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);
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);
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 )
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);
/// 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
/// 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.
/// 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(); }