]> git.mxchange.org Git - flightgear.git/commitdiff
Start moving view-manager logic into View
authorJames Turner <zakalawe@mac.com>
Sun, 17 Jan 2016 21:48:57 +0000 (15:48 -0600)
committerJames Turner <zakalawe@mac.com>
Wed, 17 Feb 2016 21:25:39 +0000 (21:25 +0000)
- work in progress, goal is to make copyToCurrent and most of
  the bind/unbind logic sink into each specific View, avoiding all the
  null pointer checks in view manager.

src/Viewer/viewer.cxx
src/Viewer/viewer.hxx
src/Viewer/viewmgr.cxx
src/Viewer/viewmgr.hxx

index 583f57c73916dfe53098d29e2edc7b6593490a4b..637084eb0d69a8c91e16151b3be6c0d8dc24e298 100644 (file)
@@ -78,7 +78,7 @@ View::View( ViewType Type, bool from_model, int from_model_index,
     _dampFactor = SGVec3d::zeros();
     _dampOutput = SGVec3d::zeros();
     _dampTarget = SGVec3d::zeros();
-    
+
     if (damp_roll > 0.0)
       _dampFactor[0] = 1.0 / pow(10.0, fabs(damp_roll));
     if (damp_pitch > 0.0)
@@ -95,12 +95,19 @@ View::View( ViewType Type, bool from_model, int from_model_index,
     _goal_heading_offset_deg = heading_offset_deg;
     _goal_pitch_offset_deg = pitch_offset_deg;
     _goal_roll_offset_deg = roll_offset_deg;
+
+    _configHeadingOffsetDeg = heading_offset_deg;
+    _configPitchOffsetDeg = pitch_offset_deg;
+    _configRollOffsetDeg = roll_offset_deg;
+
     if (fov_deg > 0) {
       _fov_deg = fov_deg;
     } else {
       _fov_deg = 55;
     }
 
+    _configFOV_deg = _fov_deg;
+
     _aspect_ratio_multiplier = aspect_ratio_multiplier;
     _target_offset_m.x() = target_x_offset_m;
     _target_offset_m.y() = target_y_offset_m;
@@ -118,6 +125,7 @@ View* View::createFromProperties(SGPropertyNode_ptr config)
     // FIXME : should be a child of config
     bool internal = config->getParent()->getBoolValue("internal", false);
 
+
     // FIXME:
     // this is assumed to be an aircraft model...we will need to read
     // model-from-type as well.
@@ -131,15 +139,16 @@ View* View::createFromProperties(SGPropertyNode_ptr config)
     double z_offset_m = config->getDoubleValue("z-offset-m");
 
     double heading_offset_deg = config->getDoubleValue("heading-offset-deg");
-    config->setDoubleValue("heading-offset-deg", heading_offset_deg);
+  //  config->setDoubleValue("heading-offset-deg", heading_offset_deg);
     double pitch_offset_deg = config->getDoubleValue("pitch-offset-deg");
-    config->setDoubleValue("pitch-offset-deg", pitch_offset_deg);
+  //  config->setDoubleValue("pitch-offset-deg", pitch_offset_deg);
     double roll_offset_deg = config->getDoubleValue("roll-offset-deg");
-    config->setDoubleValue("roll-offset-deg", roll_offset_deg);
+   // config->setDoubleValue("roll-offset-deg", roll_offset_deg);
 
     double fov_deg = config->getDoubleValue("default-field-of-view-deg");
     double near_m = config->getDoubleValue("ground-level-nearplane-m");
 
+    View* v = 0;
     // supporting two types "lookat" = 1 and "lookfrom" = 0
     const char *type = config->getParent()->getStringValue("type");
     if (!strcmp(type, "lookat")) {
@@ -154,7 +163,7 @@ View* View::createFromProperties(SGPropertyNode_ptr config)
         double target_y_offset_m = config->getDoubleValue("target-y-offset-m");
         double target_z_offset_m = config->getDoubleValue("target-z-offset-m");
 
-        return new View ( FG_LOOKAT, from_model, from_model_index,
+        v = new View ( FG_LOOKAT, from_model, from_model_index,
                            at_model, at_model_index,
                            damp_roll, damp_pitch, damp_heading,
                            x_offset_m, y_offset_m,z_offset_m,
@@ -163,7 +172,7 @@ View* View::createFromProperties(SGPropertyNode_ptr config)
                            target_x_offset_m, target_y_offset_m,
                          target_z_offset_m, near_m, internal );
     } else {
-        return new View ( FG_LOOKFROM, from_model, from_model_index,
+        v = new View ( 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,
@@ -171,6 +180,11 @@ View* View::createFromProperties(SGPropertyNode_ptr config)
                          0, 0, 0, near_m, internal );
     }
 
+    v->_name = config->getParent()->getStringValue("name");
+    v->_typeString = type;
+    v->_configHeadingOffsetDeg = config->getDoubleValue("default-heading-offset-deg");
+
+    return v;
 }
 
 
@@ -186,11 +200,52 @@ View::init ()
 void
 View::bind ()
 {
+    _tiedProperties.setRoot(fgGetNode("/sim/current-view", true));
+    _tiedProperties.Tie("heading-offset-deg", this,
+                         &View::getHeadingOffset_deg,
+                         &View::setHeadingOffset_deg_property);
+
+     fgSetArchivable("/sim/current-view/heading-offset-deg");
+
+    _tiedProperties.Tie("goal-heading-offset-deg", this,
+                        &View::getGoalHeadingOffset_deg,
+                        &View::setGoalHeadingOffset_deg);
+
+    fgSetArchivable("/sim/current-view/goal-heading-offset-deg");
+
+    _tiedProperties.Tie("pitch-offset-deg", this,
+                        &View::getPitchOffset_deg,
+                        &View::setPitchOffset_deg_property);
+    fgSetArchivable("/sim/current-view/pitch-offset-deg");
+    _tiedProperties.Tie("goal-pitch-offset-deg", this,
+                        &View::getGoalPitchOffset_deg,
+                        &View::setGoalPitchOffset_deg);
+    fgSetArchivable("/sim/current-view/goal-pitch-offset-deg");
+    _tiedProperties.Tie("roll-offset-deg", this,
+                        &View::getRollOffset_deg,
+                        &View::setRollOffset_deg_property);
+    fgSetArchivable("/sim/current-view/roll-offset-deg");
+    _tiedProperties.Tie("goal-roll-offset-deg", this,
+                        &View::getGoalRollOffset_deg,
+                        &View::setGoalRollOffset_deg);
+    fgSetArchivable("/sim/current-view/goal-roll-offset-deg");
+
+
+    _tiedProperties.getRoot()->setStringValue("name", _name);
+    _tiedProperties.getRoot()->setStringValue("type", _typeString);
+
+    SGPropertyNode_ptr config = _tiedProperties.getRoot()->getChild("config", 0, true);
+    config->setBoolValue("from-model", _from_model);
+    config->setDoubleValue("heading-offset-deg", _configHeadingOffsetDeg);
+    config->setDoubleValue("pitch-offset-deg", _configPitchOffsetDeg);
+    config->setDoubleValue("roll-offset-deg", _configRollOffsetDeg);
+    config->setDoubleValue("default-field-of-view-deg", _configFOV_deg);
 }
 
 void
 View::unbind ()
 {
+    _tiedProperties.Untie();
 }
 
 void
@@ -361,6 +416,27 @@ View::setHeadingOffset_deg (double heading_offset_deg)
       _heading_offset_deg = heading_offset_deg;
 }
 
+void
+View::setHeadingOffset_deg_property (double heading_offset_deg)
+{
+    setHeadingOffset_deg(heading_offset_deg);
+    setGoalHeadingOffset_deg(heading_offset_deg);
+}
+
+void
+View::setPitchOffset_deg_property (double pitch_offset_deg)
+{
+    setPitchOffset_deg(pitch_offset_deg);
+    setGoalPitchOffset_deg(pitch_offset_deg);
+}
+
+void
+View::setRollOffset_deg_property (double roll_offset_deg)
+{
+    setRollOffset_deg(roll_offset_deg);
+    setGoalRollOffset_deg(roll_offset_deg);
+}
+
 void
 View::setGoalRollOffset_deg (double goal_roll_offset_deg)
 {
@@ -397,7 +473,7 @@ View::setGoalHeadingOffset_deg (double goal_heading_offset_deg)
       _goal_heading_offset_deg = 0.0;
       return;
   }
-  
+
   _goal_heading_offset_deg = goal_heading_offset_deg;
   while ( _goal_heading_offset_deg < 0.0 ) {
     _goal_heading_offset_deg += 360;
@@ -416,8 +492,8 @@ View::setOrientationOffsets (double roll_offset_deg, double pitch_offset_deg, do
   _heading_offset_deg = heading_offset_deg;
 }
 
-// recalc() is done every time one of the setters is called (making the 
-// cached data "dirty") on the next "get".  It calculates all the outputs 
+// recalc() is done every time one of the setters is called (making the
+// cached data "dirty") on the next "get".  It calculates all the outputs
 // for viewer.
 void
 View::recalc ()
@@ -568,28 +644,28 @@ View::updateDampOutput(double dt)
     last_view = this;
     return;
   }
-  
+
   const double interval = 0.01;
   while (dt > interval) {
-    
+
     for (unsigned int i=0; i<3; ++i) {
       if (_dampFactor[i] <= 0.0) {
         // axis is un-damped, set output to target directly
         _dampOutput[i] = _dampTarget[i];
         continue;
       }
-      
+
       double d = _dampOutput[i] - _dampTarget[i];
       if (d > 180.0) {
         _dampOutput[i] -= 360.0;
       } else if (d < -180.0) {
         _dampOutput[i] += 360.0;
       }
-      
-      _dampOutput[i] = (_dampTarget[i] * _dampFactor[i]) + 
+
+      _dampOutput[i] = (_dampTarget[i] * _dampFactor[i]) +
         (_dampOutput[i] * (1.0 - _dampFactor[i]));
     } // of axis iteration
-    
+
     dt -= interval;
   } // of dt subdivision by interval
 }
@@ -626,7 +702,7 @@ View::get_v_fov()
     double aspectRatio = get_aspect_ratio();
     switch (_scaling_type) {
     case FG_SCALING_WIDTH:  // h_fov == fov
-       return 
+       return
             atan(tan(_fov_deg/2 * SG_DEGREES_TO_RADIANS)
                  * (aspectRatio*_aspect_ratio_multiplier))
             * SG_RADIANS_TO_DEGREES * 2;
@@ -651,7 +727,7 @@ void
 View::update (double dt)
 {
   updateDampOutput(dt);
-  
+
   int i;
   int dt_ms = int(dt * 1000);
   for ( i = 0; i < dt_ms; i++ ) {
@@ -732,4 +808,3 @@ double View::get_aspect_ratio() const
 {
     return flightgear::CameraGroup::getDefault()->getMasterAspectRatio();
 }
-
index b5b45e1bf8901d88f0c10dffe8eb65a87c68ca0c..90ecacda3e295e3e3f51644b4d1a2bbc879426b4 100644 (file)
@@ -32,6 +32,7 @@
 #include <simgear/constants.h>
 
 #include <simgear/props/props.hxx>
+#include <simgear/props/tiedpropertylist.hxx>
 #include <simgear/structure/subsystem_mgr.hxx>
 #include <simgear/math/SGMath.hxx>
 
@@ -242,13 +243,21 @@ private:
 
     void set_clean() { _dirty = false; }
 
+    void setHeadingOffset_deg_property (double heading_offset_deg);
+    void setPitchOffset_deg_property(double pitch_offset_deg);
+    void setRollOffset_deg_property(double roll_offset_deg);
+    
     //////////////////////////////////////////////////////////////////
     // private data                                                 //
     //////////////////////////////////////////////////////////////////
 
+    std::string _name, _typeString;
+    
     // flag forcing a recalc of derived view parameters
     bool _dirty;
 
+    simgear::TiedPropertyList _tiedProperties;
+
     SGQuatd mViewOrientation;
     SGQuatd mViewOffsetOr;
     SGVec3d _absolute_view_pos;
@@ -263,6 +272,10 @@ private:
     double _target_pitch_deg;
     double _target_heading_deg;
 
+    double _configRollOffsetDeg,
+        _configHeadingOffsetDeg,
+        _configPitchOffsetDeg;
+
     SGVec3d _dampTarget; ///< current target value we are damping towards
     SGVec3d _dampOutput; ///< current output of damping filter
     SGVec3d _dampFactor; ///< weighting of the damping filter
@@ -305,7 +318,7 @@ private:
 
     // the nominal field of view (angle, in degrees)
     double _fov_deg;
-
+    double _configFOV_deg;
     // default = 1.0, this value is user configurable and is
     // multiplied into the aspect_ratio to get the actual vertical fov
     double _aspect_ratio_multiplier;
index 4bf934383d226bdaf90a1d2db9faa9625d12ffb6..ccfb98c4798793f2bee59c31f37e2360a4d8efaa 100644 (file)
@@ -160,14 +160,15 @@ FGViewMgr::do_bind()
 {  
   // 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");
+ // _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);
@@ -184,7 +185,8 @@ FGViewMgr::do_bind()
                       &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 =
@@ -341,8 +343,10 @@ 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"));
 
@@ -357,12 +361,13 @@ FGViewMgr::copyToCurrent()
                 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",
@@ -375,6 +380,8 @@ FGViewMgr::copyToCurrent()
                 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",
@@ -449,102 +456,6 @@ FGViewMgr::add_view( flightgear::View * v )
   views.push_back(v);
   v->init();
 }
-    
-double
-FGViewMgr::getViewHeadingOffset_deg () const
-{
-  const flightgear::View * view = get_current_view();
-  return (view == 0 ? 0 : view->getHeadingOffset_deg());
-}
-
-void
-FGViewMgr::setViewHeadingOffset_deg (double offset)
-{
-  flightgear::View * view = get_current_view();
-  if (view != 0) {
-    view->setGoalHeadingOffset_deg(offset);
-    view->setHeadingOffset_deg(offset);
-  }
-}
-
-double
-FGViewMgr::getViewGoalHeadingOffset_deg () const
-{
-  const flightgear::View * view = get_current_view();
-  return (view == 0 ? 0 : view->getGoalHeadingOffset_deg());
-}
-
-void
-FGViewMgr::setViewGoalHeadingOffset_deg (double offset)
-{
-  flightgear::View * view = get_current_view();
-  if (view != 0)
-    view->setGoalHeadingOffset_deg(offset);
-}
-
-double
-FGViewMgr::getViewPitchOffset_deg () const
-{
-  const flightgear::View * view = get_current_view();
-  return (view == 0 ? 0 : view->getPitchOffset_deg());
-}
-
-void
-FGViewMgr::setViewPitchOffset_deg (double tilt)
-{
-  flightgear::View * view = get_current_view();
-  if (view != 0) {
-    view->setGoalPitchOffset_deg(tilt);
-    view->setPitchOffset_deg(tilt);
-  }
-}
-
-double
-FGViewMgr::getGoalViewPitchOffset_deg () const
-{
-  const flightgear::View * view = get_current_view();
-  return (view == 0 ? 0 : view->getGoalPitchOffset_deg());
-}
-
-void
-FGViewMgr::setGoalViewPitchOffset_deg (double tilt)
-{
-  flightgear::View * view = get_current_view();
-  if (view != 0)
-    view->setGoalPitchOffset_deg(tilt);
-}
-
-double
-FGViewMgr::getViewRollOffset_deg () const
-{
-  const flightgear::View * view = get_current_view();
-  return (view == 0 ? 0 : view->getRollOffset_deg());
-}
-
-void
-FGViewMgr::setViewRollOffset_deg (double tilt)
-{
-  flightgear::View * view = get_current_view();
-  if (view != 0) {
-    view->setGoalRollOffset_deg(tilt);
-    view->setRollOffset_deg(tilt);
-  }
-}
-
-double
-FGViewMgr::getGoalViewRollOffset_deg () const
-{
-  const flightgear::View * view = get_current_view();
-  return (view == 0 ? 0 : view->getGoalRollOffset_deg());
-}
-
-void
-FGViewMgr::setGoalViewRollOffset_deg (double tilt)
-{
-  flightgear::View * view = get_current_view();
-  if (view != 0)
-    view->setGoalRollOffset_deg(tilt);
-}
 
 double
 FGViewMgr::getViewXOffset_m () const
@@ -694,11 +605,22 @@ FGViewMgr::setView (int newview)
   if (newview >= (int)views.size())
     newview = 0;
 
+    if (get_current_view()) {
+        get_current_view()->unbind();
+    }
+
   // set new view
   current = newview;
+
+    if (get_current_view()) {
+        get_current_view()->bind();
+    }
+
   // copy in view data
   copyToCurrent();
 
+
+
     // force an update now, to avoid returning bogus data.
     // real fix would to be make all the accessors use the dirty mechanism
     // on FGViewer, so update() is a no-op.
index 37b6b5d96eff3479275a5c69346a45ab37db754c..7e4dfb5c9a7a15a9484a871fef51c197be6d407c 100644 (file)
@@ -89,18 +89,7 @@ private:
     void do_axes ();
 
     //  callbacks in manager to access viewer methods
-    double getViewHeadingOffset_deg () const;
-    void setViewHeadingOffset_deg (double offset);
-    double getViewGoalHeadingOffset_deg () const;
-    void setViewGoalHeadingOffset_deg (double offset);
-    double getViewPitchOffset_deg () const;
-    void setViewPitchOffset_deg (double tilt);
-    double getGoalViewPitchOffset_deg () const;
-    void setGoalViewRollOffset_deg (double tilt);
-    double getViewRollOffset_deg () const;
-    void setViewRollOffset_deg (double tilt);
-    double getGoalViewRollOffset_deg () const;
-    void setGoalViewPitchOffset_deg (double tilt);
+
     double getViewXOffset_m () const;
     void setViewXOffset_m (double x);
     double getViewYOffset_m () const;