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; 
}