/*==============================================
    Ninja Sample

    COPYRIGHT (C) SEGA ENTERSRISES,LTD.

    チャンクモデルをフラットシェーディングに変換する

    1998.10.2
================================================*/
#include <shinobi.h>
#include <njdef.h>
#include "flatconv.h"

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

#define MAX_MATRIX_DEPTH 10
#define MAX_VERTEXES 10000
static NJS_MATRIX *Matrix;
static NJS_VERTEX_BUF *VertexBuffer;

static NJS_CAMERA c1;
const PDS_PERIPHERAL* per;

/* オブジェクトデータ読み込み用 */
static Sint8 *w_buff;
static NJS_CNK_OBJECT *obj;

/* フラットシェーディング用 */
#define	VNUM	111		/* 変換後の頂点数 */
static void *vlst;

/*----------------------------------------------------------------------
           初期化
----------------------------------------------------------------------*/
void njUserInit(void)
{
	/* ファイル読み込み用 */
	GDFS fid;
	Sint32 sn;
	Uint32 rtype, rpos = 0;
	/* フラットシェーディングへのコンバート用 */
	NJS_CNK_MODEL *mp;

    /* システムの初期化 */
    sbInitSystem(NJD_RESOLUTION_640x480_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* 画面のアスペクト比を設定 */
    njSetAspect( 1.0F, 0.91F );
    /* メモリ割り当て */
    Matrix = syMalloc(sizeof(NJS_MATRIX) * MAX_MATRIX_DEPTH);
    VertexBuffer   = syMalloc(sizeof(NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* 背景色の設定 */
    njSetBackColor(ARGB(0, 0, 0, 192), ARGB(0, 0, 0, 192), ARGB(0, 0, 0, 192));
    /* 頂点格納バッファの確保 */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* マトリクススタックの初期化 */
    njInitMatrix(Matrix, MAX_MATRIX_DEPTH, 1);
    /* 3Dシステムの初期化 */
    njInit3D(VertexBuffer, MAX_VERTEXES);
    njControl3D( NJD_CONTROL_3D_MODEL_CLIP);

	/* カメラの初期化 */
	njInitCamera(&c1);
	njSetCamera(&c1);

	/* 文字色の設定 */
	njPrintColor(0xFFC0C0C0);
	/* 表示位置の調整 */
	njAdjustDisplay(0,8);

	njClipZ(-1.f, -20000.f);

	njPrintSize(16);

    /* ライトの設定 */
	njCnkSetEasyLight( 0.f, 0.f, 1.0f );
	njCnkSetEasyLightIntensity( 1.0f, 0.0f );
	njCnkSetEasyLightColor( 1.0f, 1.0f, 1.0f );

	/* オブジェクトファイルのロード */
	fid = gdFsOpen("sphere1.nj", NULL);
	gdFsGetFileSctSize(fid, &sn);
	w_buff = (Sint8 *)syMalloc(sn*2048+8);
	gdFsRead(fid, sn, w_buff);
	gdFsClose(fid);
	obj = (NJS_CNK_OBJECT *)njReadBinary(w_buff, &rpos, &rtype);

	/* フラットシェーディングになるように法線データをコンバートする */
	mp = obj->model;
	/* チャンクヘッダの分と、変換後の頂点数が格納できる領域を確保する。 */
    vlst = syMalloc(sizeof(Sint32)*2 + sizeof(NJS_VERTEX_CHUNK) * VNUM );
	njCnkFlatConvert(mp, (void *)vlst, 0.0001f);
}

/*----------------------------------------------------------------------
         メイン
----------------------------------------------------------------------*/
Sint32 njUserMain(void)
{
static Float oz = -25.f;
static Angle rx, ry, rz;

	njPrintC(NJM_LOCATION(4,4), "CHUNK FLAT SHADING SAMPLE");

	njPushMatrix(NULL);
	    njTranslate(NULL, 0.F, 0.0F, oz);

		ry += NJM_DEG_ANG(1);
		rx += NJM_DEG_ANG(1);
		rz += NJM_DEG_ANG(1);
	    njRotateXYZ(NULL, rx, ry, rz);

	    njCnkEasyDrawObject(obj);
	njPopMatrix(1);
    return NJD_USER_CONTINUE;
}

/*----------------------------------------------------------------------
         終了処理
----------------------------------------------------------------------*/
void njUserExit(void)
{
    /* メモリの開放 */
	syFree(vlst);
	syFree(obj);
	syFree(w_buff);
    syFree(Matrix);
    syFree(VertexBuffer);
    /* システムの終了 */
    njExitPrint();
    sbExitSystem();
}