]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/viewer.cxx
Merge branch 'jt/runway' into next
[flightgear.git] / src / Main / viewer.cxx
index c29b99dbe74a7f14667d269b7f323dbacd96ce75..f2ffd56c9d57a5fae327aae613bc7e6fc6068f45 100644 (file)
@@ -37,7 +37,6 @@
 
 #include <simgear/debug/logstream.hxx>
 #include <simgear/constants.h>
-#include <simgear/math/point3d.hxx>
 #include <simgear/math/polar3d.hxx>
 #include <simgear/math/sg_geodesy.hxx>
 #include <simgear/scene/model/location.hxx>
@@ -50,6 +49,9 @@
 
 #include "viewer.hxx"
 
+#include "CameraGroup.hxx"
+
+using namespace flightgear;
 \f
 ////////////////////////////////////////////////////////////////////////
 // Implementation of FGViewer.
@@ -81,7 +83,8 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index,
     _damp_heading(0),
     _scaling_type(FG_SCALING_MAX),
     _location(0),
-    _target_location(0)
+    _target_location(0),
+    _cameraGroup(CameraGroup::getDefault())
 {
     _absolute_view_pos = SGVec3d(0, 0, 0);
     _type = Type;
@@ -402,14 +405,6 @@ FGViewer::setOrientationOffsets (double roll_offset_deg, double pitch_offset_deg
   _heading_offset_deg = heading_offset_deg;
 }
 
-double *
-FGViewer::get_absolute_view_pos () 
-{
-  if (_dirty)
-    recalc();
-  return _absolute_view_pos.data();
-}
-
 // 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.
@@ -422,12 +417,9 @@ FGViewer::recalc ()
     recalcLookAt();
   }
 
-  SGVec3d center = globals->get_scenery()->get_center();
-  _view_pos = toVec3f(_absolute_view_pos - center);
-
   SGGeod geodEyePoint = SGGeod::fromCart(_absolute_view_pos);
   geodEyePoint.setElevationM(0);
-  _zero_elev = toVec3f(SGVec3d::fromGeod(geodEyePoint) - center);
+  _zero_elev = SGVec3d::fromGeod(geodEyePoint);
   
   SGQuatd hlOr = SGQuatd::fromLonLat(geodEyePoint);
   _surface_south = toVec3f(hlOr.backTransform(-SGVec3d::e1()));
@@ -479,25 +471,24 @@ FGViewer::recalcLookFrom ()
   // The geodetic position of our base view position
   SGGeod geodPos = SGGeod::fromDegFt(lon, lat, alt);
   // The rotation rotating from the earth centerd frame to
-  // the horizontal local frame
-  SGQuatd hlOr = SGQuatd::fromLonLat(geodPos);
+  // the horizontal local OpenGL frame
+  SGQuatd hlOr = SGQuatd::viewHL(geodPos);
+
   // the rotation from the horizontal local frame to the basic view orientation
   SGQuatd hlToBody = SGQuatd::fromYawPitchRollDeg(head, pitch, roll);
+  hlToBody = SGQuatd::simToView(hlToBody);
+
   // The cartesian position of the basic view coordinate
   SGVec3d position = SGVec3d::fromGeod(geodPos);
   // the rotation offset, don't know why heading is negative here ...
-  SGQuatd viewOffsetOr =
+  SGQuatd viewOffsetOr = SGQuatd::simToView(
     SGQuatd::fromYawPitchRollDeg(-_heading_offset_deg, _pitch_offset_deg,
-                                 _roll_offset_deg);
-
-  // The offset vector is meant: x +right/-left, y +up/-down, z, +back/-fwd
-  // We work in the body coordinate system which is slightly different
-  SGVec3d off(-_offset_m.z(), _offset_m.x(), -_offset_m.y());
+                                 _roll_offset_deg));
 
   // Compute the eyepoints orientation and position
   // wrt the earth centered frame - that is global coorinates
   SGQuatd ec2body = hlOr*hlToBody;
-  _absolute_view_pos = position + ec2body.backTransform(off);
+  _absolute_view_pos = position + ec2body.backTransform(_offset_m);
   mViewOrientation = ec2body*viewOffsetOr;
 }
 
@@ -562,7 +553,7 @@ FGViewer::recalcLookAt ()
                                  _roll_offset_deg);
 
   // Offsets to the eye position
-  SGVec3d eyeOff(-_offset_m.z(), _offset_m.y(), -_offset_m.x());
+  SGVec3d eyeOff(-_offset_m.z(), _offset_m.x(), -_offset_m.y());
   SGQuatd ec2eye = geodEyeHlOr*geodEyeOr;
   SGVec3d eyeCart = SGVec3d::fromGeod(geodEyePos);
   eyeCart += (ec2eye*eyeOffsetOr).backTransform(eyeOff);
@@ -583,14 +574,14 @@ FGViewer::recalcLookAt ()
   // the view direction
   SGVec3d dir = normalize(atCart - eyeCart);
   // the up directon
-  SGVec3d up = ec2eye.backTransform(SGVec3d(0, 0, 1));
+  SGVec3d up = ec2eye.backTransform(SGVec3d(0, 0, -1));
   // rotate dir to the 0-th unit vector
   // rotate up to 2-th unit vector
-  mViewOrientation = SGQuatd::fromRotateTo(dir, 0, up, 2);
+  mViewOrientation = SGQuatd::fromRotateTo(-dir, 2, up, 1);
 }
 
 void
-FGViewer::dampEyeData (double &roll_deg, double &pitch_deg, double &heading_deg)
+FGViewer::dampEyeData(double &roll_deg, double &pitch_deg, double &heading_deg)
 {
   const double interval = 0.01;
 
@@ -776,5 +767,7 @@ FGViewer::update (double dt)
       }
     }
   }
-
+  recalc();
+  _cameraGroup->update(_absolute_view_pos.osg(), mViewOrientation.osg());
+  _cameraGroup->setCameraParameters(get_v_fov(), get_aspect_ratio());
 }