From dd1f6982ddbc3bd2f5fad09696fce4e978c4cfdb Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 15 May 2007 11:22:25 +0000 Subject: [PATCH] Futher work on new view dependent overlay node --- include/osgSim/OverlayNode | 20 ++++++++ src/osgSim/OverlayNode.cpp | 26 ++++++++++ src/osgWrappers/osg/DrawPixels.cpp | 2 +- src/osgWrappers/osgSim/OverlayNode.cpp | 71 +++++++++++++++++++++++--- 4 files changed, 111 insertions(+), 8 deletions(-) diff --git a/include/osgSim/OverlayNode b/include/osgSim/OverlayNode index 124de3c6f..2e3c0d6ac 100644 --- a/include/osgSim/OverlayNode +++ b/include/osgSim/OverlayNode @@ -19,6 +19,8 @@ #include #include +#include + #include namespace osgSim { @@ -153,6 +155,24 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group bool _continuousUpdate; bool _updateCamera; osg::Polytope _textureFrustum; + + private: + + struct OverlayData + { + osg::ref_ptr _camera; + osg::ref_ptr _overlayStateSet; + osg::ref_ptr _mainSubgraphStateSet; + osg::ref_ptr _texgen; + }; + + typedef std::map OverlayDataMap; + + OpenThreads::Mutex _overlayDataMapMutex; + OverlayDataMap _overlayDataMap; + + OverlayData& getOverlayData(osgUtil::CullVisitor* cv); + }; } diff --git a/src/osgSim/OverlayNode.cpp b/src/osgSim/OverlayNode.cpp index 15f62b0ed..e8990626e 100644 --- a/src/osgSim/OverlayNode.cpp +++ b/src/osgSim/OverlayNode.cpp @@ -89,6 +89,12 @@ void OverlayNode::setOverlayTechnique(OverlayTechnique technique) init(); } +OverlayNode::OverlayData& OverlayNode::getOverlayData(osgUtil::CullVisitor* cv) +{ + OpenThreads::ScopedLock lock(_overlayDataMapMutex); + return _overlayDataMap[cv]; +} + void OverlayNode::init() { switch(_overlayTechnique) @@ -332,6 +338,26 @@ void OverlayNode::traverse_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeV void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVisitor& nv) { osg::notify(osg::NOTICE)<<"OverlayNode::traverse() - VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<(&nv); + if (!cv) + { + Group::traverse(nv); + return; + } + + OverlayData& overlayData = getOverlayData(cv); + + Group::traverse(nv); + + osg::notify(osg::NOTICE)<<" "<<&overlayData<