Various updates, including the new MeshManager

This was SVN commit r1295.
This commit is contained in:
Calefaction 2004-11-08 22:02:01 +00:00
parent 24538f5b41
commit e3137cd302
7 changed files with 103 additions and 25 deletions

65
source/graphics/MeshManager.cpp Executable file
View File

@ -0,0 +1,65 @@
#include "precompiled.h"
#include "graphics/MeshManager.h"
#include "CLogger.h"
CMeshManager::CMeshManager()
{
}
CMeshManager::~CMeshManager()
{
}
CModelDef *CMeshManager::GetMesh(const char *filename)
{
mesh_map::iterator iter;
CStr fn(filename);
if((iter = m_MeshMap.find(fn.GetHashCode())) == m_MeshMap.end())
{
try
{
CModelDef *model = CModelDef::Load(filename);
if(!model)
return NULL;
LOG(MESSAGE, "mesh", "Loading mesh '%s'...\n", filename);
model->m_Hash = fn.GetHashCode();
model->m_RefCount = 1;
m_MeshMap[model->m_Hash] = model;
return model;
}
catch(...)
{
LOG(ERROR, "mesh", "Could not load mesh '%s'\n!", filename);
return NULL;
}
}
else
{
LOG(MESSAGE, "mesh", "Loading mesh '%s%' (cached)...\n", filename);
CModelDef *model = (CModelDef *)(*iter).second;
model->m_RefCount++;
return model;
}
}
int CMeshManager::ReleaseMesh(CModelDef *mesh)
{
if(!mesh)
return 0;
mesh_map::iterator iter = m_MeshMap.find(mesh->m_Hash);
if(iter == m_MeshMap.end())
return 0;
mesh->m_RefCount--;
if(mesh->m_RefCount <= 0)
{
m_MeshMap.erase(iter);
delete mesh;
mesh = NULL;
return 0;
}
return mesh->m_RefCount;
}

23
source/graphics/MeshManager.h Executable file
View File

@ -0,0 +1,23 @@
#ifndef __H_MESHMANAGER_H__
#define __H_MESHMANAGER_H__
#include "singleton.h"
#include "graphics/ModelDef.h"
#define g_MeshManager CMeshManager::GetSingleton()
typedef STL_HASH_MAP<size_t, CModelDef *> mesh_map;
class CMeshManager : public Singleton<CMeshManager>
{
public:
CMeshManager();
~CMeshManager();
CModelDef *GetMesh(const char *filename);
int ReleaseMesh(CModelDef *mesh);
private:
mesh_map m_MeshMap;
};
#endif

View File

@ -14,7 +14,7 @@
#include "SkeletonAnim.h"
#include "SkeletonAnimDef.h"
#include "SkeletonAnimManager.h"
#include "ProgramManager.h"
#include "MeshManager.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@ -42,6 +42,8 @@ void CModel::ReleaseData()
delete m_Props[i].m_Model;
}
m_Props.clear();
if(m_pModelDef)
g_MeshManager.ReleaseMesh(m_pModelDef);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -356,6 +358,4 @@ void CModel::SetMaterial(const CMaterial &material)
if(m_Material.GetTexture().Trim(PS_TRIM_BOTH).Length() > 0)
{
}
if(m_Material.GetVertexProgram().Trim(PS_TRIM_BOTH).Length() > 0)
m_VertexProgram = g_ProgramManager.FindVertexProgram(m_Material.GetVertexProgram().Trim(PS_TRIM_BOTH).c_str());
}

View File

@ -30,17 +30,6 @@ CModelDef::~CModelDef()
delete[] m_PropPoints;
}
///////////////////////////////////////////////////////////////////////////////
// Call at shutdown to free memory
void CModelDef::Shutdown()
{
for (std::vector<CModelDef*>::iterator iter = m_LoadedModelDefs.begin(); iter != m_LoadedModelDefs.end(); ++iter)
delete *iter;
}
// The list of allocated models which are to be freed
std::vector<CModelDef*> CModelDef::m_LoadedModelDefs;
///////////////////////////////////////////////////////////////////////////////
// FindPropPoint: find and return pointer to prop point matching given name;
// return null if no match (case insensitive search)
@ -107,7 +96,6 @@ CModelDef* CModelDef::Load(const char* filename)
delete mdef;
throw CFileUnpacker::CFileEOFError();
}
m_LoadedModelDefs.push_back(mdef);
return mdef;
}

View File

@ -14,6 +14,8 @@
#include "SkeletonAnimDef.h"
#include <vector>
class CMeshManager;
///////////////////////////////////////////////////////////////////////////////
// SPropPoint: structure describing a prop point
struct SPropPoint
@ -71,6 +73,7 @@ struct SModelFace
// information of a model
class CModelDef
{
friend class CMeshManager;
public:
// current file version given to saved animations
enum { FILE_VERSION = 2 };
@ -84,11 +87,7 @@ public:
// destructor
virtual ~CModelDef();
// shutdown memory-freer
static void Shutdown();
// model I/O functions
static CModelDef* Load(const char* filename);
static void Save(const char* filename,const CModelDef* mdef);
public:
@ -126,9 +125,10 @@ public:
// prop point data
u32 m_NumPropPoints;
SPropPoint* m_PropPoints;
// all loaded models, to be freed on shutdown
static std::vector<CModelDef*> m_LoadedModelDefs;
protected:
static CModelDef* Load(const char* filename);
int m_RefCount;
size_t m_Hash;
};
#endif

View File

@ -6,6 +6,7 @@
#include "ModelDef.h"
#include "CLogger.h"
#include "MaterialManager.h"
#include "MeshManager.h"
#include "UnitManager.h"
@ -52,7 +53,10 @@ bool CObjectEntry::BuildModel()
const char* modelfilename = m_ModelName.c_str();
try {
modeldef=CModelDef::Load(modelfilename);
//modeldef=CModelDef::Load(modelfilename);
modeldef = g_MeshManager.GetMesh(modelfilename);
if(!modeldef)
throw false;
} catch (...) {
LOG(ERROR, LOG_CATEGORY, "CObjectEntry::BuildModel(): Model %s failed to load", modelfilename);
return false;

View File

@ -20,8 +20,6 @@ CObjectManager::~CObjectManager()
delete m_ObjectTypes[i].m_Objects[j];
}
}
CModelDef::Shutdown();
}
CObjectEntry* CObjectManager::FindObject(const char* objectname)