]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/viewmgr.cxx
Roy Vegard Ovesen:
[flightgear.git] / src / Main / viewmgr.cxx
index 790c990c587fb45bb6f1dd8400c529e891fd7d8d..371c38f7d3ae38bde15ae3fe8c64e2c3a7933c28 100644 (file)
@@ -3,7 +3,7 @@
 // Written by Curtis Olson, started October 2000.
 //   partially rewritten by Jim Wilson March 2002
 //
-// Copyright (C) 2000  Curtis L. Olson  - curt@flightgear.org
+// Copyright (C) 2000  Curtis L. Olson  - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -51,10 +51,13 @@ FGViewMgr::init ()
   bool at_model = false;
   int from_model_index = 0;
   int at_model_index = 0;
+  // 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";
@@ -66,6 +69,12 @@ FGViewMgr::init ()
     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.
@@ -91,7 +100,17 @@ FGViewMgr::init ()
       if (at_model) {
         nodepath = viewpath;
         nodepath += "/config/at-model-idx";
-        at_model_index = fgGetInt(nodepath.c_str());     
+        at_model_index = fgGetInt(nodepath.c_str());
+
+        nodepath = viewpath;
+        nodepath += "/config/at-model-roll-damping";
+        damp_roll = fgGetDouble(nodepath.c_str(), 0.0);
+        nodepath = viewpath;
+        nodepath += "/config/at-model-pitch-damping";
+        damp_pitch = fgGetDouble(nodepath.c_str(), 0.0);
+        nodepath = viewpath;
+        nodepath += "/config/at-model-heading-damping";
+        damp_heading = fgGetDouble(nodepath.c_str(), 0.0);
       }
     }
 
@@ -138,17 +157,20 @@ FGViewMgr::init ()
     // supporting two types now "lookat" = 1 and "lookfrom" = 0
     if ( strcmp("lookat",strdata.c_str()) == 0 )
       add_view(new FGViewer ( FG_LOOKAT, from_model, from_model_index,
-                              at_model, at_model_index, x_offset_m,
-                              y_offset_m,z_offset_m,
+                              at_model, at_model_index,
+                              damp_roll, damp_pitch, damp_heading,
+                              x_offset_m, y_offset_m,z_offset_m,
                               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, x_offset_m, y_offset_m, z_offset_m,
+      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();
@@ -250,6 +272,14 @@ FGViewMgr::bind ()
        &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);
@@ -361,8 +391,8 @@ FGViewMgr::update (double dt)
       nodepath = viewpath;
       nodepath += "/config/target-heading-deg-path";
       heading_deg = fgGetDouble(fgGetString(nodepath.c_str()));
-  
-      loop_view ->setTargetPosition(lon_deg, lat_deg, alt_ft);
+
+      loop_view->setTargetPosition(lon_deg, lat_deg, alt_ft);
       loop_view->setTargetOrientation(roll_deg, pitch_deg, heading_deg);
     } else {
       loop_view->set_dirty();
@@ -414,6 +444,12 @@ FGViewMgr::copyToCurrent()
     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());
@@ -436,6 +472,10 @@ FGViewMgr::copyToCurrent()
                 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());
+
 }
 
 
@@ -503,6 +543,38 @@ FGViewMgr::setGoalViewPitchOffset_deg (double tilt)
     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
 {
@@ -632,7 +704,12 @@ FGViewMgr::getView () const
 void
 FGViewMgr::setView (int newview )
 {
-  if ( newview < 0 || newview > (int)views.size() ) {
+  // if newview number too low wrap to last view...
+  if ( newview < 0 ) {
+    newview = (int)views.size() -1;
+  }
+  // if newview number to high wrap to zero...
+  if ( newview > ((int)views.size() -1) ) {
     newview = 0;
   }
   // set new view