From d80cf6b5eeeebf3dfa0e218f8c631fb66b3d89f2 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 16 May 2007 19:19:43 +0000 Subject: [PATCH] Futher work on view dependent OverlayNode --- examples/osgsimulation/osgsimulation.cpp | 2 + src/osgSim/OverlayNode.cpp | 177 ++++++++++++++--------- 2 files changed, 114 insertions(+), 65 deletions(-) diff --git a/examples/osgsimulation/osgsimulation.cpp b/examples/osgsimulation/osgsimulation.cpp index 68e0deeed..39d91d081 100644 --- a/examples/osgsimulation/osgsimulation.cpp +++ b/examples/osgsimulation/osgsimulation.cpp @@ -366,5 +366,7 @@ int main(int argc, char **argv) } + viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); + return viewer.run(); } diff --git a/src/osgSim/OverlayNode.cpp b/src/osgSim/OverlayNode.cpp index c9341a19a..3c87a1357 100644 --- a/src/osgSim/OverlayNode.cpp +++ b/src/osgSim/OverlayNode.cpp @@ -128,31 +128,12 @@ void OverlayNode::setOverlayTechnique(OverlayTechnique technique) OverlayNode::OverlayData& OverlayNode::getOverlayData(osgUtil::CullVisitor* cv) { OpenThreads::ScopedLock lock(_overlayDataMapMutex); - return _overlayDataMap[cv]; -} - -void OverlayNode::init() -{ - switch(_overlayTechnique) - { - case(OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY): - init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(); - break; - case(VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY): - init_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(); - break; - case(VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY): - init_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY(); - break; - } -} - -void OverlayNode::init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY() -{ - osg::notify(osg::NOTICE)<<"OverlayNode::init() - OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<second; + + OverlayData& overlayData = _overlayDataMap[cv]; + + unsigned int tex_width = _textureSizeHint; unsigned int tex_height = _textureSizeHint; @@ -181,6 +162,8 @@ void OverlayNode::init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY() overlayData._camera->setClearColor(_overlayClearColor); + overlayData._camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); + // set viewport overlayData._camera->setViewport(0,0,tex_width,tex_height); @@ -192,13 +175,55 @@ void OverlayNode::init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY() // attach the texture and use it as the color buffer. overlayData._camera->attach(osg::Camera::COLOR_BUFFER, overlayData._texture.get()); + + if (_overlaySubgraph.valid()) overlayData._camera->addChild(_overlaySubgraph.get()); } - if (!overlayData._texgenNode) overlayData._texgenNode = new osg::TexGenNode; + if (!overlayData._texgenNode) + { + overlayData._texgenNode = new osg::TexGenNode; + overlayData._texgenNode->setTextureUnit(_textureUnit); + } - if (!overlayData._mainSubgraphStateSet) overlayData._mainSubgraphStateSet = new osg::StateSet; + if (!overlayData._mainSubgraphStateSet) + { + overlayData._mainSubgraphStateSet = new osg::StateSet; - setOverlayTextureUnit(_textureUnit); + overlayData._mainSubgraphStateSet->setTextureAttributeAndModes(_textureUnit, overlayData._texture.get(), osg::StateAttribute::ON); + overlayData._mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_S, osg::StateAttribute::ON); + overlayData._mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_T, osg::StateAttribute::ON); + overlayData._mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_R, osg::StateAttribute::ON); + overlayData._mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_Q, osg::StateAttribute::ON); + + if (_texEnvMode!=GL_NONE) + { + overlayData._mainSubgraphStateSet->setTextureAttribute(_textureUnit, new osg::TexEnv((osg::TexEnv::Mode)_texEnvMode)); + } + } + + return overlayData; +} + +void OverlayNode::init() +{ + switch(_overlayTechnique) + { + case(OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY): + init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(); + break; + case(VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY): + init_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(); + break; + case(VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY): + init_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY(); + break; + } +} + +void OverlayNode::init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY() +{ + osg::notify(osg::NOTICE)<<"OverlayNode::init() - OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<(*itr); } - camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); - + if (csn) { osg::Vec3d eyePoint(0.0,0.0,0.0); // center of the planet @@ -346,19 +370,6 @@ void OverlayNode::traverse_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeV // now set up the drawing of the main scene. -#if 0 - // Disable for time being as _overlaySubgraphBound isn't accurate for - // detecting whether the overaly texture will sit over affect the rendering - // of the children of the OverlayNode. Frustrum intersection may prove more - // fruitful. - - // note needs to use bound when captured not current bound. - if (!_overlaySubgraphBound.valid() || cv->isCulled(_overlaySubgraphBound)) - { - Group::traverse(nv); - } - else -#endif { overlayData._texgenNode->accept(*cv); @@ -401,6 +412,7 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis } OverlayData& overlayData = getOverlayData(cv); + osg::Camera* camera = overlayData._camera.get(); if (_overlaySubgraph.valid()) { @@ -408,8 +420,27 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis osg::ComputeBoundsVisitor cbbv(osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN); _overlaySubgraph->accept(cbbv); + // see if we are within a coordinate system node. + osg::CoordinateSystemNode* csn = 0; + osg::NodePath& nodePath = nv.getNodePath(); + for(osg::NodePath::reverse_iterator itr = nodePath.rbegin(); + itr != nodePath.rend() && csn==0; + ++itr) + { + csn = dynamic_cast(*itr); + } + + osg::BoundingSphere bs = _overlaySubgraph->getBound(); + + + + // push the stateset. + cv->pushStateSet(overlayData._mainSubgraphStateSet.get()); + Group::traverse(nv); + cv->popStateSet(); + osg::Matrix pm = *(cv->getProjectionMatrix()); osgUtil::CullVisitor::value_type znear = cv->getCalculatedNearPlane(); @@ -468,18 +499,6 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis osg::notify(osg::NOTICE)<<" center ="<second._texgenNode.get(); - if (texgenNode) texgenNode->setTextureUnit(_textureUnit); - } - updateMainSubgraphStateSet(); } @@ -613,6 +657,9 @@ void OverlayNode::updateMainSubgraphStateSet() itr != _overlayDataMap.end(); ++itr) { + osg::TexGenNode* texgenNode = itr->second._texgenNode.get(); + if (texgenNode) texgenNode->setTextureUnit(_textureUnit); + osg::StateSet* mainSubgraphStateSet = itr->second._mainSubgraphStateSet.get(); if (mainSubgraphStateSet) {