/************************************************************
  Ninja Sample
  COPYRIGHT (C) SEGA ENTERPRISES, LTD.

  タイトル ： カメラアングルを変更する
  編集履歴 ： 98-04-24 製作開始
              98-06-19 SET5対応
              98-08-21  FogテーブルのセットをnjUserInitの中に移動
              99-04-05 appends the English comments
************************************************************/

#include <shinobi.h>
#include <njdef.h>

void main(void)
{
	njSetBorderColor( 0x00000000 );
    njUserInit();
    while (njUserMain() == NJD_USER_CONTINUE) {
        njWaitVSync();
    }
    njUserExit();
}


/* グローバルセクション */
/* global data          */
extern NJS_CNK_OBJECT   object_cube_root[];

/* マトリクス関連 */
/* matrix         */
#define MATRIX_DEPTH 10
#define VERTEX_MAX   256

static NJS_MATRIX     *g_Matrix;
static NJS_VERTEX_BUF *g_VBuf;

/* 光源 ＆ 視点 */
/* light resource and view point */
static NJS_VIEW  g_View;
static NJS_LIGHT g_Light;

/* ポーズ判定フラグ */
/* pause flag       */
Bool g_bPause = FALSE;

/* 関数のプロトタイプ */
/* prototype declarations */
void ActiveProc(void);	/* アクティブ時処理関数 */
void DrawProc(void);	/* 描画処理関数 */
void PauseProc(void);	/* ポーズ時処理関数 */

static NJS_FOG_TABLE fog;

/**********************************************************************

	njSetBorderColor( 0x00000000 );
    njUserInit --- Ninjaシステム初期化関数

**********************************************************************/

void njUserInit(void)
{
    /* システムの初期化 */
    /* Initializes the Dreamcast H/W and readies the SEGA library */
    sbInitSystem(NJD_RESOLUTION_640x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);

    /* ＮＴＳＣ画面の縦横比を補正 */
  	/* corrects the screen aspect ratio */
    njSetAspect(1.0F, 0.45F);

    /* メモリの割り当て */
    /* allocates the memory */
    g_Matrix = (NJS_MATRIX *)syMalloc(sizeof(NJS_MATRIX) * MATRIX_DEPTH);
    g_VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof(NJS_VERTEX_BUF) * VERTEX_MAX);

    /* 頂点格納バッファの確保 */
    /* allocates the buffers for registration of vertex data */
    njInitVertexBuffer(VERTEX_MAX * 64 / 4, 0, VERTEX_MAX * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /* マトリクススタックの初期化 */
   	/* initializes the matrix stack */
    njInitMatrix(g_Matrix, MATRIX_DEPTH, 1);

    /* 演算用頂点バッファの初期化 */
    /* initializes 3D system  */ 
    njInit3D(g_VBuf, VERTEX_MAX);

    /* モデル、オブジェクトの描画をコントロール */
    /* controls drawing of models and objects */
    njControl3D(NJD_CONTROL_3D_CONSTANT_ATTR);

    /* 光源の初期化 */
    /* initializes the light source */
    njCreateLight(&g_Light, NJD_SPEC_DIR);

    /* ビューの初期化 */
    /* initializes the user-defined view */
    njInitView(&g_View);

    /* ビューの設定 */
    /* sets the user-defined view as the current view */
    njSetView(&g_View);

    /* 背景色の設定 */
	/* sets background color */
    njSetBackColor(ARGB(0xff, 0xc0, 0, 0), 
                        ARGB(0xff, 0, 0xc0, 0), ARGB(0xff, 0, 0, 0xc0));

    /* テキストのカラーを設定 */
	/* sets the color of debug printing */
    njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));


    /* フォグテーブルをセット */
    /* sets the fog table */
	njGenerateFogTable(fog);
	njSetFogTable(fog);
}


/**********************************************************************

    njUserMain --- Ninjaシステムメイン処理関数

**********************************************************************/

Sint32 njUserMain(void)
{
    PDS_PERIPHERAL *per;

    /* ジョイスティックポート１のペリフェラル情報を取得 */
    /* gets the peripheral information */
    per = pdGetPeripheral(PDD_PORT_A0);    

    /* ボタンが押されたかどうかチェック */
    /* checks the pressing of start button */
    if (per->press & PDD_DGT_ST) {
        g_bPause = !g_bPause;
    }

	if (!g_bPause) {    
	   	/* アクティブ時処理 */
	   	/* not pause        */
		ActiveProc();
	} else {
		/* ポーズ時処理 */
		/* pause        */
		PauseProc();
	}
		
    /* デバッグ情報の表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(23, 5), "Ninja Sample CAMERA ANGLE");

    return NJD_USER_CONTINUE;
}



/**********************************************************************

    DrawProc --- 描画処理関数

**********************************************************************/

void DrawProc(void)
{
    int i, j;

    /* ４つの角に立方体を配置 */
    /* draws the cube at the 4 corners */ 
    for (j = 0; j < 2; j++) {
        for (i = 0; i < 2; i++) {
            njPushMatrix(NULL);
                njTranslate(NULL, i * 10.0f - 5.0f, 0.0f, j * 10.0f - 5.0f);

                /* オブジェクトの描画 */
                /* draw the object    */
                njCnkDrawObject(object_cube_root);
                
            njPopMatrix(1);
        }
    }
}


/**********************************************************************

    ActiveProc --- アクティブ時処理関数

**********************************************************************/

void ActiveProc(void)
{
    static Angle theta = NJM_DEG_ANG(0.0F);

    /* カメラを回転させる */
    /* rotates the camera */
    theta += NJM_DEG_ANG(0.5F);
    njRotateViewYAbsolute(NULL, theta);
    njSetView(&g_View);
    
    /* 描画処理 */
    /* draw     */
    DrawProc();
}


/**********************************************************************

    PauseProc --- ポーズ時処理関数

**********************************************************************/

void PauseProc(void)
{

	/* フォグの設定 */
	/* sets the fog information */
	njSetFogColor(0x00000000);
	njSetFogDensity(0xfff0);
	njFogEnable();

	/* 描画処理 */
	/* draws    */
    DrawProc();

	/* フォグを無効にする */
	/* clears the fog table */
	njFogDisable();

    /* ポーズ状態の表示 */
    /* prints the pause status */
    njPrintC(NJM_LOCATION(38, 25), "PAUSE");
}


/**********************************************************************

    njUserExit --- Ninjaシステム終了処理関数

**********************************************************************/

void njUserExit(void)
{
	njExitPrint();

    /* メモリの開放 */
	/* frees the memory area */
    syFree(g_Matrix);
    syFree(g_VBuf);
    
    /* システムの終了処理をします 最後に必ず呼び出してください */
    /* exits the system    */
    sbExitSystem();
}
