1
0
Fork 0

Viewer: move camera-group to view manager

- also devirtualise many methods in FGViewer
This commit is contained in:
James Turner 2016-01-17 14:50:13 -06:00
parent f88d641829
commit e60d9a191e
3 changed files with 93 additions and 89 deletions

View file

@ -48,7 +48,7 @@ using namespace flightgear;
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// Constructor... // Constructor...
FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index, FGViewer::FGViewer( ViewType Type, bool from_model, int from_model_index,
bool at_model, int at_model_index, bool at_model, int at_model_index,
double damp_roll, double damp_pitch, double damp_heading, double damp_roll, double damp_pitch, double damp_heading,
double x_offset_m, double y_offset_m, double z_offset_m, double x_offset_m, double y_offset_m, double z_offset_m,
@ -64,8 +64,7 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index,
_target_roll_deg(0), _target_roll_deg(0),
_target_pitch_deg(0), _target_pitch_deg(0),
_target_heading_deg(0), _target_heading_deg(0),
_scaling_type(FG_SCALING_MAX), _scaling_type(FG_SCALING_MAX)
_cameraGroup(CameraGroup::getDefault())
{ {
_absolute_view_pos = SGVec3d(0, 0, 0); _absolute_view_pos = SGVec3d(0, 0, 0);
_type = Type; _type = Type;
@ -534,7 +533,7 @@ FGViewer::updateDampOutput(double dt)
double double
FGViewer::get_h_fov() FGViewer::get_h_fov()
{ {
double aspectRatio = _cameraGroup->getMasterAspectRatio(); double aspectRatio = get_aspect_ratio();
switch (_scaling_type) { switch (_scaling_type) {
case FG_SCALING_WIDTH: // h_fov == fov case FG_SCALING_WIDTH: // h_fov == fov
return _fov_deg; return _fov_deg;
@ -560,7 +559,7 @@ FGViewer::get_h_fov()
double double
FGViewer::get_v_fov() FGViewer::get_v_fov()
{ {
double aspectRatio = _cameraGroup->getMasterAspectRatio(); double aspectRatio = get_aspect_ratio();
switch (_scaling_type) { switch (_scaling_type) {
case FG_SCALING_WIDTH: // h_fov == fov case FG_SCALING_WIDTH: // h_fov == fov
return return
@ -663,12 +662,10 @@ FGViewer::update (double dt)
} }
} }
recalc(); recalc();
_cameraGroup->update(toOsg(_absolute_view_pos), toOsg(mViewOrientation));
_cameraGroup->setCameraParameters(get_v_fov(), get_aspect_ratio());
} }
double FGViewer::get_aspect_ratio() const double FGViewer::get_aspect_ratio() const
{ {
return _cameraGroup->getMasterAspectRatio(); return flightgear::CameraGroup::getDefault()->getMasterAspectRatio();
} }

View file

@ -27,12 +27,6 @@
#ifndef _VIEWER_HXX #ifndef _VIEWER_HXX
#define _VIEWER_HXX #define _VIEWER_HXX
namespace flightgear
{
class CameraGroup;
}
#include <osg/ref_ptr>
#include <simgear/compiler.h> #include <simgear/compiler.h>
#include <simgear/constants.h> #include <simgear/constants.h>
@ -42,25 +36,26 @@ class CameraGroup;
#define FG_FOV_MIN 0.1 #define FG_FOV_MIN 0.1
#define FG_FOV_MAX 179.9 #define FG_FOV_MAX 179.9
enum fgViewType {
FG_LOOKFROM = 0,
FG_LOOKAT = 1
};
// Define a structure containing view information // Define a structure containing view information
class FGViewer : public SGSubsystem { class FGViewer : public SGSubsystem {
public: public:
enum fgScalingType { // nominal Field Of View actually applies to ... enum ScalingType { // nominal Field Of View actually applies to ...
FG_SCALING_WIDTH, // window width FG_SCALING_WIDTH, // window width
FG_SCALING_MAX // max(width, height) FG_SCALING_MAX // max(width, height)
// FG_SCALING_G_MEAN, // geometric_mean(width, height) // FG_SCALING_G_MEAN, // geometric_mean(width, height)
// FG_SCALING_INDEPENDENT // whole screen // FG_SCALING_INDEPENDENT // whole screen
}; };
enum ViewType {
FG_LOOKFROM = 0,
FG_LOOKAT = 1
};
// Constructor // Constructor
FGViewer( fgViewType Type, bool from_model, int from_model_index, FGViewer( ViewType Type, bool from_model, int from_model_index,
bool at_model, int at_model_index, bool at_model, int at_model_index,
double damp_roll, double damp_pitch, double damp_heading, double damp_roll, double damp_pitch, double damp_heading,
double x_offset_m, double y_offset_m, double z_offset_m, double x_offset_m, double y_offset_m, double z_offset_m,
@ -80,29 +75,29 @@ public:
virtual void init (); virtual void init ();
virtual void bind (); virtual void bind ();
virtual void unbind (); virtual void unbind ();
void update (double dt); virtual void update (double dt);
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Part 2: user settings. // Part 2: user settings.
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
virtual fgViewType getType() const { return _type; } ViewType getType() const { return _type; }
virtual void setType( int type ); void setType( int type );
virtual bool getInternal() const { return _internal; } bool getInternal() const { return _internal; }
virtual void setInternal( bool internal ); void setInternal( bool internal );
// Reference geodetic position of view from position... // Reference geodetic position of view from position...
// These are the actual aircraft position (pilot in // These are the actual aircraft position (pilot in
// pilot view, model in model view). // pilot view, model in model view).
// FIXME: the model view position (ie target positions) // FIXME: the model view position (ie target positions)
// should be in the model class. // should be in the model class.
virtual void setPosition (double lon_deg, double lat_deg, double alt_ft); void setPosition (double lon_deg, double lat_deg, double alt_ft);
const SGGeod& getPosition() const { return _position; } const SGGeod& getPosition() const { return _position; }
// Reference geodetic target position... // Reference geodetic target position...
virtual void setTargetPosition (double lon_deg, double lat_deg, double alt_ft); void setTargetPosition (double lon_deg, double lat_deg, double alt_ft);
const SGGeod& getTargetPosition() const { return _target; } const SGGeod& getTargetPosition() const { return _target; }
@ -119,20 +114,20 @@ public:
// orientation rotations listed below. This has the effect of the // orientation rotations listed below. This has the effect of the
// eye moving around and "looking at" the object (model) from // eye moving around and "looking at" the object (model) from
// different angles. // different angles.
virtual SGVec3d getOffset_m () const { return _offset_m; } SGVec3d getOffset_m () const { return _offset_m; }
virtual double getXOffset_m () const { return _offset_m.x(); } double getXOffset_m () const { return _offset_m.x(); }
virtual double getYOffset_m () const { return _offset_m.y(); } double getYOffset_m () const { return _offset_m.y(); }
virtual double getZOffset_m () const { return _offset_m.z(); } double getZOffset_m () const { return _offset_m.z(); }
virtual double getTargetXOffset_m () const { return _target_offset_m.x(); } double getTargetXOffset_m () const { return _target_offset_m.x(); }
virtual double getTargetYOffset_m () const { return _target_offset_m.y(); } double getTargetYOffset_m () const { return _target_offset_m.y(); }
virtual double getTargetZOffset_m () const { return _target_offset_m.z(); } double getTargetZOffset_m () const { return _target_offset_m.z(); }
virtual void setXOffset_m (double x_offset_m); void setXOffset_m (double x_offset_m);
virtual void setYOffset_m (double y_offset_m); void setYOffset_m (double y_offset_m);
virtual void setZOffset_m (double z_offset_m); void setZOffset_m (double z_offset_m);
virtual void setTargetXOffset_m (double x_offset_m); void setTargetXOffset_m (double x_offset_m);
virtual void setTargetYOffset_m (double y_offset_m); void setTargetYOffset_m (double y_offset_m);
virtual void setTargetZOffset_m (double z_offset_m); void setTargetZOffset_m (double z_offset_m);
virtual void setPositionOffsets (double x_offset_m, void setPositionOffsets (double x_offset_m,
double y_offset_m, double y_offset_m,
double z_offset_m); double z_offset_m);
@ -147,20 +142,20 @@ public:
// the eye is looking at the ojbect (ie the model). // the eye is looking at the ojbect (ie the model).
// FIXME: the FGModel class should have its own version of these so that // FIXME: the FGModel class should have its own version of these so that
// it can generate it's own model rotations. // it can generate it's own model rotations.
virtual double getRoll_deg () const { return _roll_deg; } double getRoll_deg () const { return _roll_deg; }
virtual double getPitch_deg () const {return _pitch_deg; } double getPitch_deg () const {return _pitch_deg; }
virtual double getHeading_deg () const {return _heading_deg; } double getHeading_deg () const {return _heading_deg; }
virtual void setRoll_deg (double roll_deg); void setRoll_deg (double roll_deg);
virtual void setPitch_deg (double pitch_deg); void setPitch_deg (double pitch_deg);
virtual void setHeading_deg (double heading_deg); void setHeading_deg (double heading_deg);
virtual void setOrientation (double roll_deg, double pitch_deg, double heading_deg); void setOrientation (double roll_deg, double pitch_deg, double heading_deg);
virtual double getTargetRoll_deg () const { return _target_roll_deg; } double getTargetRoll_deg () const { return _target_roll_deg; }
virtual double getTargetPitch_deg () const {return _target_pitch_deg; } double getTargetPitch_deg () const {return _target_pitch_deg; }
virtual double getTargetHeading_deg () const {return _target_heading_deg; } double getTargetHeading_deg () const {return _target_heading_deg; }
virtual void setTargetRoll_deg (double roll_deg); void setTargetRoll_deg (double roll_deg);
virtual void setTargetPitch_deg (double pitch_deg); void setTargetPitch_deg (double pitch_deg);
virtual void setTargetHeading_deg (double heading_deg); void setTargetHeading_deg (double heading_deg);
virtual void setTargetOrientation (double roll_deg, double pitch_deg, double heading_deg); void setTargetOrientation (double roll_deg, double pitch_deg, double heading_deg);
@ -175,19 +170,19 @@ public:
// In lookat view they are applied before the position offsets so that // In lookat view they are applied before the position offsets so that
// the effect is the eye moving around looking at the object (ie the model) // the effect is the eye moving around looking at the object (ie the model)
// from different angles. // from different angles.
virtual double getRollOffset_deg () const { return _roll_offset_deg; } double getRollOffset_deg () const { return _roll_offset_deg; }
virtual double getPitchOffset_deg () const { return _pitch_offset_deg; } double getPitchOffset_deg () const { return _pitch_offset_deg; }
virtual double getHeadingOffset_deg () const { return _heading_offset_deg; } double getHeadingOffset_deg () const { return _heading_offset_deg; }
virtual double getGoalRollOffset_deg () const { return _goal_roll_offset_deg; } double getGoalRollOffset_deg () const { return _goal_roll_offset_deg; }
virtual double getGoalPitchOffset_deg () const { return _goal_pitch_offset_deg; } double getGoalPitchOffset_deg () const { return _goal_pitch_offset_deg; }
virtual double getGoalHeadingOffset_deg () const {return _goal_heading_offset_deg; } double getGoalHeadingOffset_deg () const {return _goal_heading_offset_deg; }
virtual void setRollOffset_deg (double roll_offset_deg); void setRollOffset_deg (double roll_offset_deg);
virtual void setPitchOffset_deg (double pitch_offset_deg); void setPitchOffset_deg (double pitch_offset_deg);
virtual void setHeadingOffset_deg (double heading_offset_deg); void setHeadingOffset_deg (double heading_offset_deg);
virtual void setGoalRollOffset_deg (double goal_roll_offset_deg); void setGoalRollOffset_deg (double goal_roll_offset_deg);
virtual void setGoalPitchOffset_deg (double goal_pitch_offset_deg); void setGoalPitchOffset_deg (double goal_pitch_offset_deg);
virtual void setGoalHeadingOffset_deg (double goal_heading_offset_deg); void setGoalHeadingOffset_deg (double goal_heading_offset_deg);
virtual void setOrientationOffsets (double roll_offset_deg, void setOrientationOffsets (double roll_offset_deg,
double heading_offset_deg, double heading_offset_deg,
double pitch_offset_deg); double pitch_offset_deg);
@ -208,24 +203,26 @@ public:
// Part 4: View and frustrum data setters and getters // Part 4: View and frustrum data setters and getters
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
virtual void set_fov( double fov_deg ) { void set_fov( double fov_deg ) {
_fov_deg = fov_deg; _fov_deg = fov_deg;
} }
virtual double get_fov() const { return _fov_deg; }
virtual double get_h_fov(); // Get horizontal fov, in degrees.
virtual double get_v_fov(); // Get vertical fov, in degrees.
virtual double get_aspect_ratio() const; double get_fov() const { return _fov_deg; }
double get_h_fov(); // Get horizontal fov, in degrees.
double get_v_fov(); // Get vertical fov, in degrees.
virtual void set_aspect_ratio_multiplier( double m ) { // this is currently just a wrapper for the default CameraGroups' aspect
double get_aspect_ratio() const;
void set_aspect_ratio_multiplier( double m ) {
_aspect_ratio_multiplier = m; _aspect_ratio_multiplier = m;
} }
virtual double get_aspect_ratio_multiplier() const { double get_aspect_ratio_multiplier() const {
return _aspect_ratio_multiplier; return _aspect_ratio_multiplier;
} }
virtual double getNear_m () const { return _ground_level_nearplane_m; } double getNear_m () const { return _ground_level_nearplane_m; }
inline void setNear_m (double near_m) { void setNear_m (double near_m) {
_ground_level_nearplane_m = near_m; _ground_level_nearplane_m = near_m;
} }
@ -233,8 +230,8 @@ public:
// Part 5: misc setters and getters // Part 5: misc setters and getters
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
inline void set_dirty() { _dirty = true; } void set_dirty() { _dirty = true; }
inline void set_clean() { _dirty = false; } void set_clean() { _dirty = false; }
private: private:
@ -285,8 +282,8 @@ private:
// used to set nearplane when at ground level for this view // used to set nearplane when at ground level for this view
double _ground_level_nearplane_m; double _ground_level_nearplane_m;
fgViewType _type; ViewType _type;
fgScalingType _scaling_type; ScalingType _scaling_type;
// internal view (e.g. cockpit) flag // internal view (e.g. cockpit) flag
bool _internal; bool _internal;
@ -306,8 +303,6 @@ private:
// multiplied into the aspect_ratio to get the actual vertical fov // multiplied into the aspect_ratio to get the actual vertical fov
double _aspect_ratio_multiplier; double _aspect_ratio_multiplier;
// camera group controled by this view
osg::ref_ptr<flightgear::CameraGroup> _cameraGroup;
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
// private functions // // private functions //
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////

View file

@ -30,9 +30,13 @@
#include <string.h> // strcmp #include <string.h> // strcmp
#include <simgear/compiler.h> #include <simgear/compiler.h>
#include <simgear/scene/util/OsgMath.hxx>
#include <Main/fg_props.hxx> #include <Main/fg_props.hxx>
#include "viewer.hxx" #include "viewer.hxx"
#include "CameraGroup.hxx"
// Constructor // Constructor
FGViewMgr::FGViewMgr( void ) : FGViewMgr::FGViewMgr( void ) :
axis_long(0), axis_long(0),
@ -117,7 +121,7 @@ FGViewMgr::init ()
double target_y_offset_m = config->getDoubleValue("target-y-offset-m"); double target_y_offset_m = config->getDoubleValue("target-y-offset-m");
double target_z_offset_m = config->getDoubleValue("target-z-offset-m"); double target_z_offset_m = config->getDoubleValue("target-z-offset-m");
add_view(new FGViewer ( FG_LOOKAT, from_model, from_model_index, add_view(new FGViewer ( FGViewer::FG_LOOKAT, from_model, from_model_index,
at_model, at_model_index, at_model, at_model_index,
damp_roll, damp_pitch, damp_heading, damp_roll, damp_pitch, damp_heading,
x_offset_m, y_offset_m,z_offset_m, x_offset_m, y_offset_m,z_offset_m,
@ -126,7 +130,7 @@ FGViewMgr::init ()
target_x_offset_m, target_y_offset_m, target_x_offset_m, target_y_offset_m,
target_z_offset_m, near_m, internal )); target_z_offset_m, near_m, internal ));
} else { } else {
add_view(new FGViewer ( FG_LOOKFROM, from_model, from_model_index, add_view(new FGViewer ( FGViewer::FG_LOOKFROM, from_model, from_model_index,
false, 0, 0.0, 0.0, 0.0, false, 0, 0.0, 0.0, 0.0,
x_offset_m, y_offset_m, z_offset_m, x_offset_m, y_offset_m, z_offset_m,
heading_offset_deg, pitch_offset_deg, heading_offset_deg, pitch_offset_deg,
@ -338,7 +342,7 @@ FGViewMgr::update (double dt)
} }
// if lookat (type 1) then get target data... // if lookat (type 1) then get target data...
if (currentView->getType() == FG_LOOKAT) { if (currentView->getType() == FGViewer::FG_LOOKAT) {
if (!config->getBoolValue("from-model")) { if (!config->getBoolValue("from-model")) {
lon_deg = fgGetDouble(config->getStringValue("target-lon-deg-path")); lon_deg = fgGetDouble(config->getStringValue("target-lon-deg-path"));
lat_deg = fgGetDouble(config->getStringValue("target-lat-deg-path")); lat_deg = fgGetDouble(config->getStringValue("target-lat-deg-path"));
@ -369,7 +373,15 @@ FGViewMgr::update (double dt)
do_axes(); do_axes();
currentView->update(dt); currentView->update(dt);
abs_viewer_position = currentView->getViewPosition(); abs_viewer_position = currentView->getViewPosition();
// update the camera now
osg::ref_ptr<flightgear::CameraGroup> cameraGroup = flightgear::CameraGroup::getDefault();
cameraGroup->update(toOsg(abs_viewer_position),
toOsg(currentView->getViewOrientation()));
cameraGroup->setCameraParameters(currentView->get_v_fov(),
cameraGroup->getMasterAspectRatio());
// expose the raw (OpenGL) orientation to the property tree, // expose the raw (OpenGL) orientation to the property tree,
// for the sound-manager // for the sound-manager
for (int i=0; i<4; ++i) { for (int i=0; i<4; ++i) {