From 2298cc520c681ba013325d84bfcc1c2e3e2e3931 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 6 Feb 2012 13:27:25 +0000 Subject: [PATCH] From Robert Milharcic, "In attached file I implemented LOAD_IMMEDIATELY mode for new osg ProxyNode wrapper. Current version of proxynode loading uses DatabasePager for both modes(DEFER_LOADING_TO_DATABASE_PAGER and LOAD_IMMEDIATELY). Immediate loading of external references begins after ProxyNode has been deserialized in ProxyNodeFinishedObjectReadCallback." --- src/osgWrappers/serializers/osg/ProxyNode.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/osgWrappers/serializers/osg/ProxyNode.cpp b/src/osgWrappers/serializers/osg/ProxyNode.cpp index bfee2cd98..9b12600fe 100644 --- a/src/osgWrappers/serializers/osg/ProxyNode.cpp +++ b/src/osgWrappers/serializers/osg/ProxyNode.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include // _filenameList static bool checkFileNames( const osg::ProxyNode& node ) @@ -97,6 +99,30 @@ static bool writeUserCenter( osgDB::OutputStream& os, const osg::ProxyNode& node return true; } +struct ProxyNodeFinishedObjectReadCallback : public osgDB::FinishedObjectReadCallback +{ + virtual void objectRead(osgDB::InputStream& is, osg::Object& obj) + { + osg::ProxyNode& proxyNode = static_cast(obj); + + if (proxyNode.getLoadingExternalReferenceMode() == osg::ProxyNode::LOAD_IMMEDIATELY) + { + for(unsigned int i=0; i= proxyNode.getNumChildren() && !proxyNode.getFileName(i).empty()) + { + osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)is.getOptions())->getDatabasePathList(); + fpl.push_front( fpl.empty() ? osgDB::getFilePath(proxyNode.getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(proxyNode.getFileName(i))); + osg::Node* node = osgDB::readNodeFile(proxyNode.getFileName(i), is.getOptions()); + fpl.pop_front(); + if(node) + proxyNode.insertChild(i, node); + } + } + } + } +}; + REGISTER_OBJECT_WRAPPER( ProxyNode, new osg::ProxyNode, osg::ProxyNode, @@ -121,4 +147,6 @@ REGISTER_OBJECT_WRAPPER( ProxyNode, END_ENUM_SERIALIZER(); // _centerMode ADD_USER_SERIALIZER( UserCenter ); // _userDefinedCenter, _radius + + wrapper->addFinishedObjectReadCallback(new ProxyNodeFinishedObjectReadCallback()); }