diff --git a/simgear/scene/model/ModelRegistry.cxx b/simgear/scene/model/ModelRegistry.cxx index b2dfa1b6..6ae694b8 100644 --- a/simgear/scene/model/ModelRegistry.cxx +++ b/simgear/scene/model/ModelRegistry.cxx @@ -198,6 +198,34 @@ public: material->setColorMode(Material::AMBIENT_AND_DIFFUSE); } }; + +// Work around an OSG bug - the file loaders don't use the file path +// in options while the file is being loaded. + +struct OptionsPusher { + FilePathList localPathList; + OptionsPusher(const ReaderWriter::Options* options) + { + Registry* registry = Registry::instance(); + localPathList = registry->getDataFilePathList(); + const FilePathList& regPathList = registry->getDataFilePathList(); + const FilePathList& optionsPathList = options->getDatabasePathList(); + for (FilePathList::const_iterator iter = optionsPathList.begin(); + iter != optionsPathList.end(); + ++iter) { + if (find(regPathList.begin(), regPathList.end(), *iter) + == regPathList.end()) + localPathList.push_front(*iter); + } + // Save the current Registry path list and install the augmented one. + localPathList.swap(registry->getDataFilePathList()); + } + ~OptionsPusher() + { + // Restore the old path list + localPathList.swap(Registry::instance()->getDataFilePathList()); + } +}; } // namespace ReaderWriter::ReadResult @@ -207,9 +235,11 @@ ModelRegistry::readImage(const string& fileName, OpenThreads::ScopedLock lock(readerMutex); CallbackMap::iterator iter = imageCallbackMap.find(getFileExtension(fileName)); + // XXX Workaround for OSG plugin bug + OptionsPusher pusher(opt); if (iter != imageCallbackMap.end() && iter->second.valid()) return iter->second->readImage(fileName, opt); - string absFileName = findDataFile(fileName, opt); + string absFileName = findDataFile(fileName); if (!fileExists(absFileName)) { SG_LOG(SG_IO, SG_ALERT, "Cannot find image file \"" << fileName << "\""); @@ -360,6 +390,8 @@ ModelRegistry::readNode(const string& fileName, const ReaderWriter::Options* opt) { OpenThreads::ScopedLock lock(readerMutex); + // XXX Workaround for OSG plugin bug. + OptionsPusher pusher(opt); Registry* registry = Registry::instance(); ReaderWriter::ReadResult res; Node* cached = 0;