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

#include "NuMotionMake.h"



/*
	_nu_motinfo_ptr_->int_f3_func_p				Float ３つの補完コア関数のアドレス
	_nu_motinfo_ptr_->int_a3_func_p				Angle ３つの補完コア関数のアドレス
	_nu_motinfo_ptr_->int_a1_func_p				Angle １つの補完コア関数のアドレス
	_nu_motinfo_ptr_->int_sa3_func_p			Sangle ３つの補完コア関数のアドレス
*/

/*
	補完基本関数群
	
	共通仕様:
	
	name:	_nuGetMotion<Type>
	
	func:	MDATA のカレント位置からデータを読み込み、カレントモーションパラメータでの補完後のデータを返す。
	
	in:		明示的な引数:
			<pData>												= データを返す領域へのポインタ
			
			暗黙の引数:
			_nu_motinfo_ptr_->cnt								= MDATA カウンタ
			_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt]		= <Type>に関連したキー列へのポインタ
																  (今後の説明では、key と書く）
			_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt]		= キー列の個数
			_nu_motinfo_ptr_->frame								= 補完位置のフレーム番号
			
	out:	戻り値が TRUE のとき、<pData>	= 補完後のデータ
	
	return:	TRUE	: key が NULL ではなかったので、その補完データを <pData> に返す。
			FALSE	: key が NULL だったので、何も返さない。<pData> の内容は変化しない。
	
	expl:	key が NULL 以外のときはそのキー列のデータを補完して、
			引数 <pData> の指し示された場所に返し、戻り値が TRUE となる。
			
			key が NULL のときは、何もせずに戻り値を FALSE とする。
			
			
			どちらの場合でも、_nu_motinfo_ptr_->cnt が必ず１足される。
*/


int _nuGetMotionFloat3( Float pos[3] )
{
	NUS_MKEY_F		*key;
	
	if ( ( key = (NUS_MKEY_F *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		(*_nu_motinfo_ptr_->int_f3_func_p)( key,
											_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
											_nu_motinfo_ptr_->frame, pos );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionFloat2( Float rang[2] )
{
	NUS_MKEY_F2		*key;
	
	if ( ( key = (NUS_MKEY_F2 *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		nuMotionIntLinearF2( key,
							_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
							_nu_motinfo_ptr_->frame, rang );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionAngle1( Angle *pAng )
{
	NUS_MKEY_A1		*key;
	
	if ( ( key = (NUS_MKEY_A1 *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		(*_nu_motinfo_ptr_->int_a1_func_p)( key,
											_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
											_nu_motinfo_ptr_->frame, pAng );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionSangle1( Sangle *pAng )
{
	NUS_MKEY_SA1		*key;
	
	if ( ( key = (NUS_MKEY_SA1 *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		nuMotionIntLinearSA1( key,
							_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
							_nu_motinfo_ptr_->frame, pAng );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionAngle3( Angle ang[3] )
{
	NUS_MKEY_A		*key;
	
	if ( ( key = (NUS_MKEY_A *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		(*_nu_motinfo_ptr_->int_a3_func_p)( key,
											_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
											_nu_motinfo_ptr_->frame, ang );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionSangle3( Sangle ang[3] )
{
	NUS_MKEY_SA		*key;
	
	if ( ( key = (NUS_MKEY_SA *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		(*_nu_motinfo_ptr_->int_sa3_func_p)( key,
											_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
											_nu_motinfo_ptr_->frame, ang );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionQuaternion( NJS_QUATERNION *qua )
{
	NUS_MKEY_QUAT	*key;
	
	if ( ( key = (NUS_MKEY_QUAT *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		nuMotionIntLinearQ( key,
							_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
							_nu_motinfo_ptr_->frame, (Float *)qua );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

int _nuGetMotionEvent( Uint16* event )
{
	NUS_MKEY_UI16	*key;
	
	if ( ( key = (NUS_MKEY_UI16 *)_nu_motinfo_ptr_->key[_nu_motinfo_ptr_->cnt] ) != NULL ) {
		nuMotionIntEvent( key,
							_nu_motinfo_ptr_->nbkeys[_nu_motinfo_ptr_->cnt],
							_nu_motinfo_ptr_->frame, event );
		
		_nu_motinfo_ptr_->cnt++;
		return	TRUE;
	}
	else {
		_nu_motinfo_ptr_->cnt++;
		return	FALSE;
	}
}

