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

  タイトル ： パースを変更する
              changes
  編集履歴 ： 98-04-28 製作開始
              98-06-19 SET5対応
************************************************************/

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

void main(void)
{
#ifdef __GNUC__
	shinobi_workaround();
#endif
    njSetBorderColor( 0x00000000 );
    njUserInit();
    while (njUserMain() == NJD_USER_CONTINUE) {
        njWaitVSync();
    }
    njUserExit();
}


/* グローバルセクション */
/* global section       */
#define MATRIX_DEPTH    10
#define VERTEX_MAX      200

/* 外部定義オブジェクト */
/* external symbol object */
extern NJS_CNK_OBJECT object_cube_root[];

/* マトリクスデータ */
/* matrix data      */
static NJS_MATRIX     *g_Matrix;
static NJS_VERTEX_BUF *g_VBuf;

/* ビュー＆ライト */
/* view & light   */
static NJS_VIEW  g_View;
static NJS_LIGHT g_Light;

/* ポーズ時処理関数 */
/* pause function   */
void PausePhase(void);

/* アクティブ時処理関数 */
/* main function        */
void ActivePhase(void);

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

/* パース用変数 */
/* */
float g_Ang;
float g_Dist;

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

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

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);

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

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

    /* ビューの設定 */
	/* specifies 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 text color */
	njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));
}


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

    njUserMain --- Ninjaシステムメイン関数
                   main
************************************************************************/

Sint32 njUserMain(void)
{
    PDS_PERIPHERAL *per;

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

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

	if (!g_bPause) {
	   	/* アクティブ時処理 */
	   	/* not pause        */
		ActivePhase();
	} else {
		/* ポーズ時処理 */
		/* pause        */
		PausePhase();
	}

	/* サンプル名の表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(23, 4), "Ninja Sample PERS CHANGE");

    return NJD_USER_CONTINUE;
}


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

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

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

void ActivePhase(void)
{
    static int count = 0;

    /* 画角を９０度を中心にして４５度の範囲で変更する */
    count++;
    g_Ang = 90.0F + njSin(NJM_DEG_ANG(count)) * 45.0F;
    njSetPerspective(NJM_DEG_ANG(g_Ang));

    /* 画角から投影面までの距離を算出 */
    g_Dist = 320.0F / njTan(NJM_DEG_ANG(g_Ang / 2.0F));

    /* サンプル名の表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(5, 7), " PERS ANGLE =");
    njPrintF(NJM_LOCATION(18, 7), g_Ang, 3);

    /* マトリクススタックのクリア */
	/* clears the matrix stack    */
    njClearMatrix();

    /* 比率が一定の所に平行移動する */
    njTranslate(NULL, 0.0F, 0.0F, - g_Dist / 45.0F);

    /* X,Y,Z 軸の順番に回転 */
    /* rotates x,y,z */
    njRotateXYZ(NULL, NJM_DEG_ANG(30.0F),
                            NJM_DEG_ANG(30.0F), NJM_DEG_ANG(0.0F));
    /* オブジェクトの描画 */
    /* draws the object */
    njCnkDrawObject(object_cube_root);
}


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

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

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

void PausePhase(void)
{
	static int cnt = 0;

	cnt++;

	njSetFadeColor(0xff000000);
	njExecuteFade((njSin(NJM_DEG_ANG(cnt)) / 2.0F + 0.5F));
	njFadeEnable();

    /* マトリクススタックのクリア */
    /* clears the matrix stack    */
    njClearMatrix();

    /* 比率が一定の所に平行移動する */
    njTranslate(NULL, 0.0F, 0.0F, - g_Dist / 45.0F);

    /* X,Y,Z 軸の順番に回転 */
    /* rotates x,y,z */
    njRotateXYZ(NULL, NJM_DEG_ANG(30.0F), 
                            NJM_DEG_ANG(30.0F), NJM_DEG_ANG(0.0F));
    /* オブジェクトの描画 */
    /* draws the object */
    njCnkDrawObject(object_cube_root);

	njFadeDisable();

    njPrintC(NJM_LOCATION(38, 30), "PAUSE");
}


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

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

void njUserExit(void)
{
	njExitPrint();

    /* メモリの開放 */
	/* frees the memory area */
    syFree(g_Matrix);
    syFree(g_VBuf);

    /* システムの終了 */
    /* exits the system    */
    sbExitSystem();
}
