Change the main ModelRegistry callback function to stash the substituted file in the cache.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user