forked from metin2/client
Solution refactoring and restructuring, removed Boost dependency, removed unused tools
This commit is contained in:
300
src/EterGrnLib/ModelInstanceModel.cpp
Normal file
300
src/EterGrnLib/ModelInstanceModel.cpp
Normal file
@ -0,0 +1,300 @@
|
||||
#include "StdAfx.h"
|
||||
#include "ModelInstance.h"
|
||||
#include "Model.h"
|
||||
|
||||
void CGrannyModelInstance::Clear()
|
||||
{
|
||||
m_kMtrlPal.Clear();
|
||||
|
||||
DestroyDeviceObjects();
|
||||
// WORK
|
||||
__DestroyMeshBindingVector();
|
||||
// END_OF_WORK
|
||||
__DestroyMeshMatrices();
|
||||
__DestroyModelInstance();
|
||||
__DestroyWorldPose();
|
||||
|
||||
__Initialize();
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::SetMainModelPointer(CGrannyModel* pModel, CGraphicVertexBuffer* pkSharedDeformableVertexBuffer)
|
||||
{
|
||||
SetLinkedModelPointer(pModel, pkSharedDeformableVertexBuffer, NULL);
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::SetLinkedModelPointer(CGrannyModel* pkModel, CGraphicVertexBuffer* pkSharedDeformableVertexBuffer, CGrannyModelInstance** ppkSkeletonInst)
|
||||
{
|
||||
Clear();
|
||||
|
||||
if (m_pModel)
|
||||
m_pModel->Release();
|
||||
|
||||
m_pModel = pkModel;
|
||||
|
||||
m_pModel->AddReference();
|
||||
|
||||
if (pkSharedDeformableVertexBuffer)
|
||||
__SetSharedDeformableVertexBuffer(pkSharedDeformableVertexBuffer);
|
||||
else
|
||||
__CreateDynamicVertexBuffer();
|
||||
|
||||
__CreateModelInstance();
|
||||
|
||||
// WORK
|
||||
if (ppkSkeletonInst && *ppkSkeletonInst)
|
||||
{
|
||||
m_ppkSkeletonInst = ppkSkeletonInst;
|
||||
__CreateWorldPose(*ppkSkeletonInst);
|
||||
__CreateMeshBindingVector(*ppkSkeletonInst);
|
||||
}
|
||||
else
|
||||
{
|
||||
__CreateWorldPose(NULL);
|
||||
__CreateMeshBindingVector(NULL);
|
||||
}
|
||||
// END_OF_WORK
|
||||
|
||||
__CreateMeshMatrices();
|
||||
|
||||
ResetLocalTime();
|
||||
|
||||
m_kMtrlPal.Copy(pkModel->GetMaterialPalette());
|
||||
}
|
||||
|
||||
// WORK
|
||||
granny_world_pose* CGrannyModelInstance::__GetWorldPosePtr() const
|
||||
{
|
||||
if (m_pgrnWorldPoseReal)
|
||||
return m_pgrnWorldPoseReal;
|
||||
|
||||
if (m_ppkSkeletonInst && *m_ppkSkeletonInst)
|
||||
return (*m_ppkSkeletonInst)->m_pgrnWorldPoseReal;
|
||||
|
||||
assert(m_ppkSkeletonInst!=NULL && "__GetWorldPosePtr - NO HAVE SKELETON");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int* CGrannyModelInstance::__GetMeshBoneIndices(unsigned int iMeshBinding) const
|
||||
{
|
||||
assert(iMeshBinding<m_vct_pgrnMeshBinding.size());
|
||||
return GrannyGetMeshBindingToBoneIndices(m_vct_pgrnMeshBinding[iMeshBinding]);
|
||||
}
|
||||
|
||||
bool CGrannyModelInstance::__CreateMeshBindingVector(CGrannyModelInstance* pkDstModelInst)
|
||||
{
|
||||
assert(m_vct_pgrnMeshBinding.empty());
|
||||
|
||||
if (!m_pModel)
|
||||
return false;
|
||||
|
||||
granny_model* pgrnModel = m_pModel->GetGrannyModelPointer();
|
||||
if (!pgrnModel)
|
||||
return false;
|
||||
|
||||
granny_skeleton* pgrnDstSkeleton = pgrnModel->Skeleton;
|
||||
if (pkDstModelInst && pkDstModelInst->m_pModel && pkDstModelInst->m_pModel->GetGrannyModelPointer())
|
||||
pgrnDstSkeleton = pkDstModelInst->m_pModel->GetGrannyModelPointer()->Skeleton;
|
||||
|
||||
m_vct_pgrnMeshBinding.reserve(pgrnModel->MeshBindingCount);
|
||||
|
||||
granny_int32 iMeshBinding;
|
||||
for (iMeshBinding = 0; iMeshBinding != pgrnModel->MeshBindingCount; ++iMeshBinding)
|
||||
m_vct_pgrnMeshBinding.push_back(GrannyNewMeshBinding(pgrnModel->MeshBindings[iMeshBinding].Mesh, pgrnModel->Skeleton, pgrnDstSkeleton));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__DestroyMeshBindingVector()
|
||||
{
|
||||
std::for_each(m_vct_pgrnMeshBinding.begin(), m_vct_pgrnMeshBinding.end(), GrannyFreeMeshBinding);
|
||||
m_vct_pgrnMeshBinding.clear();
|
||||
}
|
||||
|
||||
// END_OF_WORK
|
||||
|
||||
|
||||
void CGrannyModelInstance::__CreateWorldPose(CGrannyModelInstance* pkSkeletonInst)
|
||||
{
|
||||
assert(m_pgrnModelInstance != NULL);
|
||||
assert(m_pgrnWorldPoseReal == NULL);
|
||||
|
||||
// WORK
|
||||
if (pkSkeletonInst)
|
||||
return;
|
||||
// END_OF_WORK
|
||||
|
||||
granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance);
|
||||
|
||||
// WORK
|
||||
m_pgrnWorldPoseReal = GrannyNewWorldPose(pgrnSkeleton->BoneCount);
|
||||
// END_OF_WORK
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__DestroyWorldPose()
|
||||
{
|
||||
if (!m_pgrnWorldPoseReal)
|
||||
return;
|
||||
|
||||
GrannyFreeWorldPose(m_pgrnWorldPoseReal);
|
||||
m_pgrnWorldPoseReal = NULL;
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__CreateModelInstance()
|
||||
{
|
||||
assert(m_pModel != NULL);
|
||||
assert(m_pgrnModelInstance == NULL);
|
||||
|
||||
const granny_model * pgrnModel = m_pModel->GetGrannyModelPointer();
|
||||
m_pgrnModelInstance = GrannyInstantiateModel(pgrnModel);
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__DestroyModelInstance()
|
||||
{
|
||||
if (!m_pgrnModelInstance)
|
||||
return;
|
||||
|
||||
GrannyFreeModelInstance(m_pgrnModelInstance);
|
||||
m_pgrnModelInstance = NULL;
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__CreateMeshMatrices()
|
||||
{
|
||||
assert(m_pModel != NULL);
|
||||
|
||||
if (m_pModel->GetMeshCount() <= 0) // <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> (ī<><EFBFBD> <20><><EFBFBD><EFBFBD>) <20><EFBFBD> <20><>Ȥ <20>ִ<EFBFBD>..
|
||||
return;
|
||||
|
||||
int meshCount = m_pModel->GetMeshCount();
|
||||
m_meshMatrices = new D3DXMATRIX[meshCount];
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__DestroyMeshMatrices()
|
||||
{
|
||||
if (!m_meshMatrices)
|
||||
return;
|
||||
|
||||
delete [] m_meshMatrices;
|
||||
m_meshMatrices = NULL;
|
||||
}
|
||||
|
||||
DWORD CGrannyModelInstance::GetDeformableVertexCount()
|
||||
{
|
||||
if (!m_pModel)
|
||||
return 0;
|
||||
|
||||
return m_pModel->GetDeformVertexCount();
|
||||
}
|
||||
|
||||
DWORD CGrannyModelInstance::GetVertexCount()
|
||||
{
|
||||
if (!m_pModel)
|
||||
return 0;
|
||||
|
||||
return m_pModel->GetVertexCount();
|
||||
}
|
||||
|
||||
// WORK
|
||||
|
||||
void CGrannyModelInstance::__SetSharedDeformableVertexBuffer(CGraphicVertexBuffer* pkSharedDeformableVertexBuffer)
|
||||
{
|
||||
m_pkSharedDeformableVertexBuffer = pkSharedDeformableVertexBuffer;
|
||||
}
|
||||
|
||||
bool CGrannyModelInstance::__IsDeformableVertexBuffer()
|
||||
{
|
||||
if (m_pkSharedDeformableVertexBuffer)
|
||||
return true;
|
||||
|
||||
return m_kLocalDeformableVertexBuffer.IsEmpty();
|
||||
}
|
||||
|
||||
IDirect3DVertexBuffer8* CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr()
|
||||
{
|
||||
return __GetDeformableVertexBufferRef().GetD3DVertexBuffer();
|
||||
}
|
||||
|
||||
CGraphicVertexBuffer& CGrannyModelInstance::__GetDeformableVertexBufferRef()
|
||||
{
|
||||
if (m_pkSharedDeformableVertexBuffer)
|
||||
return *m_pkSharedDeformableVertexBuffer;
|
||||
|
||||
return m_kLocalDeformableVertexBuffer;
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__CreateDynamicVertexBuffer()
|
||||
{
|
||||
assert(m_pModel != NULL);
|
||||
assert(m_kLocalDeformableVertexBuffer.IsEmpty());
|
||||
|
||||
int vtxCount = m_pModel->GetDeformVertexCount();
|
||||
|
||||
if (0 != vtxCount)
|
||||
{
|
||||
if (!m_kLocalDeformableVertexBuffer.Create(vtxCount,
|
||||
D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
|
||||
//D3DUSAGE_DYNAMIC, D3DPOOL_SYSTEMMEM
|
||||
|
||||
D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED
|
||||
))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::__DestroyDynamicVertexBuffer()
|
||||
{
|
||||
m_kLocalDeformableVertexBuffer.Destroy();
|
||||
m_pkSharedDeformableVertexBuffer = NULL;
|
||||
}
|
||||
|
||||
// END_OF_WORK
|
||||
|
||||
bool CGrannyModelInstance::GetBoneIndexByName(const char * c_szBoneName, int * pBoneIndex) const
|
||||
{
|
||||
assert(m_pgrnModelInstance != NULL);
|
||||
|
||||
granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance);
|
||||
|
||||
if (!GrannyFindBoneByName(pgrnSkeleton, c_szBoneName, pBoneIndex))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const float * CGrannyModelInstance::GetBoneMatrixPointer(int iBone) const
|
||||
{
|
||||
const float* bones = GrannyGetWorldPose4x4(__GetWorldPosePtr(), iBone);
|
||||
if (!bones)
|
||||
{
|
||||
granny_model* pModel = m_pModel->GetGrannyModelPointer();
|
||||
//TraceError("GrannyModelInstance(%s).GetBoneMatrixPointer(boneIndex(%d)).NOT_FOUND_BONE", pModel->Name, iBone);
|
||||
return NULL;
|
||||
}
|
||||
return bones;
|
||||
}
|
||||
|
||||
const float * CGrannyModelInstance::GetCompositeBoneMatrixPointer(int iBone) const
|
||||
{
|
||||
// NOTE : GrannyGetWorldPose4x4<78><34> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.. <20><EFBFBD><D7B7>ϰ<EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// GrannyGetWorldPose4x4<78><34> <20><><EFBFBD><EFBFBD> matrix <20><><EFBFBD>Ҹ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone);
|
||||
}
|
||||
|
||||
void CGrannyModelInstance::ReloadTexture()
|
||||
{
|
||||
assert("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - CGrannyModelInstance::ReloadTexture()");
|
||||
/*
|
||||
assert(m_pModel != NULL);
|
||||
const CGrannyMaterialPalette & c_rGrannyMaterialPalette = m_pModel->GetMaterialPalette();
|
||||
DWORD dwMaterialCount = c_rGrannyMaterialPalette.GetMaterialCount();
|
||||
for (DWORD dwMtrIndex = 0; dwMtrIndex < dwMaterialCount; ++dwMtrIndex)
|
||||
{
|
||||
const CGrannyMaterial & c_rGrannyMaterial = c_rGrannyMaterialPalette.GetMaterialRef(dwMtrIndex);
|
||||
CGraphicImage * pImageStage0 = c_rGrannyMaterial.GetImagePointer(0);
|
||||
if (pImageStage0)
|
||||
pImageStage0->Reload();
|
||||
CGraphicImage * pImageStage1 = c_rGrannyMaterial.GetImagePointer(1);
|
||||
if (pImageStage1)
|
||||
pImageStage1->Reload();
|
||||
}
|
||||
*/
|
||||
}
|
Reference in New Issue
Block a user