]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/viewer.hxx
initlialize _playing for FGATC. Proper listerner orientation based on view offset...
[flightgear.git] / src / Main / viewer.hxx
index 4a319edc361190b969791a909feef64fe2c9058f..aa5fb12125d0727e202be729b8cbbdf9df4cda9c 100644 (file)
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 
 #ifndef _VIEWER_HXX
-#define _VIEWER_HXX
+#define _VIEWER_HXX                                
 
+namespace flightgear
+{
+class CameraGroup;
+}
 
-#ifndef __cplusplus                                                          
-# error This library requires C++
-#endif                                   
+#include <osg/ref_ptr>
 
 #include <simgear/compiler.h>
 #include <simgear/constants.h>
 #include <simgear/structure/subsystem_mgr.hxx>
-#include <simgear/scene/model/location.hxx>
-
-#include <plib/sg.h>           // plib include
+#include <simgear/math/SGMath.hxx>
 
 #define FG_FOV_MIN 0.1
 #define FG_FOV_MAX 179.9
@@ -98,23 +98,12 @@ public:
     //   pilot view, model in model view).
     //   FIXME: the model view position (ie target positions) 
     //   should be in the model class.
-    virtual double getLongitude_deg () const { return _lon_deg; }
-    virtual double getLatitude_deg () const { return _lat_deg; }
-    virtual double getAltitudeASL_ft () const { return _alt_ft; }
-    virtual void setLongitude_deg (double lon_deg);
-    virtual void setLatitude_deg (double lat_deg);
-    virtual void setAltitude_ft (double alt_ft);
     virtual void setPosition (double lon_deg, double lat_deg, double alt_ft);
+    const SGGeod& getPosition() const { return _position; }
 
     // Reference geodetic target position...
-    virtual double getTargetLongitude_deg () const { return _target_lon_deg; }
-    virtual double getTargetLatitude_deg () const { return _target_lat_deg; }
-    virtual double getTargetAltitudeASL_ft () const { return _target_alt_ft; }
-    virtual void setTargetLongitude_deg (double lon_deg);
-    virtual void setTargetLatitude_deg (double lat_deg);
-    virtual void setTargetAltitude_ft (double alt_ft);
     virtual void setTargetPosition (double lon_deg, double lat_deg, double alt_ft);
-
+    const SGGeod& getTargetPosition() const { return _target; }
 
 
 
@@ -130,12 +119,12 @@ public:
     //   orientation rotations listed below.  This has the effect of the 
     //   eye moving around and "looking at" the object (model) from 
     //   different angles.
-    virtual double getXOffset_m () const { return _x_offset_m; }
-    virtual double getYOffset_m () const { return _y_offset_m; }
-    virtual double getZOffset_m () const { return _z_offset_m; }
-    virtual double getTargetXOffset_m () const { return _target_x_offset_m; }
-    virtual double getTargetYOffset_m () const { return _target_y_offset_m; }
-    virtual double getTargetZOffset_m () const { return _target_z_offset_m; }
+    virtual double getXOffset_m () const { return _offset_m.x(); }
+    virtual double getYOffset_m () const { return _offset_m.y(); }
+    virtual double getZOffset_m () const { return _offset_m.z(); }
+    virtual double getTargetXOffset_m () const { return _target_offset_m.x(); }
+    virtual double getTargetYOffset_m () const { return _target_offset_m.y(); }
+    virtual double getTargetZOffset_m () const { return _target_offset_m.z(); }
     virtual void setXOffset_m (double x_offset_m);
     virtual void setYOffset_m (double y_offset_m);
     virtual void setZOffset_m (double z_offset_m);
@@ -209,26 +198,10 @@ public:
 
     // Vectors and positions...
 
-    // Get zero view_pos
-    virtual float * get_view_pos() {if ( _dirty ) { recalc(); }        return _view_pos; }
-    // Get the absolute view position in fgfs coordinates.
-    virtual double * get_absolute_view_pos ();
-    // Get zero elev
-    virtual float * get_zero_elev() {if ( _dirty ) { recalc(); } return _zero_elev; }
-    // Get world up vector
-    virtual float *get_world_up() {if ( _dirty ) { recalc(); } return _world_up; }
-    // Get the relative (to scenery center) view position in fgfs coordinates.
-    virtual float * getRelativeViewPos ();
-    // Get the absolute zero-elevation view position in fgfs coordinates.
-    virtual float * getZeroElevViewPos ();
-    // Get surface east vector
-    virtual float *get_surface_east() {        if ( _dirty ) { recalc(); } return _surface_east; }
-    // Get surface south vector
-    virtual float *get_surface_south() {if ( _dirty ) { recalc(); } return _surface_south; }
-
-    // Matrices...
-    virtual const sgVec4 *get_VIEW() { if ( _dirty ) { recalc(); } return VIEW; }
-    virtual const sgVec4 *get_UP() { if ( _dirty ) { recalc(); } return UP; }
+    const SGVec3d& get_view_pos() { if ( _dirty ) { recalc(); } return _absolute_view_pos; }
+    const SGVec3d& getViewPosition() { if ( _dirty ) { recalc(); } return _absolute_view_pos; }
+    const SGQuatd& getViewOrientation() { if ( _dirty ) { recalc(); } return mViewOrientation; }
+    const SGQuatd& getViewOrientationOffset() { if ( _dirty ) { recalc(); } return mViewOffsetOr; }
 
     //////////////////////////////////////////////////////////////////////
     // Part 4: View and frustrum data setters and getters
@@ -258,8 +231,6 @@ public:
         _ground_level_nearplane_m = near_m;
     }
 
-    void set_scenery_center(const Point3D& center);
-
     //////////////////////////////////////////////////////////////////////
     // Part 5: misc setters and getters
     //////////////////////////////////////////////////////////////////////
@@ -267,10 +238,6 @@ public:
     inline void set_dirty() { _dirty = true; }
     inline void set_clean() { _dirty = false; }
     
-    // return eye location...
-    virtual SGLocation * getSGLocation () const { return _location; }
-
-
 private:
 
     //////////////////////////////////////////////////////////////////
@@ -280,16 +247,12 @@ private:
     // flag forcing a recalc of derived view parameters
     bool _dirty;
 
-    mutable sgdVec3 _absolute_view_pos;
-    mutable sgVec3 _relative_view_pos;
-    mutable sgVec3 _zero_elev_view_pos;
+    SGQuatd mViewOrientation;
+    SGQuatd mViewOffsetOr;
+    SGVec3d _absolute_view_pos;
 
-    double _lon_deg;
-    double _lat_deg;
-    double _alt_ft;
-    double _target_lon_deg;
-    double _target_lat_deg;
-    double _target_alt_ft;
+    SGGeod _position;
+    SGGeod _target;
 
     double _roll_deg;
     double _pitch_deg;
@@ -310,16 +273,12 @@ private:
     // Position offsets from FDM origin.  The X axis is positive
     // out the tail, Y is out the right wing, and Z is positive up.
     // distance in meters
-    double _x_offset_m;
-    double _y_offset_m;
-    double _z_offset_m;
+    SGVec3d _offset_m;
 
     // Target offsets from FDM origin (for "lookat" targets) The X
     // axis is positive out the tail, Y is out the right wing, and Z
     // is positive up.  distance in meters
-    double _target_x_offset_m;
-    double _target_y_offset_m;
-    double _target_z_offset_m;
+    SGVec3d _target_offset_m;
 
 
     // orientation offsets from reference (_goal* are for smoothed transitions)
@@ -347,54 +306,20 @@ private:
     bool _at_model;
     int _at_model_index;  // number of model (for multi model)
 
-    SGLocation * _location;
-    SGLocation * _target_location;
-
     // the nominal field of view (angle, in degrees)
-    double _fov_deg; 
+    double _fov_deg;
 
     // Ratio of window width and height; height = width *
     // aspect_ratio.  This value is automatically calculated based on
     // window dimentions.
-    double _aspect_ratio;       
+    double _aspect_ratio;
 
     // 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;
 
-    bool _reverse_view_offset;
-
-    // view position in opengl world coordinates (this is the
-    // abs_view_pos translated to scenery.center)
-    sgVec3 _view_pos;
-
-    // cartesion coordinates of current lon/lat if at sea level
-    // translated to scenery.center
-    sgVec3 _zero_elev;
-
-    // surface vector heading south
-    sgVec3 _surface_south;
-
-    // surface vector heading east (used to unambiguously align sky
-    // with sun)
-    sgVec3 _surface_east;
-
-    // world up vector (normal to the plane tangent to the earth's
-    // surface at the spot we are directly above
-    sgVec3 _world_up;
-
-    // up vector for the view (usually point straight up through the
-    // top of the aircraft
-    sgVec3 _view_up;
-
-    // sg versions of our friendly matrices
-    sgMat4 VIEW, UP;
-    sgMat4 LOCAL, ATLOCAL, TRANS, LARC_TO_SSG;
-
-    // Transformation matrix for the view direction offset relative to
-    // the AIRCRAFT matrix
-    sgMat4 VIEW_OFFSET;
-
+    // camera group controled by this view
+    osg::ref_ptr<flightgear::CameraGroup> _cameraGroup;
     //////////////////////////////////////////////////////////////////
     // private functions                                            //
     //////////////////////////////////////////////////////////////////
@@ -402,12 +327,7 @@ private:
     void recalc ();
     void recalcLookFrom();
     void recalcLookAt();
-    void copyLocationData();
-    void updateFromModelLocation (SGLocation * location);
-    void updateAtModelLocation (SGLocation * location);
-    void recalcOurOwnLocation (SGLocation * location, double lon_deg, double lat_deg, double alt_ft,
-                 double roll_deg, double pitch_deg, double heading_deg);
-    void dampEyeData (double &roll_deg, double &pitch_deg, double &heading_deg);
+    void dampEyeData(double &roll_deg, double &pitch_deg, double &heading_deg);
 
     // add to _heading_offset_deg
     inline void incHeadingOffset_deg( double amt ) {
@@ -427,10 +347,6 @@ private:
        _roll_offset_deg += amt;
     }
 
-    inline void set_reverse_view_offset( bool val ) {
-       _reverse_view_offset = val;
-    }
-
 };