Memory leak fixes from Till Busch

This commit is contained in:
timoore
2008-01-24 23:05:18 +00:00
parent edee4b3fe5
commit a098ba5e79
4 changed files with 22 additions and 76 deletions

View File

@@ -52,8 +52,6 @@ SG_USING_STD(map);
#include "mat.hxx"
static map<string, osg::ref_ptr<osg::Texture2D> > _tex_cache;
////////////////////////////////////////////////////////////////////////
// Constructors and destructor.
@@ -222,35 +220,24 @@ SGMaterial::init ()
}
}
bool
SGMaterial::load_texture ( int n )
{
int i = (n >= 0) ? n : 0 ;
int end = (n >= 0) ? n+1 : _status.size();
for (; i < end; i++)
{
if ( !_status[i].texture_loaded ) {
SG_LOG( SG_GENERAL, SG_INFO, "Loading deferred texture "
<< _status[i].texture_path );
assignTexture(_status[i].state.get(), _status[i].texture_path,
wrapu, wrapv, mipmap);
_status[i].texture_loaded = true;
}
}
return true;
}
osg::StateSet *
SGMaterial::get_state (int n) const
SGMaterial::get_state (int n)
{
if (_status.size() == 0) {
SG_LOG( SG_GENERAL, SG_WARN, "No state available.");
return NULL;
}
int i = n >= 0 ? n : _current_ptr;
if(!_status[i].texture_loaded)
{
assignTexture(_status[i].state.get(), _status[i].texture_path,
wrapu, wrapv, mipmap);
_status[i].texture_loaded = true;
}
osg::StateSet *st = _status[i].state.get();
osg::StateSet *st = (n >= 0) ? _status[n].state.get()
: _status[_current_ptr].state.get();
_current_ptr += 1;
if (_current_ptr >= _status.size())
_current_ptr = 0;
@@ -279,13 +266,7 @@ SGMaterial::build_state( bool defer_tex_load )
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
if ( !defer_tex_load ) {
SG_LOG(SG_INPUT, SG_INFO, " " << _status[i].texture_path );
assignTexture( stateSet, _status[i].texture_path, wrapu, wrapv);
_status[i].texture_loaded = true;
} else {
_status[i].texture_loaded = false;
}
_status[i].texture_loaded = false;
osg::Material* material = new osg::Material;
material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
@@ -320,21 +301,11 @@ void SGMaterial::set_state( osg::StateSet *s )
void SGMaterial::assignTexture( osg::StateSet *state, const std::string &fname,
int _wrapu, int _wrapv, int _mipmap )
{
map<string, osg::ref_ptr<osg::Texture2D> >::iterator _tex_cache_iter;
_tex_cache_iter = _tex_cache.find(fname);
if (_tex_cache_iter == _tex_cache.end())
{
osg::Texture2D* texture = SGLoadTexture2D(fname, 0, _wrapu, _wrapv,
mipmap ? -1 : 0);
texture->setMaxAnisotropy( SGGetTextureFilter());
state->setTextureAttributeAndModes(0, texture);
_tex_cache[fname] = texture;
}
else
{
state->setTextureAttributeAndModes(0, _tex_cache_iter->second.get());
// cout << "Cache hit: " << fname << endl;
}
osg::Texture2D* texture = SGLoadTexture2D(fname, 0, _wrapu, _wrapv,
mipmap ? -1 : 0);
texture->setMaxAnisotropy( SGGetTextureFilter());
state->setTextureAttributeAndModes(0, texture);
osg::TexEnv* texEnv = new osg::TexEnv;
texEnv->setMode(osg::TexEnv::MODULATE);
state->setTextureAttributeAndModes(0, texEnv);

View File

@@ -113,18 +113,10 @@ public:
// Public methods.
////////////////////////////////////////////////////////////////////
/**
* Force the texture to load if it hasn't already.
*
* @return true if the texture loaded, false if it was loaded
* already.
*/
bool load_texture (int n = -1);
/**
* Get the textured state.
*/
osg::StateSet *get_state (int n = -1) const;
osg::StateSet *get_state (int n = -1);
/**
@@ -331,7 +323,9 @@ public:
const SGMaterial* getMaterial() const
{ return mMaterial; }
private:
SGSharedPtr<const SGMaterial> mMaterial;
// this cannot be an SGSharedPtr since that would create a cicrular reference
// making it impossible to ever free the space needed by SGMaterial
const SGMaterial* mMaterial;
};
void

View File

@@ -168,23 +168,9 @@ SGMaterial *SGMaterialLib::find( const string& material ) {
return NULL;
}
// Destructor
SGMaterialLib::~SGMaterialLib ( void ) {
}
// Load one pending "deferred" texture. Return true if a texture
// loaded successfully, false if no pending, or error.
void SGMaterialLib::load_next_deferred() {
// container::iterator it = begin();
for ( material_map_iterator it = begin(); it != end(); it++ ) {
/* we don't need the key, but here's how we'd get it if we wanted it. */
// const string &key = it->first;
SGMaterial *slot = it->second;
if (slot->load_texture())
return;
}
SG_LOG( SG_GENERAL, SG_INFO, "SGMaterialLib::~SGMaterialLib() size=" << matlib.size());
}
const SGMaterial*

View File

@@ -75,11 +75,6 @@ public:
// find a material record by material name
SGMaterial *find( const string& material );
/**
* Load the next deferred texture, if there is any.
*/
void load_next_deferred();
material_map_iterator begin() { return matlib.begin(); }
const_material_map_iterator begin() const { return matlib.begin(); }