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

#include "NuMotionMake.h"


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

void _nuCnkPushPopShapeLink( NJS_CNK_OBJECT *cnkobj )
{
	NJS_CNK_OBJECT bcnkobj;

	do {
		njPushMatrixEx();
		
		nuMotionLinkTransformEx( cnkobj );
		
		/* 変更 */
		if ( _nu_motion_event_flag_){
			bcnkobj = *cnkobj;
			nuChangeMotionObject( 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] ) {
					nuCalcShapeLinkVlist( cnkmodel );
				}
				(*_nu_objmotinfo_ptr_->draw_func_p)( cnkmodel );

			}
			//	たとえ、モデルが NULL でも、また、HIDE フラグが立っていても
			//	シェープの MDATA ポインタを進める必要が有る。
			nuSetNextShapeLinkNode();
		}
		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 ) {
			_nuCnkPushPopShapeLink( (NJS_CNK_OBJECT *)cnkobj->child );
		}
		
		njPopMatrixEx();
		
		cnkobj = cnkobj->sibling;
		
	} while ( cnkobj != NULL );
}
