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

#include "NuMotionMake.h"


static void		_nuCnkPushPopGetMotionDataArray( const NJS_CNK_OBJECT *cnkobj );

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

/*
	関数名	nuGetDrawMotion
	
	機  能	指定したフレームにおけるモーションの pos,ang,scl を取得する。
	
	入  力	object		= オブジェクト
			motion		= モーション
			frame		= フレーム番号
	
	出  力	data->pos	= posの列
			data->ang	= angの列（コータニオンのときは、虚数３成分を格納）
			data->scl	= sclの列
	
	戻り値	なし
	
	概　要
	
	備　考
*/
void nuGetDrawMotion( const NJS_CNK_OBJECT *object, const NUS_MOTION *motion, NUS_MOTION_DATA *data, Float frame )
{
	_nu_objmotinfo_ptr_->pos_buf_ptr = data->pos;
	_nu_objmotinfo_ptr_->ang_buf_ptr = data->ang;
	_nu_objmotinfo_ptr_->scl_buf_ptr = data->scl;
	
	nuStartMotionObj( motion, frame );
	
	_nuCnkPushPopGetMotionDataArray( object );
}


/*************************   内部関数   *************************/

/*
	func:	pos, ang, scl をバッファに出力する。
			
			･この関数を呼ぶ前に
			  _nu_objmotinfo_ptr_->pos_buf_ptr
			  _nu_objmotinfo_ptr_->ang_buf_ptr
			  _nu_objmotinfo_ptr_->scl_buf_ptr
			  にそれぞれの格納場所のポインタを設定しておく。
			
			･クォータニオンのノードは虚数３成分だけが ang に格納される。
*/
static void _nuCnkPushPopGetMotionDataArray( const NJS_CNK_OBJECT *cnkobj )
{
	do {
		NJS_QUATERNION		qua;
		int					MotRot;
		
		MotRot		= nuGetMotionNodeData( cnkobj,
									   _nu_objmotinfo_ptr_->pos_buf_ptr,
									   _nu_objmotinfo_ptr_->ang_buf_ptr,
									   _nu_objmotinfo_ptr_->scl_buf_ptr,
									   &qua );
		
		_nu_objmotinfo_ptr_->pos_buf_ptr	+= 3;
		_nu_objmotinfo_ptr_->scl_buf_ptr	+= 3;
		
		if ( MotRot == NUD_MROT_QUATERNION ) {
			//	このノードにコータニオンのキーがあった場合
			*_nu_objmotinfo_ptr_->ang_buf_ptr++		= *( ( Angle * )&qua.im[0] );
			*_nu_objmotinfo_ptr_->ang_buf_ptr++		= *( ( Angle * )&qua.im[1] );
			*_nu_objmotinfo_ptr_->ang_buf_ptr++		= *( ( Angle * )&qua.im[2] );
		}
		else {
			_nu_objmotinfo_ptr_->ang_buf_ptr	+= 3;
		}
		
		
		if ( cnkobj->child != NULL ) {
			_nuCnkPushPopGetMotionDataArray( ( const NJS_CNK_OBJECT* )cnkobj->child );
		}
		
		cnkobj = cnkobj->sibling;
		
	} while ( cnkobj != NULL );
}
