]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/ModelRegistry.hxx
Provide something more sensible for the properties root
[simgear.git] / simgear / scene / model / ModelRegistry.hxx
index 229f75578280ad82212b05f6e374a290625b9b26..998d2f2fca5ea17fe0476cfe3d0c43f344e1b2fe 100644 (file)
@@ -29,6 +29,7 @@
 #include <osgDB/Registry>
 
 #include <simgear/compiler.h>
+#include <simgear/structure/Singleton.hxx>
 
 #include <string>
 #include <map>
@@ -60,13 +61,13 @@ namespace simgear
 // readNode function is specified as a template with a bunch of
 // pluggable (and predefined) policies.
 template <typename ProcessPolicy, typename CachePolicy, typename OptimizePolicy,
-          typename CopyPolicy, typename SubstitutePolicy>
+          typename CopyPolicy, typename SubstitutePolicy, typename BVHPolicy>
 class ModelRegistryCallback : public osgDB::Registry::ReadFileCallback {
 public:
     ModelRegistryCallback(const std::string& extension) :
         _processPolicy(extension), _cachePolicy(extension),
         _optimizePolicy(extension), _copyPolicy(extension),
-        _substitutePolicy(extension)
+        _substitutePolicy(extension), _bvhPolicy(extension)
     {
     }
     virtual osgDB::ReaderWriter::ReadResult
@@ -96,11 +97,12 @@ public:
                 optimizedNode = _optimizePolicy.optimize(processedNode.get(),
                                                          fileName, opt);
             }
+            _bvhPolicy.buildBVH(fileName, optimizedNode.get());
             _cachePolicy.addToCache(fileName, optimizedNode.get());
         }
-        return ReaderWriter::ReadResult(_copyPolicy.copy(optimizedNode.get(),
-                                                         fileName,
-                                                         opt));
+        osg::ref_ptr<osg::Node> copyNode;
+        copyNode = _copyPolicy.copy(optimizedNode.get(), fileName, opt);
+        return ReaderWriter::ReadResult(copyNode);
     }
 protected:
     static osgDB::ReaderWriter::ReadResult
@@ -120,6 +122,7 @@ protected:
     OptimizePolicy _optimizePolicy;
     CopyPolicy _copyPolicy;
     SubstitutePolicy _substitutePolicy;
+    BVHPolicy _bvhPolicy;
     virtual ~ModelRegistryCallback() {}
 };
 
@@ -195,12 +198,30 @@ struct NoSubstitutePolicy {
         return std::string();
     }
 };
+
+struct BuildLeafBVHPolicy {
+    BuildLeafBVHPolicy(const std::string& extension) {}
+    void buildBVH(const std::string& fileName, osg::Node* node);
+};
+
+struct BuildGroupBVHPolicy {
+    BuildGroupBVHPolicy(const std::string& extension) {}
+    void buildBVH(const std::string& fileName, osg::Node* node);
+};
+
+struct NoBuildBVHPolicy {
+    NoBuildBVHPolicy(const std::string& extension) {}
+    void buildBVH(const std::string& fileName, osg::Node* node);
+};
+
 typedef ModelRegistryCallback<DefaultProcessPolicy, DefaultCachePolicy,
                               OptimizeModelPolicy, DefaultCopyPolicy,
-                              OSGSubstitutePolicy> DefaultCallback;
+                              OSGSubstitutePolicy, BuildLeafBVHPolicy>
+DefaultCallback;
 
 // The manager for the callbacks
-class ModelRegistry : public osgDB::Registry::ReadFileCallback {
+class ModelRegistry : public osgDB::Registry::ReadFileCallback,
+                      public ReferencedSingleton<ModelRegistry> {
 public:
     ModelRegistry();
     virtual osgDB::ReaderWriter::ReadResult
@@ -215,10 +236,8 @@ public:
     void addNodeCallbackForExtension(const std::string& extension,
                                      osgDB::Registry::ReadFileCallback*
                                      callback);
-    static ModelRegistry* getInstance();
     virtual ~ModelRegistry() {}
 protected:
-    static osg::ref_ptr<ModelRegistry> instance;
     typedef std::map<std::string, osg::ref_ptr<osgDB::Registry::ReadFileCallback> >
     CallbackMap;
     CallbackMap imageCallbackMap;
@@ -233,7 +252,8 @@ protected:
 // postprocessing.
 typedef ModelRegistryCallback<DefaultProcessPolicy, NoCachePolicy,
                               NoOptimizePolicy, NoCopyPolicy,
-                              NoSubstitutePolicy> LoadOnlyCallback;
+                              NoSubstitutePolicy, BuildLeafBVHPolicy>
+LoadOnlyCallback;
 
 // Proxy for registering extension-based callbacks
 
@@ -243,7 +263,7 @@ class ModelRegistryCallbackProxy
 public:
     ModelRegistryCallbackProxy(std::string extension)
     {
-        ModelRegistry::getInstance()
+        ModelRegistry::instance()
             ->addNodeCallbackForExtension(extension, new T(extension));
     }
 };