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

  タイトル ： フォグの設定（宙返り）
  編集履歴 ： 98-05-11 作成開始
              98-06-19 SET5対応
              98-07-07 C0焼き付き問題に対応（ポーズ追加）
              98-09-16 テクスチャバッファ確保のサイズ変更
************************************************************/

#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 20000
#define MAX_TEXTURE_NUM 20

extern NJS_TEXLIST texlist_air00_body_1;
extern NJS_CNK_OBJECT object_air00_body_1_body_1[];
extern NJS_CNK_OBJECT object_air00_body_1_proR_0[];
extern NJS_CNK_OBJECT object_air00_body_1_proR_1[];
extern NJS_CNK_OBJECT object_air00_body_1_proR_5[];
extern NJS_CNK_OBJECT object_air00_body_1_proR_6[];

static NJS_MATRIX *Matrix;
static NJS_VERTEX_BUF *VBuf;
static NJS_VIEW View;
static NJS_LIGHT Light;
static NJS_TEXMEMLIST Tex[MAX_TEXTURE_NUM];
static NJS_FOG_TABLE Fog;

static PDS_PERIPHERAL *Per;

void PauseMode(void);

/************************************************************
  初期化関数
************************************************************/
void njUserInit(void)
{
    /* システムを初期化 */
    sbInitSystem(NJD_RESOLUTION_640x240_NTSCNI,NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* ＮＴＳＣ画面の縦横比を補正 */
    njSetAspect(1.0F, 0.45F);
    /* バッファ用メモリをアロケート */
    Matrix = syMalloc(sizeof(NJS_MATRIX) * MAX_MATRIX_DEPTH);
    VBuf = syMalloc(sizeof(NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* バックグラウンドカラーを設定 */
    njSetBackColor(ARGB(0, 150, 150, 150),ARGB(0, 150, 150, 150), ARGB(0, 150, 150, 150));
    /* テクスチャバッファの確保 */
    njInitTextureBuffer((Sint8 *)VBuf,0x800*10);
    /* 頂点データ登録用バッファをアロケート（１つの頂点＊６４／４バイト） */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* マトリクススタックを初期化（１＝ライト演算用のマトリクスを使用） */
    njInitMatrix(Matrix, MAX_MATRIX_DEPTH, 1);
    /* ３Ｄシステムの初期化（モデル描画のためのワークバッファを初期化） */
    njInit3D(VBuf, MAX_VERTEXES);
    /* 光源の種類を定めライトを新たに設置（平行光源を登録）
      （位置＝0,0,0）（向き＝0,0,-1） */
    njCreateLight(&Light, NJD_SPEC_DIR);
    /* ビューの初期化（位置＝0,0,0）（向き＝0,0,-1）（傾き＝０度） */
    njInitView(&View);
    /* ユーザの用意したビューをカレントビューに指定 */
    njSetView(&View);

    /* テクスチャのロード */
    njInitTexture(Tex, MAX_TEXTURE_NUM);
    njLoadTexture(&texlist_air00_body_1);
    njSetTexture(&texlist_air00_body_1);

    /* フォグテーブルの作成とデンシティの設定 */
    njGenerateFogTable3(Fog, -300.0F, -700.0F);
    /* 使用するフォグテーブルをセット */
    njSetFogTable(Fog);
    /* フォグの色を指定 */
    njSetFogColor(ARGB(0, 150, 150, 150));
    /* フォグ効果をオンにする */
    njFogEnable();
    /* デバッグ文字の色 */
    njPrintColor(ARGB(255, 150, 150, 150));
}

/************************************************************
  定期実行されるメイン処理
************************************************************/
Sint32 njUserMain(void)
{
    static Angle angPro = NJM_DEG_ANG(0.0F);  /* プロペラの回転角 */
    static Angle angBody = NJM_DEG_ANG(0.0F); /* 飛行機の回転角 */

    static Bool pauseMode = FALSE;

    /* サンプル名の表示 */
    njPrintC(NJM_LOCATION(4, 2), "Ninja Sample FOG 1");
    njPrintC(NJM_LOCATION(4, 4), "Press Start Button To Pause");

    /* ペリフェラルチェック */
    Per = pdGetPeripheral(PDD_PORT_A0);
    if (Per->press & PDD_DGT_ST) { /* スタートボタンが押された */
        pauseMode = !pauseMode;
    }
    /* ポーズ画面を作る */
    if (pauseMode == TRUE) {
        static NJS_POINT2 pnt[4] = { 0, 0, 640, 0, 640, 480, 0, 480 };
        static NJS_COLOR col[4] = {
            ARGB(150, 0, 0, 0), ARGB(150, 0, 0, 0),
            ARGB(150, 0, 0, 0), ARGB(150, 0, 0, 0),
        };
        static NJS_POINT2COL p2c = { pnt, col, NULL, 4 };

        njColorBlendingMode(0, NJD_COLOR_BLENDING_BOTHSRCALPHA);
        njDrawPolygon2D(&p2c, 4, -1.0F, NJD_FILL | NJD_TRANSPARENT);

        PauseMode();
    }

    if (pauseMode == FALSE) {
        /* 飛行機の回転 */
        angBody -= NJM_DEG_ANG(1.0F);

        /* プロペラの回転 */
        angPro += NJM_DEG_ANG(10.0F);
        object_air00_body_1_proR_0->ang[2] = angPro;
        object_air00_body_1_proR_1->ang[2] = angPro;
        object_air00_body_1_proR_5->ang[2] = angPro;
        object_air00_body_1_proR_6->ang[2] = angPro;
    }

    /* 宙返りのマトリクス演算 */
    njPushMatrix(NULL);
    njTranslate(NULL, 0.0F, 0.0F, -500.0F);
    njRotateX(NULL, angBody);
    njTranslate(NULL, 0.0F, 0.0F, -200.0F);
    njRotateX(NULL, NJM_DEG_ANG(90.0F));
    njRotateY(NULL, NJM_DEG_ANG(180.0F));
    njCnkDrawObject(object_air00_body_1_body_1);
    njPopMatrix(1);

    return NJD_USER_CONTINUE;
}

/************************************************************
  実行終了時に呼び出される終了処理
************************************************************/
void njUserExit(void)
{
    /* メモリを解放 */
    syFree(Matrix);
    syFree(VBuf);

    /* テクスチャを解放 */
	njExitPrint();
    njExitTexture();
    /* システムの終了 */
    sbExitSystem();
}

/************************************************************
  ポーズ時に呼び出される処理
************************************************************/
void PauseMode(void)
{
    static Sint16 interval = 0;
    static Bool display = TRUE;

    interval++;
    if (interval >= 30) {
        display = !display;
        interval = 0;
    }
    if (display == TRUE) {
        njPrintSize(32);
        njPrintC(NJM_LOCATION(7, 6),"PAUSE!");
        njPrintSize(8);
    }
}
