]> git.mxchange.org Git - flightgear.git/commitdiff
Add a possible node not to visit.
authorfrohlich <frohlich>
Fri, 7 Aug 2009 05:24:18 +0000 (05:24 +0000)
committerTim Moore <timoore@redhat.com>
Sat, 8 Aug 2009 06:37:14 +0000 (08:37 +0200)
Modified Files:
scenery.cxx scenery.hxx

src/Scenery/scenery.cxx
src/Scenery/scenery.hxx

index 6853cfd9b968cdad339c8786c7031fced1e5bbec..b747f97edec59d509e182a8b50c7ffd98eae05f7 100644 (file)
@@ -121,16 +121,18 @@ void FGScenery::unbind() {
 
 bool
 FGScenery::get_cart_elevation_m(const SGVec3d& pos, double max_altoff,
-                                double& alt, const SGMaterial** material)
+                                double& alt, const SGMaterial** material,
+                                const osg::Node* butNotFrom)
 {
   SGGeod geod = SGGeod::fromCart(pos);
   geod.setElevationM(geod.getElevationM() + max_altoff);
-  return get_elevation_m(geod, alt, material);
+  return get_elevation_m(geod, alt, material, butNotFrom);
 }
 
 bool
 FGScenery::get_elevation_m(const SGGeod& geod, double& alt,
-                           const SGMaterial** material)
+                           const SGMaterial** material,
+                           const osg::Node* butNotFrom)
 {
   SGVec3d start = SGVec3d::fromGeod(geod);
 
@@ -151,6 +153,10 @@ FGScenery::get_elevation_m(const SGGeod& geod, double& alt,
     for (int i = 0; i < nHits; ++i) {
       const osgUtil::Hit& hit
         = intersectVisitor.getHitList(lineSegment.get())[i];
+      if (butNotFrom &&
+          std::find(hit.getNodePath().begin(), hit.getNodePath().end(),
+                    butNotFrom) != hit.getNodePath().end())
+          continue;
       SGVec3d point;
       point.osg() = hit.getWorldIntersectPoint();
       SGGeod geod = SGGeod::fromCart(point);
@@ -173,7 +179,8 @@ FGScenery::get_elevation_m(const SGGeod& geod, double& alt,
 
 bool
 FGScenery::get_cart_ground_intersection(const SGVec3d& pos, const SGVec3d& dir,
-                                        SGVec3d& nearestHit)
+                                        SGVec3d& nearestHit,
+                                        const osg::Node* butNotFrom)
 {
   // We assume that starting positions in the center of the earth are invalid
   if ( norm1(pos) < 1 )
@@ -197,6 +204,10 @@ FGScenery::get_cart_ground_intersection(const SGVec3d& pos, const SGVec3d& dir,
     for (int i = 0; i < nHits; ++i) {
       const osgUtil::Hit& hit
         = intersectVisitor.getHitList(lineSegment.get())[i];
+      if (butNotFrom &&
+          std::find(hit.getNodePath().begin(), hit.getNodePath().end(),
+                    butNotFrom) != hit.getNodePath().end())
+          continue;
       SGVec3d point;
       point.osg() = hit.getWorldIntersectPoint();
       double newdist = length(start - point);
index bc8b4f7100a68792bfee800c297d1bd326734a2f..bd976ba231ce82121a8ce1895528aa7fe8821bf6 100644 (file)
@@ -71,7 +71,8 @@ public:
     /// value is undefined. 
     /// All values are meant to be in meters or degrees.
     bool get_elevation_m(const SGGeod& geod, double& alt,
-                         const SGMaterial** material);
+                         const SGMaterial** material,
+                         const osg::Node* butNotFrom = 0);
 
     /// Compute the elevation of the scenery beow the cartesian point pos.
     /// you the returned scenery altitude is not higher than the position
@@ -85,7 +86,8 @@ public:
     /// value is undefined.
     /// All values are meant to be in meters.
     bool get_cart_elevation_m(const SGVec3d& pos, double max_altoff,
-                              double& elevation, const SGMaterial** material);
+                              double& elevation, const SGMaterial** material,
+                              const osg::Node* butNotFrom = 0);
 
     /// Compute the nearest intersection point of the line starting from 
     /// start going in direction dir with the terrain.
@@ -93,7 +95,8 @@ public:
     /// usual earth centered wgs84 coordiante system. Units are meters.
     /// On success, true is returned.
     bool get_cart_ground_intersection(const SGVec3d& start, const SGVec3d& dir,
-                                      SGVec3d& nearestHit);
+                                      SGVec3d& nearestHit,
+                                      const osg::Node* butNotFrom = 0);
 
     osg::Group *get_scene_graph () const { return scene_graph.get(); }
     osg::Group *get_terrain_branch () const { return terrain_branch.get(); }