diff --git a/src/osgEarth/InstanceResource b/src/osgEarth/InstanceResource index 5c8f8baacb..1f667bf59e 100644 --- a/src/osgEarth/InstanceResource +++ b/src/osgEarth/InstanceResource @@ -53,6 +53,10 @@ namespace osgEarth { namespace Util optional& uri() { return _uri; } const optional& uri() const { return _uri; } + //! For programmaticly set nodes only + osg::ref_ptr& node() { return _node; } + const osg::ref_ptr& node() const { return _node; } + public: // serialization methods virtual Config getConfig() const; @@ -62,7 +66,8 @@ namespace osgEarth { namespace Util /** Constructs a new resource. */ InstanceResource( const Config& conf =Config() ); - optional _uri; + optional _uri; + osg::ref_ptr _node; virtual osg::Node* createNodeFromURI( const URI& uri, const osgDB::Options* dbOptions ) const =0; }; diff --git a/src/osgEarth/InstanceResource.cpp b/src/osgEarth/InstanceResource.cpp index d26af729f5..bc3a62d1d7 100644 --- a/src/osgEarth/InstanceResource.cpp +++ b/src/osgEarth/InstanceResource.cpp @@ -50,5 +50,8 @@ InstanceResource::getConfig() const osg::Node* InstanceResource::createNode( const osgDB::Options* dbOptions ) const { - return createNodeFromURI( _uri.value(), dbOptions ); + if (_node.valid()) + return _node.get(); + else + return createNodeFromURI( _uri.value(), dbOptions ); } diff --git a/src/osgEarth/SubstituteModelFilter.cpp b/src/osgEarth/SubstituteModelFilter.cpp index 3469bd1111..16e60a92d7 100644 --- a/src/osgEarth/SubstituteModelFilter.cpp +++ b/src/osgEarth/SubstituteModelFilter.cpp @@ -113,7 +113,6 @@ SubstituteModelFilter::findResource(const URI& uri, osg::ref_ptr& output ) { // be careful about refptrs here since _instanceCache is an LRU. - InstanceCache::Record rec; if ( _instanceCache.get(uri, rec) ) { @@ -129,8 +128,16 @@ SubstituteModelFilter::findResource(const URI& uri, { // create it on the fly: output = symbol->createResource(); - output->uri() = uri; - _instanceCache.insert( uri, output.get() ); + + if (!uri.empty()) + { + output->uri() = uri; + _instanceCache.insert(uri, output.get()); + } + else if (symbol->asModel()) + { + output->node() = symbol->asModel()->getModel(); + } } // failed to find the instance.