forked from metin2/client
Solution refactoring and restructuring, removed Boost dependency, removed unused tools
This commit is contained in:
242
src/EterGrnLib/Thing.cpp
Normal file
242
src/EterGrnLib/Thing.cpp
Normal file
@ -0,0 +1,242 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user