_offset_m.x() = x_offset_m;
_offset_m.y() = y_offset_m;
_offset_m.z() = z_offset_m;
+ _configOffset_m = _offset_m;
+
_heading_offset_deg = heading_offset_deg;
_pitch_offset_deg = pitch_offset_deg;
_roll_offset_deg = roll_offset_deg;
_target_offset_m.x() = target_x_offset_m;
_target_offset_m.y() = target_y_offset_m;
_target_offset_m.z() = target_z_offset_m;
+ _configTargetOffset_m = _target_offset_m;
+
_ground_level_nearplane_m = near_m;
// a reasonable guess for init, so that the math doesn't blow up
}
// Destructor
-View::~View( void ) {
+View::~View( void )
+{
+ _tiedProperties.Untie();
}
void
_tiedProperties.setRoot(fgGetNode("/sim/current-view", true));
_tiedProperties.Tie("heading-offset-deg", this,
&View::getHeadingOffset_deg,
- &View::setHeadingOffset_deg_property);
+ &View::setHeadingOffset_deg_property,
+ false /* do not set current property value */);
fgSetArchivable("/sim/current-view/heading-offset-deg");
_tiedProperties.Tie("goal-heading-offset-deg", this,
&View::getGoalHeadingOffset_deg,
- &View::setGoalHeadingOffset_deg);
+ &View::setGoalHeadingOffset_deg,
+ false /* do not set current property value */);
fgSetArchivable("/sim/current-view/goal-heading-offset-deg");
_tiedProperties.Tie("pitch-offset-deg", this,
&View::getPitchOffset_deg,
- &View::setPitchOffset_deg_property);
+ &View::setPitchOffset_deg_property,
+ false /* do not set current property value */);
fgSetArchivable("/sim/current-view/pitch-offset-deg");
_tiedProperties.Tie("goal-pitch-offset-deg", this,
&View::getGoalPitchOffset_deg,
- &View::setGoalPitchOffset_deg);
+ &View::setGoalPitchOffset_deg,
+ false /* do not set current property value */);
fgSetArchivable("/sim/current-view/goal-pitch-offset-deg");
_tiedProperties.Tie("roll-offset-deg", this,
&View::getRollOffset_deg,
- &View::setRollOffset_deg_property);
+ &View::setRollOffset_deg_property,
+ false /* do not set current property value */);
fgSetArchivable("/sim/current-view/roll-offset-deg");
_tiedProperties.Tie("goal-roll-offset-deg", this,
&View::getGoalRollOffset_deg,
- &View::setGoalRollOffset_deg);
+ &View::setGoalRollOffset_deg,
+ false /* do not set current property value */);
fgSetArchivable("/sim/current-view/goal-roll-offset-deg");
-
+// following config properties are exposed on current-view but don't change,
+// so we can simply copy them here.
_tiedProperties.getRoot()->setStringValue("name", _name);
_tiedProperties.getRoot()->setStringValue("type", _typeString);
+ _tiedProperties.getRoot()->setBoolValue("internal", _internal);
SGPropertyNode_ptr config = _tiedProperties.getRoot()->getChild("config", 0, true);
config->setBoolValue("from-model", _from_model);
config->setDoubleValue("pitch-offset-deg", _configPitchOffsetDeg);
config->setDoubleValue("roll-offset-deg", _configRollOffsetDeg);
config->setDoubleValue("default-field-of-view-deg", _configFOV_deg);
+
+// following properties are not tied, but copied each frame (for now).
+// copying /in/ happens in FGViewMgr::update; this is where we copy our current
+// values /out/ when we are activated
+ _tiedProperties.getRoot()->setDoubleValue("x-offset-m", getXOffset_m());
+ _tiedProperties.getRoot()->setDoubleValue("y-offset-m", getYOffset_m());
+ _tiedProperties.getRoot()->setDoubleValue("z-offset-m", getZOffset_m());
+
+ _tiedProperties.getRoot()->setDoubleValue("target-x-offset-m", getTargetXOffset_m());
+ _tiedProperties.getRoot()->setDoubleValue("target-y-offset-m", getTargetYOffset_m());
+ _tiedProperties.getRoot()->setDoubleValue("target-z-offset-m", getTargetZOffset_m());
}
void
_tiedProperties.Untie();
}
+void View::resetOffsetsAndFOV()
+{
+ _target_offset_m = _configTargetOffset_m;
+ _offset_m = _configOffset_m;
+ _pitch_offset_deg = _configPitchOffsetDeg;
+ _heading_offset_deg = _configHeadingOffsetDeg;
+ _roll_offset_deg = _configRollOffsetDeg;
+ _fov_deg = _configFOV_deg;
+}
+
void
View::setType ( int type )
{
inited = true;
- // stash properties
- current_x_offs = fgGetNode("/sim/current-view/x-offset-m", true);
- current_y_offs = fgGetNode("/sim/current-view/y-offset-m", true);
- current_z_offs = fgGetNode("/sim/current-view/z-offset-m", true);
- target_x_offs = fgGetNode("/sim/current-view/target-x-offset-m", true);
- target_y_offs = fgGetNode("/sim/current-view/target-y-offset-m", true);
- target_z_offs = fgGetNode("/sim/current-view/target-z-offset-m", true);
+
for (unsigned int i = 0; i < config_list.size(); i++) {
copyToCurrent();
do_bind();
+
+ get_current_view()->bind();
}
void
}
inited = false;
+ views.clear();
}
void
FGViewMgr::reinit ()
{
- int current_view_index = current;
-
- // reset offsets and fov to configuration defaults
- for (unsigned int i = 0; i < config_list.size(); i++) {
- SGPropertyNode *n = config_list[i];
- setView(i);
-
- fgSetDouble("/sim/current-view/x-offset-m",
- n->getDoubleValue("config/x-offset-m"));
- fgSetDouble("/sim/current-view/y-offset-m",
- n->getDoubleValue("config/y-offset-m"));
- fgSetDouble("/sim/current-view/z-offset-m",
- n->getDoubleValue("config/z-offset-m"));
- fgSetDouble("/sim/current-view/pitch-offset-deg",
- n->getDoubleValue("config/pitch-offset-deg"));
- fgSetDouble("/sim/current-view/heading-offset-deg",
- n->getDoubleValue("config/heading-offset-deg"));
- fgSetDouble("/sim/current-view/roll-offset-deg",
- n->getDoubleValue("config/roll-offset-deg"));
-
- double fov_deg = n->getDoubleValue("config/default-field-of-view-deg");
- if (fov_deg < 10.0)
- fov_deg = 55.0;
- fgSetDouble("/sim/current-view/field-of-view", fov_deg);
-
- // target offsets for lookat mode only...
- fgSetDouble("/sim/current-view/target-x-offset-m",
- n->getDoubleValue("config/target-x-offset-m"));
- fgSetDouble("/sim/current-view/target-y-offset-m",
- n->getDoubleValue("config/target-y-offset-m"));
- fgSetDouble("/sim/current-view/target-z-offset-m",
- n->getDoubleValue("config/target-z-offset-m"));
- }
- setView(current_view_index);
+ viewer_list::iterator it;
+ for (it = views.begin(); it != views.end(); ++it) {
+ (*it)->resetOffsetsAndFOV();
+ }
}
typedef double (FGViewMgr::*double_getter)() const;
{
// view-manager code was designed to init before bind, so
// this is a no-op; init() calls the real bind() impl below
+
+ current_x_offs = fgGetNode("/sim/current-view/x-offset-m", true);
+ current_y_offs = fgGetNode("/sim/current-view/y-offset-m", true);
+ current_z_offs = fgGetNode("/sim/current-view/z-offset-m", true);
+ target_x_offs = fgGetNode("/sim/current-view/target-x-offset-m", true);
+ target_y_offs = fgGetNode("/sim/current-view/target-y-offset-m", true);
+ target_z_offs = fgGetNode("/sim/current-view/target-z-offset-m", true);
}
void
{
// these are bound to the current view properties
_tiedProperties.setRoot(fgGetNode("/sim/current-view", true));
- // _tiedProperties.Tie("heading-offset-deg", this,
- // &FGViewMgr::getViewHeadingOffset_deg,
- // &FGViewMgr::setViewHeadingOffset_deg);
- // fgSetArchivable("/sim/current-view/heading-offset-deg");
- // _tiedProperties.Tie("goal-heading-offset-deg", this,
- // &FGViewMgr::getViewGoalHeadingOffset_deg,
- // &FGViewMgr::setViewGoalHeadingOffset_deg);
- //fgSetArchivable("/sim/current-view/goal-heading-offset-deg");
-#if 0
- _tiedProperties.Tie("pitch-offset-deg", this,
- &FGViewMgr::getViewPitchOffset_deg,
- &FGViewMgr::setViewPitchOffset_deg);
- fgSetArchivable("/sim/current-view/pitch-offset-deg");
- _tiedProperties.Tie("goal-pitch-offset-deg", this,
- &FGViewMgr::getGoalViewPitchOffset_deg,
- &FGViewMgr::setGoalViewPitchOffset_deg);
- fgSetArchivable("/sim/current-view/goal-pitch-offset-deg");
- _tiedProperties.Tie("roll-offset-deg", this,
- &FGViewMgr::getViewRollOffset_deg,
- &FGViewMgr::setViewRollOffset_deg);
- fgSetArchivable("/sim/current-view/roll-offset-deg");
- _tiedProperties.Tie("goal-roll-offset-deg", this,
- &FGViewMgr::getGoalViewRollOffset_deg,
- &FGViewMgr::setGoalViewRollOffset_deg);
- fgSetArchivable("/sim/current-view/goal-roll-offset-deg");
-#endif
-
+
_tiedProperties.Tie("view-number", this,
&FGViewMgr::getView, &FGViewMgr::setView);
SGPropertyNode* view_number =
_tiedProperties.getRoot()->getNode("view-number");
view_number->setAttribute(SGPropertyNode::ARCHIVE, false);
-
// Keep view on reset/reinit
view_number->setAttribute(SGPropertyNode::PRESERVE, true);
void
FGViewMgr::unbind ()
{
+ flightgear::View* v = get_current_view();
+ if (v) {
+ v->unbind();
+ }
+
_tiedProperties.Untie();
config_list.clear();
view_number.clear();
+ target_x_offs.clear();
+ target_y_offs.clear();
+ target_z_offs.clear();
+ current_x_offs.clear();
+ current_y_offs.clear();
+ current_z_offs.clear();
}
void
}
}
+ // these properties aren't tied - manually propogate them to the
+ // currently active view
setViewXOffset_m(current_x_offs->getDoubleValue());
setViewYOffset_m(current_y_offs->getDoubleValue());
setViewZOffset_m(current_z_offs->getDoubleValue());
void
FGViewMgr::copyToCurrent()
{
- if (!inited) {
- return;
- }
-
-#if 0
- SGPropertyNode *n = config_list[current];
-
- fgSetString("/sim/current-view/name", n->getStringValue("name"));
- fgSetString("/sim/current-view/type", n->getStringValue("type"));
-
- // copy certain view config data for default values
- fgSetDouble("/sim/current-view/config/heading-offset-deg",
- n->getDoubleValue("config/default-heading-offset-deg"));
- fgSetDouble("/sim/current-view/config/pitch-offset-deg",
- n->getDoubleValue("config/pitch-offset-deg"));
- fgSetDouble("/sim/current-view/config/roll-offset-deg",
- n->getDoubleValue("config/roll-offset-deg"));
- fgSetDouble("/sim/current-view/config/default-field-of-view-deg",
- n->getDoubleValue("config/default-field-of-view-deg"));
- fgSetBool("/sim/current-view/config/from-model",
- n->getBoolValue("config/from-model"));
-#endif
-
- // copy view data
- fgSetDouble("/sim/current-view/x-offset-m", getViewXOffset_m());
- fgSetDouble("/sim/current-view/y-offset-m", getViewYOffset_m());
- fgSetDouble("/sim/current-view/z-offset-m", getViewZOffset_m());
-#if 0
- fgSetDouble("/sim/current-view/goal-heading-offset-deg",
- get_current_view()->getGoalHeadingOffset_deg());
- fgSetDouble("/sim/current-view/goal-pitch-offset-deg",
- get_current_view()->getGoalPitchOffset_deg());
- fgSetDouble("/sim/current-view/goal-roll-offset-deg",
- get_current_view()->getRollOffset_deg());
- fgSetDouble("/sim/current-view/heading-offset-deg",
- get_current_view()->getHeadingOffset_deg());
- fgSetDouble("/sim/current-view/pitch-offset-deg",
- get_current_view()->getPitchOffset_deg());
- fgSetDouble("/sim/current-view/roll-offset-deg",
- get_current_view()->getRollOffset_deg());
-#endif
-
- fgSetDouble("/sim/current-view/target-x-offset-m",
- get_current_view()->getTargetXOffset_m());
- fgSetDouble("/sim/current-view/target-y-offset-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());
}
void FGViewMgr::clear()