diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 981b67859..f2e2fd8d5 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -1361,19 +1361,41 @@ void CullVisitor::apply(osg::ClearNode& node) namespace osgUtil { -class RenderStageCache : public osg::Object +class RenderStageCache : public osg::Object, public osg::Observer { public: RenderStageCache() {} RenderStageCache(const RenderStageCache&, const osg::CopyOp&) {} + virtual ~RenderStageCache() + { + for(RenderStageMap::iterator itr = _renderStageMap.begin(); + itr != _renderStageMap.end(); + ++itr) + { + itr->first->removeObserver(this); + } + } META_Object(osgUtil, RenderStageCache); + virtual void objectDeleted(void* object) + { + osg::Referenced* ref = reinterpret_cast(object); + osgUtil::CullVisitor* cv = dynamic_cast(ref); + OpenThreads::ScopedLock lock(_mutex); + RenderStageMap::iterator itr = _renderStageMap.find(cv); + if (itr!=_renderStageMap.end()) + { + _renderStageMap.erase(cv); + } + } + void setRenderStage(CullVisitor* cv, RenderStage* rs) { OpenThreads::ScopedLock lock(_mutex); _renderStageMap[cv] = rs; + cv->addObserver(this); } RenderStage* getRenderStage(osgUtil::CullVisitor* cv)