Add a possible node not to visit.
Modified Files: scenery.cxx scenery.hxx
This commit is contained in:
parent
0c2db22988
commit
aac4bec5c7
2 changed files with 21 additions and 7 deletions
|
@ -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);
|
||||
|
|
|
@ -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(); }
|
||||
|
|
Loading…
Reference in a new issue