Change the main ModelRegistry callback function to stash the substituted file in the cache.

This commit is contained in:
timoore
2007-11-29 23:56:49 +00:00
parent 34704a17f2
commit fdb265cd6e
+34 -20
View File
@@ -75,30 +75,44 @@ public:
using namespace osgDB; using namespace osgDB;
using osgDB::ReaderWriter; using osgDB::ReaderWriter;
Registry* registry = Registry::instance(); Registry* registry = Registry::instance();
std::string usedFileName = _substitutePolicy.substitute(fileName, opt); ref_ptr<osg::Node> optimizedNode = _cachePolicy.find(fileName, opt);
if (usedFileName.empty()) if (!optimizedNode.valid()) {
usedFileName = fileName; std::string otherFileName = _substitutePolicy.substitute(fileName,
ref_ptr<osg::Node> loadedNode = _cachePolicy.find(usedFileName, opt); opt);
if (!loadedNode.valid()) { ReaderWriter::ReadResult res;
ReaderWriter* rw = registry ->getReaderWriterForExtension(osgDB::getFileExtension(usedFileName)); if (!otherFileName.empty()) {
if (!rw) res = loadUsingReaderWriter(otherFileName, opt);
return ReaderWriter::ReadResult(); // FILE_NOT_HANDLED if (res.validNode())
ReaderWriter::ReadResult res = rw->readNode(usedFileName, opt); optimizedNode = res.getNode();
if (!res.validNode()) }
return res; if (!optimizedNode.valid()) {
ref_ptr<osg::Node> processedNode res = loadUsingReaderWriter(fileName, opt);
= _processPolicy.process(res.getNode(), usedFileName, opt); if (!res.validNode())
ref_ptr<osg::Node> optimizedNode return res;
= _optimizePolicy.optimize(processedNode.get(), usedFileName, ref_ptr<osg::Node> processedNode
opt); = _processPolicy.process(res.getNode(), fileName, opt);
_cachePolicy.addToCache(usedFileName, optimizedNode.get()); optimizedNode = _optimizePolicy.optimize(processedNode.get(),
loadedNode = optimizedNode; fileName, opt);
}
_cachePolicy.addToCache(fileName, optimizedNode.get());
} }
return ReaderWriter::ReadResult(_copyPolicy.copy(loadedNode.get(), return ReaderWriter::ReadResult(_copyPolicy.copy(optimizedNode.get(),
usedFileName, fileName,
opt)); opt));
} }
protected: protected:
static osgDB::ReaderWriter::ReadResult
loadUsingReaderWriter(const std::string& fileName,
const osgDB::ReaderWriter::Options* opt)
{
using namespace osgDB;
ReaderWriter* rw = Registry::instance()
->getReaderWriterForExtension(osgDB::getFileExtension(fileName));
if (!rw)
return ReaderWriter::ReadResult(); // FILE_NOT_HANDLED
return rw->readNode(fileName, opt);
}
ProcessPolicy _processPolicy; ProcessPolicy _processPolicy;
CachePolicy _cachePolicy; CachePolicy _cachePolicy;
OptimizePolicy _optimizePolicy; OptimizePolicy _optimizePolicy;