From d4f7da7bb88557a8d392fcad2596535e18f11947 Mon Sep 17 00:00:00 2001 From: Don BURNS Date: Wed, 5 Feb 2003 23:13:27 +0000 Subject: [PATCH] Right, em.... fixed eh.. problem with destruction of RenderBin prototype list --- src/osgUtil/RenderBin.cpp | 48 +++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/osgUtil/RenderBin.cpp b/src/osgUtil/RenderBin.cpp index 1ee2dfc0e..a0049a3c7 100644 --- a/src/osgUtil/RenderBin.cpp +++ b/src/osgUtil/RenderBin.cpp @@ -15,52 +15,72 @@ #include #include +#include #include using namespace osg; using namespace osgUtil; + +class RenderBinPrototypeList : public osg::Referenced, public std::map< std::string, osg::ref_ptr > +{ + public: + RenderBinPrototypeList() {osg::notify(osg::DEBUG_INFO)<<"constructing RenderBinPrototypeList"< > RenderBinPrototypeList; RenderBinPrototypeList* renderBinPrototypeList() { - static RenderBinPrototypeList s_renderBinPrototypeList; - return &s_renderBinPrototypeList; + static osg::ref_ptr s_renderBinPrototypeList = new RenderBinPrototypeList; + return s_renderBinPrototypeList.get(); } RenderBin* RenderBin::getRenderBinPrototype(const std::string& binName) { - RenderBinPrototypeList::iterator itr = renderBinPrototypeList()->find(binName); - if (itr != renderBinPrototypeList()->end()) return itr->second.get(); - else return NULL; + RenderBinPrototypeList* list = renderBinPrototypeList(); + if (list) + { + RenderBinPrototypeList::iterator itr = list->find(binName); + if (itr != list->end()) return itr->second.get(); + } + return NULL; } RenderBin* RenderBin::createRenderBin(const std::string& binName) { - RenderBin* prototype = getRenderBinPrototype(binName); - if (prototype) return dynamic_cast(prototype->clone(osg::CopyOp::DEEP_COPY_ALL)); - else return NULL; + RenderBinPrototypeList* list = renderBinPrototypeList(); + if (list) + { + RenderBin* prototype = getRenderBinPrototype(binName); + if (prototype) return dynamic_cast(prototype->clone(osg::CopyOp::DEEP_COPY_ALL)); + } + return NULL; } void RenderBin::addRenderBinPrototype(const std::string& binName,RenderBin* proto) { - if (proto) + osg::notify(osg::DEBUG_INFO)<<"addRenderBinPrototype "<find(proto->className()); - if (itr != renderBinPrototypeList()->end()) renderBinPrototypeList()->erase(itr); + RenderBinPrototypeList::iterator itr = list->find(proto->className()); + if (itr != list->end()) list->erase(itr); } }