www.pudn.com > notWow.rar > ModelMgr.cpp
#include "ModelMgr.h"
#include "ResLoader.h"
ModelID ModelsManager::AddModel(const char* Name,MODELTYPE Type)
{
map::iterator Itr;
Itr = m_NameMap.find(Name);
if(Itr == m_NameMap.end())
{
ModelID id = m_MinPos;
IModel* pModel;
int Size;
char *pFile = (char*)g_ResLdr.GetFile(Name,Size,RES_MODEL);
pModel = new M2Model;
if(!pModel->Init(pFile,Size,Type,m_pd3dDevice))
{
delete pModel;
delete pFile;
return -1;
}
delete [] pFile;
if(id == m_Models.size())
{
m_MinPos ++;
m_Models.push_back(pModel);
m_RefCounters.push_back(1);
}
else
{
m_Models[id] = pModel;
m_RefCounters[id] = 1;
short i = id + 1;
while(i < m_Models.size())
{
if(m_Models[i] == NULL)
{
break;
}
}
m_MinPos = i;
}
m_NameMap.insert(make_pair(Name,id));
m_nModels ++;
return id;
}
else
{
m_RefCounters[Itr->second] ++;
return Itr->second;
}
}
ModelID ModelsManager::AddModel(ObjectID ObjId)
{
MODELTYPE Type;
bool M2File;
string Name = g_ResLdr.GetObjectName(ObjId,Type,M2File);
if(Name.empty())
return -1;
map::iterator Itr;
Itr = m_NameMap.find(Name);
if(Itr == m_NameMap.end())
{
ModelID id = m_MinPos;
IModel* pModel;
int Size;
char *pFile = (char*)g_ResLdr.GetModelFile(ObjId,Size);
if(M2File)
pModel = new M2Model;
else
pModel = new XModel;
if(!pModel->Init(pFile,Size,Type,m_pd3dDevice))
{
delete pModel;
delete pFile;
return -1;
}
delete [] pFile;
if(id == m_Models.size())
{
m_MinPos++;
m_Models.push_back(pModel);
m_RefCounters.push_back(1);
}
else
{
m_Models[id] = pModel;
m_RefCounters[id] = 1;
short i = id + 1;
while(i < m_Models.size())
{
if(m_Models[i] == NULL)
{
break;
}
}
m_MinPos = i;
}
m_NameMap.insert(make_pair(Name,id));
m_nModels ++;
return id;
}
else
{
m_RefCounters[Itr->second] ++;
return Itr->second;
}
}
void ModelsManager::Delete(ModelID id)
{
if(id < 0 || id >= m_Models.size())
return ;
if(m_Models[id] == NULL)
return ;
if(m_RefCounters[id] > 1)
{
m_RefCounters[id] --;
}
else
{
m_RefCounters[id] = 0;
m_Models[id]->Free();
delete m_Models[id];
m_Models[id] = NULL;
if(id < m_MinPos)
m_MinPos = id;
m_nModels --;
for(map::iterator Itr = m_NameMap.begin() ; Itr != m_NameMap.end() ; Itr ++)
{
if(Itr->second == id)
{
m_NameMap.erase(Itr);
return;
}
}
}
}
void ModelsManager::Init(LPDIRECT3DDEVICE9 pd3dDevice)
{
Free();
m_pd3dDevice = pd3dDevice;
}
void ModelsManager::Free()
{
for(int i = 0 ; i < m_Models.size(); ++ i)
{
if(m_Models[i] == NULL)
continue;
m_Models[i]->Free();
delete m_Models[i];
m_Models[i] = NULL;
}
m_Models.clear();
m_NameMap.clear();
m_RefCounters.clear();
m_nModels = 0;
m_MinPos = 0;
m_pd3dDevice = NULL;
}
void ModelsManager::OnDestory()
{
}
bool ModelsManager::OnCreate()
{
return true;
}
void ModelsManager::OnLost()
{
for(int i = 0 ; i < m_Models.size(); ++ i)
{
m_Models[i]->Lost();
}
}
bool ModelsManager::OnReset()
{
for(int i = 0 ; i < m_Models.size(); ++ i)
{
m_Models[i]->Reset();
}
return true;
}