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"
2004-12-07 03:04:38 +01:00
# include "res/res.h"
2004-05-29 22:56:24 +02:00
# 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"
2005-03-18 23:02:20 +01:00
# include "timer.h"
2004-06-03 03:43:33 +02:00
2004-08-15 22:57:31 +02:00
# define LOG_CATEGORY "graphics"
2004-05-29 22:56:24 +02:00
2004-11-24 00:52:39 +01:00
// filter for vfs_next_dirent
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 + + ) {
2005-02-10 00:19:48 +01:00
// Don't bother looking at textures that haven't been loaded yet - since
// the caller has given us a Handle to the texture, it must be loaded.
// (This matters because GetHandle would load the texture, even though
// there's no need to.)
if ( ttype . m_Textures [ i ] - > IsLoaded ( ) & & 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 ;
}
2004-11-24 00:52:39 +01:00
void CTextureManager : : LoadTerrainTextures ( int terraintype , const char * fileext_filter )
2004-05-29 22:56:24 +02:00
{
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 )
{
2004-11-24 00:52:39 +01:00
while ( vfs_next_dirent ( dir , & dent , fileext_filter ) = = 0 )
2004-06-02 16:27:54 +02:00
{
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 + + ) {
2004-11-24 00:52:39 +01:00
for ( uint j = 0 ; j < ARRAY_SIZE ( SupportedTextureFormats ) ; j + + ) {
2004-05-29 22:56:24 +02:00
LoadTerrainTextures ( i , SupportedTextureFormats [ j ] ) ;
}
}
}