/*
	Ninja Library
	
	COPYRIGHT ( C ) SEGA ENTERPRISES, LTD.
*/
#include "NuMotionMake.h"

/****************************************************************/
/*																*/
/*	NINJA MOTION関数											*/
/*																*/
/*	Copyright ( C ) 1997 Sega 									*/
/*	Produced by Sega, SystemR&D 								*/
/*																*/
/*	Create 2000-06-15 SEGA System R&D							*/
/*																*/
/****************************************************************/

/*************************   公開関数   *************************/
void nuSetLight( Int light_num, NJS_LIGHT *light )
{
	switch(light->func){
	case NJD_MFUNC_UNDEFINE:
		break;
	case NJD_MFUNC_EASY:
		njCnkSetEasyLight( light->x, light->y, light->z);
		njCnkSetEasyLightColor( light->r, light->g, light->b );
		njCnkSetEasyLightIntensity( light->f1, light->f2);
		break;
	case NJD_MFUNC_SIMPLE:
		njCnkSetSimpleLight( light->x, light->y, light->z);
		njCnkSetSimpleLightColor( light->r, light->g, light->b );
		njCnkSetSimpleLightIntensity( light->f1, light->f2);
		break;
	case NJD_MFUNC_EASY_MULTI:
		switch(light->type){
		case NJD_LTYPE_POINT:
			njCnkSetEasyMultiLightPoint( light_num, light->x, light->y, light->z);
			njCnkSetEasyMultiLightColor( light_num, light->r, light->g, light->b );
			njCnkSetEasyMultiLightRange( light_num, light->f1, light->f2);
			break;
		case NJD_LTYPE_VECTOR:
			njCnkSetEasyMultiLightVectorEx(light_num, light->x, light->y, light->z);
			njCnkSetEasyMultiLightColor( light_num, light->r, light->g, light->b );
			break;
		case NJD_LTYPE_AMBIENT:
			njCnkSetEasyMultiAmbient( light->r, light->g, light->b );
			break;
		}
		break;
	case NJD_MFUNC_SIMPLE_MULTI:
		switch(light->type){
		case NJD_LTYPE_POINT:
			njCnkSetSimpleMultiLightPoint( light_num, light->x, light->y, light->z);
			njCnkSetSimpleMultiLightColor( light_num, light->r, light->g, light->b );
			njCnkSetSimpleMultiLightRange( light_num, light->f1, light->f2);
			break;
		case NJD_LTYPE_VECTOR:
			njCnkSetSimpleMultiLightVectorEx(light_num, light->x, light->y, light->z);
			njCnkSetSimpleMultiLightColor( light_num, light->r, light->g, light->b );
			break;
		case NJD_LTYPE_AMBIENT:
			njCnkSetSimpleMultiAmbient( light->r, light->g, light->b );
			break;
		}
		break;
	}
}


/*
	func:	指定されたフレームのライトモーションの位置や方向などを取得する。
	
	in:		light	= 補完データが無い場合のデフォルトのデータを指定する。
			data	= 位置や方向データを取得する領域を指定する。
	
	注意:	モーション情報は０番スロットが使用される。
*/
void nuGetLightMotion( const NJS_LIGHT *light, const NUS_MOTION *motion, NUS_LMOTION_DATA *data, Float frame )
{
	Uint32				data_type;
	Float				*pPos	= data->pos;
	Float				*pRgb	= data->rgb;
	Float				*pRange	= data->rang;
	
	nuSetCurMotionInfoSlot( 0 );
	
	nuStartMotionEx( motion, frame );
	
	
	data_type			= _nu_motinfo_ptr_->type;
	
	
	if (( data_type & NUD_MTYPE_POS_0 ) || ( data_type & NUD_MTYPE_VEC_0 )){
		//	ライトの位置のモーション
		if ( !_nuGetMotionFloat3( pPos ) ) {
			pPos[0]	= light->x;
			pPos[1]	= light->y;
			pPos[2]	= light->z;
		}
		
	}
	else{
		pPos[0]	= light->x;
		pPos[1]	= light->y;
		pPos[2]	= light->z;
	}
	
	if (( data_type & NUD_MTYPE_ANG_1 ) || ( data_type & NUD_MTYPE_SANG_1 ) || ( data_type & NUD_MTYPE_QUAT_1 )){
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}
	if ( data_type & NUD_MTYPE_SCL_2 ) {
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}
	if (( data_type & NUD_MTYPE_VEC_3 ) || ( data_type & NUD_MTYPE_TARGET_3 )){
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}
	if ( data_type & NUD_MTYPE_EVENT_4 ) {
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}
	/* 5 */
	if ( data_type & NUD_MTYPE_ROLL_6 ) {
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}
	if ( data_type & NUD_MTYPE_ANGLE_7 ) {
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}

	if ( data_type & NUD_MTYPE_RGB_8 ) {
		//	ライトのカラーのモーション
		if ( !_nuGetMotionFloat3( pRgb ) ) {
			pRgb[0]	= light->r;
			pRgb[1]	= light->g;
			pRgb[2]	= light->b;
		}
	}
	else{
			pRgb[0]	= light->r;
			pRgb[1]	= light->g;
			pRgb[2]	= light->b;
	}
	
	if (( data_type & NUD_MTYPE_INTENSITY_9 ) || ( data_type & NUD_MTYPE_POINT_9 )){
		if ( !_nuGetMotionFloat2( pRange ) ) {
			pRange[0]	= light->f1;
			pRange[1]	= light->f2;
		}
	}
	else {
			pRange[0]	= light->f1;
			pRange[1]	= light->f2;
	}
	
}

/*
	func:	ライトモーションを実行する。
			ただし、func,typeによって設定される関数が異なる
			・ライトポジションが設定される。
			・ライトベクトルが設定される。
			・ライトカラーが設定される。
			・インテンシティ、アンビエントが設定される。
			・ライト範囲(nrange,frange)が設定される。
	
	in:		light_num	= Multiの時はライトの番号を入れる
			light		= 補完データが無い場合のデフォルトのデータを指定する。
			motion		= ライトモーション
			frame		= フレーム番号
			
	注意:	モーション情報は０番スロットが使用される。
			MultiLightSwitch,MultiLightMatricesは実行していません
*/
void nuLightMotion( Int light_num, const NJS_LIGHT *light, const NUS_MOTION *motion, Float frame )
{
	NJS_LIGHT dst_light;
	NUS_LMOTION_DATA data;
	
	//	補完データの取得
	data.pos = &dst_light.x;
	data.rgb = &dst_light.r;
	data.rang = &dst_light.f1;
	
	nuGetLightMotion( light, motion, &data, frame );

	/*
		・ライトモーションの内容を反映させる
	*/
	dst_light.func = light->func;
	dst_light.type = light->type;
	nuSetLight( light_num, &dst_light );

}


void nuLightAction( Int light_num, const NUS_LACTION *laction, Float frame )
{
	nuLightMotion( light_num, laction->light, laction->motion, frame );
}

void nuGetLightAction( const NUS_LACTION *laction, NUS_LMOTION_DATA *data, Float frame )
{
	nuGetLightMotion( laction->light, laction->motion, data, frame );
}

/*
	func:	マルチライトモーションを実行する。
	in:		mlight		= NUS_MLIGHT_MOTION構造体に複数のライトを設定する
			frame		= フレーム番号
			
	注意:	モーション情報は０番スロットが使用される。
			MultiLightSwitchは内部で実行します。
			使用関数（EasyMulti、SimpleMulti）の判定はmlight->lights[0]->funcで行います。
*/
void nuMultiLightMotion(const NUS_MLIGHT_MOTION *mlight,Float frame)
{
	Int i;
	Int l = 0;

	for(i = 0;i < mlight->n;i++){
		if(mlight->lights[i]->type != NJD_LTYPE_AMBIENT){
			l++;
		}
		nuLightMotion( l, mlight->lights[i], mlight->motions[i], frame );
	}
		
	switch(mlight->lights[0]->func){
	case NJD_MFUNC_EASY_MULTI:
		njCnkSetEasyMultiLightSwitch(NJD_CNK_EASY_MULTILIGHT_ALL, NJD_LIGHT_ON);
		break;
	case NJD_MFUNC_SIMPLE_MULTI:
		njCnkSetSimpleMultiLightSwitch(NJD_CNK_SIMPLE_MULTILIGHT_ALL, NJD_LIGHT_ON);
		break;
	}

}
