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

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

/*************************   公開関数   *************************/

/*
	func:	指定されたフレームのカメラモーションの位置や方向などを取得する。
	
	in:		camera	= 補完データが無い場合のデフォルトのデータを指定する。
			data	= 位置や方向データを取得する領域を指定する。
	
	注意:	モーション情報は０番スロットが使用される。
*/
void nuGetCameraMotion( const NJS_CAMERA *camera, const NUS_MOTION *motion, NUS_CMOTION_DATA *data, Float frame )
{
	Uint32				data_type;
	Float				*pPos	= data->pos;
	Float				*pVect	= data->vect;
	Sangle				*pRoll	= data->roll;
	Sangle				*pAng	= data->ang;
	
	
	nuSetCurMotionInfoSlot( 0 );
	
	nuStartMotionEx( motion, frame );
	
	
	data_type			= _nu_motinfo_ptr_->type;
	
	
	if ( data_type & NUD_MTYPE_POS_0 ) {
		//	カメラの位置のモーション
		if ( !_nuGetMotionFloat3( pPos ) ) {
			pPos[0]	= camera->px;
			pPos[1]	= camera->py;
			pPos[2]	= camera->pz;
		}
	}
	else {
		pPos[0]	= camera->px;
		pPos[1]	= camera->py;
		pPos[2]	= camera->pz;
	}
	
	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_TARGET_3 ) {
		//	ターゲットのモーション
		if ( _nuGetMotionFloat3( pVect ) ) {
			pVect[0]	-= pPos[0];
			pVect[1]	-= pPos[1];
			pVect[2]	-= pPos[2];
		}
		else {
			pVect[0]	= camera->vx;
			pVect[1]	= camera->vy;
			pVect[2]	= camera->vz;
		}
	}
	else if ( data_type & NUD_MTYPE_VEC_3 ) {
		//	視線ベクトルのモーション
		if ( !_nuGetMotionFloat3( pVect ) ) {
			pVect[0]	= camera->vx;
			pVect[1]	= camera->vy;
			pVect[2]	= camera->vz;
		}
	}
	else {
		pVect[0]	= camera->vx;
		pVect[1]	= camera->vy;
		pVect[2]	= camera->vz;
	}
	if ( data_type & NUD_MTYPE_EVENT_4 ) {
		_nu_motinfo_ptr_->cnt++;		//SKIP
	}

	/* 5 */
	
	if ( data_type & NUD_MTYPE_ROLL_6 ) {
		//	Roll角のモーション
		if ( _nuGetMotionSangle1( pRoll ) ) {
			//*pRoll	+= camera->roll;			//??? : nuGetCameraMotionOld
		}
		else {
			*pRoll	= camera->roll;
		}
	}
	if ( data_type & NUD_MTYPE_ANGLE_7 ) {
		//	画角のモーション
		if ( !_nuGetMotionSangle1( pAng ) ) {
			*pAng		= camera->ang;
		}
	}
	else {
		*pAng		= camera->ang;
	}
}

/*
	func:	カメラモーションを実行する。
			・画角が設定される。
			・カレントマトリックスが変更される。
	
	in:		camera		= 補完データが無い場合のデフォルトのデータを指定する。
			motion		= カメラモーション
			frame		= フレーム番号
			
	注意:		モーション情報は０番スロットが使用される。
*/
void nuCameraMotion( const NJS_CAMERA *camera, const NUS_MOTION *motion, Float frame )
{
	
	NJS_CAMERA	dst_camera;
	NUS_CMOTION_DATA data;
	
	//	補完データの取得
	data.pos = &dst_camera.px;
	data.vect = &dst_camera.vx;
	data.roll = &dst_camera.roll;
	data.ang = &dst_camera.ang;

	nuGetCameraMotion( camera, motion, &data, frame );
	/*
		・カメラ構造体の内容をカレントマトリックスに反映させる。
		・画角を設定する。
	*/
	njSetCamera( &dst_camera );
}

void nuCameraAction( const NUS_CACTION *caction, Float frame )
{
	nuCameraMotion( caction->camera, caction->motion, frame );
}

void nuGetCameraAction( const NUS_CACTION *caction, NUS_CMOTION_DATA *data, Float frame )
{
	nuGetCameraMotion( caction->camera, caction->motion, data, frame );
}
