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

*/
#ifndef _NJ_CNK_INTENSITY_H_
#define _NJ_CNK_INTENSITY_H_

typedef enum {
	NJD_CNK_INTENSITY_MODE_DIR,
	NJD_CNK_INTENSITY_MODE_POINT,
	NJD_CNK_INTENSITY_MODE_DIR_POINT
} NJD_CNK_INTENSITY_MODE;

typedef enum {
	NJD_CNK_INTENSITY_LIGHT_0,
	NJD_CNK_INTENSITY_LIGHT_1,
	NJD_CNK_INTENSITY_LIGHT_2,
	NJD_CNK_INTENSITY_LIGHT_3,
	NJD_CNK_INTENSITY_LIGHT_4,
	NJD_CNK_INTENSITY_LIGHT_5,
	NJD_CNK_INTENSITY_LIGHT_6,
	NJD_CNK_INTENSITY_LIGHT_7
} NJD_CNK_INTENSITY_LIGHT;

typedef enum {
	NJD_CNK_INTENSITY_EXP_16,
	NJD_CNK_INTENSITY_EXP_32
} NJD_CNK_INTENSITY_EXP;

typedef struct {
	Float	fZ;						// 3D上のZ座標
	Float	fX;						// スクリーンX座標
	Float	fY;						// スクリーンY座標
	Float	fW;						// スクリーンW座標
	Float	fDiff;					// Base Intensity
	Float	fSpec;					// Offset Intensity
	Float	fNx;					// 法線のX成分
	Float	fNy;					// 法線のY成分
} NJS_CNK_INTENSITY_BUF;

typedef struct {
	NJD_CNK_INTENSITY_MODE eMode;
	Float		fX0;				// 関数でセットされるワーク(Vector/Point)
	Float		fY0;
	Float		fZ0;
	Float		fX1;				// DIR_POINTのときに使うワーク。
	Float		fY1;				// Matrices関数が呼ばれたときに書き込まれる
	Float		fZ1;
	Uint32		pad[1];
} NJS_CNK_INTENSITY_W0;

typedef struct {
	Float		fX;					// 最終的に計算に使うワーク。
	Float		fY;					// DIR/POINTはMatrices関数で書き込まれる
	Float		fZ;					// DIR_POINTのときは階層ごとに書き込まれる
	Float		fFar;				// FARリミッター
	Float		fNear;				// NEARリミッター
	Float		fDiff;
	Float		fSpec;
	Uint32		pad[1];
} NJS_CNK_INTENSITY_W1;

typedef struct {
	Uint32		nFlags;				// %0000 = END/CONT | EXP32/16 | POINT/DIR | ON/OFF
	Float		fDiffR;				// Global Diff Color R
	Float		fDiffG;				// Global Diff Color G
	Float		fDiffB;				// Global Diff Color B
	Float		fOffsDiff;			// ディフューズへ加算する値
	Float		fOffsSpec;			// スペキュラーへ加算する値
	Uint32		nTSP;				// ノンテクスチャ時に張るテクスチャパラメータ
	Uint32		nTCW;				// ノンテクスチャ時に張るテクスチャパラメータ
	Float		fConstDiff;			// 法線なし頂点のときのディフューズ値
	Float		fConstSpec;			// 法線なし頂点のときのスペキュラー値
	Float		fEnvRatioU;			// 環境マップ時のU値の比率
	Float		fEnvRatioV;			// 環境マップ時にV値の比率
	Float		fSpecR;				// Global Spec Color R
	Float		fSpecG;				// Global Spec Color G
	Float		fSpecB;				// Global Spec Color B
	Uint32		pad[1];				// 32 Byte Align
	NJS_CNK_INTENSITY_W1 sW1[8];
	NJS_CNK_INTENSITY_W0 sW0[8];
} NJS_CNK_INTENSITY_WORK;

extern NJS_CNK_INTENSITY_WORK _nj_cnk_intensity_;

void	njCnkIntensityLoadTexture( void );
void	njCnkIntensityReleaseTexture( void );
void	njCnkIntensityLightInit( Uint32 nNum );

void	njCnkSetIntensityLightDiffColor( Float fR, Float fG, Float fB );
void	njCnkSetIntensityLightSpecColor( Float fR, Float fG, Float fB );
void	njCnkSetIntensityLightOffset( Float fOffsSpec, Float fOffsDiff );
void	njCnkSetIntensityLightConst( Float fConstSpec, Float fConstDiff );
void	njCnkSetIntensityLightEnvRatio( Float fU, Float fV );

void	njCnkSetIntensityLightMode( NJD_CNK_INTENSITY_LIGHT eLight, NJD_CNK_INTENSITY_MODE eMode );
void	njCnkSetIntensityLightSwitch( NJD_CNK_INTENSITY_LIGHT eLight, Sint32 bSwitch );
void	njCnkSetIntensityLightVector( NJD_CNK_INTENSITY_LIGHT eLight, Float fX, Float fY, Float fZ );
void	njCnkSetIntensityLightPoint( NJD_CNK_INTENSITY_LIGHT eLight, Float fX, Float fY, Float fZ );
void	njCnkSetIntensityLightExp( NJD_CNK_INTENSITY_LIGHT eLight, NJD_CNK_INTENSITY_EXP eExp );
void	njCnkSetIntensityLightSet( NJD_CNK_INTENSITY_LIGHT eLight, Float fSpec, Float fDiff );
void	njCnkSetIntensityLightRange( NJD_CNK_INTENSITY_LIGHT eLight, Float fNear, Float fFar );

void	njCnkSetIntensityLightMatrices( void );
Sint32  njCnkIntensityDrawModel( NJS_CNK_MODEL *model );
void    njCnkIntensityDrawObject( NJS_CNK_OBJECT *object );

#endif
