Add a texture cache mechanism. Fortunately this oly seems affective for empty.rgb ...
This commit is contained in:
@@ -43,6 +43,9 @@ SG_USING_STD(map);
|
|||||||
|
|
||||||
#include "mat.hxx"
|
#include "mat.hxx"
|
||||||
|
|
||||||
|
static map<string, ssgTexture *> _tex_cache;
|
||||||
|
static map<string, ssgTexture *>::iterator _tex_cache_iter;
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Constructors and destructor.
|
// Constructors and destructor.
|
||||||
@@ -208,9 +211,8 @@ SGMaterial::load_texture ( int n )
|
|||||||
if ( !_status[i].texture_loaded ) {
|
if ( !_status[i].texture_loaded ) {
|
||||||
SG_LOG( SG_GENERAL, SG_INFO, "Loading deferred texture "
|
SG_LOG( SG_GENERAL, SG_INFO, "Loading deferred texture "
|
||||||
<< _status[i].texture_path );
|
<< _status[i].texture_path );
|
||||||
_status[i].state->setTexture(
|
assignTexture(_status[i].state, _status[i].texture_path,
|
||||||
(char *)_status[i].texture_path.c_str(),
|
wrapu, wrapv, mipmap );
|
||||||
wrapu, wrapv, mipmap );
|
|
||||||
_status[i].texture_loaded = true;
|
_status[i].texture_loaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -254,8 +256,7 @@ SGMaterial::build_ssg_state( bool defer_tex_load )
|
|||||||
|
|
||||||
if ( !defer_tex_load ) {
|
if ( !defer_tex_load ) {
|
||||||
SG_LOG(SG_INPUT, SG_INFO, " " << _status[i].texture_path );
|
SG_LOG(SG_INPUT, SG_INFO, " " << _status[i].texture_path );
|
||||||
state->setTexture( (char *)_status[i].texture_path.c_str(),
|
assignTexture( state, _status[i].texture_path, wrapu, wrapv );
|
||||||
wrapu, wrapv );
|
|
||||||
_status[i].texture_loaded = true;
|
_status[i].texture_loaded = true;
|
||||||
} else {
|
} else {
|
||||||
_status[i].texture_loaded = false;
|
_status[i].texture_loaded = false;
|
||||||
@@ -286,6 +287,22 @@ void SGMaterial::set_ssg_state( ssgSimpleState *s )
|
|||||||
_status.push_back( _internal_state( s, "", true ) );
|
_status.push_back( _internal_state( s, "", true ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SGMaterial::assignTexture( ssgSimpleState *state, string &fname,
|
||||||
|
int _wrapu, int _wrapv, int _mipmap )
|
||||||
|
{
|
||||||
|
_tex_cache_iter = _tex_cache.find(fname);
|
||||||
|
if (_tex_cache_iter == _tex_cache.end())
|
||||||
|
{
|
||||||
|
state->setTexture((char *)fname.c_str(), _wrapu, _wrapv, _mipmap);
|
||||||
|
_tex_cache[fname] = state->getTexture();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
state->setTexture(_tex_cache_iter->second);
|
||||||
|
// cout << "Cache hit: " << fname << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ private:
|
|||||||
void build_ssg_state( bool defer_tex_load );
|
void build_ssg_state( bool defer_tex_load );
|
||||||
void set_ssg_state( ssgSimpleState *s );
|
void set_ssg_state( ssgSimpleState *s );
|
||||||
|
|
||||||
|
void assignTexture( ssgSimpleState *state, string &fname, int _wrapu = TRUE, int _wrapv = TRUE, int _mipmap = TRUE );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user