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

  タイトル ： 線光源の設定、
              グーロ、フラットシェーディングの切り替え
  編集履歴 ： 98-05-01 作成開始
              98-06-19 SET5対応
              98-07-09 ポーズ機能(light 0ff)追加、
              デバック文字色変更
************************************************************/

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

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

#define MAX_MATRIX_DEPTH 12
#define MAX_VERTEXES 2000
#define OBJECT_1 object_cube_root
#define CUBE_X 10.5F
#define CUBE_Y 10.F
#define CUBE_Z -20.F
#define CUBE_NEXT 2.4F
/*旧式メイプルボックス用*/
#define SET_OLD_PD pdSetMode(PDD_MODE_TYPE_A)

extern NJS_CNK_OBJECT OBJECT_1[];
extern NJS_MATRIX object;
static NJS_MATRIX *matrix;
static NJS_VERTEX_BUF *vbuf;
NJS_VIEW view;
NJS_LIGHT light;
NJS_LIGHT light1;
NJS_ARGB argb;
/*シェーディング用フラグ*/
Bool  flat = FALSE;
/*----------------------------------------------------------------------
           初期化
----------------------------------------------------------------------*/
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, 255));
    /* 頂点格納バッファの確保 */
    njInitVertexBuffer(MAX_VERTEXES * 256 , 0, MAX_VERTEXES * 256 , 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* マトリクススタックの初期化 */
    njInitMatrix(matrix, MAX_MATRIX_DEPTH, 1);
    /* 3Dシステムの初期化 */
    njInit3D(vbuf, MAX_VERTEXES);
    /* ビューの初期化 */
    njInitView(&view);
    /* ビューの設定 */
    njSetView(&view);
    /* 光源の設定 */
    njCreateLight(&light, NJD_SPEC_DIR);
    njSetLightIntensity( &light, 0.1F, 0.2F, 0.1F );

    njCreateLight( &light1, NJD_SPOT_LIGHT);
    njSetLightLocation(&light1, 0.F, -1.F, -8.F);
    njSetLightIntensity( &light1, 1.0F, 1.0F, 1.0F );
/*	njCnkSetAmbient(1.f, 1.f, 1.f);*/

    njControl3D(NJD_CONTROL_3D_CNK_CONSTANT_ATTR|NJD_CONTROL_3D_CONSTANT_TEXTURE_MATERIAL);
    /*light color*/
    argb.r = 0;
    argb.g = 0;
    argb.b = 0;
    /*debug文字変更(焼き付き防止)*/
    njPrintColor(0xffc0c0c0);
}

/*----------------------------------------------------------------------
         メイン
----------------------------------------------------------------------*/
Sint32 njUserMain(void)
{
    int i = 0;
    int j = 0;
    static PDS_PERIPHERAL *input; /*キー入力用*/
    static Bool pause = FALSE;   /*flag for pause*/

    input = pdGetPeripheral(PDD_PORT_A0);
    /*ポーズの判定*/
    if (input->press & PDD_DGT_ST) {
        pause = !pause;
        if(pause){  /*ポーズがかかったら減光*/
            njSetLightIntensity(&light, 0.01F, 0.01F, 0.01F);
            njSetLightIntensity(&light1, 0.1F, 0.1F, 0.1F);
            njSetBackColor(ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 100));
        } else {    /*ポーズからぬけたら輝度を戻す*/
            njSetLightIntensity(&light, 0.1F, 0.2F, 0.1F);
            njSetLightIntensity(&light1, 1.F, 1.F, 1.F);
            njSetBackColor(ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 255));
        }
    }
    /*ポーズ中の処理*/
    if (pause){
        njPrintC(NJM_LOCATION(35, 25), "PAUSE");
    }

    /*sample name*/
    njPrintC(NJM_LOCATION(23, 4),"Ninja Sample SOPT LIGHT");
    /* マトリクススタックのクリア */
    njClearMatrix();
    /* オブジェクトの描画 */
    for (j = 0; j < 10; j++) {
        for (i = 0; i < 10; i++) {
            njPushMatrix(NULL);
            njTranslate(NULL, CUBE_X - (j * CUBE_NEXT), CUBE_Y - (i * CUBE_NEXT), CUBE_Z);
            njCnkDrawObject(OBJECT_1);
            njPopMatrix(1);
        }
    }
    if (!pause) {   /*ポーズ中にはデータの更新を行わない*/
        /*シェーディング色の更新*/
        njSetLightColor(&light1, argb.r, argb.g, argb.b);
        if (argb.r > 1)
            argb.r = 0;
        if (argb.g > 1)
            argb.g = 0;
        if (argb.b > 1)
            argb.b = 0;
        argb.r += 0.003F;
        argb.g += 0.002F;
        argb.b += 0.001F;
        /*シェーディングの切り替え*/
        if (argb.r >= 1)
            if (!flat) {
                flat = TRUE;
            }else {
                flat = FALSE;
            }
        if (!flat) {
            njSetConstantAttr( ~NJD_FST_FL, 0);
            njPrintC(NJM_LOCATION(2, 7), "Gouraud Shading");
        }else {
            njSetConstantAttr( 0xffffffff, NJD_FST_FL);
            njPrintC(NJM_LOCATION(2, 7), "Flat Shading");
        }
    }
    return NJD_USER_CONTINUE;
}

/*----------------------------------------------------------------------
         終了処理
----------------------------------------------------------------------*/
void njUserExit(void)
{
	njExitPrint();
    /*matrixとvbufのクリア*/
    syFree(matrix);
    syFree(vbuf);
    /* システムの終了 */
    sbExitSystem();
}




































