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

  タイトル ： スクロールの表示（プライオリティの変更）
  編集履歴 ： 98-04-28 製作開始
                      ・スクロール面を前景として表示
                      ・スクロール面半透明設定
                      ・njExittexture()を追加
              98-06-18 SET5対応
              98-07-10  pause機能(半透明ポリゴンの表示)、
                        焼付き防止追加
              98-08-21  FogテーブルのセットをnjUserInitの中に移動
              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 2000
#define MAX_POLYGON_VTX 10
/*キューブ表示関連マクロ*/
#define CUBE_SPACE 2.4F

/*後で削ること！！！！！！*/
#define OLD_PAD pdSetMode(PDD_MODE_TYPE_A);
#define CUBE_X 2.5F
#define CUBE_Y -1.F
#define CUBE_Z -7.F
/*旧式メイプルボックス使用時！*/
#define OLD_PAD pdSetMode(PDD_MODE_TYPE_A);

extern NJS_CNK_OBJECT object_cube_root[2];
extern NJS_MATRIX object;
static NJS_MATRIX *matrix;
static NJS_VERTEX_BUF *vbuf;
NJS_VIEW view;
NJS_LIGHT light;

NJS_SCROLL scl;
NJS_FOG_TABLE fog;
static float xFog = -50.F;

static  NJS_POLYGON_VTX *poly;

/*スクロール面用テクスチャー*/
static NJS_TEXMEMLIST  *texmemlist;
static NJS_TEXNAME texname[]={
    {"skytest2.pvr", NJD_TEXATTR_GLOBALINDEX, 0}
};
Uint32 map[2][2] ={
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 128, 0)},
    {NJM_MAP(0, 0, 128),NJM_MAP(0, 128, 128)}
};
static NJS_TEXLIST texlist = {texname, 1};
Bool pause = FALSE; /*flag for pausing*/
void scroll(void);
void draw_object(void);

/*----------------------------------------------------------------------
           初期化
----------------------------------------------------------------------*/
void njUserInit(void)
{
    /* システムの初期化 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    matrix = (NJS_MATRIX *)syMalloc(sizeof (NJS_MATRIX) * MAX_MATRIX_DEPTH);
    vbuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * MAX_VERTEXES);
    poly = (NJS_POLYGON_VTX *)syMalloc(sizeof (NJS_POLYGON_VTX) * MAX_POLYGON_VTX);
    /* 背景色の設定 */
    njSetBackColor(ARGB(0, 0, 0, 192), ARGB(0, 0, 0, 192), ARGB(0, 0, 0, 192));      /*192 = c0*/
    /* テクスチャバッファの確保 */
    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);
    /* 3Dシステムの初期化 */
    njInit3D(vbuf, MAX_VERTEXES);
    /* 光源の初期化 */
    njCreateLight(&light, NJD_SPEC_DIR);
    /* ビューの初期化 */
    njInitView(&view);
    /* ビューの設定 */
    njSetView(&view);
    /* ＮＴＳＣ画面の縦横比を補正 */
    njSetAspect(1.0F, 1.0F);
    /*文字色設定(焼付き防止)*/
    njPrintColor(0xffc0c0c0);
/*--------------------------------------
　         テクスチャー設定
----------------------------------------*/
    texmemlist = syMalloc(sizeof (NJS_TEXMEMLIST) * 1);
    njInitTexture( texmemlist,1);
    /*テクスチャーロード*/
    njLoadTexture( &texlist);
    /*スクロール面の設定*/
    scl.celps = 256;
    scl.mapw = 2;
    scl.maph = 2;
    scl.sx = 1.0f;
    scl.sy = 1.0f;
    scl.spx = 240.f;
    scl.spy = 240.f;
    scl.list = &texlist;
    scl.map = (Uint32*)map;
    scl.mflag = OFF;
    scl.sflag = OFF;
    scl.pr = -10.f;
    scl.px = 0.f;
    scl.py = 0.f;
    scl.bx = 0.f;
    scl.by = 0.f;
    scl.cx = 240.f;
    scl.cy = 240.f;
    scl.sclc.argb.a = 125;
    scl.sclc.argb.r = 255;
    scl.sclc.argb.g = 255;
    scl.sclc.argb.b = 255;
    scl.colmode = NJD_COLOR_MODE_PACKED_TEXTURE_TRANS;

/*---------------------------------
    FOG
----------------------------------*/
    njSetFogColor(0xff0000c0);
    njSetFogTable(fog);
    njFogEnable();
/*---------------------------------
    POLYGON
----------------------------------*/
    poly[0].x = 0.F;
    poly[0].y = 0.F;
    poly[0].z = 5.0F;
    poly[0].col = 0x770000c0;
    poly[1].x = 0.F;
    poly[1].y = 480.F;
    poly[1].z = 5.0F;
    poly[1].col = 0x770000c0;
    poly[2].x = 640.F;
    poly[2].y = 0.F;
    poly[2].z = 5.0F;
    poly[2].col = 0x770000c0;
    poly[3].x = 640.F;
    poly[3].y = 480.F;
    poly[3].z = 5.0F;
    poly[3].col = 0x770000c0;

    /*フォグテーブルをセット*/
    njGenerateFogTable2(fog, xFog);
    njSetFogTable(fog);
}

/*----------------------------------------------------------------------
         メイン
----------------------------------------------------------------------*/
Sint32 njUserMain(void)
{
    static PDS_PERIPHERAL *input;

    static Uint32 print_col = 0x11c00000;

    input = (PDS_PERIPHERAL *) pdGetPeripheral(PDD_PORT_A0);   /*get key state*/
    /*checking key*/
    if (input->press & PDD_DGT_ST){
        pause = !pause;
    }
    if(pause) {     /*文字色/サイズの更新*/
        njPrintSize(20);
        njPrintColor(print_col);
        njPrintC(NJM_LOCATION(5, 4), "PAUSE");
        if (print_col < 0xffc0c0c0) {
            print_col += 0x03000000;
        }
    /*半透明ポリゴンの表示*/
        njDrawPolygon(poly, 4, TRUE);
    }
    njPrintColor(0xffc0c0c0);
    njPrintSize(8);
    njPrintC(NJM_LOCATION(10, 7), "Ninja Sample SCROLL FOG");
    draw_object();
    scroll();


    return NJD_USER_CONTINUE;
}
/*-------------------------------------------------
           オブジェクト描画更新用関数
-------------------------------------------------*/
void draw_object(void)
{
    int i = 0;
    int j = 0;
    static float mZ = 0;
    static enum{FORWARD, BACK}f_mZ = FORWARD;
    /* マトリクススタックのクリア */
    njClearMatrix();

    for (j = 0; j < 3; j++) {
        for (i = 0; i<10; i++) {
            njPushMatrix(NULL);
            njTranslate(NULL, CUBE_X - (j * CUBE_SPACE), CUBE_Y + (i * CUBE_SPACE), CUBE_Z - (i * 5) + mZ);
            /* オブジェクトの描画 */
            njCnkDrawObject(object_cube_root);
            njPopMatrix(1);
        }
    }
    /*ポーズがかかっていないなら描画位置を更新*/
    if (!pause) {
        /*オブジェクトのZ方向移動*/
        if (f_mZ == FORWARD) {
            mZ -= 0.5F;
            if (mZ < -50) {
                f_mZ = BACK;
            }
        }else {
            mZ += 0.5F;
            if (mZ > 0) {
                f_mZ = FORWARD;
            }
        }
    }
}

/*---------------------------------------------
    スクロール面描画用関数
----------------------------------------------*/
void scroll(void)
{
    /* マトリクススタックのクリア */
    njClearMatrix();
    /*ポーズがかかっていないならスクロール位置を更新*/
    if (!pause) {
        scl.by += 1.0f;
        if (scl.by > scl.celps * scl.maph) {
            scl.by -= scl.celps*scl.maph;
        }
    }
        njDrawScroll(&scl);
}
/*----------------------------------------------------------------------
         終了処理
----------------------------------------------------------------------*/
void njUserExit(void)
{
    /*テクスチャーの開放*/
	njExitPrint();
    njExitTexture();
    /*free*/
    syFree(matrix);
    syFree(vbuf);
    syFree(poly);
    /* システムの終了 */
    sbExitSystem();
}




