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()
{
}