1
0
forked from 0ad/0ad

TerrainTextureManager cleanup.

This was SVN commit r16901.
This commit is contained in:
leper 2015-07-30 21:51:01 +00:00
parent c5aad60776
commit a4e606c575
2 changed files with 31 additions and 46 deletions

View File

@ -50,45 +50,33 @@ CTerrainTextureManager::~CTerrainTextureManager()
{
UnloadTerrainTextures();
TerrainAlphaMap::iterator it;
for (it = m_TerrainAlphas.begin(); it != m_TerrainAlphas.end(); ++it)
for (std::pair<const VfsPath, TerrainAlpha>& ta : m_TerrainAlphas)
{
ogl_tex_free(it->second.m_hCompositeAlphaMap);
it->second.m_hCompositeAlphaMap = 0;
ogl_tex_free(ta.second.m_hCompositeAlphaMap);
ta.second.m_hCompositeAlphaMap = 0;
}
}
void CTerrainTextureManager::UnloadTerrainTextures()
{
for (size_t i=0; i < m_TextureEntries.size(); i++)
delete m_TextureEntries[i];
for (CTerrainTextureEntry* const& te : m_TextureEntries)
delete te;
m_TextureEntries.clear();
TerrainGroupMap::iterator it = m_TerrainGroups.begin();
while (it != m_TerrainGroups.end())
{
delete it->second;
++it;
}
for (const std::pair<CStr, CTerrainGroup*>& tg : m_TerrainGroups)
delete tg.second;
m_TerrainGroups.clear();
m_LastGroupIndex = 0;
}
CTerrainTextureEntry* CTerrainTextureManager::FindTexture(const CStr& tag_)
CTerrainTextureEntry* CTerrainTextureManager::FindTexture(const CStr& tag_) const
{
CStr tag(tag_);
// Strip extension off of tag
long pos=tag.ReverseFind(".");
if (pos != -1)
{
tag = tag.substr(0, pos);
}
for (size_t i=0;i<m_TextureEntries.size();i++)
{
if (m_TextureEntries[i]->GetTag() == tag)
return m_TextureEntries[i];
}
CStr tag = tag_.BeforeLast("."); // Strip extension
for (CTerrainTextureEntry* const& te : m_TextureEntries)
if (te->GetTag() == tag)
return te;
LOGWARNING("CTerrainTextureManager: Couldn't find terrain %s", tag.c_str());
return 0;
@ -99,20 +87,19 @@ CTerrainPropertiesPtr CTerrainTextureManager::GetPropertiesFromFile(const CTerra
return CTerrainProperties::FromXML(props, pathname);
}
CTerrainTextureEntry *CTerrainTextureManager::AddTexture(const CTerrainPropertiesPtr& props, const VfsPath& path)
CTerrainTextureEntry* CTerrainTextureManager::AddTexture(const CTerrainPropertiesPtr& props, const VfsPath& path)
{
CTerrainTextureEntry *entry = new CTerrainTextureEntry(props, path);
CTerrainTextureEntry* entry = new CTerrainTextureEntry(props, path);
m_TextureEntries.push_back(entry);
return entry;
}
void CTerrainTextureManager::DeleteTexture(CTerrainTextureEntry* entry)
{
typedef std::vector<CTerrainTextureEntry*>::iterator Iter;
Iter i=std::find(m_TextureEntries.begin(),m_TextureEntries.end(),entry);
if (i!=m_TextureEntries.end()) {
m_TextureEntries.erase(i);
}
auto it = std::find(m_TextureEntries.begin(), m_TextureEntries.end(), entry);
if (it != m_TextureEntries.end())
m_TextureEntries.erase(it);
delete entry;
}
@ -170,7 +157,6 @@ void CTerrainTextureManager::RecurseDirectory(const CTerrainPropertiesPtr& paren
LoadTextures(props, path);
}
int CTerrainTextureManager::LoadTerrainTextures()
{
CTerrainPropertiesPtr rootProps(new CTerrainProperties(CTerrainPropertiesPtr()));
@ -180,22 +166,21 @@ int CTerrainTextureManager::LoadTerrainTextures()
CTerrainGroup* CTerrainTextureManager::FindGroup(const CStr& name)
{
TerrainGroupMap::const_iterator it=m_TerrainGroups.find(name);
TerrainGroupMap::const_iterator it = m_TerrainGroups.find(name);
if (it != m_TerrainGroups.end())
return it->second;
else
return m_TerrainGroups[name] = new CTerrainGroup(name, ++m_LastGroupIndex);
}
void CTerrainGroup::AddTerrain(CTerrainTextureEntry *pTerrain)
void CTerrainGroup::AddTerrain(CTerrainTextureEntry* pTerrain)
{
m_Terrains.push_back(pTerrain);
}
void CTerrainGroup::RemoveTerrain(CTerrainTextureEntry *pTerrain)
void CTerrainGroup::RemoveTerrain(CTerrainTextureEntry* pTerrain)
{
std::vector<CTerrainTextureEntry *>::iterator it;
it=find(m_Terrains.begin(), m_Terrains.end(), pTerrain);
auto it = find(m_Terrains.begin(), m_Terrains.end(), pTerrain);
if (it != m_Terrains.end())
m_Terrains.erase(it);
}

View File

@ -57,9 +57,9 @@ public:
{}
// Add a texture entry to this terrain type
void AddTerrain(CTerrainTextureEntry *);
void AddTerrain(CTerrainTextureEntry*);
// Remove a texture entry
void RemoveTerrain(CTerrainTextureEntry *);
void RemoveTerrain(CTerrainTextureEntry*);
size_t GetIndex() const
{ return m_Index; }
@ -89,13 +89,13 @@ class CTerrainTextureManager : public Singleton<CTerrainTextureManager>
friend class CTerrainTextureEntry;
public:
typedef std::map<CStr, CTerrainGroup *> TerrainGroupMap;
typedef std::map<CStr, CTerrainGroup*> TerrainGroupMap;
typedef std::map<VfsPath, TerrainAlpha> TerrainAlphaMap;
private:
// All texture entries created by this class, for easy freeing now that
// textures may be in several STextureType's
std::vector<CTerrainTextureEntry *> m_TextureEntries;
std::vector<CTerrainTextureEntry*> m_TextureEntries;
TerrainGroupMap m_TerrainGroups;
@ -123,20 +123,20 @@ public:
void UnloadTerrainTextures();
CTerrainTextureEntry* FindTexture(const CStr& tag);
CTerrainTextureEntry* FindTexture(const CStr& tag) const;
// Create a texture object for a new terrain texture at path, using the
// property sheet props.
CTerrainTextureEntry *AddTexture(const CTerrainPropertiesPtr& props, const VfsPath& path);
CTerrainTextureEntry* AddTexture(const CTerrainPropertiesPtr& props, const VfsPath& path);
// Remove the texture from all our maps and lists and delete it afterwards.
void DeleteTexture(CTerrainTextureEntry* entry);
// Find or create a new texture group. All terrain groups are owned by the
// texturemanager (TerrainTypeManager)
CTerrainGroup *FindGroup(const CStr& name);
CTerrainGroup* FindGroup(const CStr& name);
const TerrainGroupMap &GetGroups() const
const TerrainGroupMap& GetGroups() const
{ return m_TerrainGroups; }
};