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

  タイトル ： スプライト（四角形ポリゴン）を回転，拡大縮小表示する
              sprite (rotation & change size)
  編集履歴 ： 98-04-21 製作開始
              98-04-22 コーディング規約に合わせる
              98-05-12 データをAngle型に統一
              98-05-15 SET2/4切り替えマクロを追加
              98-05-25 SET4コンパイル時のバグを修正
              98-06-19 SET5対応
              98-07-08 C0焼き付き問題に対応（ポーズ追加）
              98-09-16 テクスチャバッファ確保のサイズ変更
              99-04-07 appends the English comments
************************************************************/

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

void main(void)
{
#ifdef __GNUC__
	shinobi_workaround();
#endif
    njSetBorderColor( 0x00000000 );
    njUserInit();
    while (njUserMain() == NJD_USER_CONTINUE) {
        njWaitVSync();
    }
    njUserExit();
}

#define TEXNUM 1
#define MAX_VERTEXES 1000
#define VERTEX_MAX 1000

static NJS_VERTEX_BUF  *VBuf;

/*テクスチャを設定*/
static NJS_TEXNAME Texname[] = {
    {"Sprite.pvr", NJD_TEXATTR_GLOBALINDEX, 0 },
};
static NJS_TEXANIM Texanim[] = {
    {400, 300, 200, 150, 0, 0, 255, 255, 0, 0},
};
static NJS_TEXLIST Texlist = {Texname, TEXNUM};
static NJS_TEXMEMLIST Texmemlist[TEXNUM];

static NJS_SPRITE Sprite;
static NJS_ARGB Argb;

PDS_PERIPHERAL* Per;

void PauseMode(void);

/************************************************************
  初期化
  initialize
************************************************************/
void njUserInit(void)
{
    /*システムを初期化*/
    /* Initializes the Dreamcast H/W and readies the SEGA library */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);

    VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof(NJS_VERTEX_BUF) * VERTEX_MAX);

    /*バックグラウンドカラーを設定*/
    /* sets the background color */
    njSetBackColor(ARGB(0, 150, 0, 0), ARGB(0, 150, 0, 0), ARGB(0, 0, 0, 0));

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

    /*頂点データ登録用バッファをアロケート*/
    /* allocates the buffers for registration of vertex data */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);

	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /*テクスチャ情報を格納する領域を設定*/
    /* sets the area used for storing texture information */
    njInitTexture(Texmemlist, TEXNUM);

    /*テクスチャをロードする*/
    /* load texture */
    njLoadTexture(&Texlist);
    /* カレントテクスチャリストをtexlistにする */
    /* set current texture */
    njSetTexture(&Texlist);

    Sprite.p.x = 160; /* 中心のｘ座標  sprite position x */
    Sprite.p.y = 120; /* 中心のｙ座標  sprite position y */
    Sprite.sx = 0.5F; /* ｘ方向の拡大率 sprite scale x */
    Sprite.sy = 0.5F; /* ｙ方向の拡大率 sprite scale y */
    Sprite.ang = NJM_DEG_ANG(0.0F); /* 回転角度 sprite angle */
    Sprite.tlist = &Texlist;
    Sprite.tanim = Texanim;

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

    /* 乱数の種を設定 */
    njRandomSeed(0);

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

/************************************************************
  定期実行されるメイン処理
  main
************************************************************/
Sint32 njUserMain(void)
{
    static Bool pauseMode = FALSE;

    static Angle ramdaX = NJM_DEG_ANG(0.0F);
    static Angle ramdaY = NJM_DEG_ANG(0.0F);
    static Angle stepX = NJM_DEG_ANG(5.0F);
    static Angle stepY = NJM_DEG_ANG(3.0F);

    Float scaleX;
    Float scaleY;

    /*サンプル名の表示*/
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(6, 5), "Ninja Sample ROT SPRITE 2");
    njPrintC(NJM_LOCATION(6, 7), "Press Start Button To Pause");

    /* ペリフェラルチェック */
    /* gets the peripheral infomation */
    Per = pdGetPeripheral(PDD_PORT_A0);
    if (Per->press & PDD_DGT_ST) { /* スタートボタンが押された */
                                   /* checking key */
        pauseMode = !pauseMode;
    }
    /* ポーズ画面を作る */
    /* pause mode */
    if (pauseMode == TRUE) {
        Argb.r = 0.25F;
        Argb.g = 0.25F;
        Argb.b = 0.25F;

        PauseMode();
    }
    else {
        Argb.r = 0.7F;
        Argb.g = 0.7F;
        Argb.b = 0.7F;
    }

    if (pauseMode == FALSE) { /* 回転角＆拡大率の更新 */
                              /* change sprite angle & scale */
        Sprite.ang += NJM_DEG_ANG(1.0F);
        if (Sprite.ang == NJM_DEG_ANG(0.0F)) {
            stepX = NJM_DEG_ANG((int)(njRandom() * 10.0F) + 2.0F);
            stepY = NJM_DEG_ANG((int)(njRandom() * 10.0F) + 2.0F);
        }
        ramdaX += stepX;
        ramdaY += stepY;
        scaleX = njSin(ramdaX) * 0.5F + 0.7F ;
        scaleY = njCos(ramdaY) * 0.5F + 0.7F ;
        Sprite.sx = scaleX;
        Sprite.sy = scaleY;
    }

    njSetConstantMaterial(&Argb);

    /*２Ｄスプライトの表示*/
    /* draw a sprite */
    njDrawSprite2D(&Sprite, 0, -2.0F, NJD_SPRITE_ANGLE | NJD_SPRITE_COLOR);

    return NJD_USER_CONTINUE;
}

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

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

    interval++;
    if (interval >= 30) {
        display = !display;
        interval = 0;
    }
    if (display == TRUE) {
        njPrintSize(20);
        njPrintC(NJM_LOCATION(5, 4),"PAUSE!");
        njPrintSize(8);
    }
}
