]> git.mxchange.org Git - simgear.git/commitdiff
Crash-fix: make mat-lib reference counted.
authorJames Turner <zakalawe@mac.com>
Sun, 19 Jan 2014 16:45:01 +0000 (16:45 +0000)
committerJames Turner <zakalawe@mac.com>
Sun, 19 Jan 2014 16:45:01 +0000 (16:45 +0000)
Make SGReaderWriterOptions own the material lib it's passing to
loader code, so it cannot be freed unexpectedly.

simgear/scene/material/matlib.hxx
simgear/scene/tgdb/obj.cxx
simgear/scene/util/SGReaderWriterOptions.hxx

index 45db7734526eced050c8d9c695de877a521f25e7..8a298b5fe4788ca18b4f8a3d8b7323da4ca3751a 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <simgear/compiler.h>
 
+#include <simgear/structure/SGReferenced.hxx>
 #include <simgear/structure/SGSharedPtr.hxx>
 
 #include <memory>
@@ -41,7 +42,8 @@ namespace simgear { class Effect; }
 namespace osg { class Geode; }
 
 // Material management class
-class SGMaterialLib {
+class SGMaterialLib : public SGReferenced
+{
 
 private:
     class MatLibPrivate;
@@ -99,5 +101,6 @@ public:
     ~SGMaterialLib ( void );
 };
 
+typedef SGSharedPtr<SGMaterialLib> SGMaterialLibPtr;
 
 #endif // _MATLIB_HXX 
index b5d6dd71cd8346e5e2cd7a72e57d874f45168177..edb35f268de78e3a410180afdd85c56e4879cd58 100644 (file)
@@ -905,7 +905,7 @@ public:
     // Generate all the lighting objects for the tile.
     osg::LOD* generateLightingTileObjects()
     {
-      SGMaterialLib* matlib = NULL;
+      SGMaterialLibPtr matlib;
 
       if (_options)
         matlib = _options->getMaterialLib();
@@ -1046,7 +1046,7 @@ public:
     // Generate all the random forest, objects and buildings for the tile
     osg::LOD* generateRandomTileObjects()
     {
-      SGMaterialLib* matlib = NULL;
+      SGMaterialLibPtr matlib;
       bool use_random_objects = false;
       bool use_random_vegetation = false;
       bool use_random_buildings = false;
@@ -1181,7 +1181,7 @@ SGLoadBTG(const std::string& path, const simgear::SGReaderWriterOptions* options
     if (!tile.read_bin(path))
       return NULL;
 
-    SGMaterialLib* matlib = 0;
+    SGMaterialLibPtr matlib;
 
     if (options) {
       matlib = options->getMaterialLib();
index 2a4b983d283194b8c00985e5f89d6f5f94ea0ab3..64262135a4de0c7068c6bab2f746bbf387183bb9 100644 (file)
 
 #include <osgDB/Options>
 #include <simgear/scene/model/modellib.hxx>
+#include <simgear/scene/material/matlib.hxx>
+
 #include <simgear/props/props.hxx>
 
 class SGPropertyNode;
-class SGMaterialLib;
+
 
 namespace simgear
 {
@@ -70,7 +72,7 @@ public:
     void setPropertyNode(const SGSharedPtr<SGPropertyNode>& propertyNode)
     { _propertyNode = propertyNode; }
 
-    SGMaterialLib* getMaterialLib() const
+    SGMaterialLibPtr getMaterialLib() const
     { return _materialLib; }
     void setMaterialLib(SGMaterialLib* materialLib)
     { _materialLib = materialLib; }
@@ -100,7 +102,7 @@ protected:
 
 private:
     SGSharedPtr<SGPropertyNode> _propertyNode;
-    SGMaterialLib* _materialLib;
+    SGSharedPtr<SGMaterialLib> _materialLib;
     osg::Node *(*_load_panel)(SGPropertyNode *);
     osg::ref_ptr<SGModelData> _model_data;
     bool _instantiateEffects;