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

  タイトル ： スプライト（四角形ポリゴン）に半透明をかける
  編集履歴 ： 98-04-24 製作開始
              98-05-12 コーディング規約に合わせる
              98-05-15 SET2/4切り替えマクロを追加
              98-05-25 SET4コンパイル時のバグを修正
              98-06-19 SET5対応
              98-07-07 C0焼き付き問題に対応（ポーズ追加）
              98-08-20 頂点バッファサイズを変更
              98-09-16 テクスチャバッファ確保のサイズ変更
************************************************************/


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

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

#define SPRITE_NUM 2
#define TEXNUM 2
#define MAX_VERTEXES 200 * 20

static NJS_VERTEX_BUF *VBuf;

/* テクスチャを設定 */
static NJS_TEXNAME Texname[] = {
   /* ファイル名                    アトリビュート                 ＩＤ */
    {"sprite1.pvr", NJD_TEXATTR_GLOBALINDEX, 0},
    {"sprite2.pvr", NJD_TEXATTR_GLOBALINDEX, 1},
};
static NJS_TEXLIST Texlist = {Texname, TEXNUM};
static NJS_TEXANIM Texanim[] = {
   /* サイズ   中心座標  テクスチャＵＶ値 テクスチャＩＤ アトリビュート */
    {400, 300, 200, 150,  0, 0, 255, 255,        0,             0},
    {400, 300, 200, 150,  0, 0, 255, 255,        1,             0},
};
static NJS_TEXMEMLIST Texmemlist[TEXNUM];

static NJS_SPRITE Sprite[SPRITE_NUM];
static NJS_ARGB  Argb;

PDS_PERIPHERAL* Per;

void PauseMode(void);

/************************************************************
  初期化関数
************************************************************/
void njUserInit(void)
{
    /* システムを初期化 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* vertexバッファの確保 */
    VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* バックグラウンドカラーを設定 */
    njSetBackColor(ARGB(0, 128, 0, 128),
        ARGB(0, 128, 0, 128), ARGB(0, 0, 0, 0));
    /* テクスチャバッファの確保 */
    njInitTextureBuffer((Sint8 *)VBuf,0x800*10);
    /* 頂点データ登録用バッファをアロケート */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* テクスチャ情報を格納する領域を設定 */
    njInitTexture(Texmemlist, TEXNUM);
    /* テクスチャをロードする */
    njLoadTexture(&Texlist);

    /* スプライトの特性を設定 */
    Sprite[0].p.x = 120;
    Sprite[0].p.y = 100;
    Sprite[0].sx = 0.5F;
    Sprite[0].sy = 0.5F;
    Sprite[0].ang = NJM_DEG_ANG(0.0F);
    Sprite[0].tlist = &Texlist;
    Sprite[0].tanim = Texanim;
    Sprite[1].p.x = 200;
    Sprite[1].p.y = 150;
    Sprite[1].sx = 0.5F;
    Sprite[1].sy = 0.5F;
    Sprite[1].ang = NJM_DEG_ANG(0.0F);
    Sprite[1].tlist = &Texlist;
    Sprite[1].tanim = Texanim;

    /* モデル、オブジェクトの描画をコントロール */
    njControl3D(NJD_CONTROL_3D_CONSTANT_MATERIAL);
    Argb.r = 1.0F;
    Argb.g = 1.0F;
    Argb.b = 1.0F;

    /* デバッグ文字の色 */
    njPrintColor(ARGB(255, 150, 150, 150));
}

/************************************************************
  定期実行されるメイン処理
************************************************************/
Sint32 njUserMain(void)
{
    /* 以下のブレンディングモードからそれぞれ選択 */
    static const Int blendingModeTable[] = {
        /*  0 */ NJD_COLOR_BLENDING_BOTHINVALPHA,
        /*  1 */ NJD_COLOR_BLENDING_BOTHSRCALPHA,
        /*  2 */ NJD_COLOR_BLENDING_DESTALPHA,
        /*  3 */ NJD_COLOR_BLENDING_DESTCOLOR,
        /*  4 */ NJD_COLOR_BLENDING_INVDESTALPHA,
        /*  5 */ NJD_COLOR_BLENDING_INVDESTCOLOR,
        /*  6 */ NJD_COLOR_BLENDING_INVSRCALPHA,
        /*  7 */ NJD_COLOR_BLENDING_INVSRCCOLOR,
        /*  8 */ NJD_COLOR_BLENDING_SRCALPHA,
        /*  9 */ NJD_COLOR_BLENDING_SRCCOLOR,
        /* 10 */ NJD_COLOR_BLENDING_ONE,
        /* 11 */ NJD_COLOR_BLENDING_ZERO,
    };

    static Bool pauseMode = FALSE;

    Int srcBlendingMode = blendingModeTable[8];
    Int destBlendingMode = blendingModeTable[6];

    static Float step = 0.01F;

    /* サンプル名の表示 */
    njPrintC(NJM_LOCATION(4, 3), "Ninja Sample (Sprite Alpha Blending)");
    njPrintC(NJM_LOCATION(4, 5), "Press Start Button To Pause");

    /* ペリフェラルチェック */
    Per = pdGetPeripheral(PDD_PORT_A0);
    if (Per->press & PDD_DGT_ST) { /* スタートボタンが押された */
        pauseMode = !pauseMode;
    }
    /* ポーズ画面を作る */
    if (pauseMode == TRUE) {
        static NJS_POINT2 pnt[4] = { 0, 0, 640, 0, 640, 480, 0, 480 };
        static NJS_COLOR col[4] = {
            ARGB(150, 0, 0, 0), ARGB(150, 0, 0, 0),
            ARGB(150, 0, 0, 0), ARGB(150, 0, 0, 0),
        };
        static NJS_POINT2COL p2c = { pnt, col, NULL, 4 };

        njColorBlendingMode(0, NJD_COLOR_BLENDING_BOTHSRCALPHA);
        njDrawPolygon2D(&p2c, 4, -1.0F, NJD_FILL | NJD_TRANSPARENT);

        PauseMode();
    }

    /* α値の設定 */
    if (pauseMode == FALSE) {
        Argb.a = Argb.a + step;
        if (Argb.a >= 1.0F || Argb.a <= 0.0F) {
            step = -step;
        }
        /* モデルマテリアルの設定  */
        njSetConstantMaterial(&Argb);
    }

    /* 左上スプライトのブレンディングモードを設定 */
    njColorBlendingMode(NJD_SOURCE_COLOR, blendingModeTable[10]);
    njColorBlendingMode(NJD_DESTINATION_COLOR, blendingModeTable[11]);
    /* ２Ｄスプライト（左上）の表示 */
    njDrawSprite2D(&Sprite[0], 0, -3.0F, NJD_SPRITE_ALPHA | NJD_SPRITE_COLOR);

    /* 右下スプライトのブレンディングモードを設定 */
    njColorBlendingMode(NJD_SOURCE_COLOR, srcBlendingMode);
    njColorBlendingMode(NJD_DESTINATION_COLOR, destBlendingMode);
    /* ２Ｄスプライト（右下）の表示 */
    njDrawSprite2D(&Sprite[1], 1, -2.0F, NJD_SPRITE_ALPHA | NJD_SPRITE_COLOR);

    return NJD_USER_CONTINUE;
}

/************************************************************
  実行終了時に呼び出される終了処理
************************************************************/
void njUserExit(void)
{
	njExitPrint();
    njExitTexture();
    syFree(VBuf);
    sbExitSystem();
}

/************************************************************
  ポーズ時に呼び出される処理
************************************************************/
void PauseMode(void)
{
    static Sint16 interval = 0;
    static Bool display = TRUE;

    interval++;
    if (interval >= 30) {
        display = !display;
        interval = 0;
    }
    if (display == TRUE) {
        njPrintSize(16);
        njPrintC(NJM_LOCATION(7, 6),"PAUSE!");
        njPrintSize(8);
    }
}
