2004-06-03 20:38:14 +02:00
# include "precompiled.h"
2004-06-03 03:43:33 +02:00
# include <algorithm>
2004-05-29 22:56:24 +02:00
# include "TextureManager.h"
# include "lib.h"
# include "ogl.h"
2004-09-19 13:57:51 +02:00
# include "res/ogl_tex.h"
2004-06-03 03:43:33 +02:00
# include "CLogger.h"
2004-08-15 22:57:31 +02:00
# define LOG_CATEGORY "graphics"
2004-05-29 22:56:24 +02:00
2004-06-22 15:22:46 +02:00
static const char * SupportedTextureFormats [ ] = { " .png " , " .dds " , " .tga " , " .bmp " } ;
2004-05-29 22:56:24 +02:00
CTextureManager : : CTextureManager ( )
{
m_TerrainTextures . reserve ( 32 ) ;
}
2004-05-30 02:46:58 +02:00
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 ] ;
}
}
}
2004-05-29 22:56:24 +02:00
void CTextureManager : : AddTextureType ( const char * name )
{
m_TerrainTextures . resize ( m_TerrainTextures . size ( ) + 1 ) ;
STextureType & ttype = m_TerrainTextures . back ( ) ;
ttype . m_Name = name ;
2004-06-03 02:20:20 +02:00
ttype . m_Index = ( int ) m_TerrainTextures . size ( ) - 1 ;
2004-05-29 22:56:24 +02:00
}
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 + + ) {
2004-06-07 21:56:26 +02:00
if ( strcmp ( ( const char * ) ttype . m_Textures [ i ] - > GetName ( ) , filename ) = = 0 ) {
2004-05-29 22:56:24 +02:00
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 + + ) {
2004-06-07 21:56:26 +02:00
if ( handle = = ttype . m_Textures [ i ] - > GetHandle ( ) ) {
2004-05-29 22:56:24 +02:00
return ttype . m_Textures [ i ] ;
}
}
}
return 0 ;
}
CTextureEntry * CTextureManager : : AddTexture ( const char * filename , int type )
{
assert ( ( uint ) type < m_TerrainTextures . size ( ) ) ;
2004-06-07 21:56:26 +02:00
2004-06-08 14:10:51 +02:00
// create new texture entry
CTextureEntry * texentry = new CTextureEntry ( filename , type ) ;
// add entry to list ..
m_TerrainTextures [ type ] . m_Textures . push_back ( texentry ) ;
return texentry ;
2004-05-29 22:56:24 +02:00
}
void CTextureManager : : DeleteTexture ( CTextureEntry * entry )
{
// find entry in list
2004-06-07 21:56:26 +02:00
std : : vector < CTextureEntry * > & textures = m_TerrainTextures [ entry - > GetType ( ) ] . m_Textures ;
2004-05-29 22:56:24 +02:00
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 )
{
2004-06-02 16:27:54 +02:00
CStr pathname ( " art/textures/terrain/types/ " ) ;
2004-05-29 22:56:24 +02:00
pathname + = m_TerrainTextures [ terraintype ] . m_Name ;
2004-06-02 16:27:54 +02:00
pathname + = " / " ;
2004-06-07 21:56:26 +02:00
2004-06-02 16:27:54 +02:00
Handle dir = vfs_open_dir ( pathname . c_str ( ) ) ;
vfsDirEnt dent ;
2004-06-07 21:56:26 +02:00
2004-06-02 16:27:54 +02:00
if ( dir > 0 )
{
while ( vfs_next_dirent ( dir , & dent , fileext ) = = 0 )
{
2004-08-15 22:57:31 +02:00
LOG ( NORMAL , LOG_CATEGORY , " CTextureManager::LoadTerrainTextures(): texture %s added to type %s " , dent . name , m_TerrainTextures [ terraintype ] . m_Name . c_str ( ) ) ;
2004-06-02 16:27:54 +02:00
AddTexture ( dent . name , terraintype ) ;
2004-05-29 22:56:24 +02:00
}
2004-06-07 21:56:26 +02:00
2004-06-02 16:27:54 +02:00
vfs_close_dir ( dir ) ;
2004-05-29 22:56:24 +02:00
}
}
void CTextureManager : : BuildTerrainTypes ( )
{
2004-06-02 16:27:54 +02:00
Handle dir = vfs_open_dir ( " art/textures/terrain/types/ " ) ;
vfsDirEnt dent ;
2004-06-07 21:56:26 +02:00
2004-06-02 16:27:54 +02:00
if ( dir > 0 )
{
while ( vfs_next_dirent ( dir , & dent , " / " ) = = 0 )
{
AddTextureType ( dent . name ) ;
2004-05-29 22:56:24 +02:00
}
2004-06-07 21:56:26 +02:00
2004-06-02 16:27:54 +02:00
vfs_close_dir ( dir ) ;
2004-05-29 22:56:24 +02:00
}
2004-06-02 16:27:54 +02:00
2004-05-29 22:56:24 +02:00
}
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 ] ) ;
}
}
}