diff --git a/src/osgSim/OverlayNode.cpp b/src/osgSim/OverlayNode.cpp index 975e15a21..d907a3ed3 100644 --- a/src/osgSim/OverlayNode.cpp +++ b/src/osgSim/OverlayNode.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -350,6 +351,8 @@ public: osg::Vec3d intersection = (vb*distance_a - va*distance_b)/(distance_a-distance_b); newVertices.push_back(intersection); newFace.vertices.push_back(intersection); + + // osg::notify(osg::NOTICE)<<" intersection distance "<setVertexArray(vertices); + + for(Faces::iterator itr = _faces.begin(); + itr != _faces.end(); + ++itr) + { + Face& face = *itr; + geometry->addPrimitiveSet( new osg::DrawArrays(GL_LINE_STRIP, vertices->size(), face.vertices.size()) ); + for(Vertices::iterator vitr = face.vertices.begin(); + vitr != face.vertices.end(); + ++vitr) + { + vertices->push_back(*vitr); + } + } + + osg::Vec4Array* colours = new osg::Vec4Array; + colours->push_back(colour); + geometry->setColorArray(colours); + geometry->setColorBinding(osg::Geometry::BIND_OVERALL); + + osg::StateSet* stateset = geometry->getOrCreateStateSet(); + stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); + stateset->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF); + stateset->setTextureMode(1, GL_TEXTURE_2D, osg::StateAttribute::OFF); + + return geometry; + } + protected: typedef std::list Faces; @@ -593,6 +631,7 @@ OverlayNode::OverlayData& OverlayNode::getOverlayData(osgUtil::CullVisitor* cv) texture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER); texture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER); texture->setBorderColor(osg::Vec4(_overlayClearColor)); + texture->setBorderColor(osg::Vec4(1.0,0.0,0.0,0.5)); overlayData._texture = texture; } @@ -860,7 +899,13 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis if (_overlaySubgraph.valid()) { - + +#if 0 + if (!overlayData._geode) + { + overlayData._geode = new osg::Geode; + } +#endif // see if we are within a coordinate system node. osg::CoordinateSystemNode* csn = 0; osg::NodePath& nodePath = nv.getNodePath(); @@ -908,7 +953,11 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis // create polytope for the view frustum in local coords CustomPolytope frustum; - frustum.setToUnitFrustum(); +#if 1 + frustum.setToUnitFrustum(false, false); +#else + frustum.setToUnitFrustum(true, true); +#endif frustum.transform(inverseMVP, MVP); @@ -925,29 +974,43 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis overlayPolytope.insertVertex(osg::Vec3d(0.0,0.0,0.0)); } - frustum.cut(overlayPolytope); - + if (overlayData._geode.valid() && overlayData._geode->getNumDrawables()>500) + { + overlayData._geode->removeDrawables(0, 3); + } + + if (overlayData._geode.valid()) + { + overlayData._geode->addDrawable(overlayPolytope.createDrawable(osg::Vec4d(1.0f,1.0f,0.0f,1.0f))); + overlayData._geode->addDrawable(frustum.createDrawable(osg::Vec4d(0.0f,0.0f,1.0f,1.0f))); + } + CustomPolytope::Vertices corners; - frustum.getPoints(corners); + #if 0 +// frustum.cut(overlayPolytope); + frustum.getPoints(corners); +#else + overlayPolytope.cut(frustum); + overlayPolytope.getPoints(corners); +#endif + + if (overlayData._geode.valid()) + { + overlayData._geode->addDrawable(overlayPolytope.createDrawable(osg::Vec4d(1.0f,1.0f,1.0f,1.0f))); + } + + + osg::notify(osg::NOTICE)<<"AFTER CUT corners = "<getBound().center(); + osg::Vec3d frustum_axis = cv->getLookVectorLocal(); - double diagonal = (corners[0]-corners[7]).length(); - float diagonal_near = (corners[0]-center_near).length(); - float diagonal_far = (corners[7]-center_far).length(); - - osg::notify(osg::NOTICE)<<" center ="<