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

#include "NuMotionMake.h"


NUS_CUR_MOTIONLINK_INFO			_nu_shapelink_info_;

NUS_SHAPE_GROUP_COEFF	*_nu_shape_link_buf_;
NUS_CSHAPELIST *_nu_shape_link_list_;

void nuGetShapeLinkGroupID( void );

void nuStartShapeLink( const NUS_MOTION_LINK *shape_link, Float rate )
{
	//	なるべくカレントモーション情報がスロット 0 で終わるようにするため 1,0 の順にしている。
	nuSetCurShapeInfoSlot( 1 );
	nuStartShapeEx( shape_link->motion[1], shape_link->frame[1] );
	
	nuSetCurShapeInfoSlot( 0 );
	nuStartShapeEx( shape_link->motion[0], shape_link->frame[0] );
	
	_nu_shapelink_info_.rate	= rate;
}

void nuSetNextShapeLinkNode( void )
{
	nuSetCurShapeInfoSlot( 1 );
	nuSetNextShapeNodeEx();
	
	nuSetCurShapeInfoSlot( 0 );
	nuSetNextShapeNodeEx();
}

/*
	この関数は、シェープグループIDの補間係数を格納するバッファを確保する
*/
void nuInitShapeLink( void *buf, Sint32 size )
{
	Sint32	i;
	NUS_SHAPE_GROUP_COEFF *p;
	
	_nu_shape_link_buf_ = buf;

	p = buf;
	size  = size / ( sizeof(NUS_SHAPE_GROUP_COEFF) );
	
	for( i=0; i<size; i++ ) {
		p->checkID = 0;
	}
}

/*
	シェープリスト設定
*/
void nuSetShapeLinkList( const NUS_CSHAPELIST *shape_list )
{
	_nu_shape_link_list_ = shape_list;
}

/*
	モデルのVlistにシェープデータを計算して埋め込みます
*/
void nuCalcShapeLinkVlist( const NJS_CNK_MODEL *cnkmodel )
{
	Sint32	i;
	Uint16	*vlist;
	Uint32	vtype,size;
	

	vlist = (Uint16*)cnkmodel->vlist;

	//１ノードで複数チャンクに分かれます
	for( i=0; i<_nu_shpinfo_ptr_->cnt; i++ ) {
		nuSetCurShapeInfoSlot( 0 );
		nuGetShapeGroupID();
		nuSetCurShapeInfoSlot( 1 );
		nuGetShapeLinkGroupID();

		vtype = *vlist++ & 0x00ff;
		size = *vlist++;		/* size */
		vlist++;				/* offset */
		vlist++;				/* vertex num */

		//オリジナルのVlistとシェープデータポインタでデータを埋め込みます
		nuSetShapeLinkVlist( (Uint32*)vlist, vtype );
		
		//次のシェープデータ
		nuSetCurShapeInfoSlot( 0 );
		_nu_shpinfo_ptr_->group += 1;
		nuSetCurShapeInfoSlot( 1 );
		_nu_shpinfo_ptr_->group += 1;
		//次のチャンク
		vlist += size * 2 - 2;
	}
}

/*
	カレントのキーグループIDをチェックし、
	補間係数をセットする
*/
void nuGetShapeLinkGroupID( void )
{
	Uint32	id,group;
	NUS_MKEY_SHAPEID	*key1,*key2;
	Float	Rate;
	
	id = _nu_shpinfo_ptr_->group->keys->shapeId;
	
	group = _nu_shape_link_list_->shapes[id].groupId;
	_nu_shpinfo_ptr_->KeyGroupID = group;
	
	//補間係数をすでに計算しているか
	if( _nu_shape_link_buf_[group].checkID != _nu_shpinfo_ptr_->checkID ) {
		
		_nuGetMotionLinearKeys( _nu_shpinfo_ptr_->group->keys, sizeof( NUS_MKEY_SHAPEID ), _nu_shpinfo_ptr_->group->nbKey,
								_nu_shpinfo_ptr_->frame, (void**)&key1, (void**)&key2, &Rate );
		
		_nu_shape_link_buf_[group].checkID  = _nu_shpinfo_ptr_->checkID;
		_nu_shape_link_buf_[group].ShapeID1 = key1->shapeId;
		_nu_shape_link_buf_[group].ShapeID2 = key2->shapeId;
		_nu_shape_link_buf_[group].rate     = Rate;
	}
}

