Files
Leviathan/Client/Game/engine/Renderer/KRenderObjectBone.cpp
T
2026-06-01 12:46:52 +02:00

714 lines
19 KiB
C++

#include "stdafx.h"
#include "krenderobjectBone.h"
#include "krenderobjectMesh.h"
#include "K3DCamera.h"
#include "KRenderDeviceDX.h"
#include "KDeviceManager.h"
//#include "K3DFrustum.h"
#include "GameDefine.h"
#include "KResource.h"
#include "KViewport.h"
//아이템, 이펙트 링크시크는 위치
char * pAttachName[ATTACH_MAX] =
{
"Head", //0
"Bip01 L Hand", //"HandL", //1
"Bip01 R Hand", //"HandR", //2
"Bip01 L Forearm", //"Arm2L", //3
"Bip01 R Forearm", //"Arm2R", //4
"Bip01 L Forearm", //"Arm2L", //5 deco
"Bip01 R Forearm", //"Arm2R", //6 deco
"Body2", //7
"Saddle", //EFFECT_POS_SADDLE, //8
"Back", //"Back" 9
"Bip01 L Hand_weapon", //Left Hand //10
"Bip01 R Hand_weapon", //Right Hand //11
"Bip01 L Hand_weaponL01", //Left Hand //12 Weapon Effect
"Bip01 R Hand_weaponR01", //Right Hand //13 Weapon Effect
"Bip01 L Hand_weaponL01", //Left Hand //13 Weapon Effect
"Bip01 R Hand_weaponR01", //Right Hand //14 Weapon Effect
};
char * pEffectPosBody = "Bip01 Body1";
//이펙트 링크시키는 위치
char * pEffectPosName[] =
{
"Bip01 Head", //EFFECT_POS_TOP,
"Bip01 Spine1", //EFFECT_POS_MIDDLE,
"Bip01 Body1", //EFFECT_POS_DAMAGE,
"Bip01 Body1", //EFFECT_POS_ETC,
"saddle", //EFFECT_POS_SADDLE,
"Bip01 L Hand_weaponL01", //EFFECT_POS_W_LEFT
"Bip01 R Hand_weaponR01", //EFFECT_POS_W_RIGHT
"Bip01 R Hand_weaponR01", //EFFECT_POS_W_TWOHAND
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KBoneSeqObject Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool KBoneSeqObject::m_bIsBoneDraw = false;
bool KBoneSeqObject::m_bIsAxisDraw = false;
KBoneSeqObject::KBoneSeqObject()
{
K3DMatrixIdentity( m_matLocal );
K3DMatrixIdentity( m_matResult );
m_pBoneCacheTM = NULL;
m_bValidPrevBoneCache = false;
m_pBoneCacheAniData = NULL;
m_pPrevBoneCacheAniData = NULL;
m_pMatHead = NULL;
m_pMatNeck = NULL;
m_pMatBody1 = NULL;
m_pMatBody2 = NULL;
m_pMatPelvis = NULL;
m_pMatLeftHand = NULL;
m_pMatRightHand = NULL;
m_pMatLeftFoot = NULL;
m_pMatRightFoot = NULL;
m_pMatLeftFist = NULL;
m_pMatRightFist = NULL;
}
KBoneSeqObject::~KBoneSeqObject()
{
SAFE_DELETE_ARRAY(m_pBoneCacheTM);
SAFE_DELETE_ARRAY(m_pBoneCacheAniData );
SAFE_DELETE_ARRAY(m_pPrevBoneCacheAniData);
}
void KBoneSeqObject::SetDeform( KSeqObject * pMeshSeq )
{
realizeTime();
_CID( SETDEFORM_BONE );
KMsgSET_DEFORM defmsg( m_nBoneCnt, m_pBoneCacheTM );
defmsg.pBoneSeq = this;
pMeshSeq->Perform( id_SETDEFORM_BONE, defmsg );
//아래와 같은 경우는, 헤어 같은 다른 본에붙는 Mesh 들이다..
if( m_pMatParent && m_pMatAttach )
{
pMeshSeq->SetParentTransform( m_pMatParent, m_pMatAttach );
}
}
void KBoneSeqObject::SetAttach( int nAttachIndex, KSeqObject * pMeshSeq )
{
if( nAttachIndex < 0 || nAttachIndex > ATTACH_MAX )
{
assert(0);
return;
}
int index = -1;
GetBone(pAttachName[nAttachIndex], index);
if( index >= 0 )
pMeshSeq->SetParentTransform( pMeshSeq->GetParentTransform(), &m_pBoneCacheTM[index] );
else
{//MAX, XSI 본이 틀려 예외 추가
//2009-02-17: hunee
//이펙트 버그 수정, weapon1일때만 적용 됨 ㅠㅠ
//weapon2일때도 적용되게 수정
if( nAttachIndex == ATTACH_HAND_LEFT_WEAPON01 || nAttachIndex == ATTACH_HAND_LEFT_WEAPON02)
{
GetBone(pAttachName[ATTACH_HAND_LEFT_WEAPON], index);
if( index >= 0 )
pMeshSeq->SetParentTransform( pMeshSeq->GetParentTransform(), &m_pBoneCacheTM[index] );
}
else if( nAttachIndex == ATTACH_HAND_RIGHT_WEAPON01 || nAttachIndex == ATTACH_HAND_RIGHT_WEAPON02)
{
GetBone(pAttachName[ATTACH_HAND_RIGHT_WEAPON], index);
if( index >= 0 )
pMeshSeq->SetParentTransform( pMeshSeq->GetParentTransform(), &m_pBoneCacheTM[index] );
}
}
}
void KBoneSeqObject::SetAttachEffectPos( int nEffectPosIndex, KSeqObject * pMeshSeq )
{
int index = -1;
if( strcmp(pEffectPosName[nEffectPosIndex], "Bip01 L Hand" ) == 0 )
int x = 0;
GetBone(pEffectPosName[nEffectPosIndex], index);
if( index == 5 || index == 6)
int x = 0;
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_MIDDLE ) )
{ //Spine1 이 없으면 Body1 도 한번 더 검색 : 몬스터에 없을 경우가 있다.
GetBone(pEffectPosBody, index);
}
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_TOP ) )
{
GetBone(pAttachName[ATTACH_HEAD], index);
}
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_DAMAGE || nEffectPosIndex == EFFECT_POS_MIDDLE ) )
{
GetBone(pAttachName[ATTACH_BODY], index);
}
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_SADDLE ) )
{
GetBone(pAttachName[ATTACH_SADDLE], index);
}
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_W_LEFT ) )
{
GetBone(pAttachName[ATTACH_HAND_LEFT], index );
if( index == -1 )
GetBone(pAttachName[ATTACH_HAND_LEFT_WEAPON], index );
}
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_W_RIGHT ) )
{
GetBone(pAttachName[ATTACH_HAND_RIGHT], index );
if( index == -1 )
GetBone(pAttachName[ATTACH_HAND_RIGHT_WEAPON], index );
}
if( index == -1 && ( nEffectPosIndex == EFFECT_POS_W_TWOHAND ) )
{
GetBone(pAttachName[ATTACH_HAND_RIGHT], index );
if( index == -1 )
GetBone(pAttachName[ATTACH_HAND_RIGHT_WEAPON], index );
}
if( index >= 0 )
{
pMeshSeq->SetParentTransform( pMeshSeq->GetParentTransform(), &m_pBoneCacheTM[index], TRUE );
}
else{
// assert(0);
// _oprint( "SetAttachEffectPos : 이름 못 찾음 %s, %d\n", pEffectPosName[nEffectPosIndex], nEffectPosIndex );
}
}
void KBoneSeqObject::SetAttachEffectBone( int nBoneIndex, KSeqObject * pMeshSeq )
{
if( nBoneIndex >= 0 && nBoneIndex < GetBoneCount() )
pMeshSeq->SetParentTransform( pMeshSeq->GetParentTransform(), &m_pBoneCacheTM[nBoneIndex] );
}
void KBoneSeqObject::Reset()
{
KSeqObject::Reset();
m_bValidPrevBoneCache = false;
m_dwTime = 0;
}
void KBoneSeqObject::SetRes( K3DBoneResource *bone )
{
assert( m_spResBone == NULL );
m_spResBone = bone;
if( m_spResBone == NULL ) return;
if( m_spResBone->GetVersion() == ( DWORD ) ( ( 1 << 16 ) | 0 ) ) SetRes10( bone );
else if( m_spResBone->GetVersion() == ( DWORD ) ( ( 1 << 16 ) | 1 ) ) SetRes11( bone );
else assert( 0 );
}
K3DMatrix * const KBoneSeqObject::GetBoneMatrixByName(char *boneName)
{
int nIndex=-1;
m_spResBone->GetBone( boneName, nIndex );
if( nIndex != -1 ) return &m_pBoneCacheTM[nIndex];
return NULL;
}
const char * KBoneSeqObject::GetResourceName()
{
if( m_spResBone )
return m_spResBone->GetName();
return "EmptyBoneResource";
}
void KBoneSeqObject::SetRes10( K3DBoneResource* bone )
{
m_interval.Expand( m_spResBone->GetInterval() );
m_nBoneCnt = m_spResBone->GetBoneCount();
m_pBoneCacheTM = new K3DMatrix[m_nBoneCnt];
memset( m_pBoneCacheTM, 0, sizeof(K3DMatrix)*m_nBoneCnt );
m_pBoneCacheAniData = new BONE_ANI_DATA[m_nBoneCnt];
m_pPrevBoneCacheAniData = new BONE_ANI_DATA[m_nBoneCnt];
m_dwPrevBoneCacheTime=0;
for( int i(0); m_nBoneCnt>i; i++ )
{
K3DMatrixIdentity( m_pBoneCacheTM[i] );
m_pBoneCacheAniData[i].pos = K3DVector(0,0,0);
m_pBoneCacheAniData[i].quat = K3DQuaternion(0,0,0,1);
m_pPrevBoneCacheAniData[i].pos = K3DVector(0,0,0);
m_pPrevBoneCacheAniData[i].quat = K3DQuaternion(0,0,0,1);
}
//캐쉬 Matrix 등록
int nIndex = -1;
m_spResBone->GetBone( "Head", nIndex );
if( nIndex != -1 ) m_pMatHead = &m_pBoneCacheTM[nIndex];
if( !m_pMatHead )
{
m_spResBone->GetBone( "Bip01 Head", nIndex );
if( nIndex != -1 ) m_pMatHead = &m_pBoneCacheTM[nIndex];
}
m_spResBone->GetBone( "Neck", nIndex );
if( nIndex != -1 ) m_pMatNeck = &m_pBoneCacheTM[nIndex];
if( !m_pMatNeck )
{
m_spResBone->GetBone( "Bip01 Neck", nIndex );
if( nIndex != -1 ) m_pMatNeck = &m_pBoneCacheTM[nIndex];
}
m_spResBone->GetBone( "Body1", nIndex );
if( nIndex != -1 ) m_pMatBody1 = &m_pBoneCacheTM[nIndex];
if( !m_pMatBody1 )
{
m_spResBone->GetBone( "Bip01 Body1", nIndex );
if( nIndex != -1 ) m_pMatBody1 = &m_pBoneCacheTM[nIndex];
}
if( !m_pMatBody1 ) m_pMatBody1 = m_pMatNeck;
m_spResBone->GetBone( "Body2", nIndex );
if( nIndex != -1 ) m_pMatBody2 = &m_pBoneCacheTM[nIndex];
if( !m_pMatBody2 )
{
m_spResBone->GetBone( "Bip01 Body2", nIndex );
if( nIndex != -1 ) m_pMatBody2 = &m_pBoneCacheTM[nIndex];
if( !m_pMatBody2 )
{
m_spResBone->GetBone( "Bip02", nIndex );
if( nIndex != -1 ) m_pMatBody2 = &m_pBoneCacheTM[nIndex];
}
}
if( !m_pMatBody2 ) m_pMatBody2 = m_pMatNeck;
//Pelvis
m_spResBone->GetBone( "@HideBip01", nIndex );
if( nIndex != -1 ) m_pMatPelvis = &m_pBoneCacheTM[nIndex];
if( !m_pMatPelvis )
{
m_spResBone->GetBone( "Pelvis", nIndex );
if( nIndex != -1 ) m_pMatPelvis = &m_pBoneCacheTM[nIndex];
}
if( !m_pMatPelvis )
{
m_spResBone->GetBone( "Bip01 Pelvis", nIndex );
if( nIndex != -1 ) m_pMatPelvis = &m_pBoneCacheTM[nIndex];
}
if( !m_pMatLeftHand )
{
m_spResBone->GetBone( "Bip01 L Forearm", nIndex );
if( nIndex != -1 ) m_pMatLeftHand = &m_pBoneCacheTM[nIndex];
}
if( !m_pMatRightHand )
{
m_spResBone->GetBone( "Bip01 R Forearm", nIndex );
if( nIndex != -1 ) m_pMatRightHand = &m_pBoneCacheTM[nIndex];
}
m_spResBone->GetBone( "FootL", nIndex );
if( nIndex != -1 ) m_pMatLeftFoot = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "FootR", nIndex );
if( nIndex != -1 ) m_pMatRightFoot = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "Bip01 L Hand", nIndex );
if( nIndex != -1 ) m_pMatLeftFist = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "Bip01 R Hand", nIndex );
if( nIndex != -1 ) m_pMatRightFist = &m_pBoneCacheTM[nIndex];
}
void KBoneSeqObject::SetRes11( K3DBoneResource* bone )
{
m_interval.Expand( m_spResBone->GetInterval() );
m_nBoneCnt = m_spResBone->GetBoneCount();
m_pBoneCacheTM = new K3DMatrix[m_nBoneCnt];
memset( m_pBoneCacheTM, 0, sizeof(K3DMatrix)*m_nBoneCnt );
m_pBoneCacheAniData = new BONE_ANI_DATA[m_nBoneCnt];
m_pPrevBoneCacheAniData = new BONE_ANI_DATA[m_nBoneCnt];
for( int i(0); m_nBoneCnt>i; i++ )
{
K3DMatrixIdentity( m_pBoneCacheTM[i] );
m_pBoneCacheAniData[i].pos = K3DVector(0,0,0);
m_pBoneCacheAniData[i].quat = K3DQuaternion(0,0,0,1);
m_pPrevBoneCacheAniData[i].pos = K3DVector(0,0,0);
m_pPrevBoneCacheAniData[i].quat = K3DQuaternion(0,0,0,1);
}
//캐쉬 Matrix 등록
int nIndex = -1;
m_spResBone->GetBone( "Head", nIndex );
if( nIndex != -1 ) m_pMatHead = &m_pBoneCacheTM[nIndex];
if( !m_pMatHead )
{
m_spResBone->GetBone( "Bip01 Head", nIndex );
if( nIndex != -1 ) m_pMatHead = &m_pBoneCacheTM[nIndex];
}
m_spResBone->GetBone( "Neck", nIndex );
if( nIndex != -1 ) m_pMatNeck = &m_pBoneCacheTM[nIndex];
if( !m_pMatNeck )
{
m_spResBone->GetBone( "Bip01 Neck", nIndex );
if( nIndex != -1 ) m_pMatNeck = &m_pBoneCacheTM[nIndex];
}
m_spResBone->GetBone( "Body1", nIndex );
if( nIndex != -1 ) m_pMatBody1 = &m_pBoneCacheTM[nIndex];
if( !m_pMatBody1 )
{
m_spResBone->GetBone( "Bip01 Body1", nIndex );
if( nIndex != -1 ) m_pMatBody1 = &m_pBoneCacheTM[nIndex];
}
if( !m_pMatBody1) m_pMatBody1 = m_pMatNeck;
m_spResBone->GetBone( "Body2", nIndex );
if( nIndex != -1 ) m_pMatBody2 = &m_pBoneCacheTM[nIndex];
if( !m_pMatBody2 )
{
m_spResBone->GetBone( "Bip01 Body2", nIndex );
if( nIndex != -1 ) m_pMatBody2 = &m_pBoneCacheTM[nIndex];
if( !m_pMatBody2 )
{
m_spResBone->GetBone( "Bip02", nIndex );
if( nIndex != -1 ) m_pMatBody2 = &m_pBoneCacheTM[nIndex];
}
}
if( !m_pMatBody2 ) m_pMatBody2 = m_pMatNeck;
//Pelvis
m_spResBone->GetBone( "@HideBip01", nIndex );
if( nIndex != -1 ) m_pMatPelvis = &m_pBoneCacheTM[nIndex];
if( !m_pMatPelvis )
{
m_spResBone->GetBone( "Pelvis", nIndex );
if( nIndex != -1 ) m_pMatPelvis = &m_pBoneCacheTM[nIndex];
}
if( !m_pMatPelvis )
{
m_spResBone->GetBone( "Bip01 Pelvis", nIndex );
if( nIndex != -1 ) m_pMatPelvis = &m_pBoneCacheTM[nIndex];
}
m_spResBone->GetBone( "Bip01_L_Hand", nIndex );
if( nIndex != -1 ) m_pMatLeftHand = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "Bip01_R_Hand", nIndex );
if( nIndex != -1 ) m_pMatRightHand = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "FootL", nIndex );
if( nIndex != -1 ) m_pMatLeftFoot = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "FootR", nIndex );
if( nIndex != -1 ) m_pMatRightFoot = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "Bip01 L Hand", nIndex );
if( nIndex != -1 ) m_pMatLeftFist = &m_pBoneCacheTM[nIndex];
m_spResBone->GetBone( "Bip01 R Hand", nIndex );
if( nIndex != -1 ) m_pMatRightFist = &m_pBoneCacheTM[nIndex];
}
void KBoneSeqObject::Render( KViewportObject *viewport, DWORD flag, const K3DMatrix * pAttachMat )
{
//- 작업중.
realizeTime();
if( m_bIsBoneDraw )
viewport->RegisterWire( &m_prWire );
if( m_bIsAxisDraw )
viewport->RegisterWire( &m_prAxisWire );
}
KSeqObject* KBoneSeqObject::Clone()
{
KBoneSeqObject *obj = new KBoneSeqObject;
obj->SetRes( m_spResBone );
return obj;
}
K3DMatrix * KBoneSeqObject::GetBoneBaseTM()
{
if( m_spResBone != NULL )
return m_spResBone->GetBoneBaseTM();
else
return NULL;
}
int KBoneSeqObject::GetBoneCount()
{
if( m_spResBone != NULL )
return m_spResBone->GetBoneCount();
else
return 0;
}
void KBoneSeqObject::realizeTime()
{
if( m_spResBone == NULL) return;
if ( m_dwRealizedTime != m_dwTime )
{
if( m_bValidPrevBoneCache )
{
float weight = (m_dwTime < 800) ? m_dwTime/800.f : 1.f;
if(weight >= 1.f) m_bValidPrevBoneCache = false;
if( m_bValidPrevBoneCache )
m_spResBone->CalcBoneTransforms( m_dwTime, m_pBoneCacheTM, m_pBoneCacheAniData, m_pPrevBoneCacheAniData, weight );
}
else
{
m_spResBone->CalcBoneTransforms( m_dwTime, m_pBoneCacheTM, m_pBoneCacheAniData );
}
}
m_dwRealizedTime = m_dwTime;
if( !m_bIsBoneDraw && !m_bIsAxisDraw ) return;
if ( m_pMatAttach != NULL && m_pMatParent != NULL )
{
K3DMatrix matTemp;
K3DMatrixMultiply( matTemp, *m_pMatAttach, *m_pMatParent );
K3DMatrixMultiply( m_matResult, m_matLocal, matTemp );
}
else if ( m_pMatParent != NULL )
K3DMatrixMultiply( m_matResult, m_matLocal, *m_pMatParent );
else
m_matResult = m_matLocal;
m_prWire.SetTransform( m_matResult );
m_prAxisWire.SetTransform( m_matResult );
// //View Vecotor 등 적용.
// int nIndex;
// K3DBone * pHeadBone = m_spResBone->GetBone("Head", nIndex);
// if(pHeadBone)
// {
//// pHeadBone->SetViewVectorX( 180.f );
// }
K3DMatrix * pBoneMatrix = m_pBoneCacheTM;
m_prAxisWire.Clear();
m_prWire.Clear();
int n(0);
for( int i(0); m_spResBone->GetBoneCount()>i; i++ )
{
K3DBone * pBone = m_spResBone->GetBone(i);
K3DBone * pBoneParent = pBone->GetParentBone();
if( m_bIsBoneDraw )
{
if(pBoneParent)
{
K3DMatrix Mat1 = pBoneMatrix[pBone->GetIndex()];
K3DMatrix Mat2 = pBoneMatrix[pBoneParent->GetIndex()];
m_prWire.AddLine( Mat1.GetPosVector(), Mat2.GetPosVector(), KColor( 255, 255, 255, 255 ) );
}
else
{
K3DMatrix Mat1 = pBoneMatrix[pBone->GetIndex()];
m_prWire.AddLine( Mat1.GetPosVector(), Mat1.GetPosVector(), KColor( 255, 255, 255, 255 ) );
}
}
//Bone 좌표
if( m_bIsAxisDraw )
{
K3DMatrix Mat1 = pBoneMatrix[pBone->GetIndex()];
K3DVector vVectorX, vVectorY, vVectorZ;
AxisCalculation( Mat1, vVectorX, vVectorY, vVectorZ );
m_prAxisWire.AddLine( Mat1.GetPosVector(), vVectorX, KColor(255,0,0,255) );
m_prAxisWire.AddLine( Mat1.GetPosVector(), vVectorY, KColor(0,255,0,255) );
m_prAxisWire.AddLine( Mat1.GetPosVector(), vVectorZ, KColor(0,0,255,255) );
}
}
}
float KBoneSeqObject::GetHeadZ()
{
return m_spResBone->GetHeadZ();
}
void KBoneSeqObject::GetHandLeft( K3DVector & pos )
{
m_spResBone->GetHandLeft( pos );
}
void KBoneSeqObject::GetHandRight( K3DVector & pos )
{
m_spResBone->GetHandRight( pos );
}
//좌우
void KBoneSeqObject::SetViewVectorX( float x, float y, float z )
{
m_ViewVectorX = K3DVector( x, y, 0.f );
}
//상하
void KBoneSeqObject::SetViewVectorZ( float x, float y, float z )
{
m_ViewVectorZ = K3DVector( x, 0.f, z );
}
//몸통
void KBoneSeqObject::SetBodyVector( float x, float y )
{
m_BodyVector = K3DVector( x, y, 0.f );
}
void *KBoneSeqObject::Perform( KID id, KArg& msg )
{
_CID( GETBONEINFO );
_CID( GETBONEMATRIX );
_CID( GETBONEMATRIX2 );
_CID( GETBONEMATRIX3 );
_CID( GETCACHETM );
_CID( SETCACHETM );
_CID( GETVERSION );
_CID( GETBONENAMELIST );
if( id == id_GETBONEINFO )
{
KMsgGET_BONEINFO *boneinfo = static_cast<KMsgGET_BONEINFO*>(&msg);
boneinfo->nBoneCount = GetBoneCount();
boneinfo->dwMinTime = GetInterval().GetStart();
boneinfo->dwMaxTime = GetInterval().GetEnd();
return (void*)1;
}
else if( id == id_GETBONENAMELIST )
{
KMsgGET_BONENAMELIST *bonenamelist = static_cast<KMsgGET_BONENAMELIST*>(&msg);
if( m_spResBone )
{
for( int i(0); GetBoneCount()>i; i++ )
{
K3DBone* pBone = m_spResBone->GetBone(i);
if( pBone )
{
bonenamelist->vBoneNameList.push_back( pBone->GetName() );
bonenamelist->vBoneMatrixList.push_back( &m_pBoneCacheTM[i] );
}
}
}
return (void*)1;
}
else if( id == id_GETBONEMATRIX )
{
KMsgGET_BONEMATRIX *boneMat = static_cast<KMsgGET_BONEMATRIX *>(&msg);
m_spResBone->GetBone( boneMat->strBoneName, boneMat->nBoneMatIndex );
if( boneMat->nBoneMatIndex != -1 )
{
boneMat->pBoneMat = &m_pBoneCacheTM[boneMat->nBoneMatIndex];
}
}
else if( id == id_GETBONEMATRIX2)
{
KMsgGET_BONEMATRIX2 *boneMat = static_cast<KMsgGET_BONEMATRIX2 *>(&msg);
boneMat->pBoneMat = GetBoneMatrix( boneMat->nDetailIndex );
}
else if( id == id_GETBONEMATRIX3)
{
KMsgGET_BONEMATRIX3*boneMat = static_cast<KMsgGET_BONEMATRIX3 *>(&msg);
if( boneMat->nBoneIndex >= 0 && boneMat->nBoneIndex < GetBoneCount() )
{
boneMat->pBoneMat = &m_pBoneCacheTM[boneMat->nBoneIndex];
}
}
//else if( id == id_SETBONEINIT )
//{
//}
else if( id == id_GETCACHETM )
{
KMsgGET_GETCACHETM *cacheTM = static_cast<KMsgGET_GETCACHETM *>(&msg);
if( m_pBoneCacheTM )
{
if( m_dwTime != 0 )
{ //적용된 본 만 사용 가능
cacheTM->pCacheAniData = m_pBoneCacheAniData;
cacheTM->nCount = m_nBoneCnt;
}
}
}
else if( id == id_SETCACHETM )
{
KMsgGET_GETCACHETM *cacheTM = static_cast<KMsgGET_GETCACHETM *>(&msg);
if( cacheTM->bUseBlend == false || cacheTM->pCacheAniData == NULL )
{
m_bValidPrevBoneCache = false;
return NULL;
}
if( m_pBoneCacheTM && cacheTM->pCacheAniData && m_nBoneCnt == cacheTM->nCount )
{
for( int i(0); m_nBoneCnt>i; i++ )
{
m_pPrevBoneCacheAniData[i] = cacheTM->pCacheAniData[i];
}
m_dwPrevBoneCacheTime=m_dwRealizedTime;
m_bValidPrevBoneCache = true;
}
}
else if( id == id_GETVERSION )
{
KMsgGET_GETVERSION* pMsgVersion = static_cast< KMsgGET_GETVERSION* >( &msg );
if( pMsgVersion->dwVersion == ( DWORD ) -1 )
{
if( m_spResBone != NULL ) pMsgVersion->dwVersion = m_spResBone->GetVersion();
}
}
return NULL;
}
K3DMatrix * KBoneSeqObject::GetBoneMatrix( int nDetail )
{
switch(nDetail)
{
case DETAIL_HEAD : return m_pMatHead;
case DETAIL_NECK : return m_pMatNeck;
case DETAIL_BODY2 : return m_pMatBody2;
case DETAIL_BODY1 : return m_pMatBody1;
case DETAIL_PELVIS : return m_pMatPelvis;
case DETAIL_LEFT_HAND : return m_pMatLeftHand;
case DETAIL_RIGHT_HAND : return m_pMatRightHand;
case DETAIL_LEFT_FIST : return m_pMatLeftFist;
case DETAIL_RIGHT_FIST : return m_pMatRightFist;
}
return NULL;
}