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

  タイトル ： 環境光を設定する
  編集履歴 ： 98-04-28 製作開始
              98-06-19 SET5対応
************************************************************/

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

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

#define MAX_MATRIX_DEPTH 10
#define MAX_VERTEXES 4096

#define COLOR_CHANGE_CYCLE 500 					/* 一色を表示する周期 */
#define CUBE_MAX 3 								/* 立方体の数 */
#define CUBE_ROTATION_SPEED NJM_DEG_ANG(1.0F) 	/* 回転速度 */

extern NJS_OBJECT object_cube_root[];

static NJS_MATRIX *TranslationMatrix;
static NJS_VERTEX_BUF *VertexBuffer;

static NJS_VIEW View;
static NJS_LIGHT AmbientLight;

static PDS_PERIPHERAL *key;
/*----------------------------------------------------------------------
           初期化
----------------------------------------------------------------------*/
void njUserInit(void)
{
    /* システムの初期化 */
    sbInitSystem(NJD_RESOLUTION_640x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* ＮＴＳＣ画面の縦横比を補正 */
    njSetAspect(1.0F, 0.45F);
    /* メモリ割り当て */
    TranslationMatrix = syMalloc(sizeof(NJS_MATRIX) * MAX_MATRIX_DEPTH);
    VertexBuffer   = syMalloc(sizeof(NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* 背景色の設定 */
    njSetBackColor(0x00C00000, 0x0000C000, 0x000000C0);
    /* 頂点格納バッファの確保 */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* マトリクススタックの初期化 */
    njInitMatrix(TranslationMatrix, MAX_MATRIX_DEPTH, 1);
    /* 3Dシステムの初期化 */
    njInit3D(VertexBuffer, MAX_VERTEXES);
    /* 光源の初期化 */
    njCreateLight(&AmbientLight, NJD_AMBIENT);
    njSetLightIntensity(&AmbientLight, 1.0F, 1.0F, 1.0F);
    njSetLightAlpha(&AmbientLight, 1.0F);
    /* ビューの初期化 */
    njInitView(&View);
    /* ビューの設定 */
    njSetView(&View);
	/* 文字の色を指定 */
	njPrintColor(0xFFC0C0C0);
}

/*----------------------------------------------------------------------
         メイン
----------------------------------------------------------------------*/
Sint32 njUserMain(void)
{
    /* 変数の初期設定 */
    static Angle rotateAng = NJM_DEG_ANG(0.0F);

    int cubeNo = 0;        	/* 立方体を順番に表示するために使われる変数 */
    static int counter = 0;	/* 同色を表示する時間を調整するためのカウンタ変数 */

	static Bool pause = FALSE; 	/* ポーズがかかっているか */

	/* ポーズの判定 */
	key = pdGetPeripheral(PDD_PORT_A0);

	if (key->press & PDD_DGT_ST) {
	    if (pause == FALSE) {
		    njSetBackColor(0x00000000, 0x00000000, 0x00000000);
		    pause = TRUE;
		} else {
		    njSetBackColor(0x00C00000, 0x0000C000, 0x000000C0);
		    pause = FALSE;
		}
	}

    /* 色名の表示 */
	if (pause == TRUE) {
	    njPrintC(NJM_LOCATION( 4, 4),"PAUSE");
		njSetLightColor(&AmbientLight, 0.5F, 0.5F, 0.5F);
	} else {
	    counter++;
		if (counter == COLOR_CHANGE_CYCLE * CUBE_MAX) {
		  counter = 0;
		}
		if (counter < COLOR_CHANGE_CYCLE) {
		    njPrintC(NJM_LOCATION( 4, 4),"COLOR RED");
			njSetLightColor(&AmbientLight, 1.0F, 0.0F, 0.0F);
		} else if (counter < COLOR_CHANGE_CYCLE * 2) {
		    njPrintC(NJM_LOCATION( 4, 4),"COLOR GREEN");
			njSetLightColor(&AmbientLight, 0.0F, 1.0F, 0.0F);
		} else {
		    njPrintC(NJM_LOCATION( 4, 4),"COLOR BLUE");
			njSetLightColor(&AmbientLight, 0.0F, 0.0F, 1.0F);
		}
	}
    /* サンプル名の表示 */
    njPrintC(NJM_LOCATION(23, 2), "Ninja Sample LIGHT COLOR CHANGE");
    /* 立方体の表示 */
    for (cubeNo = 0; cubeNo < CUBE_MAX; cubeNo++){
        njPushMatrix(NULL);
        njTranslate(NULL, (cubeNo - 1) * 3.0F, 0.0F, -10.0F);
        /* X,Y,Z 軸の順番に回転 */
        njRotateXYZ(NULL, rotateAng, rotateAng, rotateAng);
        /* オブジェクトの描画 */
        njDrawObject(object_cube_root);
        njPopMatrix(1);
    }
    /* X,Y,Z 軸への回転角の更新 */
    rotateAng += CUBE_ROTATION_SPEED;

    return NJD_USER_CONTINUE;
}

/*----------------------------------------------------------------------
         終了処理
----------------------------------------------------------------------*/
void njUserExit(void)
{
	njExitPrint();
    /* メモリの開放 */
    syFree(TranslationMatrix);
    syFree(VertexBuffer);
    /* システムの終了 */
    sbExitSystem();
}
