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

  タイトル ： 三角形ポリゴンを１個表示する
  編集履歴 ： 98-04-20 製作開始
              98-06-19 SET5対応
              98-07-09 pause機能(何も表示しない)、
                       焼付き防止対策
************************************************************/

#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 1000
extern NJS_OBJECT object_cube_root[];

static NJS_MATRIX *matrix;
static NJS_VERTEX_BUF *vbuf;
NJS_POINT3COL p;
NJS_VIEW view;
NJS_LIGHT light;

void MallocP3C(NJS_POINT3COL *p3c, Uint32 n);
void FreeP3C(NJS_POINT3COL *p3c);


/*----------------------------------------------------------------------
           初期化
----------------------------------------------------------------------*/
void njUserInit(void)
{
    /* システムの初期化 */
    sbInitSystem(NJD_RESOLUTION_640x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* 画面のアスペクト比を補正 */
    njSetAspect( 1.0F, 0.45F );
    /*matrixとvertexバッファの確保*/
    matrix = (NJS_MATRIX *)syMalloc(sizeof (NJS_MATRIX) * MAX_MATRIX_DEPTH);
    vbuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* 背景色の設定 */
    njSetBackColor(ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 0));
    /* 頂点格納バッファの確保 */
    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);
    /* 3Dシステムの初期化 */
    njInit3D(vbuf, MAX_VERTEXES);
    /* 光源の初期化 */
    njCreateLight(&light, NJD_DIR_LIGHT);
    /* ビューの初期化 */
    njInitView(&view);
    /* ビューの設定 */
    njSetView(&view);
    /*debug文字変更(焼き付き防止)*/
    njPrintColor(0xffc0c0c0);
}

/*----------------------------------------------------------------------
         メイン
----------------------------------------------------------------------*/
Sint32 njUserMain(void)
{
    static PDS_PERIPHERAL *input;
    static Bool pause = FALSE;  /*flag for pausing*/
    static Sint16 pauseCnt = 1;

    input = pdGetPeripheral(PDD_PORT_A0);/*キ−状態をとる*/
    /*Checking key*/
    if (input->press & PDD_DGT_ST)
        pause = !pause;

    /* サンプル名の表示 */
    njPrintC(NJM_LOCATION(23, 4), "Ninja Sample TRIANGLE");

    /*マトリックスのクリア*/
    njClearMatrix();

    /*checking pause ポーズのときはポリゴンの表示しない*/
    if (pause) {
        if (pauseCnt <=50){
            njPrintC(NJM_LOCATION(35, 27), "PAUSE");
        } else if (pauseCnt == 100)
            pauseCnt = 0;
        pauseCnt++;
    } else{
        /* サンプル名の表示 */
        njPrintC(NJM_LOCATION(23, 4), "Ninja Sample TRIANGLE");
        /*メモリの確保*/
        MallocP3C(&p, 3);
        /*ポリゴンデータの設定*/
        p.p[0].x = 0.0F;
        p.p[0].y = 0.0F;
        p.p[0].z = -2000.0F;
        p.col[0].argb.a = 0xff;
        p.col[0].argb.r = 0xc0;
        p.col[0].argb.g = 0xc0;
        p.col[0].argb.b = 0xc0;
        p.p[1].x = 160.0F;
        p.p[1].y = -320.0F;
        p.p[1].z = -2000.0F;
        p.col[1].argb.a = 0xff;
        p.col[1].argb.r = 0xc0;
        p.col[1].argb.g = 0xc0;
        p.col[1].argb.b = 0xc0;
        p.p[2].x = -160.0F;
        p.p[2].y = -320.0F;
        p.p[2].z = -2000.0F;
        p.col[2].argb.a = 0xff;
        p.col[2].argb.r = 0xc0;
        p.col[2].argb.g = 0xc0;
        p.col[2].argb.b = 0xc0;
        /*三角形ポリゴンの描画*/
        njDrawTriangle3D(&p, 1, NJD_DRAW_NORMAL | NJD_FILL);
        /*メモリの開放*/
        FreeP3C(&p);
    }
    return NJD_USER_CONTINUE;
}

void MallocP3C(NJS_POINT3COL *p3c, Uint32 n)
{
    p3c->p = (NJS_POINT3 *)syMalloc(n * sizeof (NJS_POINT3));
    p3c->col = (NJS_COLOR *)syMalloc(n * sizeof (NJS_COLOR));
    p3c->tex = (NJS_COLOR *)syMalloc(n * sizeof (NJS_COLOR));
    p3c->num = n;
}

void FreeP3C(NJS_POINT3COL *p3c)
{
    syFree(p3c->p);
    syFree(p3c->col);
    syFree(p3c->tex);
    p3c->num = 0;
}
/*----------------------------------------------------------------------
         終了処理
----------------------------------------------------------------------*/
void njUserExit(void)
{
	njExitPrint();
    /*matrixとvbufのクリア*/
    syFree(matrix);
    syFree(vbuf);
    /* システムの終了 */
    sbExitSystem();
}






