Work around osg Registry path list problems

The OSG reader plugins overwrite the path list passed in options with the local
directory of the file being read, forcing you to set the path list in
the Registry. I think this a bug, but in the meantime here's a workaround.
This commit is contained in:
timoore
2007-12-09 22:38:10 +00:00
parent 4b7361dfe7
commit 3c409c5070

View File

@@ -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<OpenThreads::ReentrantMutex> 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<OpenThreads::ReentrantMutex> lock(readerMutex);
// XXX Workaround for OSG plugin bug.
OptionsPusher pusher(opt);
Registry* registry = Registry::instance();
ReaderWriter::ReadResult res;
Node* cached = 0;