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

  タイトル ： 環境マッピングを施す
  編集履歴 ： 98-05-01 製作開始
              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 MATRIX_DEPTH    12
#define VERTEX_MAX      4096

/* 外部定義モデル */
/* model data */
extern NJS_OBJECT object_sphere[];

/* 3D関連データ */
/* 3D data */
static NJS_MATRIX     *g_Matrix;   /* マトリクススタック */
                                   /* matrix stack */
static NJS_VERTEX_BUF *g_VBuf;     /* 頂点バッファ */
                                   /* vertex buffer */

static NJS_VIEW    g_View;  /* 視点 */
                            /* view point */
static NJS_LIGHT   g_Light; /* 光源 */
                            /* light source */

/* テクスチャデータ */
/* texture data */
#define TEXTURE_NUM  1  /* テクスチャデータの数 */
                        /* the number of texture data */
/* キャッシュメモリに読み込まれるテクスチャを定義 */
/* defines the textuer data that loads to the cache memory */
static NJS_TEXNAME g_TexName[] = {"reflect.pvr", NJD_TEXATTR_GLOBALINDEX, 0};
static NJS_TEXLIST g_TexList   = {g_TexName, TEXTURE_NUM};
static NJS_TEXMEMLIST g_Texture[TEXTURE_NUM];

/* ポーズ判定フラグ */
/* pause flag */
Bool g_bPause = FALSE;

/* ポーズ時処理関数 */
/* pause founction */
void PausePhase(void);

/* アクティブ時処理関数 */
/* main function */
void ActivePhase(void);


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

	njSetBorderColor( 0x00000000 );
    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);

    /* テクスチャバッファの確保 */
    /* 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 );

    /* マトリクススタックの初期化 */
  	/* initializes the matrix stack */
    njInitMatrix(g_Matrix, MATRIX_DEPTH, 1);

    /* 演算用頂点バッファの確保 */
    /* initializes 3D system  */ 
    njInit3D(g_VBuf, VERTEX_MAX);

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

    /* ライトの初期化 */
    /* initializes the light source */
    njCreateLight(&g_Light, NJD_SPEC_DIR);
    njSetLightIntensity(&g_Light, 0.2F, 1.0F, 0.4F);

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

    /* テクスチャのロードとセットアップ */
    /* loads and sets up the texture */
     
    njInitTexture(g_Texture, TEXTURE_NUM);  /* テクスチャデータ領域を確保 */
                                            /* sets the area used for storing texture information */
    njLoadTexture(&g_TexList);  /* テクスチャリストにあるテクスチャデータを*/
                                /* キャッシュメモリにロード */
                                /* loads the texture to cache memory */
    njSetTexture(&g_TexList);   /* カレントテクスチャリストを設定 */
                                /* sets current texture list */

    /* モデルのアトリビュートを環境マップするように変更 */
    /* sets model attributes "environment mapping" */
    njControl3D( NJD_CONTROL_3D_CONSTANT_ATTR );
    njSetConstantAttr( 0xffffffff, NJD_FLAG_USE_TEXTURE | NJD_FLAG_USE_ENV 
                                | NJD_FILTER_BILINEAR | NJD_FLAG_USE_FLAT);

	/* テキストのカラーを設定 */
	/* sets the text color */
	njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));
}


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

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

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

Sint32 njUserMain(void)
{
    PDS_PERIPHERAL *per;

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

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

	/* ポーズ状態によって処理を切り替える */
	/* pause or not */
	if (!g_bPause) {
		ActivePhase();
	} else {
		PausePhase();
	}

    /* デバッグ情報表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(23, 5), "Ninja Sample ENVIRONMENT MAPPING");

    return NJD_USER_CONTINUE;
}


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

    ActivePhase --- アクティブ時処理関数

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

void ActivePhase(void)
{
    static Angle ang = NJM_DEG_ANG(0.0F);

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

    /* 移動処理 */
    /* translate */
    njTranslate(NULL, 0.0F, 0.0F, -5.0F); 
    
    /* 回転処理 */
    /* rotate */
    ang += NJM_DEG_ANG(1.0F);
    njRotateXYZ(NULL, ang, ang, ang);

    /* 描画 */
    /* draw */
    njDrawObject(object_sphere);
}


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

    PausePhase --- ポーズ時処理関数

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

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

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

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

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

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

    njPrintC(NJM_LOCATION(38, 30), "PAUSE");
}


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

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

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

void njUserExit(void)
{
    /* メモリの開放 */
	/* frees the memory area */
    syFree(g_Matrix);
    syFree(g_VBuf);

    /* テクスチャ終了処理 */
	/* exits texture use  */
	njExitPrint();
    njExitTexture();

    /*  システムの終了処理を行います */
    /* exits the system    */
    sbExitSystem();
}
