// partially rewritten by Jim Wilson jim@kelcomaine.com using interface
// by David Megginson March 2002
//
-// Copyright (C) 1997 - 2000 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 1997 - 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
#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 "fgfs.hxx"
-
#define FG_FOV_MIN 0.1
#define FG_FOV_MAX 179.9
};
// Define a structure containing view information
-class FGViewer : public FGSubsystem {
+class FGViewer : public SGSubsystem {
public:
// Constructor
FGViewer( fgViewType Type, bool from_model, int from_model_index,
bool at_model, int at_model_index,
+ double damp_roll, double damp_pitch, double damp_heading,
double x_offset_m, double y_offset_m, double z_offset_m,
double heading_offset_deg, double pitch_offset_deg,
- double roll_offset_deg, double fov_deg,
+ double roll_offset_deg,
+ double fov_deg, double aspect_ratio_multiplier,
double target_x_offset_m, double target_y_offset_m,
- double target_z_offset_m, double near_m );
+ double target_z_offset_m, double near_m, bool internal );
// Destructor
virtual ~FGViewer( void );
//////////////////////////////////////////////////////////////////////
- // Part 1: standard FGSubsystem implementation.
+ // Part 1: standard SGSubsystem implementation.
//////////////////////////////////////////////////////////////////////
virtual void init ();
virtual fgViewType getType() const { return _type; }
virtual void setType( int type );
+ virtual bool getInternal() const { return _internal; }
+ virtual void setInternal( bool internal );
+
// Reference geodetic position of view from position...
// These are the actual aircraft position (pilot in
// pilot view, model in model view).
}
virtual double get_aspect_ratio() const { return _aspect_ratio; }
+ virtual void set_aspect_ratio_multiplier( double m ) {
+ _aspect_ratio_multiplier = m;
+ }
+ virtual double get_aspect_ratio_multiplier() const {
+ return _aspect_ratio_multiplier;
+ }
+
virtual double getNear_m () const { return _ground_level_nearplane_m; }
inline void setNear_m (double near_m) {
_ground_level_nearplane_m = near_m;
}
+ void set_scenery_center(const Point3D& center);
+
//////////////////////////////////////////////////////////////////////
// Part 5: misc setters and getters
//////////////////////////////////////////////////////////////////////
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;
+
// 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
fgViewType _type;
fgScalingType _scaling_type;
+ // internal view (e.g. cockpit) flag
+ bool _internal;
+
// view is looking from a model
bool _from_model;
int _from_model_index; // number of model (for multi model)
// the nominal field of view (angle, in degrees)
double _fov_deg;
- // ratio of window width and height; height = width * aspect_ratio
- double _aspect_ratio;
+ // Ratio of window width and height; height = width *
+ // aspect_ratio. This value is automatically calculated based on
+ // window dimentions.
+ 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;
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);
// add to _heading_offset_deg
inline void incHeadingOffset_deg( double amt ) {
_pitch_offset_deg += amt;
}
+ // add to _roll_offset_deg
+ inline void incRollOffset_deg( double amt ) {
+ set_dirty();
+ _roll_offset_deg += amt;
+ }
+
inline void set_reverse_view_offset( bool val ) {
_reverse_view_offset = val;
}