]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/ModelRegistry.cxx
Improved tile cache priority scheme.
[simgear.git] / simgear / scene / model / ModelRegistry.cxx
index 1728020d64df06be17b7337d1ecb036b0dc90726..a4fb94c9fc2b6561ffca032da2e56fef961d3bd5 100644 (file)
@@ -55,6 +55,8 @@
 #include <simgear/props/condition.hxx>
 
 #include "BoundingVolumeBuildVisitor.hxx"
+#include "model.hxx"
+#include "SGReaderWriterXMLOptions.hxx"
 
 using namespace std;
 using namespace osg;
@@ -62,9 +64,6 @@ using namespace osgUtil;
 using namespace osgDB;
 using namespace simgear;
 
-using OpenThreads::ReentrantMutex;
-using OpenThreads::ScopedLock;
-
 // Little helper class that holds an extra reference to a
 // loaded 3d model.
 // Since we clone all structural nodes from our 3d models,
@@ -205,14 +204,12 @@ ReaderWriter::ReadResult
 ModelRegistry::readImage(const string& fileName,
                          const ReaderWriter::Options* opt)
 {
-    ScopedLock<ReentrantMutex> lock(readerMutex);
     CallbackMap::iterator iter
         = imageCallbackMap.find(getFileExtension(fileName));
-    // XXX Workaround for OSG plugin bug
     {
         if (iter != imageCallbackMap.end() && iter->second.valid())
             return iter->second->readImage(fileName, opt);
-        string absFileName = findDataFile(fileName, opt);
+        string absFileName = SGModelLib::findDataFile(fileName, opt);
         if (!fileExists(absFileName)) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot find image file \""
                    << fileName << "\"");
@@ -302,7 +299,7 @@ string OSGSubstitutePolicy::substitute(const string& name,
 {
     string fileSansExtension = getNameLessExtension(name);
     string osgFileName = fileSansExtension + ".osg";
-    string absFileName = findDataFile(osgFileName, opt);
+    string absFileName = SGModelLib::findDataFile(osgFileName, opt);
     return absFileName;
 }
 
@@ -355,10 +352,6 @@ ReaderWriter::ReadResult
 ModelRegistry::readNode(const string& fileName,
                         const ReaderWriter::Options* opt)
 {
-    ScopedLock<ReentrantMutex> lock(readerMutex);
-
-    // XXX Workaround for OSG plugin bug.
-//    Registry* registry = Registry::instance();
     ReaderWriter::ReadResult res;
     CallbackMap::iterator iter
         = nodeCallbackMap.find(getFileExtension(fileName));
@@ -393,7 +386,7 @@ public:
 
 static SGReadCallbackInstaller readCallbackInstaller;
 
-// we get optimal geometry from the loader.
+// we get optimal geometry from the loader (Hah!).
 struct ACOptimizePolicy : public OptimizeModelPolicy {
     ACOptimizePolicy(const string& extension)  :
         OptimizeModelPolicy(extension)
@@ -417,6 +410,10 @@ struct ACOptimizePolicy : public OptimizeModelPolicy {
                 && group->getNumChildren() == 1)
                 optimized = static_cast<Node*>(group->getChild(0));
         }
+        const SGReaderWriterXMLOptions* sgopt
+            = dynamic_cast<const SGReaderWriterXMLOptions*>(opt);
+        if (sgopt && sgopt->getInstantiateEffects())
+            optimized = instantiateEffects(optimized.get(), sgopt);
         return optimized.release();
     }
 };