/*
	Ninja Sample

	COPYRIGHT (C) SEGA ENTERSRISES,LTD.

	Multilight Sample

	1998.9.08
*/

#include <Shinobi.h>
#include <Nindows.h>

#define	OBJECT	object_tea_Teapot1E_Teapot1E

extern NJS_CNK_OBJECT OBJECT[];
extern NJS_MATRIX	matrix[8];
extern NJS_VERTEX_BUF	vbuf[4096];

NJS_TEXMEMLIST	tex[10];
NJS_VIEW	view;
NJS_PERIPHERAL *per;

Sint32	xx,yy,zz = 0;

void njUserInit(void)
{
	/* ボーダーカラーを黒にセットする */
	njSetBorderColor(0x00000000);
	sbInitSystem( NJD_RESOLUTION_640x480_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1 );
	/* 2Vレーテンシモード */
	njInitVertexBuffer( -800000, 0, 200000, 0 ,0);
	/* デバッグプリントの初期化 */
	njInitPrint(NULL,0,0);
	njInitMatrix( matrix, 8 , 0);
	njInit3D( vbuf, 4096 );
	njInitView( &view );
	njSetView( &view );

	/*Nindowsで使用するテクスチャ分*/
	njInitTexture( tex, 10 );
	nwInitSystem(10,NJD_PORT_B0);

	njControl3D( NJD_CONTROL_3D_CONSTANT_ATTR );
	njSetConstantAttr( 0xffffffff, NJD_FLAG_USE_TEXTURE | NJD_FLAG_USE_ENV|NJD_FILTER_BILINEAR);

	njSetBackColor(0x00000000,0x00000000,0x000000FF);

	njPrintSize(16);
	
	/* チャンクライトの個数の設定              *
	 * （内部で光源設定キューを持たないので    *
	 *   個数とライトの種類は以下のように      *
	 *   関連します。                     ）   *
	 *                                         *
	 * 1:平行光源１                            *
	 * 2:平行光源１+点光源２                   *
	 * 3:平行光源１+点光源２+点光源３          *
	 * 4:平行光源１+点光源２+点光源３+点光源４ *
	 *                                         */
	 
	njCnkSetEasyMultiLight(4);

	/* チャンクライトの平行光源（一番目の光源）方向設定 */
	njCnkSetEasyMultiLightVector(0.f, 0.f, -1.f);

	/* チャンクライトの点光源位置設定 */
	/* ２番目の光源（点光源）の設定 */
	njCnkSetEasyMultiLightPoint(NJD_CNK_EASY_MULTILIGHT_2, 0.f, 0.f, -12.f);
	/* ３番目の光源（点光源）の設定 */
	njCnkSetEasyMultiLightPoint(NJD_CNK_EASY_MULTILIGHT_3, 0.f, 0.f, -12.f);
	/* ４番目の光源（点光源）の設定 */
	njCnkSetEasyMultiLightPoint(NJD_CNK_EASY_MULTILIGHT_4, 0.f, 0.f, -12.f);

	/* チャンクライトの点光源範囲（距離）設定 */
	njCnkSetEasyMultiLightRange(NJD_CNK_EASY_MULTILIGHT_2, 6.f, 40.f);
	njCnkSetEasyMultiLightRange(NJD_CNK_EASY_MULTILIGHT_3, 6.f, 40.f);
	njCnkSetEasyMultiLightRange(NJD_CNK_EASY_MULTILIGHT_4, 6.f, 40.f);

	/* チャンクライトのアンビエント色設定 */
	njCnkSetEasyMultiAmbient(0.1f, 0.1f, 0.1f);

	/* チャンクライトの光源色設定 */
	njCnkSetEasyMultiLightColor(NJD_CNK_EASY_MULTILIGHT_1, 0.6f, 0.5f, 0.3f);
	njCnkSetEasyMultiLightColor(NJD_CNK_EASY_MULTILIGHT_2, 1.f, 0.5f, 0.5f);
	njCnkSetEasyMultiLightColor(NJD_CNK_EASY_MULTILIGHT_3, 0.5f, 1.f, 0.5f);
	njCnkSetEasyMultiLightColor(NJD_CNK_EASY_MULTILIGHT_4, 0.5f, 0.5f, 1.f);
}

#define RANGE	10
#define LTNUM	10
Sint32 njUserMain(void)
{
	static int _num = 0;
	static int _stop = 1;
	static int _lt_1[LTNUM]={1,0,1,0,0,0,0,0,0,0};
	static int _lt_2[LTNUM]={1,0,0,1,0,0,1,1,0,1};
	static int _lt_3[LTNUM]={1,0,0,0,1,0,1,0,1,1};
	static int _lt_4[LTNUM]={1,0,0,0,0,1,0,1,1,1};
	static char *_name[LTNUM]=
	{
		"ALL", "OFF", "DIR", "PT1", "PT2", "PT3", "P12", "P13", "P23", "P123",
	};
	
	per = (PDS_PERIPHERAL *) njGetPeripheral(NJD_PORT_A0);
	if( per->press & NJD_DGT_TA ) {
		_num++;
		_num %= LTNUM;

		/* チャンクライトのＯＮ・ＯＦＦ設定               *
		 * （ＯＮ：１、ＯＦＦ：０）                       *
		 *  この関数は、NJD_CNK_EASY_MULTILIGHT_ALLフラグ *
		 *  を設定できます。これにより設定されたすべての  *
		 *  ライトを切り換えれます。                      */
		 
		if (!_num) njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_ALL, 1);
		if (_num==1) njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_ALL, 0);
		else {
			njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_1, _lt_1[_num]);
			njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_2, _lt_2[_num]);
			njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_3, _lt_3[_num]);
			njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_4, _lt_4[_num]);
		}
	}
	
	njClearMatrix();
	{
		NJS_POINT3 p1,p2,p3;
		static int a1,a2,a3;
		
		a1 += 0x100;
		a2 += 0x200;
		a3 += 0x300;
		
		p1.x = RANGE * njCos(a1);
		p1.y = RANGE * njSin(a1);
		p1.z = -12.f;
		
		p2.x = RANGE * njCos(a2);
		p2.y = 0.f;
		p2.z = -12.f + RANGE * njSin(a2);
		
		p3.x = 0.f;
		p3.y = RANGE * njSin(a3);
		p3.z = -12.f + RANGE * njCos(a3);
		
		njCnkSetEasyMultiLightPoint(NJD_CNK_EASY_MULTILIGHT_2, p1.x, p1.y, p1.z);
		njCnkSetEasyMultiLightPoint(NJD_CNK_EASY_MULTILIGHT_3, p2.x, p2.y, p2.z);
		njCnkSetEasyMultiLightPoint(NJD_CNK_EASY_MULTILIGHT_4, p3.x, p3.y, p3.z);
		
		/* チャンクライトの方向・位置の反映              *
		 * この関数は、基本的にビュー・カメラの設定後に  *
		 * 設定してください。（例：njClearMatrixの後等） *
		 * これより前に設定されたすべてのライトの位置・  *
		 * 方向を反映させます。                          */
		 
		njCnkSetEasyMultiLightMatrices();
	}

	njTranslate( NULL, 0.f, 0.f, -12.f );
	njRotateXYZ( NULL, xx,yy,zz );
	njCnkEasyMultiDrawObject( OBJECT );
	
	if (_stop) {
		xx += 257;
		yy += 179;
		zz += 193;
	}
	
	njPrint(NJM_LOCATION(2,2), "PUSH A:CHANGE LIGHT");
	njPrint(NJM_LOCATION(2,3), "LIGHT : %s", _name[_num]);
	
	if(per->press & NJD_DGT_ST){
		_stop ^= 1;
	}

	return nwExecute();
}

void njUserExit(void)
{
	/* デバッグプリントの終了 */
	njExitPrint();
	nwExitSystem();
	njExitTexture();
	sbExitSystem();
}

