forked from 0ad/0ad
143 lines
3.2 KiB
C++
Executable File
143 lines
3.2 KiB
C++
Executable File
#include "precompiled.h"
|
|
|
|
#include <algorithm>
|
|
|
|
#include "TextureManager.h"
|
|
#include "lib.h"
|
|
#include "ogl.h"
|
|
#include "res/tex.h"
|
|
#include "CLogger.h"
|
|
|
|
|
|
static const char* SupportedTextureFormats[] = { ".png", ".dds", ".tga", ".bmp" };
|
|
|
|
|
|
|
|
CTextureManager::CTextureManager()
|
|
{
|
|
m_TerrainTextures.reserve(32);
|
|
}
|
|
|
|
CTextureManager::~CTextureManager()
|
|
{
|
|
for (size_t i=0;i<m_TerrainTextures.size();i++) {
|
|
for (size_t j=0;j<m_TerrainTextures[i].m_Textures.size();j++) {
|
|
delete m_TerrainTextures[i].m_Textures[j];
|
|
}
|
|
}
|
|
}
|
|
|
|
void CTextureManager::AddTextureType(const char* name)
|
|
{
|
|
m_TerrainTextures.resize(m_TerrainTextures.size()+1);
|
|
STextureType& ttype=m_TerrainTextures.back();
|
|
ttype.m_Name=name;
|
|
ttype.m_Index=(int)m_TerrainTextures.size()-1;
|
|
}
|
|
|
|
CTextureEntry* CTextureManager::FindTexture(const char* filename)
|
|
{
|
|
// check if file already loaded
|
|
for (uint k=0;k<m_TerrainTextures.size();k++) {
|
|
STextureType& ttype=m_TerrainTextures[k];
|
|
for (uint i=0;i<ttype.m_Textures.size();i++) {
|
|
if (strcmp((const char*) ttype.m_Textures[i]->GetName(),filename)==0) {
|
|
return ttype.m_Textures[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
CTextureEntry* CTextureManager::FindTexture(Handle handle)
|
|
{
|
|
for (uint k=0;k<m_TerrainTextures.size();k++) {
|
|
STextureType& ttype=m_TerrainTextures[k];
|
|
for (uint i=0;i<ttype.m_Textures.size();i++) {
|
|
if (handle==ttype.m_Textures[i]->GetHandle()) {
|
|
return ttype.m_Textures[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
CTextureEntry* CTextureManager::AddTexture(const char* filename,int type)
|
|
{
|
|
assert((uint)type<m_TerrainTextures.size());
|
|
|
|
// create new texture entry
|
|
CTextureEntry* texentry=new CTextureEntry(filename,type);
|
|
|
|
// add entry to list ..
|
|
m_TerrainTextures[type].m_Textures.push_back(texentry);
|
|
|
|
return texentry;
|
|
}
|
|
|
|
void CTextureManager::DeleteTexture(CTextureEntry* entry)
|
|
{
|
|
// find entry in list
|
|
std::vector<CTextureEntry*>& textures=m_TerrainTextures[entry->GetType()].m_Textures;
|
|
|
|
typedef std::vector<CTextureEntry*>::iterator Iter;
|
|
Iter i=std::find(textures.begin(),textures.end(),entry);
|
|
if (i!=textures.end()) {
|
|
textures.erase(i);
|
|
}
|
|
delete entry;
|
|
}
|
|
|
|
void CTextureManager::LoadTerrainTextures(int terraintype,const char* fileext)
|
|
{
|
|
CStr pathname("art/textures/terrain/types/");
|
|
pathname+=m_TerrainTextures[terraintype].m_Name;
|
|
pathname+="/";
|
|
|
|
Handle dir=vfs_open_dir(pathname.c_str());
|
|
vfsDirEnt dent;
|
|
|
|
if (dir > 0)
|
|
{
|
|
while (vfs_next_dirent(dir, &dent, fileext) == 0)
|
|
{
|
|
LOG(NORMAL, "CTextureManager::LoadTerrainTextures(): texture %s added to type %s", dent.name, m_TerrainTextures[terraintype].m_Name.c_str());
|
|
AddTexture(dent.name, terraintype);
|
|
}
|
|
|
|
vfs_close_dir(dir);
|
|
}
|
|
}
|
|
|
|
void CTextureManager::BuildTerrainTypes()
|
|
{
|
|
Handle dir=vfs_open_dir("art/textures/terrain/types/");
|
|
vfsDirEnt dent;
|
|
|
|
if (dir > 0)
|
|
{
|
|
while (vfs_next_dirent(dir, &dent, "/") == 0)
|
|
{
|
|
AddTextureType(dent.name);
|
|
}
|
|
|
|
vfs_close_dir(dir);
|
|
}
|
|
|
|
}
|
|
|
|
void CTextureManager::LoadTerrainTextures()
|
|
{
|
|
// find all the terrain types by directory name
|
|
BuildTerrainTypes();
|
|
|
|
// now iterate through terrain types loading all textures of that type
|
|
for (uint i=0;i<m_TerrainTextures.size();i++) {
|
|
for (uint j=0;j<sizeof(SupportedTextureFormats)/sizeof(const char*);j++) {
|
|
LoadTerrainTextures(i,SupportedTextureFormats[j]);
|
|
}
|
|
}
|
|
}
|