1
0
Fork 0

src/Viewer/view.*: in Tower View etc, use tower nearest to the multiplayer aircraft.

This commit is contained in:
Julian Smith 2019-08-07 16:57:00 +01:00
parent c2f542b085
commit e3b3f40f0a

View file

@ -829,7 +829,7 @@ void View::handleAGL()
{ {
/* Just in case get_elevation_m() fails, we may as well use sea level. */ /* Just in case get_elevation_m() fails, we may as well use sea level. */
ground_altitude = 0; ground_altitude = 0;
SG_LOG(SG_FLIGHT, SG_DEBUG, "get_elevation_m() failed. _target=" << _target << "\n"); SG_LOG(SG_VIEW, SG_DEBUG, "get_elevation_m() failed. _target=" << _target << "\n");
} }
double h_distance = SGGeodesy::distanceM(_position, _target); double h_distance = SGGeodesy::distanceM(_position, _target);
@ -858,7 +858,7 @@ void View::handleAGL()
double chase_distance_m; double chase_distance_m;
const std::string& root = ViewPropertyEvaluator::getStringValue("(/sim/view[(/sim/current-view/view-number-raw)]/config/root)"); const std::string& root = ViewPropertyEvaluator::getStringValue("(/sim/view[(/sim/current-view/view-number-raw)]/config/root)");
if (root == "/") { if (root == "/" || root == "") {
chase_distance_m = ViewPropertyEvaluator::getDoubleValue("(/sim/chase-distance-m)", -25); chase_distance_m = ViewPropertyEvaluator::getDoubleValue("(/sim/chase-distance-m)", -25);
} }
else { else {
@ -915,7 +915,8 @@ void View::handleAGL()
fov_v_deg *= _fov_user_deg / _configFOV_deg; fov_v_deg *= _fov_user_deg / _configFOV_deg;
set_fov(fov_v_deg); set_fov(fov_v_deg);
SG_LOG(SG_FLIGHT, SG_DEBUG, "" SG_LOG(SG_VIEW, SG_DEBUG, ""
<< " fov_v_deg=" << fov_v_deg
<< " _position=" << _position << " _position=" << _position
<< " _target=" << _target << " _target=" << _target
<< " ground_altitude=" << ground_altitude << " ground_altitude=" << ground_altitude
@ -926,7 +927,7 @@ void View::handleAGL()
} }
/* Views of an aircraft e.g. Helicopter View. */ /* Views of an aircraft e.g. Helicopter View and Tower View. */
void void
View::recalcLookAt () View::recalcLookAt ()
{ {
@ -967,24 +968,35 @@ View::recalcLookAt ()
_position = _target; _position = _target;
_position.setLongitudeDeg( const std::string& tail = ViewPropertyEvaluator::getStringValue("(/sim/view[(/sim/current-view/view-number-raw)]/config/eye-lon-deg-path)");
ViewPropertyEvaluator::getDoubleValue(
"((/sim/view[(/sim/current-view/view-number-raw)]/config/eye-lon-deg-path))", if (tail != "") {
_position.getLongitudeDeg() /* <tail> will typically be /sim/tower/longitude-deg, so that this view's
) eye position is from the tower rather than relative to the aircraft.
);
_position.setLatitudeDeg( If we are viewing a multiplayer aircraft, the nearest tower
ViewPropertyEvaluator::getDoubleValue( will be in /sim/view[]/config/root/sim/tower/longitude-deg (see
"((/sim/view[(/sim/current-view/view-number-raw)]/config/eye-lat-deg-path))", FGEnvironmentMgr::updateClosestAirport()), so we use a prefix to select
_position.getLatitudeDeg() either /sim/tower/longitude-deg or multiplayer's tower. */
) _position.setLongitudeDeg(
); ViewPropertyEvaluator::getDoubleValue(
_position.setElevationFt( "((/sim/view[(/sim/current-view/view-number-raw)]/config/root)(/sim/view[(/sim/current-view/view-number-raw)]/config/eye-lon-deg-path))",
ViewPropertyEvaluator::getDoubleValue( _position.getLongitudeDeg()
"((/sim/view[(/sim/current-view/view-number-raw)]/config/eye-alt-ft-path))", )
_position.getElevationFt() );
) _position.setLatitudeDeg(
); ViewPropertyEvaluator::getDoubleValue(
"((/sim/view[(/sim/current-view/view-number-raw)]/config/root)(/sim/view[(/sim/current-view/view-number-raw)]/config/eye-lat-deg-path))",
_position.getLatitudeDeg()
)
);
_position.setElevationFt(
ViewPropertyEvaluator::getDoubleValue(
"((/sim/view[(/sim/current-view/view-number-raw)]/config/root)(/sim/view[(/sim/current-view/view-number-raw)]/config/eye-alt-ft-path))",
_position.getElevationFt()
)
);
}
if (_lookat_agl) { if (_lookat_agl) {
handleAGL(); handleAGL();