www.pudn.com > notWow.rar > TexMgr.cpp


#include "TexMgr.h" 
 
#include "ResLoader.h" 
extern ResLoader g_ResLdr; 
 
TextureID	TexturesManager::AddTexture(const char* Name) 
{	 
 
	map::iterator Itr; 
	Itr = m_NameMap.find(Name); 
	if(Itr == m_NameMap.end()) 
	{ 
		TextureID id = m_MinPos; 
		 
		LPDIRECT3DTEXTURE9 pTex; 
		HRESULT hr; 
		int Size; 
		void* pFile = g_ResLdr.GetFile(Name,Size,RES_TEXTURE); 
		hr = D3DXCreateTextureFromFileInMemoryEx(m_pd3dDevice, pFile,Size, D3DX_DEFAULT, D3DX_DEFAULT,  
												0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,  
												D3DX_DEFAULT, D3DX_DEFAULT, 0,  
												NULL, NULL, &pTex ); 
		delete []pFile; 
 
		if(FAILED(hr)) 
		{ 
			FILE *fp = fopen("Err.txt","w+"); 
			fprintf(fp,"%s:cannot load texture\n",Name); 
			fclose(fp);	 
			return -1; 
		} 
		if(id == m_Textures.size()) 
		{ 
			m_MinPos ++; 
			m_Textures.push_back(pTex); 
			m_RefCounters.push_back(1); 
		} 
		else 
		{ 
			m_Textures[id] = pTex; 
			m_RefCounters[id] = 1; 
			short i = id + 1; 
			while(i < m_Textures.size()) 
			{ 
				if(m_Textures[i] == NULL) 
				{				 
					break; 
				} 
			} 
			m_MinPos = i; 
		} 
		m_NameMap.insert(make_pair(Name,id)); 
		m_nTextures ++; 
		return id; 
	} 
	else 
	{ 
		m_RefCounters[Itr->second] ++; 
		return Itr->second; 
	} 
} 
 
TextureID	TexturesManager::AddTextureInM2(const char* Name) 
{	 
	//string  str = Name; 
	//if(m_NameMap.count(str) == 0) 
	//{ 
	//	TextureID id = m_Indices.size(); 
	//	short index = m_Textures.size(); 
	//	 
	//	string str(Name); 
	//	int pos = str.find_last_of('\\'); 
	//	string nstr(str,pos+1); 
	//	//nstr += ".png"; 
	//	nstr[nstr.length() - 1] = 's'; 
	//	nstr[nstr.length() - 2] = 'd'; 
	//	nstr[nstr.length() - 3] = 'd'; 
	//	m_Names.push_back(nstr); 
	//	str = "..\\" + nstr; 
	//	wchar_t wName[100]; 
	//	mbstowcs( wName, str.c_str(), 100 ); 
	//	LPDIRECT3DTEXTURE9 pTex; 
	//	// todo 
	//	HRESULT hr; 
	//	hr = D3DXCreateTextureFromFileEx(m_pd3dDevice, wName, D3DX_DEFAULT, D3DX_DEFAULT,  
	//									D3DX_FROM_FILE, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,  
	//									D3DX_DEFAULT, D3DX_DEFAULT, 0,  
	//									NULL, NULL, &pTex ); 
	//	delete []pFile; 
	//	if(FAILED(hr)) 
	//		return -1; 
	//	m_Indices.push_back(index); 
	//	m_Textures.push_back(pTex); 
	//	return id; 
	//} 
	//else 
	//{ 
	//	return m_NameMap[str]; 
	//} 
	return -1; 
} 
 
void	TexturesManager::Delete(TextureID id) 
{ 
	if(id < 0 || id >= m_Textures.size()) 
		return ; 
	if(m_Textures[id] == NULL) 
		return ; 
	if(m_RefCounters[id] > 1) 
	{ 
		m_RefCounters[id] --; 
	} 
	else 
	{ 
		m_RefCounters[id] = 0; 
		m_Textures[id]->Release(); 
		m_Textures[id] = NULL; 
		if(id < m_MinPos) 
			m_MinPos = id; 
		m_nTextures --; 
		for(map::iterator Itr = m_NameMap.begin() ; Itr != m_NameMap.end() ; Itr ++) 
		{ 
			if(Itr->second == id) 
			{ 
				m_NameMap.erase(Itr); 
				return; 
			} 
		} 
	} 
} 
void TexturesManager::Init(LPDIRECT3DDEVICE9	pd3dDevice) 
{ 
	Free(); 
	m_pd3dDevice = pd3dDevice; 
} 
 
void TexturesManager::Free() 
{ 
	for(int i = 0 ; i < m_Textures.size(); ++ i) 
	{ 
		SAFE_RELEASE(m_Textures[i]); 
	} 
	m_Textures.clear(); 
	m_RefCounters.clear(); 
	m_nTextures = 0; 
	m_MinPos = 0; 
	m_NameMap.clear(); 
	m_pd3dDevice = NULL; 
} 
 
string TexturesManager::GetTextureName(TextureID id) 
{ 
	map::iterator Itr; 
	for(Itr = m_NameMap.begin() ; Itr != m_NameMap.end() ; ++ Itr) 
	{ 
		if(Itr->second == id) 
		{ 
			return Itr->first; 
		} 
	} 
	return string(""); 
} 
 
 
bool TexturesManager::OnCreate() 
{ 
	return true; 
} 
 
void TexturesManager::OnDestory() 
{ 
 
} 
 
bool TexturesManager::OnReset() 
{ 
	return true; 
} 
 
void TexturesManager::OnLost() 
{ 
 
}