bool at_model = false;
int from_model_index = 0;
int at_model_index = 0;
- double damp_alt, damp_roll, damp_pitch, damp_heading;
+ // double damp_alt;
+ double damp_roll = 0.0, damp_pitch = 0.0, damp_heading = 0.0;
double x_offset_m, y_offset_m, z_offset_m, fov_deg;
double heading_offset_deg, pitch_offset_deg, roll_offset_deg;
double target_x_offset_m, target_y_offset_m, target_z_offset_m;
double near_m;
+ bool internal;
for (int i = 0; i < fgGetInt("/sim/number-views"); i++) {
viewpath = "/sim/view";
nodepath += "/type";
strdata = fgGetString(nodepath.c_str());
+ // find out if this is an internal view (e.g. in cockpit, low near plane)
+ internal = false; // default
+ nodepath = viewpath;
+ nodepath += "/internal";
+ internal = fgGetBool(nodepath.c_str());
+
// FIXME:
// this is assumed to be an aircraft model...we will need to read
// model-from-type as well.
heading_offset_deg, pitch_offset_deg,
roll_offset_deg, fov_deg,
target_x_offset_m, target_y_offset_m,
- target_z_offset_m, near_m ));
+ target_z_offset_m, near_m, internal ));
else
add_view(new FGViewer ( FG_LOOKFROM, from_model, from_model_index,
false, 0, 0.0, 0.0, 0.0,
x_offset_m, y_offset_m, z_offset_m,
heading_offset_deg, pitch_offset_deg,
- roll_offset_deg, fov_deg, 0, 0, 0, near_m ));
+ roll_offset_deg, fov_deg, 0, 0, 0, near_m,
+ internal ));
}
copyToCurrent();
&FGViewMgr::getGoalViewPitchOffset_deg,
&FGViewMgr::setGoalViewPitchOffset_deg);
fgSetArchivable("/sim/current-view/goal-pitch-offset-deg");
+ fgTie("/sim/current-view/roll-offset-deg", this,
+ &FGViewMgr::getViewRollOffset_deg,
+ &FGViewMgr::setViewRollOffset_deg);
+ fgSetArchivable("/sim/current-view/roll-offset-deg");
+ fgTie("/sim/current-view/goal-roll-offset-deg", this,
+ &FGViewMgr::getGoalViewRollOffset_deg,
+ &FGViewMgr::setGoalViewRollOffset_deg);
+ fgSetArchivable("/sim/current-view/goal-roll-offset-deg");
fgTie("/sim/current-view/view-number", this,
&FGViewMgr::getView, &FGViewMgr::setView);
fgSetDouble("/sim/current-view/config/default-field-of-view-deg",
fgGetDouble(nodepath.c_str()));
+ nodepath = viewpath;
+ nodepath += "/config/from-model";
+ fgSetBool("/sim/current-view/config/from-model",
+ fgGetBool(nodepath.c_str()));
+
+
// copy view data
fgSetDouble("/sim/current-view/x-offset-m", getViewXOffset_m());
fgSetDouble("/sim/current-view/y-offset-m", getViewYOffset_m());
get_current_view()->getTargetYOffset_m());
fgSetDouble("/sim/current-view/target-z-offset-m",
get_current_view()->getTargetZOffset_m());
+
+ fgSetBool("/sim/current-view/internal",
+ get_current_view()->getInternal());
+
}
view->setGoalPitchOffset_deg(tilt);
}
+double
+FGViewMgr::getViewRollOffset_deg () const
+{
+ const FGViewer * view = get_current_view();
+ return (view == 0 ? 0 : view->getRollOffset_deg());
+}
+
+void
+FGViewMgr::setViewRollOffset_deg (double tilt)
+{
+ FGViewer * view = get_current_view();
+ if (view != 0) {
+ view->setGoalRollOffset_deg(tilt);
+ view->setRollOffset_deg(tilt);
+ }
+}
+
+double
+FGViewMgr::getGoalViewRollOffset_deg () const
+{
+ const FGViewer * view = get_current_view();
+ return (view == 0 ? 0 : view->getGoalRollOffset_deg());
+}
+
+void
+FGViewMgr::setGoalViewRollOffset_deg (double tilt)
+{
+ FGViewer * view = get_current_view();
+ if (view != 0)
+ view->setGoalRollOffset_deg(tilt);
+}
+
double
FGViewMgr::getViewXOffset_m () const
{