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

  タイトル ： バイリニアフィルタを設定する
              uses the bilinear filter
  編集履歴 ： 98-04-28 製作開始
              98-06-19 SET5対応
              98-09-16 テクスチャバッファ確保のサイズ変更
              99-04-05 appends the English comments
************************************************************/

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

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


/* グローバルデータセクション */
/* Global Data                */
#define VERTEX_MAX      1028
#define MATRIX_DEPTH    12

/* 3D関連データ */
/* 3D Data      */
static NJS_MATRIX      *g_Matrix;
static NJS_VERTEX_BUF  *g_VBuf;

static NJS_VIEW    g_View;
static NJS_LIGHT   g_Light;

/* 頂点データ  */
/* Vertex Data */
static NJS_POINT3COL  g_PointCol;
static NJS_POINT3     g_Point[4];
static NJS_COLOR      g_Color[4];
static NJS_COLOR      g_UV[4];

/* テクスチャデータ */
/* Texture Data     */
#define TEXTURE_NUM 1
#define TEXTURE_BUFFER_SIZE 0x800*10

Sint8   g_TexBuf[TEXTURE_BUFFER_SIZE];
static NJS_TEXNAME    texname = {"tex.pvr", NJD_TEXATTR_GLOBALINDEX, 0};
static NJS_TEXLIST    texlist = {&texname, TEXTURE_NUM};
static NJS_TEXMEMLIST tex[TEXTURE_NUM];

/* ポーズ処理関数 */
/* function for PAUSE */
void PauseProc(void);

/* ポーズ用フラグ */
/* flag for PAUSE */
Bool g_bPause = FALSE;

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

    njUserInit --- Ninjaシステム初期化関数

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

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

    /* ＮＴＳＣ画面の縦横比を補正 */
	/* corrects the screen aspect ratio */
    njSetAspect(1.0F, 0.45F);


    /* メモリの割り当て */
    /* allocates the memory */
    g_Matrix = (NJS_MATRIX *)syMalloc(sizeof(NJS_MATRIX) * MATRIX_DEPTH);
    g_VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof(NJS_VERTEX_BUF) * VERTEX_MAX);

    /* テクスチャのバッファを確保 */
    /* allocates the buffers for registration of vertex data */
    njInitTextureBuffer((Sint8 *)g_TexBuf,TEXTURE_BUFFER_SIZE);

    /* 頂点バッファの確保 */
    /* 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 );

    /* 3Dシステム初期化 */
    /* initializes 3D system  */ 
    njInitMatrix(g_Matrix, MATRIX_DEPTH, 1);
    njInit3D(g_VBuf, VERTEX_MAX);

    /* ビューの初期化 */
    /* initializes the user-defined view */
    njInitView(&g_View);
    njSetView(&g_View);

    /* ライトの初期化 */
    /* creates the light source */
    njCreateLight(&g_Light, NJD_LAMBERT_DIR);

    /* テクスチャの初期化 */
    /* initializes the texture */
    njInitTexture(tex, TEXTURE_NUM);
    njLoadTexture(&texlist);
    njSetTexture(&texlist);
    njSetTextureNum(0);

    /* 頂点データの初期化 */
    /* sets the vertex data */
    g_PointCol.p   = g_Point;
    g_PointCol.col = g_Color;
    g_PointCol.tex = g_UV;
    g_PointCol.num = 4;
    
    g_Point[0].x = -1.0F;
    g_Point[0].y =  1.0F;
    g_Point[0].z =  0.0F;
    g_UV[0].tex.u = 0;
    g_UV[0].tex.v = 0;
    g_Color[0].argb.a = 0xff;
    g_Color[0].argb.r = 0xff;
    g_Color[0].argb.g = 0xff;
    g_Color[0].argb.b = 0xff;

    g_Point[1].x = -1.0F;
    g_Point[1].y = -1.0F;
    g_Point[1].z =  0.0F;
    g_UV[1].tex.u = 0;
    g_UV[1].tex.v = 0xff;
    g_Color[1].argb.a = 0xff;
    g_Color[1].argb.r = 0xff;
    g_Color[1].argb.g = 0xff;
    g_Color[1].argb.b = 0xff;

    g_Point[2].x =  1.0F;
    g_Point[2].y = -1.0F;
    g_Point[2].z =  0.0F;
    g_UV[2].tex.u = 0xff;
    g_UV[2].tex.v = 0xff;
    g_Color[2].argb.a = 0xff;
    g_Color[2].argb.r = 0xff;
    g_Color[2].argb.g = 0xff;
    g_Color[2].argb.b = 0xff;

    g_Point[3].x =  1.0F;
    g_Point[3].y =  1.0F;
    g_Point[3].z =  0.0F;
    g_UV[3].tex.u = 0xff;
    g_UV[3].tex.v = 0;
    g_Color[3].argb.a = 0xff;
    g_Color[3].argb.r = 0xff;
    g_Color[3].argb.g = 0xff;
    g_Color[3].argb.b = 0xff;

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

    /* デバッグの文字色を設定 */
  	/* sets the color of debug printing */
    njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));
}


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

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

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

Sint32 njUserMain(void)
{
    NJS_PERIPHERAL* per;
    static Angle ang = NJM_DEG_ANG(0.0F);
    static int time = 0;

    /* ジョイスティックポートペリフェラル情報を取得 */
    /* gets the peripheral information              */
    per = njGetPeripheral(NJD_PORT_A0);    

    /* ボタンが押されたかどうかチェック */
    /* checks the START button          */
    if (per->press & NJD_DGT_ST) {
        g_bPause = !g_bPause;
    }

    /* ポーズじゃないなら */
    /* not pause ?        */
    if (!g_bPause) {
        /* ５秒ごとにテクスチャフィルタモードを切り替える */
        /* changes the texture filter every 5 minitus     */
        if (++time > 600) {
            time = 0;
        }
        if (time < 300) {
            njTextureFilterMode(NJD_TEXTUREFILTER_BILINEAR);
            njPrintC(NJM_LOCATION(30, 23), "Bilinear Filter = ON");
        } else {
            njTextureFilterMode(NJD_TEXTUREFILTER_POINT_SAMPLE);
            njPrintC(NJM_LOCATION(30, 23), "Bilinear Filter = OFF");
        }

        /* マトリクスのクリア */
        /* clears the matrix stack */
        njClearMatrix();

        /* 移動処理  */
        /* translate */
        njTranslate(NULL, 0.0F, 0.0F, -5.0F); 

        /* 回転処理 */
        /* roteate  */
        ang += NJM_DEG_ANG(1.0F); 
        njRotateXYZ(NULL, NJM_DEG_ANG(0.0), ang, NJM_DEG_ANG(0.0));
    /* ポーズなら */
    /* pause ?    */
    } else {
        PauseProc();
        njPrintC(NJM_LOCATION(38, 25), "PAUSE");
    }

    /* 描画 */
    /* Draw */
    njDrawPolygon3D(&g_PointCol, 4, NJD_FILL | NJD_USE_TEXTURE);

    /* デバッグ情報表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(23, 4), "Ninja Sample BI-LINEAR FILTER");

    return NJD_USER_CONTINUE;
}


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

    PauseProc --- ポーズ処理関数

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

void PauseProc(void)
{
    NJS_POINT2COL pc;
    NJS_POINT2    p[4];
    NJS_COLOR     col[4];
        
    /* 半透明用スプライトの設定 */
    /* sets the translucent splits */
    pc.p   = p;
    pc.col = col;
    pc.tex = NULL;
    pc.num = 4;
    
    p[0].x = 0;
    p[0].y = 0;
    col[0].color = 0xc0000000;

    p[1].x = 0;
    p[1].y = 480;
    col[1].color = 0xc0000000;

    p[2].x = 640;
    p[2].y = 480;
    col[2].color = 0xc0000000;

    p[3].x = 640;
    p[3].y = 0;
    col[3].color = 0xc0000000;

    /* 半透明ポリゴンの描画 */
    /* draws the translucent polygons */
    njDrawPolygon2D(&pc, 4, -2.0F, NJD_TRANSPARENT | NJD_FILL);
}


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

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

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

void njUserExit(void)
{
	njExitPrint();
    njExitTexture();

    /* メモリの開放 */
   	/* frees the memory area */
    syFree(g_Matrix);
    syFree(g_VBuf);
    
    /* システム終了処理関数 */
    /* exits the system    */
    sbExitSystem();
}
