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
|
bool
|
||||||
FGScenery::get_cart_elevation_m(const SGVec3d& pos, double max_altoff,
|
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);
|
SGGeod geod = SGGeod::fromCart(pos);
|
||||||
geod.setElevationM(geod.getElevationM() + max_altoff);
|
geod.setElevationM(geod.getElevationM() + max_altoff);
|
||||||
return get_elevation_m(geod, alt, material);
|
return get_elevation_m(geod, alt, material, butNotFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
FGScenery::get_elevation_m(const SGGeod& geod, double& alt,
|
FGScenery::get_elevation_m(const SGGeod& geod, double& alt,
|
||||||
const SGMaterial** material)
|
const SGMaterial** material,
|
||||||
|
const osg::Node* butNotFrom)
|
||||||
{
|
{
|
||||||
SGVec3d start = SGVec3d::fromGeod(geod);
|
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) {
|
for (int i = 0; i < nHits; ++i) {
|
||||||
const osgUtil::Hit& hit
|
const osgUtil::Hit& hit
|
||||||
= intersectVisitor.getHitList(lineSegment.get())[i];
|
= intersectVisitor.getHitList(lineSegment.get())[i];
|
||||||
|
if (butNotFrom &&
|
||||||
|
std::find(hit.getNodePath().begin(), hit.getNodePath().end(),
|
||||||
|
butNotFrom) != hit.getNodePath().end())
|
||||||
|
continue;
|
||||||
SGVec3d point;
|
SGVec3d point;
|
||||||
point.osg() = hit.getWorldIntersectPoint();
|
point.osg() = hit.getWorldIntersectPoint();
|
||||||
SGGeod geod = SGGeod::fromCart(point);
|
SGGeod geod = SGGeod::fromCart(point);
|
||||||
|
@ -173,7 +179,8 @@ FGScenery::get_elevation_m(const SGGeod& geod, double& alt,
|
||||||
|
|
||||||
bool
|
bool
|
||||||
FGScenery::get_cart_ground_intersection(const SGVec3d& pos, const SGVec3d& dir,
|
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
|
// We assume that starting positions in the center of the earth are invalid
|
||||||
if ( norm1(pos) < 1 )
|
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) {
|
for (int i = 0; i < nHits; ++i) {
|
||||||
const osgUtil::Hit& hit
|
const osgUtil::Hit& hit
|
||||||
= intersectVisitor.getHitList(lineSegment.get())[i];
|
= intersectVisitor.getHitList(lineSegment.get())[i];
|
||||||
|
if (butNotFrom &&
|
||||||
|
std::find(hit.getNodePath().begin(), hit.getNodePath().end(),
|
||||||
|
butNotFrom) != hit.getNodePath().end())
|
||||||
|
continue;
|
||||||
SGVec3d point;
|
SGVec3d point;
|
||||||
point.osg() = hit.getWorldIntersectPoint();
|
point.osg() = hit.getWorldIntersectPoint();
|
||||||
double newdist = length(start - point);
|
double newdist = length(start - point);
|
||||||
|
|
|
@ -71,7 +71,8 @@ public:
|
||||||
/// value is undefined.
|
/// value is undefined.
|
||||||
/// All values are meant to be in meters or degrees.
|
/// All values are meant to be in meters or degrees.
|
||||||
bool get_elevation_m(const SGGeod& geod, double& alt,
|
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.
|
/// Compute the elevation of the scenery beow the cartesian point pos.
|
||||||
/// you the returned scenery altitude is not higher than the position
|
/// you the returned scenery altitude is not higher than the position
|
||||||
|
@ -85,7 +86,8 @@ public:
|
||||||
/// value is undefined.
|
/// value is undefined.
|
||||||
/// All values are meant to be in meters.
|
/// All values are meant to be in meters.
|
||||||
bool get_cart_elevation_m(const SGVec3d& pos, double max_altoff,
|
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
|
/// Compute the nearest intersection point of the line starting from
|
||||||
/// start going in direction dir with the terrain.
|
/// start going in direction dir with the terrain.
|
||||||
|
@ -93,7 +95,8 @@ public:
|
||||||
/// usual earth centered wgs84 coordiante system. Units are meters.
|
/// usual earth centered wgs84 coordiante system. Units are meters.
|
||||||
/// On success, true is returned.
|
/// On success, true is returned.
|
||||||
bool get_cart_ground_intersection(const SGVec3d& start, const SGVec3d& dir,
|
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_scene_graph () const { return scene_graph.get(); }
|
||||||
osg::Group *get_terrain_branch () const { return terrain_branch.get(); }
|
osg::Group *get_terrain_branch () const { return terrain_branch.get(); }
|
||||||
|
|
Loading…
Add table
Reference in a new issue