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

#include "NuMotionMake.h"



/*
	関数名:	nuDrawMotionLink
	
	機  能:	モーション付きモデルの描画関数
	
	入  力: object		= オブジェクト
			
			motion_link	= モーションリンク構造体
			
			shape_link	= シェープリンク構造体(NULL であれば、通常のモーションリンク描画となる）
						  現在、無視される。
			rate		= 補完レイト
			
			pDrawFunc	= 描画関数
	
	出  力:	なし
	戻り値:	なし
	概  要:
	備  考:
*/
void nuDrawMotionLink( const NJS_CNK_OBJECT *object, const NUS_MOTION_LINK *motion_link,
						Float rate, Sint32 ( *pDrawFunc )( NJS_CNK_MODEL *cnkmodel ) )
{
	//	これから処理する内容を設定
	nuStartMotionLink( motion_link, rate );
	
	
	//	描画関数のセット
	_nu_objmotinfo_ptr_->draw_func_p		= pDrawFunc;
	
	//	モーション描画開始
	_nuPushPopMotionLink( object );
}

/****************************************************************/
/*	関数名：_nuPushPopMotionLink								*/
/*	機  能：モーション付きモデルの描画メイン					*/
/*	入  力：NJS_CNK_OBJECT *object	:オブジェクト				*/
/*	出  力：なし												*/
/*	戻り値：なし												*/
/*	概　要：													*/
/*	備　考：													*/
/****************************************************************/
void _nuPushPopMotionLink( const NJS_CNK_OBJECT *cnkobj )
{
	NJS_CNK_OBJECT bcnkobj;

	do {
		njPushMatrixEx();
		
		nuMotionLinkTransformEx( cnkobj );

		/* 変更 */
		if ( _nu_motion_event_flag_){
			bcnkobj = *cnkobj;
			nuChangeMotionObject( cnkobj );
		}
		
		if( _nu_motion_callback_ != NULL ) (*_nu_motion_callback_)( cnkobj );
		
		if ( ( cnkobj->model != NULL ) && ( !( cnkobj->evalflags & NJD_EVAL_HIDE ) ) ) {
			(*_nu_objmotinfo_ptr_->draw_func_p)( cnkobj->model );
		}
		
		/* 戻す */
		if ( _nu_motion_event_flag_){
			*(NJS_CNK_OBJECT *)cnkobj = bcnkobj;
		}
		
		if ( cnkobj->child != NULL ) {
			_nuPushPopMotionLink( ( const NJS_CNK_OBJECT* )cnkobj->child );
		}
		
		njPopMatrixEx();
		
		cnkobj = cnkobj->sibling;
		
	} while ( cnkobj != NULL );
}
