/************************************************************
  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 VERTEX_MAX  1000     /* 頂点の最大数 */

/* テクスチャデータ */
#define TEXTURE_NUM  1  /* テクスチャデータの数 */

static NJS_VERTEX_BUF  *g_VBuf;

/* キャッシュメモリに読み込まれるテクスチャを定義 */
static NJS_TEXNAME g_TexName[] = {"tex.pvr", NJD_TEXATTR_GLOBALINDEX, 0};
static NJS_TEXLIST g_TexList = {g_TexName, TEXTURE_NUM};
static NJS_TEXMEMLIST g_Texture[TEXTURE_NUM];

/* スクロール用データ */
#define MAP_CELL_WIDTH  5
#define MAP_CELL_HEIGHT 4

static Uint32 g_Map[MAP_CELL_HEIGHT][MAP_CELL_WIDTH] = {
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), 
                                    NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), 
                                    NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), 
                                    NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), 
                                    NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)}, 
};

static NJS_SCROLL  g_Scroll;                   /* スクロール構造体 */
static Angle       g_Ang = NJM_DEG_ANG(0.0);   /* スクロール回転角度 */


/***************************************************************************

	njSetBorderColor( 0x00000000 );
    njUserInit --- Ninjaシステム初期化関数

***************************************************************************/

void njUserInit (void)
{
    /* 画面モードの決定 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* メモリの割り当て */
    g_VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof(NJS_VERTEX_BUF) * VERTEX_MAX);
    /* テクスチャバッファの確保 */
    njInitTextureBuffer((Sint8 *)g_VBuf,0x800*10);

    /* 頂点の最大数分バッファをアロケートする */
    njInitVertexBuffer(VERTEX_MAX * 64 / 4, 0, VERTEX_MAX * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /* テクスチャのロードとセットアップ */
    njInitTexture(g_Texture, TEXTURE_NUM); /* テクスチャデータ領域を確保 */
    njLoadTexture(&g_TexList);  /* テクスチャリストにあるテクスチャデータを */
                                /* テクスチャメモリにロード */
    /* スクロールのセットアップ */
    g_Scroll.celps = 128;           /* セルのピクセルサイズ */
    g_Scroll.mapw = MAP_CELL_WIDTH; /* マップの横方向のセルの個数 */
    g_Scroll.maph = MAP_CELL_HEIGHT;/* マップの縦方向のセルの個数 */
    g_Scroll.sw = 0;                /* スクロール面の描画横方向の大きさ */
    g_Scroll.sh = 0;                /* スクロール面の描画縦方向の大きさ */
    g_Scroll.list = &g_TexList;     /* テクスチャリストを指定 */
    g_Scroll.map = (Uint32 *)g_Map; /* マップ配列を指定 */
    g_Scroll.px = 0;                /* スクロール画面の移動座標 */
    g_Scroll.py = 0;
    g_Scroll.bx = 0;                /* マップの書き始めの座標 */
    g_Scroll.by = 0;                    
    g_Scroll.pr = -100.0f;          /* スクロールのプライオリティ（優先順位)*/
    g_Scroll.sflag = OFF;           /* 拡縮をするかしないかのフラグ */
    g_Scroll.mflag = ON;            /* 回転をするかしないかのフラグ */
    g_Scroll.cx = 320.0F;           /* 回転中心座標 */
    g_Scroll.cy = 240.0F;
    g_Scroll.m[0] = njCos(NJM_DEG_ANG(0.0F));/* 回転マトリクスの指定 */
    g_Scroll.m[1] =-njSin(NJM_DEG_ANG(0.0F));
    g_Scroll.m[2] = njSin(NJM_DEG_ANG(0.0F));
    g_Scroll.m[3] = njCos(NJM_DEG_ANG(0.0F));
    g_Scroll.colmode = NJD_COLOR_MODE_PACKED_TEXTURE; /* カラーモードの指定 */
    g_Scroll.sclc.argb.a = 0xff;     /* スクロール全体にかけるカラー */
    g_Scroll.sclc.argb.r = 0xff;
    g_Scroll.sclc.argb.g = 0xff;
    g_Scroll.sclc.argb.b = 0xff;

    /* 背景を設定 */
    njSetBackColor(ARGB(255, 255, 0, 0), 
                        ARGB(255, 0, 255, 0), ARGB(255, 0, 0, 255));

}


/***************************************************************************

    njUserMain --- Ninjaシステムメイン関数

***************************************************************************/

Sint32 njUserMain(void)
{
    g_Ang += NJM_DEG_ANG(0.25F);     /* 回転角度を更新 */
    g_Scroll.m[0] = njCos(g_Ang);   /* 回転マトリクスを変化 */
    g_Scroll.m[1] =-njSin(g_Ang);
    g_Scroll.m[2] = njSin(g_Ang);
    g_Scroll.m[3] = njCos(g_Ang);
    
    /* スクロールの描画 */
    njDrawScroll(&g_Scroll);

    /* デバッグ情報の表示 */
    njPrintC(NJM_LOCATION(5, 5), "Ninja Sample");
    njPrintC(NJM_LOCATION(5, 7), "Scroll Rotation");
    
    return NJD_USER_CONTINUE;
}


/***************************************************************************

    njUserExit --- Ninjaシステム終了関数

***************************************************************************/

void njUserExit(void)
{
	njExitPrint();
    njExitTexture();
    syFree(g_VBuf);
    sbExitSystem(); /* システムの終了処理を行います */
}
