]> git.mxchange.org Git - simgear.git/commitdiff
Memory leak fixes from Till Busch
authortimoore <timoore>
Thu, 24 Jan 2008 23:05:18 +0000 (23:05 +0000)
committertimoore <timoore>
Thu, 24 Jan 2008 23:05:18 +0000 (23:05 +0000)
simgear/scene/material/mat.cxx
simgear/scene/material/mat.hxx
simgear/scene/material/matlib.cxx
simgear/scene/material/matlib.hxx

index 94da1b5cdb1d013dd02fae073bd91c6871b798c8..7e590d63e002154d9672cdbea25900a27f4e1346 100644 (file)
@@ -52,8 +52,6 @@ SG_USING_STD(map);
 
 #include "mat.hxx"
 
-static map<string, osg::ref_ptr<osg::Texture2D> > _tex_cache;
-
 \f
 ////////////////////////////////////////////////////////////////////////
 // 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);
index a5d328b0325e329bcebe1f3ee20388f012b68737..0a0fbd13289c7781140497307ddad3fdf20b7393 100644 (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
index 5bf353cb3824ea981f8e6a0a0d6c40daa22342fd..ba8ef9abb0df6faee2accfb84d565d2cda964ffa 100644 (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*
index e7f2ca2a1f1233608220029e84ea7c0f72fb1aeb..1407e44f5b3680a6745564b9cdc39435c0ea3dec 100644 (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(); }