300 lines
7.5 KiB
C++
300 lines
7.5 KiB
C++
|
#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();
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|