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

#include "NuMotionMake.h"


/*	内部関数のプロトタイプ宣言	*/


/*
	関数名:	nuCnkDrawShapeMotion
	
	機  能:	モーション付きモデルの描画関数
	
	入  力: object		= オブジェクト
			motion		= モーション
			shape		= シェープ(NULL であれば、通常のモーション描画となる）
			frame		= フレーム番号
			pDrawFunc	= 描画関数
	
	出  力:	なし
	戻り値:	なし
	概  要:
	備  考:
*/
void nuCnkDrawShapeMotion( NJS_CNK_OBJECT *object, const NUS_MOTION *motion, const NUS_MOTION *shape, Float frame, Float sframe,
							Sint32 ( *pDrawFunc )( NJS_CNK_MODEL *cnkmodel ) )
{
	//	これから処理する内容を設定
	nuStartMotionObj( motion, frame );
	
	//	描画関数のセット
	_nu_objmotinfo_ptr_->draw_func_p		= pDrawFunc;
	
	
	if ( shape == NULL ) {
		//	モーション描画開始
		_nuPushPopMotion( object );
	}
	else {
		//	シェープ特有の処理
		nuSetCurShapeInfoSlot( 0 );
		nuStartShapeEx( shape, sframe );
		
		//	シェープ描画開始
		_nuCnkPushPopShape( object );
	}
	
}

void _nuCnkPushPopShape( NJS_CNK_OBJECT *cnkobj )
{
	NJS_CNK_OBJECT bcnkobj;

	do {
		njPushMatrixEx();
		
		nuMotionTransformEx( cnkobj );
		/* 変更 */
		if ( _nu_motion_event_flag_){
			bcnkobj = *cnkobj;
			nuChangeMotionObject( cnkobj );
		}
		
		if( _nu_motion_callback_ != NULL ) (*_nu_motion_callback_)( cnkobj );

		if ( !( cnkobj->evalflags & NJD_EVAL_SHAPE_SKIP ) ) {
			NJS_CNK_MODEL		*cnkmodel;
			if ( ( (cnkmodel = cnkobj->model) != NULL ) && ( !( cnkobj->evalflags & NJD_EVAL_HIDE ) ) ) {
				//１ノードの頂点をシェープし、オリジナルのVLISTに書き込みます。
				if( _nu_shpinfo_ptr_->mdata->p[0] ) {
					nuCalcShapeVlist( cnkmodel );
				}
				(*_nu_objmotinfo_ptr_->draw_func_p)( cnkmodel );

			}
			//	たとえ、モデルが NULL でも、また、HIDE フラグが立っていても
			//	シェープの MDATA ポインタを進める必要が有る。
			nuSetNextShapeNodeEx();
		}
		else {
			NJS_CNK_MODEL		*cnkmodel;
			if ( ( (cnkmodel = cnkobj->model) != NULL ) && ( !( cnkobj->evalflags & NJD_EVAL_HIDE ) ) ) {
				(*_nu_objmotinfo_ptr_->draw_func_p)( cnkmodel );
			}
		}
		
			/* 戻す */
		if ( _nu_motion_event_flag_){
			*(NJS_CNK_OBJECT *)cnkobj = bcnkobj;
		}
		
		if ( cnkobj->child != NULL ) {
			_nuCnkPushPopShape( (NJS_CNK_OBJECT *)cnkobj->child );
		}
		
		njPopMatrixEx();
		
		cnkobj = cnkobj->sibling;
		
	} while ( cnkobj != NULL );
}
