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

  タイトル ： スプライト（四角形ポリゴン）に半透明をかける
              Sprite (effect alpha)
  編集履歴 ： 98-04-28 製作開始
              98-06-19 SET5対応
              98-09-16 テクスチャバッファ確保のサイズ変更
              99-04-07 appends the English comments
************************************************************/

#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  /* use only one texture */

static NJS_VERTEX_BUF  *g_VBuf;

/* キャッシュメモリに読み込まれるテクスチャを定義 */
/* texture */
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];

/* スクロール用データ */
/* scroll surface */
#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);   /* scroll rotation */


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

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

void njUserInit (void)
{
    /* 画面モードの決定 */
    /* Initializes the Dreamcast H/W and readies the SEGA library */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);

    /* メモリの割り当て */
    /* allocates the vertex calculation work */
    g_VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof(NJS_VERTEX_BUF) * VERTEX_MAX);

    /* テクスチャバッファの確保 */
    /* sets necessary memory for work area of a texture */
    njInitTextureBuffer((Sint8 *)g_VBuf,0x800*10);

    /* 頂点の最大数分バッファをアロケートする */
    /* allocates the buffers for registration of vertex data */
    njInitVertexBuffer(VERTEX_MAX * 64 / 4, 0, VERTEX_MAX * 64 / 4, 0, 0);

	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /* テクスチャデータ領域を確保 */
    /* sets the area used for storing texture information */
    njInitTexture(g_Texture, TEXTURE_NUM);

    /* テクスチャリストにあるテクスチャデータをテクスチャメモリにロード */
    /* loads the texuter */
    njLoadTexture(&g_TexList);

    /* スクロールのセットアップ */
    /* sets the scroll surface */
    g_Scroll.celps = 128;           /* size of cell */
    g_Scroll.mapw = MAP_CELL_WIDTH; /* map width */
    g_Scroll.maph = MAP_CELL_HEIGHT;/* map height */
    g_Scroll.sw = 0;                
    g_Scroll.sh = 0;                
    g_Scroll.list = &g_TexList;     
    g_Scroll.map = (Uint32 *)g_Map; 
    g_Scroll.px = 0;                /* position x */
    g_Scroll.py = 0;                /* position y */
    g_Scroll.bx = 0;                
    g_Scroll.by = 0;                    
    g_Scroll.pr = -100.0f;          /* priority */
    g_Scroll.sflag = OFF;           /* ignore scaling */
    g_Scroll.mflag = ON;            /* enable rotation */
    g_Scroll.cx = 320.0F;           /* center x */
    g_Scroll.cy = 240.0F;           /* center y */
    g_Scroll.m[0] = njCos(NJM_DEG_ANG(0.0F));/* matrix */
    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; /* color mode */
    g_Scroll.sclc.argb.a = 0xff;     /* Alpha */
    g_Scroll.sclc.argb.r = 0xff;     /* R */
    g_Scroll.sclc.argb.g = 0xff;     /* G */
    g_Scroll.sclc.argb.b = 0xff;     /* B */

    /* 背景を設定 */
    /* sets the background color*/
    njSetBackColor(ARGB(255, 255, 0, 0), 
                        ARGB(255, 0, 255, 0), ARGB(255, 0, 0, 255));

}


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

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

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);
    
    /* スクロールの描画 */
	/* draws scroll surface */
    njDrawScroll(&g_Scroll);

    /* サンプル名の表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(5, 5), "Ninja Sample");
    njPrintC(NJM_LOCATION(5, 7), "Scroll Rotation");
    
    return NJD_USER_CONTINUE;
}


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

    njUserExit --- Ninjaシステム終了関数
	exit
***************************************************************************/

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