Files
Client/Engine/Effect/SMRHeader.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

634 lines
17 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "./SMRHeader.h"
#include "GMMemory.h"
namespace SGEngine { namespace Core {
bool ISSameVertex(const D3DXVECTOR3 &vec1,const D3DXVECTOR3 &vec2)
{
D3DXVECTOR3 vecSub = vec1 - vec2;
if((fabs(vecSub.x) < 0.001f) &&
(fabs(vecSub.y) < 0.001f) &&
(fabs(vecSub.z) < 0.001f))
return true;
return false;
}
void CMeshCoreData::CMeshSMorphData::SetSmartMorphData(CExportMeshVertex *pSrc,CExportMeshVertex *pDest,const int &iVertices,const int &iModelIndex,char *strModelName)
{
std::vector<D3DXVECTOR3> ArrRelative;
std::vector<int> ArrRelativeIndex;
ArrRelative.clear();
ArrRelativeIndex.clear();
int i;
D3DXVECTOR3 vecRelative;
for(i = 0; i < iVertices; i++)
{
if(!ISSameVertex(pSrc[i].m_vecPos,pDest[i].m_vecPos))
{
ArrRelativeIndex.push_back(i);
vecRelative = pDest[i].m_vecPos - pSrc[i].m_vecPos;
ArrRelative.push_back(vecRelative);
}
}
m_iRelativeNum = (int)ArrRelative.size();
m_pRelativeVertices = new D3DXVECTOR3[ArrRelative.size()];
memcpy(m_pRelativeVertices,&ArrRelative[0],sizeof(D3DXVECTOR3) * ArrRelative.size());
m_pRelativeIndex = new int[ArrRelativeIndex.size()];
memcpy(m_pRelativeIndex,&ArrRelativeIndex[0],sizeof(int) * ArrRelativeIndex.size());
m_iModelID = iModelIndex;
if(strModelName)
{
strcpy(m_strName,strModelName);
}
}
void CMeshCoreData::SetSkinMeshData(const int &iVertex,D3DXMATRIX *matTm,D3DXMATRIX *matInvNodeTm) // rigid
{
if(iVertex < m_iVerticesNum)
{
D3DXMATRIX matSkinTm;
m_bUpdateData = true;
D3DXVECTOR3 *pPos = &(m_pDefaultVertices[iVertex].m_vecPos);
D3DXVECTOR3 *pDestPos = &(m_pVertices[iVertex].m_vecPos);
D3DXVECTOR4 vecTrans;
D3DXMatrixMultiply(&matSkinTm,matInvNodeTm,matTm);
D3DXVec3Transform(&vecTrans,pPos,&matSkinTm);
pDestPos->x = vecTrans.x;
pDestPos->y = vecTrans.y;
pDestPos->z = vecTrans.z;
}
}
void CMeshCoreData::SetSkinMeshData(const int &iVertex,CMeshSkinData::CMeshBlendData *pBlend,const int &iBlend)
{
int i;
if(iVertex < m_iVerticesNum)
{
D3DXMATRIX matWorldTm;
D3DXMATRIX matInvNodeTm;
D3DXMATRIX matSkinTm;
m_bUpdateData = true;
D3DXVECTOR3 *pPos = &(m_pDefaultVertices[iVertex].m_vecPos);
D3DXVECTOR3 *pDestPos = &(m_pVertices[iVertex].m_vecPos);
D3DXVECTOR4 vecTrans;
pDestPos->x = pDestPos->y = pDestPos->z = 0.0f;
for(i = 0; i < iBlend; i++ )
{
matWorldTm = pBlend[i].m_pNode->m_matNodeTm;
matWorldTm *= pBlend[i].m_fNodeWeight;
matInvNodeTm = pBlend[i].m_pNode->m_matInvNodeTm;
D3DXMatrixMultiply(&matSkinTm,&matInvNodeTm,&matWorldTm);
D3DXVec3Transform(&vecTrans,pPos,&matSkinTm);
pDestPos->x += vecTrans.x;
pDestPos->y += vecTrans.y;
pDestPos->z += vecTrans.z;
}
}
}
void CMeshCoreData::SetSmartMorphInterValue(const float &fValue,const int &iIndex)
{
if(m_bSMorph)
{
float fInter = fValue;
if(m_iSMorph > iIndex && m_pfSMorphInterValue)
{
/* if(fInter > 1.0f)
fInter = 1.0f;
if(fInter < 0.0f)
fInter = 0.0f;*/
m_pfSMorphInterValue[iIndex] = fInter;
}
}
}
void CMeshCoreData::UpdateMeshSmartMorph()
{
if(m_bSMorph && m_pVertices && m_pDefaultVertices)
{
int i,j;
m_bUpdateData = true;
memcpy(m_pVertices,m_pDefaultVertices,sizeof(CExportMeshVertex) * m_iVerticesNum);
for(i = 0; i < m_iSMorph; i++ )
{
if(fabs(m_pfSMorphInterValue[i]) > 0.00001f)
{
for(j = 0; j < m_pSMorph[i].m_iRelativeNum; j++ )
{
int iVertexIndex = m_pSMorph[i].m_pRelativeIndex[j];
m_pVertices[iVertexIndex].m_vecPos += (m_pSMorph[i].m_pRelativeVertices[j] * m_pfSMorphInterValue[i]);
}
}
}
}
}
void CMeshCoreData::UpdateMeshMorph(const float &fFrame)
{
if(m_bMorph && !m_bSMorph) // <20>ϴ<EFBFBD> smorph<70><68> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵǰ<C8B5> <20>س<EFBFBD><D8B3>´<EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
int i;
int iSelect = 0;
int iCurrentFrame = (int)ceil(fFrame);
int iBeforeFrame = 0;
int iNextFrame = 0;
int iBeforeKey = 0;
int iNextKey = 0;
float fInterval = 0.0f;
CExportMeshVertex *pVertices = NULL;
for(i = 0; i < m_iMorph; i++ )
{
if(m_pMorphData[i].m_iFrame >= iCurrentFrame)
{
iSelect = i;
break;
}
}
if(m_iMorph == i)
{
iSelect = m_iMorph - 1;
pVertices = m_pMorphData[iSelect].m_pVertices;
memcpy(m_pVertices,pVertices,sizeof(CExportMeshVertex) * m_iVerticesNum);
m_bUpdateData = true;
}
else if(iSelect == 0)
{
pVertices = m_pMorphData[iSelect].m_pVertices;
memcpy(m_pVertices,pVertices,sizeof(CExportMeshVertex) * m_iVerticesNum);
m_bUpdateData = true;
}
else
{
m_bUpdateData = true;
iBeforeKey = iSelect - 1;
iBeforeFrame = m_pMorphData[iBeforeKey].m_iFrame;
iNextKey = iSelect;
iNextFrame = m_pMorphData[iNextKey].m_iFrame;
fInterval = (fFrame - iBeforeFrame) / (float)(iNextFrame - iBeforeFrame);
for(i = 0 ;i < m_iVerticesNum; i++ )
{
m_pVertices[i].m_vecPos = m_pMorphData[iNextKey].m_pVertices[i].m_vecPos - m_pMorphData[iBeforeKey].m_pVertices[i].m_vecPos;
m_pVertices[i].m_vecPos *= fInterval;
m_pVertices[i].m_vecPos += m_pMorphData[iBeforeKey].m_pVertices[i].m_vecPos;
m_pVertices[i].m_vecNormal = m_pMorphData[iNextKey].m_pVertices[i].m_vecNormal - m_pMorphData[iBeforeKey].m_pVertices[i].m_vecNormal;
m_pVertices[i].m_vecNormal *= fInterval;
m_pVertices[i].m_vecNormal += m_pMorphData[iBeforeKey].m_pVertices[i].m_vecNormal;
m_pVertices[i].m_vecTexcoord = m_pMorphData[iNextKey].m_pVertices[i].m_vecTexcoord - m_pMorphData[iBeforeKey].m_pVertices[i].m_vecTexcoord;
m_pVertices[i].m_vecTexcoord *= fInterval;
m_pVertices[i].m_vecTexcoord += m_pMorphData[iBeforeKey].m_pVertices[i].m_vecTexcoord;
}
}
}
}
// Linear interpolation.
void CMeshObjNode::UpdateTm(const float &fFrame,D3DXMATRIX *matParent)
{
int i;
int iSelect = 0;
D3DXVECTOR3 vecPos;
D3DXVECTOR3 vecScale;
D3DXQUATERNION qRot;
int iCurrentFrame = (int)ceil(fFrame);
int iBeforeFrame = 0;
int iNextFrame = 0;
int iBeforeKey = 0;
int iNextKey = 0;
float fInterval = 0.0f;
D3DXVECTOR3 vecInterval;
if(m_bAniNode)
{
if(m_pAniNode->m_bTmAni)
{
CNodeTMInfo CurrentTmInfo;
for(i = 0; i < m_pAniNode->m_iTmKeys; i++)
{
if(m_pAniNode->m_pTmKeys[i].m_iFrame >= iCurrentFrame)
{
iSelect = i;
break;
}
}
if(m_pAniNode->m_iTmKeys == i)
{
iSelect = m_pAniNode->m_iTmKeys - 1;
CurrentTmInfo = m_pAniNode->m_pTmKeys[iSelect].m_TmInfo;
}
else if(iSelect == 0)
{
CurrentTmInfo = m_pAniNode->m_pTmKeys[iSelect].m_TmInfo;
}
else
{
iBeforeKey = iSelect - 1;
iBeforeFrame = m_pAniNode->m_pTmKeys[iBeforeKey].m_iFrame;
iNextKey = iSelect;
iNextFrame = m_pAniNode->m_pTmKeys[iNextKey].m_iFrame;
fInterval = (fFrame - iBeforeFrame) / (float)(iNextFrame - iBeforeFrame);
D3DXVECTOR3 vecInterval;
// Trans
vecInterval.x = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_vecTrans.x - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecTrans.x;
vecInterval.y = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_vecTrans.y - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecTrans.y;
vecInterval.z = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_vecTrans.z - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecTrans.z;
vecInterval *= fInterval;
CurrentTmInfo.m_vecTrans.x = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecTrans.x + vecInterval.x;
CurrentTmInfo.m_vecTrans.y = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecTrans.y + vecInterval.y;
CurrentTmInfo.m_vecTrans.z = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecTrans.z + vecInterval.z;
// Scale
vecInterval.x = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_vecScale.x - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecScale.x;
vecInterval.y = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_vecScale.y - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecScale.y;
vecInterval.z = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_vecScale.z - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecScale.z;
vecInterval *= fInterval;
CurrentTmInfo.m_vecScale.x = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecScale.x + vecInterval.x;
CurrentTmInfo.m_vecScale.y = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecScale.y + vecInterval.y;
CurrentTmInfo.m_vecScale.z = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_vecScale.z + vecInterval.z;
// qrot
D3DXQuaternionSlerp(&CurrentTmInfo.m_qRot,
&(m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_qRot),
&(m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_qRot),
fInterval);
// qscaleaxis
D3DXQuaternionSlerp(&CurrentTmInfo.m_qScaleAxis,
&(m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_qScaleAxis),
&(m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_qScaleAxis),
fInterval);
// fDetermination
vecInterval.x = m_pAniNode->m_pTmKeys[iNextKey].m_TmInfo.m_fDetermination - m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_fDetermination;
vecInterval.x *= fInterval;
CurrentTmInfo.m_fDetermination = m_pAniNode->m_pTmKeys[iBeforeKey].m_TmInfo.m_fDetermination + vecInterval.x;
}
/* Convert matrix from affine value.
ptm = position component (t)
rtm = "essential" rotation (q)
srtm = "stretch" rotation (u)
stm = scale component (k)
ftm = the flip tm -> ScaleMatrix(Point3(ap.f,ap.f,ap.f));
Here's the correct way of reassembling the decomposed matrix:
Matrix3 srtm, rtm, ptm, stm, ftm;
ptm.IdentityMatrix();
ptm.SetTrans(ap.t);
ap.q.MakeMatrix(rtm);
ap.u.MakeMatrix(srtm);
stm = ScaleMatrix(ap.k);
mat = Inverse(srtm) * stm * srtm * rtm * ftm * ptm;
*/
D3DXMATRIX matR,matSA,matScale,matF,matP,matInvSA;
D3DXMatrixScaling(&matF,CurrentTmInfo.m_fDetermination,
CurrentTmInfo.m_fDetermination,
CurrentTmInfo.m_fDetermination);
D3DXMatrixIdentity(&matP);
D3DXMatrixTranslation(&matP,CurrentTmInfo.m_vecTrans.x,
CurrentTmInfo.m_vecTrans.y,
CurrentTmInfo.m_vecTrans.z);
D3DXMatrixRotationQuaternion(&matR,&CurrentTmInfo.m_qRot);
D3DXMatrixRotationQuaternion(&matSA,&CurrentTmInfo.m_qScaleAxis);
D3DXMatrixInverse(&matInvSA,NULL,&matSA);
D3DXMatrixScaling(&matScale,CurrentTmInfo.m_vecScale.x,
CurrentTmInfo.m_vecScale.y,
CurrentTmInfo.m_vecScale.z);
D3DXMatrixMultiply(&m_matNodeTm,&matInvSA,&matScale);
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,&matSA);
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,&matR);
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,&matF);
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,&matP);
}
else
{
if(m_pAniNode->m_bPosAni)
{
for(i = 0; i < m_pAniNode->m_iPosKeys; i++ )
{
if(m_pAniNode->m_pPosKeys[i].m_iFrame >= iCurrentFrame)
{
iSelect = i;
break;
}
}
if(m_pAniNode->m_iPosKeys == i)
{
iSelect = m_pAniNode->m_iPosKeys - 1;
vecPos = m_pAniNode->m_pPosKeys[iSelect].m_vecPos;
}
else if(iSelect == 0)
{
vecPos = m_pAniNode->m_pPosKeys[iSelect].m_vecPos;
}
else
{
iBeforeKey = iSelect - 1;
iBeforeFrame = m_pAniNode->m_pPosKeys[iBeforeKey].m_iFrame;
iNextKey = iSelect;
iNextFrame = m_pAniNode->m_pPosKeys[iNextKey].m_iFrame;
fInterval = (fFrame - iBeforeFrame) / (float)(iNextFrame - iBeforeFrame);
vecInterval.x = m_pAniNode->m_pPosKeys[iNextKey].m_vecPos.x - m_pAniNode->m_pPosKeys[iBeforeKey].m_vecPos.x;
vecInterval.y = m_pAniNode->m_pPosKeys[iNextKey].m_vecPos.y - m_pAniNode->m_pPosKeys[iBeforeKey].m_vecPos.y;
vecInterval.z = m_pAniNode->m_pPosKeys[iNextKey].m_vecPos.z - m_pAniNode->m_pPosKeys[iBeforeKey].m_vecPos.z;
vecInterval *= fInterval;
vecPos.x = m_pAniNode->m_pPosKeys[iBeforeKey].m_vecPos.x + vecInterval.x;
vecPos.y = m_pAniNode->m_pPosKeys[iBeforeKey].m_vecPos.y + vecInterval.y;
vecPos.z = m_pAniNode->m_pPosKeys[iBeforeKey].m_vecPos.z + vecInterval.z;
}
}
else
vecPos = m_DefaultNodeTm.m_vecTrans;
if(m_pAniNode->m_bScaleAni)
{
iSelect = 0;
for(i = 0; i < m_pAniNode->m_iScaleKeys; i++ )
{
if(m_pAniNode->m_pScaleKeys[i].m_iFrame >= iCurrentFrame)
{
iSelect = i;
break;
}
}
if(m_pAniNode->m_iScaleKeys == i)
{
iSelect = m_pAniNode->m_iScaleKeys - 1;
vecScale = m_pAniNode->m_pScaleKeys[iSelect].m_vecScale;
}
else if(iSelect == 0)
{
vecScale = m_pAniNode->m_pScaleKeys[iSelect].m_vecScale;
}
else
{
iBeforeKey = iSelect - 1;
iBeforeFrame = m_pAniNode->m_pScaleKeys[iBeforeKey].m_iFrame;
iNextKey = iSelect;
iNextFrame = m_pAniNode->m_pScaleKeys[iNextKey].m_iFrame;
fInterval = (fFrame - iBeforeFrame) / (float)(iNextFrame - iBeforeFrame);
vecInterval.x = m_pAniNode->m_pScaleKeys[iNextKey].m_vecScale.x - m_pAniNode->m_pScaleKeys[iBeforeKey].m_vecScale.x;
vecInterval.y = m_pAniNode->m_pScaleKeys[iNextKey].m_vecScale.y - m_pAniNode->m_pScaleKeys[iBeforeKey].m_vecScale.y;
vecInterval.z = m_pAniNode->m_pScaleKeys[iNextKey].m_vecScale.z - m_pAniNode->m_pScaleKeys[iBeforeKey].m_vecScale.z;
vecInterval *= fInterval;
vecScale.x = m_pAniNode->m_pScaleKeys[iBeforeKey].m_vecScale.x + vecInterval.x;
vecScale.y = m_pAniNode->m_pScaleKeys[iBeforeKey].m_vecScale.y + vecInterval.y;
vecScale.z = m_pAniNode->m_pScaleKeys[iBeforeKey].m_vecScale.z + vecInterval.z;
}
}
else
vecScale = m_DefaultNodeTm.m_vecScale;
if(m_pAniNode->m_bRotAni)
{
iSelect = 0;
for(i = 0; i < m_pAniNode->m_iRotKeys; i++ )
{
if(m_pAniNode->m_pRotKeys[i].m_iFrame >= iCurrentFrame)
{
iSelect = i;
break;
}
}
if(m_pAniNode->m_iRotKeys == i)
{
iSelect = m_pAniNode->m_iRotKeys - 1;
qRot = m_pAniNode->m_pRotKeys[iSelect].m_qRotKey;
}
else if(iSelect == 0)
{
qRot = m_pAniNode->m_pRotKeys[iSelect].m_qRotKey;
}
else
{
iBeforeKey = iSelect - 1;
iBeforeFrame = m_pAniNode->m_pRotKeys[iBeforeKey].m_iFrame;
iNextKey = iSelect;
iNextFrame = m_pAniNode->m_pRotKeys[iNextKey].m_iFrame;
fInterval = (fFrame - iBeforeFrame) / (float)(iNextFrame - iBeforeFrame);
D3DXQuaternionSlerp(&qRot,
&(m_pAniNode->m_pRotKeys[iBeforeKey].m_qRotKey),
&(m_pAniNode->m_pRotKeys[iNextKey].m_qRotKey),
fInterval);
}
}
else
qRot = m_DefaultNodeTm.m_qRot;
D3DXMatrixTransformation(&m_matNodeTm,
NULL,NULL,&vecScale,NULL,&qRot,&vecPos);
} // else
if(m_pAniNode->m_bVisAni)
{
float fVis = 1.0f;
float fInter = 0.0f;
for(i = 0; i < m_pAniNode->m_iVisKeys; i++ )
{
if(m_pAniNode->m_pVisKeys[i].m_iFrame >= iCurrentFrame)
{
iSelect = i;
break;
}
}
if(m_pAniNode->m_iVisKeys == i)
{
iSelect = m_pAniNode->m_iVisKeys - 1;
fVis = m_pAniNode->m_pVisKeys[iSelect].m_fVisibility;
}
else if(iSelect == 0)
{
fVis = m_pAniNode->m_pVisKeys[iSelect].m_fVisibility;
}
else
{
iBeforeKey = iSelect - 1;
iBeforeFrame = m_pAniNode->m_pVisKeys[iBeforeKey].m_iFrame;
iNextKey = iSelect;
iNextFrame = m_pAniNode->m_pVisKeys[iNextKey].m_iFrame;
fInterval = (fFrame - iBeforeFrame) / (float)(iNextFrame - iBeforeFrame);
fInter = m_pAniNode->m_pVisKeys[iNextKey].m_fVisibility - m_pAniNode->m_pVisKeys[iBeforeKey].m_fVisibility;
fInter *= fInterval;
fVis = m_pAniNode->m_pVisKeys[iBeforeKey].m_fVisibility + fInter;
}
m_fVisibility = fVis;
}
}
else{
/* vecPos = m_DefaultNodeTm.m_vecTrans;
qRot = m_DefaultNodeTm.m_qRot;
vecScale = m_DefaultNodeTm.m_vecScale;
D3DXMatrixTransformation(&m_matNodeTm,
NULL,NULL,&vecScale,NULL,&qRot,&vecPos);
*/
/* D3DXMATRIX mat;
D3DXMatrixInverse(&mat,NULL,&m_matInvNodeTm);
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,&mat);
*/
D3DXMatrixInverse(&m_matNodeTm,NULL,&m_matInvNodeTm);
}
if(matParent)
{
if(m_bWorldTM)
{
D3DXMATRIX matInv;
D3DXMatrixInverse(&matInv,NULL,matParent); // exporter<65><72><EFBFBD><EFBFBD> (bipe <20><> ) ó<><C3B3> <20>ؾ<EFBFBD><D8BE><EFBFBD>.
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,&matInv); // LocalTm = WorldTm * Parent InvTm
}
m_matLocalTm = m_matNodeTm;
D3DXMatrixMultiply(&m_matNodeTm,&m_matNodeTm,matParent); // WorldTm = LocalTm * ParentTm
}
}
void CMeshObjNode::UpdateSkinning()
{
int i;
D3DXMATRIX matWorldTm;
D3DXMATRIX matInvNodeTm;
int iVertexIndex;
int iMatIndex;
if(m_bSkinMorph && m_pSkinData)
{
for(i = 0; i < m_pSkinData->m_iRigid; i++)
{
matWorldTm = m_pSkinData->m_pRigid[i].m_pNode->m_matNodeTm;
matInvNodeTm = m_pSkinData->m_pRigid[i].m_pNode->m_matInvNodeTm;
iVertexIndex = m_pSkinData->m_pRigid[i].m_iVertexIndex;
iMatIndex = m_pSkinData->m_pRigid[i].m_iMatIndex;
SetSkinMeshData(iMatIndex,iVertexIndex,&matWorldTm,&matInvNodeTm);
}
for(i = 0; i < m_pSkinData->m_iBlend; i++ )
{
iVertexIndex = m_pSkinData->m_pBlend[i].m_iVertexIndex;
iMatIndex = m_pSkinData->m_pBlend[i].m_iMatIndex;
int iBlend = m_pSkinData->m_pBlend[i].m_iBlendData;
CMeshSkinData::CMeshBlendData *pBlend = m_pSkinData->m_pBlend[i].m_pArrBlendData;
SetSkinMeshData(iMatIndex,iVertexIndex,pBlend,iBlend);
}
}
}
}}