Hi!
According to the OSG wiki IntersectVisitor is deprecated, attached
is a patch to convert it to the new IntersectionVisitor.
Unfortunately this does not fix the repeating "Picked up error in
TriangleIntersect" errors occurring in some situations, but maybe
going away from deprecated classes is good in itself.
Regards,
Thomas Arendsen Hein
--
[EMAIL PROTECTED] - http://intevation.de/~thomas/ - OpenPGP key: 0x5816791A
Intevation GmbH, Neuer Graben 17, 49074 Osnabrueck - AG Osnabrueck, HR B 18998
Geschaeftsfuehrer: Frank Koormann, Bernhard Reiter, Dr. Jan-Oliver Wagner
Index: src/Scenery/scenery.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/Scenery/scenery.cxx,v
retrieving revision 1.26
diff -u -u -r1.26 scenery.cxx
--- src/Scenery/scenery.cxx 22 Mar 2008 09:31:09 -0000 1.26
+++ src/Scenery/scenery.cxx 13 Nov 2008 21:30:36 -0000
@@ -28,7 +28,8 @@
#include <stdio.h>
#include <string.h>
-#include <osgUtil/IntersectVisitor>
+#include <osgUtil/IntersectionVisitor>
+#include <osgUtil/LineSegmentIntersector>
#include <simgear/constants.h>
#include <simgear/debug/logstream.hxx>
@@ -143,27 +144,26 @@
geodEnd.setElevationM(SGMiscd::min(geod.getElevationM() - 10, -10000));
SGVec3d end = SGVec3d::fromGeod(geodEnd);
- osgUtil::IntersectVisitor intersectVisitor;
- intersectVisitor.setTraversalMask(SG_NODEMASK_TERRAIN_BIT);
- osg::ref_ptr<osg::LineSegment> lineSegment;
- lineSegment = new osg::LineSegment(start.osg(), end.osg());
- intersectVisitor.addLineSegment(lineSegment.get());
- get_scene_graph()->accept(intersectVisitor);
- bool hits = intersectVisitor.hits();
+ osg::ref_ptr<osgUtil::LineSegmentIntersector> lineSegment;
+ lineSegment = new osgUtil::LineSegmentIntersector(start.osg(), end.osg());
+ osgUtil::IntersectionVisitor intersectionVisitor(lineSegment.get());
+ intersectionVisitor.setTraversalMask(SG_NODEMASK_TERRAIN_BIT);
+ get_scene_graph()->accept(intersectionVisitor);
+ bool hits = lineSegment->containsIntersections();
if (hits) {
- int nHits = intersectVisitor.getNumHits(lineSegment.get());
alt = -SGLimitsd::max();
- for (int i = 0; i < nHits; ++i) {
- const osgUtil::Hit& hit
- = intersectVisitor.getHitList(lineSegment.get())[i];
+ osgUtil::LineSegmentIntersector::Intersections& intersections
+ = lineSegment->getIntersections();
+ for (osgUtil::LineSegmentIntersector::Intersections::iterator itr
+ = intersections.begin(); itr != intersections.end(); ++itr) {
SGVec3d point;
- point.osg() = hit.getWorldIntersectPoint();
+ point.osg() = itr->getWorldIntersectPoint();
SGGeod geod = SGGeod::fromCart(point);
double elevation = geod.getElevationM();
if (alt < elevation) {
alt = elevation;
if (material) {
- const osg::StateSet* stateSet = hit.getDrawable()->getStateSet();
+ const osg::StateSet* stateSet = itr->drawable->getStateSet();
*material = globals->get_matlib()->findMaterial(stateSet);
}
}
@@ -186,21 +186,20 @@
SGVec3d start = pos;
SGVec3d end = start + 1e5*normalize(dir); // FIXME visibility ???
- osgUtil::IntersectVisitor intersectVisitor;
- intersectVisitor.setTraversalMask(SG_NODEMASK_TERRAIN_BIT);
- osg::ref_ptr<osg::LineSegment> lineSegment;
- lineSegment = new osg::LineSegment(start.osg(), end.osg());
- intersectVisitor.addLineSegment(lineSegment.get());
- get_scene_graph()->accept(intersectVisitor);
- bool hits = intersectVisitor.hits();
+ osg::ref_ptr<osgUtil::LineSegmentIntersector> lineSegment;
+ lineSegment = new osgUtil::LineSegmentIntersector(start.osg(), end.osg());
+ osgUtil::IntersectionVisitor intersectionVisitor(lineSegment.get());
+ intersectionVisitor.setTraversalMask(SG_NODEMASK_TERRAIN_BIT);
+ get_scene_graph()->accept(intersectionVisitor);
+ bool hits = lineSegment->containsIntersections();
if (hits) {
- int nHits = intersectVisitor.getNumHits(lineSegment.get());
double dist = SGLimitsd::max();
- for (int i = 0; i < nHits; ++i) {
- const osgUtil::Hit& hit
- = intersectVisitor.getHitList(lineSegment.get())[i];
+ osgUtil::LineSegmentIntersector::Intersections& intersections
+ = lineSegment->getIntersections();
+ for (osgUtil::LineSegmentIntersector::Intersections::iterator itr
+ = intersections.begin(); itr != intersections.end(); ++itr) {
SGVec3d point;
- point.osg() = hit.getWorldIntersectPoint();
+ point.osg() = itr->getWorldIntersectPoint();
double newdist = length(start - point);
if (newdist < dist) {
dist = newdist;
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel