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

  タイトル ： スクロールを拡大縮小する
  編集履歴 ： 98-04-28 製作開始
              98-06-19 SET5対応
              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 TEX_NUM 100
#define SIZE_CHANGE_SPEED NJM_DEG_ANG(1.0F)/* 拡大、縮小の速さ*/

#define SCREEN_SAVE_TIME 30

static Uint32 ScaleMap[1][1] = {
    {NJM_MAP(0, 0, 0)}
};

static NJS_TEXNAME ScaleTexName[1]={
    {"frog.pvr",NJD_TEXATTR_GLOBALINDEX, 1000},
};
static NJS_TEXLIST ScaleTexList = {ScaleTexName, 1};
static NJS_SCROLL ScaleScroll;
static NJS_TEXMEMLIST ScaleTexMemList[TEX_NUM];

static NJS_MATRIX *ScaleMatrix;
static NJS_VERTEX_BUF *ScaleVbuf;
static Sint8 TextureBuf[0x40800];

/*-----------------------------------------------
    初期化
-----------------------------------------------*/
void njUserInit(void)
{
    /* システムの初期化 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* メモリ割り当て */
    ScaleMatrix = syMalloc(sizeof(NJS_MATRIX) * MAX_MATRIX_DEPTH);
    ScaleVbuf   = syMalloc(sizeof(NJS_VERTEX_BUF) * MAX_VERTEXES);

    njInitTextureBuffer( ( Sint8 * )TextureBuf, 0x800*10 );
    /* 背景色の設定 */
    njSetBackColor(0xFF000000, 0xFF000000, 0xFF000000);
    /* 頂点格納バッファの確保 */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* マトリックススタックの初期化 */
    njInitMatrix(ScaleMatrix, MAX_MATRIX_DEPTH, 1); 
    /* テクスチャの初期化 */
    njInitTexture(ScaleTexMemList, TEX_NUM);
    /* スクロールの設定 */
    ScaleScroll.celps =  256;                  /* セルサイズ               */
    ScaleScroll.mapw  =    1;                  /* マップの横のセルの個数   */
    ScaleScroll.maph  =    1;                  /* マップの縦のセルの個数   */
    ScaleScroll.sx    =    1.0F;               /* スケール 横              */
    ScaleScroll.sy    =    1.0F;               /* スケール 縦              */
    ScaleScroll.spx   =    0.0F;               /* スケールセンター ｘ座標  */
    ScaleScroll.spy   =    0.0F;               /* スケールセンター ｙ座標  */
    ScaleScroll.list  = &ScaleTexList;         /* テクスチャリスト         */
    ScaleScroll.map   = (Uint32*)ScaleMap;     /* マップ配列               */
    ScaleScroll.mflag = OFF;                   /* マトリックスフラグ       */
    ScaleScroll.sflag = ON;                    /* スケールフラグ           */
    ScaleScroll.pr    = -1000.0F;              /* プライオリティ           */
    ScaleScroll.px    =     0.0F;              /* 移動 ｘ座標              */
    ScaleScroll.py    =     0.0F;              /* 移動 ｙ座標              */
    ScaleScroll.bx    =     0.0F;              /* マップの書き始め ｘ座標  */
    ScaleScroll.by    =     0.0F;              /* マップの書き始め ｙ座標  */
    ScaleScroll.cx    =     0.0F;              /* 回転中心 ｘ座標          */
    ScaleScroll.cy    =     0.0F;              /* 回転中心 ｙ座標          */
    ScaleScroll.sclc.argb.a = 255;             /* 全体にかける Ａ          */
    ScaleScroll.sclc.argb.r = 255;             /* 全体にかける Ｒ          */
    ScaleScroll.sclc.argb.g = 255;             /* 全体にかける Ｇ          */
    ScaleScroll.sclc.argb.b = 255;             /* 全体にかける Ｂ          */
    ScaleScroll.colmode = NJD_COLOR_MODE_PACKED_TEXTURE;   /* カラーモードの設定 */
    njLoadTexture(&ScaleTexList);
	/* 文字色の設定 */
	njPrintColor(0xFFC0C0C0);
}

Sint32 njUserMain(void)
{
    static Angle size = NJM_DEG_ANG(0.0F);/* 拡大・縮小のサイズを決める変数 */
	static PDS_PERIPHERAL *key;/* ボタン入力 */
	static Bool pause = FALSE;/* ポーズがかかっているかどうか */
	static int counter = 0;
	/* ポーズの判定 */
	key = (PDS_PERIPHERAL *) pdGetPeripheral(PDD_PORT_A0);

	if (key->press & PDD_DGT_ST) {
	    if (pause == FALSE) {
		    pause = TRUE;
		} else {
		    pause = FALSE;
		}
	}

    /* デバッグ情報の表示 */
    njPrintC(NJM_LOCATION(10, 3), "Ninja Sample SCROLL ZOOM");
	if (pause == TRUE) {
	    njPrintC(NJM_LOCATION(16, 5), "PAUSE");
	}
    /* 拡大率（縮小率）の変更 */
    ScaleScroll.sx = njSin(size) + 1.5F;
    ScaleScroll.sy = njSin(size) + 1.5F;
    /* オブジェクトの描画 */
	if (pause == FALSE) {
	    njDrawScroll(&ScaleScroll);
		size += SIZE_CHANGE_SPEED;
	} else {
	    counter++;
		if (counter > SCREEN_SAVE_TIME) {
		    njDrawScroll(&ScaleScroll);
		}
		if (counter == SCREEN_SAVE_TIME * 2) {
		    counter = 0;
		}
	}
    return NJD_USER_CONTINUE;
}

void njUserExit(void)
{
    /* メモリの開放 */
    syFree(ScaleMatrix);
    syFree(ScaleVbuf);
    /* システムの終了 */
	njExitPrint();
    njExitTexture();
    sbExitSystem();
}
