243 lines
4.4 KiB
C++
243 lines
4.4 KiB
C++
#include "StdAfx.h"
|
|
#include "../eterbase/Debug.h"
|
|
#include "Thing.h"
|
|
#include "ThingInstance.h"
|
|
|
|
CGraphicThing::CGraphicThing(const char* c_szFileName) : CResource(c_szFileName)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
CGraphicThing::~CGraphicThing()
|
|
{
|
|
//OnClear();
|
|
Clear();
|
|
}
|
|
|
|
void CGraphicThing::Initialize()
|
|
{
|
|
m_pgrnFile = NULL;
|
|
m_pgrnFileInfo = NULL;
|
|
m_pgrnAni = NULL;
|
|
|
|
m_models = NULL;
|
|
m_motions = NULL;
|
|
}
|
|
|
|
void CGraphicThing::OnClear()
|
|
{
|
|
if (m_motions)
|
|
delete [] m_motions;
|
|
|
|
if (m_models)
|
|
delete [] m_models;
|
|
|
|
if (m_pgrnFile)
|
|
GrannyFreeFile(m_pgrnFile);
|
|
|
|
Initialize();
|
|
}
|
|
|
|
CGraphicThing::TType CGraphicThing::Type()
|
|
{
|
|
static TType s_type = StringToType("CGraphicThing");
|
|
return s_type;
|
|
}
|
|
|
|
bool CGraphicThing::OnIsEmpty() const
|
|
{
|
|
return m_pgrnFile ? false : true;
|
|
}
|
|
|
|
bool CGraphicThing::OnIsType(TType type)
|
|
{
|
|
if (CGraphicThing::Type() == type)
|
|
return true;
|
|
|
|
return CResource::OnIsType(type);
|
|
}
|
|
|
|
bool CGraphicThing::CreateDeviceObjects()
|
|
{
|
|
if (!m_pgrnFileInfo)
|
|
return true;
|
|
|
|
for (int m = 0; m < m_pgrnFileInfo->ModelCount; ++m)
|
|
{
|
|
CGrannyModel & rModel = m_models[m];
|
|
rModel.CreateDeviceObjects();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void CGraphicThing::DestroyDeviceObjects()
|
|
{
|
|
if (!m_pgrnFileInfo)
|
|
return;
|
|
|
|
for (int m = 0; m < m_pgrnFileInfo->ModelCount; ++m)
|
|
{
|
|
CGrannyModel & rModel = m_models[m];
|
|
rModel.DestroyDeviceObjects();
|
|
}
|
|
}
|
|
|
|
bool CGraphicThing::CheckModelIndex(int iModel) const
|
|
{
|
|
if (!m_pgrnFileInfo)
|
|
{
|
|
Tracef("m_pgrnFileInfo == NULL: %s\n", GetFileName());
|
|
return false;
|
|
}
|
|
|
|
assert(m_pgrnFileInfo != NULL);
|
|
|
|
if (iModel < 0)
|
|
return false;
|
|
|
|
if (iModel >= m_pgrnFileInfo->ModelCount)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CGraphicThing::CheckMotionIndex(int iMotion) const
|
|
{
|
|
// Temporary
|
|
if (!m_pgrnFileInfo)
|
|
return false;
|
|
// Temporary
|
|
|
|
assert(m_pgrnFileInfo != NULL);
|
|
|
|
if (iMotion < 0)
|
|
return false;
|
|
|
|
if (iMotion >= m_pgrnFileInfo->AnimationCount)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
CGrannyModel * CGraphicThing::GetModelPointer(int iModel)
|
|
{
|
|
assert(CheckModelIndex(iModel));
|
|
assert(m_models != NULL);
|
|
return m_models + iModel;
|
|
}
|
|
|
|
CGrannyMotion * CGraphicThing::GetMotionPointer(int iMotion)
|
|
{
|
|
assert(CheckMotionIndex(iMotion));
|
|
|
|
if (iMotion >= m_pgrnFileInfo->AnimationCount)
|
|
return NULL;
|
|
|
|
assert(m_motions != NULL);
|
|
return (m_motions + iMotion);
|
|
}
|
|
|
|
int CGraphicThing::GetModelCount() const
|
|
{
|
|
if (!m_pgrnFileInfo)
|
|
return 0;
|
|
|
|
return (m_pgrnFileInfo->ModelCount);
|
|
}
|
|
|
|
int CGraphicThing::GetMotionCount() const
|
|
{
|
|
if (!m_pgrnFileInfo)
|
|
return 0;
|
|
|
|
return (m_pgrnFileInfo->AnimationCount);
|
|
}
|
|
|
|
bool CGraphicThing::OnLoad(int iSize, const void * c_pvBuf)
|
|
{
|
|
if (!c_pvBuf)
|
|
return false;
|
|
|
|
m_pgrnFile = GrannyReadEntireFileFromMemory(iSize, (void *) c_pvBuf);
|
|
|
|
if (!m_pgrnFile)
|
|
return false;
|
|
|
|
m_pgrnFileInfo = GrannyGetFileInfo(m_pgrnFile);
|
|
|
|
if (!m_pgrnFileInfo)
|
|
return false;
|
|
|
|
LoadModels();
|
|
LoadMotions();
|
|
return true;
|
|
}
|
|
|
|
// SUPPORT_LOCAL_TEXTURE
|
|
static std::string gs_modelLocalPath;
|
|
|
|
const std::string& GetModelLocalPath()
|
|
{
|
|
return gs_modelLocalPath;
|
|
}
|
|
// END_OF_SUPPORT_LOCAL_TEXTURE
|
|
|
|
bool CGraphicThing::LoadModels()
|
|
{
|
|
assert(m_pgrnFile != NULL);
|
|
assert(m_models == NULL);
|
|
|
|
if (m_pgrnFileInfo->ModelCount <= 0)
|
|
return false;
|
|
|
|
// SUPPORT_LOCAL_TEXTURE
|
|
const std::string& fileName = GetFileNameString();
|
|
|
|
//char localPath[256] = "";
|
|
if (fileName.length() > 2 && fileName[1] != ':')
|
|
{
|
|
int sepPos = fileName.rfind('\\');
|
|
gs_modelLocalPath.assign(fileName, 0, sepPos+1);
|
|
}
|
|
// END_OF_SUPPORT_LOCAL_TEXTURE
|
|
|
|
int modelCount = m_pgrnFileInfo->ModelCount;
|
|
|
|
m_models = new CGrannyModel[modelCount];
|
|
|
|
for (int m = 0; m < modelCount; ++m)
|
|
{
|
|
CGrannyModel & rModel = m_models[m];
|
|
granny_model * pgrnModel = m_pgrnFileInfo->Models[m];
|
|
|
|
if (!rModel.CreateFromGrannyModelPointer(pgrnModel))
|
|
return false;
|
|
}
|
|
|
|
GrannyFreeFileSection(m_pgrnFile, GrannyStandardRigidVertexSection);
|
|
GrannyFreeFileSection(m_pgrnFile, GrannyStandardRigidIndexSection);
|
|
GrannyFreeFileSection(m_pgrnFile, GrannyStandardDeformableIndexSection);
|
|
GrannyFreeFileSection(m_pgrnFile, GrannyStandardTextureSection);
|
|
return true;
|
|
}
|
|
|
|
bool CGraphicThing::LoadMotions()
|
|
{
|
|
assert(m_pgrnFile != NULL);
|
|
assert(m_motions == NULL);
|
|
|
|
if (m_pgrnFileInfo->AnimationCount <= 0)
|
|
return false;
|
|
|
|
int motionCount = m_pgrnFileInfo->AnimationCount;
|
|
|
|
m_motions = new CGrannyMotion[motionCount];
|
|
|
|
for (int m = 0; m < motionCount; ++m)
|
|
if (!m_motions[m].BindGrannyAnimation(m_pgrnFileInfo->Animations[m]))
|
|
return false;
|
|
|
|
return true;
|
|
}
|