diff --git a/src/osgSim/OverlayNode.cpp b/src/osgSim/OverlayNode.cpp index d907a3ed3..3240d2507 100644 --- a/src/osgSim/OverlayNode.cpp +++ b/src/osgSim/OverlayNode.cpp @@ -202,7 +202,7 @@ public: } - void insertVertex(const osg::Vec3d& vertex) + void insertVertex(const osg::Vec3d& vertex, osg::EllipsoidModel* em=0, double minHeight=0.0) { // osg::notify(osg::NOTICE)<<"Inserting vertex "< VertexSet; + VertexSet uniqueVertices; + for(Edges::iterator eitr = edges.begin(); eitr != edges.end(); ++eitr) @@ -268,16 +271,62 @@ public: face.vertices.push_back(edge.first); face.vertices.push_back(edge.second); if (face.plane.distance(center)<0.0) face.plane.flip(); - _faces.push_back(face); + + uniqueVertices.insert(edge.first); + uniqueVertices.insert(edge.second); } } + + // now trim the new polytope back the desired height + if (em) + { + // compute the base vertices at the new height + Vertices baseVertices; + for(VertexSet::iterator itr = uniqueVertices.begin(); + itr != uniqueVertices.end(); + ++itr) + { + const osg::Vec3d& point = *itr; + double latitude, longitude, height; + em->convertXYZToLatLongHeight(point.x(), point.y(), point.z(), latitude, longitude, height); + osg::Vec3d normal(point); + normal.normalize(); + baseVertices.push_back(point - normal * (height - minHeight)); + } + + //compute centroid of the base vertices + osg::Vec3d center; + double totalArea = 0; + for(unsigned int i=0; isetTextureSize(tex_width, tex_height); @@ -630,15 +679,18 @@ OverlayNode::OverlayData& OverlayNode::getOverlayData(osgUtil::CullVisitor* cv) texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); texture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER); texture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER); +#if 1 texture->setBorderColor(osg::Vec4(_overlayClearColor)); +#else texture->setBorderColor(osg::Vec4(1.0,0.0,0.0,0.5)); +#endif overlayData._texture = texture; } // set up the render to texture camera. if (!overlayData._camera) { - osg::notify(osg::NOTICE)<<" setting up camera"<(*itr); } + osg::EllipsoidModel* em = csn ? csn->getEllipsoidModel() : 0; + - if (csn) + if (em) { osg::Vec3d eyePoint(0.0,0.0,0.0); // center of the planet double centerDistance = (eyePoint-osg::Vec3d(bs.center())).length(); @@ -900,7 +954,7 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis if (_overlaySubgraph.valid()) { -#if 0 +#if 0 if (!overlayData._geode) { overlayData._geode = new osg::Geode; @@ -916,6 +970,8 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis csn = dynamic_cast(*itr); } + osg::EllipsoidModel* em = csn ? csn->getEllipsoidModel() : 0; + osg::BoundingSphere bs = _overlaySubgraph->getBound(); @@ -969,9 +1025,15 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis _overlaySubgraph->accept(cbbv); overlayPolytope.setToBoundingBox(cbbv.getBoundingBox()); - if (csn) + if (em) { - overlayPolytope.insertVertex(osg::Vec3d(0.0,0.0,0.0)); + double minHeight = -1000.0; + overlayPolytope.insertVertex(osg::Vec3d(0.0,0.0,0.0), em, minHeight); + } + else + { + double minHeight = -1000.0; + overlayPolytope.projectDowntoBase(osg::Vec3d(0.0,0.0,1.0), minHeight); } @@ -982,20 +1044,15 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis 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))); + //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; - #if 0 -// frustum.cut(overlayPolytope); - frustum.getPoints(corners); -#else - overlayPolytope.cut(frustum); - overlayPolytope.getPoints(corners); -#endif + overlayPolytope.cut(frustum); + overlayPolytope.getPoints(corners); if (overlayData._geode.valid()) { @@ -1004,7 +1061,7 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis - osg::notify(osg::NOTICE)<<"AFTER CUT corners = "<