#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
// 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; }
// orientation rotations listed below. This has the effect of the
// eye moving around and "looking at" the object (model) from
// different angles.
+ virtual SGVec3d getOffset_m () const { return _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(); }
// Vectors and positions...
- // Get zero elev
- const SGVec3d& get_zero_elev() {if ( _dirty ) { recalc(); } return _zero_elev; }
- // Get world up vector
- const SGVec3f& get_world_up() {if ( _dirty ) { recalc(); } return _world_up; }
- // Get surface east vector
- const SGVec3f& get_surface_east() { if ( _dirty ) { recalc(); } return _surface_east; }
- // Get surface south vector
- const SGVec3f& get_surface_south() {if ( _dirty ) { recalc(); } return _surface_south; }
-
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
inline void set_dirty() { _dirty = true; }
inline void set_clean() { _dirty = false; }
- // return eye location...
- virtual SGLocation * getSGLocation () const { return _location; }
-
-
private:
//////////////////////////////////////////////////////////////////
bool _dirty;
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;
double _target_pitch_deg;
double _target_heading_deg;
- double _damp_sync;
- double _damp_roll;
- double _damp_pitch;
- double _damp_heading;
-
- double _damped_roll_deg;
- double _damped_pitch_deg;
- double _damped_heading_deg;
-
+ SGVec3d _dampTarget; ///< current target value we are damping towards
+ SGVec3d _dampOutput; ///< current output of damping filter
+ SGVec3d _dampFactor; ///< weighting of the damping filter
+
// 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
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;
// multiplied into the aspect_ratio to get the actual vertical fov
double _aspect_ratio_multiplier;
- // cartesion coordinates of current lon/lat if at sea level
- SGVec3d _zero_elev;
-
- // surface vector heading south
- SGVec3f _surface_south;
-
- // surface vector heading east (used to unambiguously align sky
- // with sun)
- SGVec3f _surface_east;
-
- // world up vector (normal to the plane tangent to the earth's
- // surface at the spot we are directly above
- SGVec3f _world_up;
-
+ // camera group controled by this view
+ osg::ref_ptr<flightgear::CameraGroup> _cameraGroup;
//////////////////////////////////////////////////////////////////
// private functions //
//////////////////////////////////////////////////////////////////
void recalc ();
void recalcLookFrom();
void recalcLookAt();
- void dampEyeData(double &roll_deg, double &pitch_deg, double &heading_deg);
+ void setDampTarget(double h, double p, double r);
+ void getDampOutput(double& roll, double& pitch, double& heading);
+
+ void updateDampOutput(double dt);
+
// add to _heading_offset_deg
inline void incHeadingOffset_deg( double amt ) {
set_dirty();