#include #include #include #include #include #include #include #include #include #include #include #include #include struct MyReadCallback : public osgUtil::IntersectionVisitor::ReadCallback { virtual osg::Node* readNodeFile(const std::string& filename) { return osgDB::readNodeFile(filename); } }; int main(int argc, char **argv) { // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); // set up the usage document, in case we need to print out how to use this program. arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates use of node tracker."); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); osg::ref_ptr scene = osgDB::readNodeFiles(arguments); if (!scene) { std::cout<<"No model loaded, please specify a valid model on the command line."<(scene.get()); osg::EllipsoidModel* em = csn ? csn->getEllipsoidModel() : 0; osg::BoundingSphere bs = scene->getBound(); bool useIntersectorGroup = true; bool useLineOfSight = true; if (useLineOfSight) { osg::Vec3d start = bs.center() + osg::Vec3d(0.0,bs.radius(),0.0); osg::Vec3d end = bs.center() - osg::Vec3d(0.0, bs.radius(),0.0); osg::Vec3d deltaRow( 0.0, 0.0, bs.radius()*0.01); osg::Vec3d deltaColumn( bs.radius()*0.01, 0.0, 0.0); unsigned int numRows = 20; unsigned int numColumns = 20; osgSim::LineOfSight los; #if 0 osgSim::HeightAboveTerrain hat; hat.setDatabaseCacheReadCallback(los.getDatabaseCacheReadCallback()); for(unsigned int r=0; rtick(); los.computeIntersections(scene.get()); osg::Timer_t endTick = osg::Timer::instance()->tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<tick(); std::cout<<"Computing HeightAboveTerrain"<tick(); for(unsigned int i=0; idelta_s(startTick,endTick)<tick(); std::cout<<"Computing ElevationSlice"<tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<first<<" "<second<tick(); osg::Vec3d start = bs.center() + osg::Vec3d(0.0,bs.radius(),0.0); osg::Vec3d end = bs.center();// - osg::Vec3d(0.0, bs.radius(),0.0); osg::Vec3d deltaRow( 0.0, 0.0, bs.radius()*0.01); osg::Vec3d deltaColumn( bs.radius()*0.01, 0.0, 0.0); unsigned int numRows = 20; unsigned int numColumns = 20; osg::ref_ptr intersectorGroup = new osgUtil::IntersectorGroup(); for(unsigned int r=0; r intersector = new osgUtil::LineSegmentIntersector(s, e); intersectorGroup->addIntersector( intersector.get() ); } } osgUtil::IntersectionVisitor intersectVisitor( intersectorGroup.get(), new MyReadCallback ); scene->accept(intersectVisitor); osg::Timer_t endTick = osg::Timer::instance()->tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<containsIntersections() ) { std::cout<<"Found intersections "<getIntersectors(); for(osgUtil::IntersectorGroup::Intersectors::iterator intersector_itr = intersectors.begin(); intersector_itr != intersectors.end(); ++intersector_itr) { osgUtil::LineSegmentIntersector* lsi = dynamic_cast(intersector_itr->get()); if (lsi) { osgUtil::LineSegmentIntersector::Intersections& intersections = lsi->getIntersections(); for(osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin(); itr != intersections.end(); ++itr) { const osgUtil::LineSegmentIntersector::Intersection& intersection = *itr; std::cout<<" ratio "<tick(); #if 1 osg::Vec3d start = bs.center() + osg::Vec3d(0.0,bs.radius(),0.0); osg::Vec3d end = bs.center() - osg::Vec3d(0.0, bs.radius(),0.0); #else osg::Vec3d start = bs.center() + osg::Vec3d(0.0,0.0, bs.radius()); osg::Vec3d end = bs.center() - osg::Vec3d(0.0, 0.0, bs.radius()); #endif osg::ref_ptr intersector = new osgUtil::LineSegmentIntersector(start, end); osgUtil::IntersectionVisitor intersectVisitor( intersector.get(), new MyReadCallback ); scene->accept(intersectVisitor); osg::Timer_t endTick = osg::Timer::instance()->tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<containsIntersections() ) { osgUtil::LineSegmentIntersector::Intersections& intersections = intersector->getIntersections(); for(osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin(); itr != intersections.end(); ++itr) { const osgUtil::LineSegmentIntersector::Intersection& intersection = *itr; std::cout<<" ratio "<