Add infrastructure in preparation for tilting the view.
This commit is contained in:
parent
88cb2d13f0
commit
5cb3d22494
3 changed files with 101 additions and 1 deletions
src/Main
|
@ -356,6 +356,48 @@ setGoalViewOffset (double offset)
|
||||||
->set_goal_view_offset(offset * SGD_DEGREES_TO_RADIANS);
|
->set_goal_view_offset(offset * SGD_DEGREES_TO_RADIANS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current view tilt in degrees.
|
||||||
|
*/
|
||||||
|
static double
|
||||||
|
getViewTilt ()
|
||||||
|
{
|
||||||
|
return (globals->get_current_view()
|
||||||
|
->get_view_tilt() * SGD_RADIANS_TO_DEGREES);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
setViewTilt (double tilt)
|
||||||
|
{
|
||||||
|
globals->get_current_view()->set_view_tilt(tilt * SGD_DEGREES_TO_RADIANS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
getGoalViewTilt ()
|
||||||
|
{
|
||||||
|
return (globals->get_current_view()
|
||||||
|
->get_goal_view_tilt() * SGD_RADIANS_TO_DEGREES);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setGoalViewTilt (double tilt)
|
||||||
|
{
|
||||||
|
while ( tilt < 0 ) {
|
||||||
|
tilt += 360.0;
|
||||||
|
}
|
||||||
|
while ( tilt > 360.0 ) {
|
||||||
|
tilt -= 360.0;
|
||||||
|
}
|
||||||
|
// Snap to center if we are close
|
||||||
|
if ( fabs(tilt) < 1.0 || fabs(tilt) > 359.0 ) {
|
||||||
|
tilt = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
globals->get_current_view()
|
||||||
|
->set_goal_view_tilt(tilt * SGD_DEGREES_TO_RADIANS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pilot position offset from CG.
|
* Pilot position offset from CG.
|
||||||
|
@ -1051,6 +1093,9 @@ fgInitProps ()
|
||||||
fgTie("/sim/view/offset-deg", getViewOffset, setViewOffset, false);
|
fgTie("/sim/view/offset-deg", getViewOffset, setViewOffset, false);
|
||||||
fgSetArchivable("/sim/view/offset-deg");
|
fgSetArchivable("/sim/view/offset-deg");
|
||||||
fgTie("/sim/view/goal-offset-deg", getGoalViewOffset, setGoalViewOffset, false);
|
fgTie("/sim/view/goal-offset-deg", getGoalViewOffset, setGoalViewOffset, false);
|
||||||
|
fgTie("/sim/view/tilt-deg", getViewTilt, setViewTilt, false);
|
||||||
|
fgSetArchivable("/sim/view/tilt-deg");
|
||||||
|
fgTie("/sim/view/goal-tilt-deg", getGoalViewTilt, setGoalViewTilt, false);
|
||||||
fgSetArchivable("/sim/view/goal-offset-deg");
|
fgSetArchivable("/sim/view/goal-offset-deg");
|
||||||
fgTie("/sim/view/pilot/x-offset-m",
|
fgTie("/sim/view/pilot/x-offset-m",
|
||||||
getPilotPositionXOffset, setPilotPositionXOffset);
|
getPilotPositionXOffset, setPilotPositionXOffset);
|
||||||
|
|
|
@ -38,7 +38,9 @@
|
||||||
FGViewer::FGViewer( void ):
|
FGViewer::FGViewer( void ):
|
||||||
fov(55.0),
|
fov(55.0),
|
||||||
view_offset(0.0),
|
view_offset(0.0),
|
||||||
goal_view_offset(0.0)
|
goal_view_offset(0.0),
|
||||||
|
view_tilt(0.0),
|
||||||
|
goal_view_tilt(0.0)
|
||||||
{
|
{
|
||||||
sgSetVec3( pilot_offset, 0.0, 0.0, 0.0 );
|
sgSetVec3( pilot_offset, 0.0, 0.0, 0.0 );
|
||||||
sgdZeroVec3(geod_view_pos);
|
sgdZeroVec3(geod_view_pos);
|
||||||
|
@ -104,4 +106,33 @@ FGViewer::update (int dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for ( int i = 0; i < dt; i++ ) {
|
||||||
|
if ( fabs(get_goal_view_tilt() - get_view_tilt()) < 0.05 ) {
|
||||||
|
set_view_tilt( get_goal_view_tilt() );
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// move current_view.view_tilt towards
|
||||||
|
// current_view.goal_view_tilt
|
||||||
|
if ( get_goal_view_tilt() > get_view_tilt() )
|
||||||
|
{
|
||||||
|
if ( get_goal_view_tilt() - get_view_tilt() < SGD_PI ){
|
||||||
|
inc_view_tilt( 0.01 );
|
||||||
|
} else {
|
||||||
|
inc_view_tilt( -0.01 );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( get_view_tilt() - get_goal_view_tilt() < SGD_PI ){
|
||||||
|
inc_view_tilt( -0.01 );
|
||||||
|
} else {
|
||||||
|
inc_view_tilt( 0.01 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( get_view_tilt() > SGD_2PI ) {
|
||||||
|
inc_view_tilt( -SGD_2PI );
|
||||||
|
} else if ( get_view_tilt() < 0 ) {
|
||||||
|
inc_view_tilt( SGD_2PI );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,10 @@ protected:
|
||||||
// the goal view offset angle (used for smooth view changes)
|
// the goal view offset angle (used for smooth view changes)
|
||||||
double goal_view_offset;
|
double goal_view_offset;
|
||||||
|
|
||||||
|
// the view tilt angles
|
||||||
|
double view_tilt;
|
||||||
|
double goal_view_tilt;
|
||||||
|
|
||||||
// geodetic view position
|
// geodetic view position
|
||||||
sgdVec3 geod_view_pos;
|
sgdVec3 geod_view_pos;
|
||||||
|
|
||||||
|
@ -168,6 +172,24 @@ public:
|
||||||
inline void set_reverse_view_offset( bool val ) {
|
inline void set_reverse_view_offset( bool val ) {
|
||||||
reverse_view_offset = val;
|
reverse_view_offset = val;
|
||||||
}
|
}
|
||||||
|
inline void set_view_tilt( double a ) {
|
||||||
|
set_dirty();
|
||||||
|
view_tilt = a;
|
||||||
|
}
|
||||||
|
inline void inc_view_tilt( double amt ) {
|
||||||
|
set_dirty();
|
||||||
|
view_tilt += amt;
|
||||||
|
}
|
||||||
|
inline void set_goal_view_tilt( double a) {
|
||||||
|
set_dirty();
|
||||||
|
goal_view_tilt = a;
|
||||||
|
while ( goal_view_tilt < 0 ) {
|
||||||
|
goal_view_tilt += 360.0;
|
||||||
|
}
|
||||||
|
while ( goal_view_tilt > 360.0 ) {
|
||||||
|
goal_view_tilt -= 360.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
inline void set_geod_view_pos( double lon, double lat, double alt ) {
|
inline void set_geod_view_pos( double lon, double lat, double alt ) {
|
||||||
// data should be in radians and meters asl
|
// data should be in radians and meters asl
|
||||||
set_dirty();
|
set_dirty();
|
||||||
|
@ -197,6 +219,8 @@ public:
|
||||||
inline double get_view_offset() const { return view_offset; }
|
inline double get_view_offset() const { return view_offset; }
|
||||||
inline bool get_reverse_view_offset() const { return reverse_view_offset; }
|
inline bool get_reverse_view_offset() const { return reverse_view_offset; }
|
||||||
inline double get_goal_view_offset() const { return goal_view_offset; }
|
inline double get_goal_view_offset() const { return goal_view_offset; }
|
||||||
|
inline double get_view_tilt() const { return view_tilt; }
|
||||||
|
inline double get_goal_view_tilt() const { return goal_view_tilt; }
|
||||||
inline double *get_geod_view_pos() { return geod_view_pos; }
|
inline double *get_geod_view_pos() { return geod_view_pos; }
|
||||||
inline float *get_pilot_offset() { return pilot_offset; }
|
inline float *get_pilot_offset() { return pilot_offset; }
|
||||||
inline double get_sea_level_radius() const { return sea_level_radius; }
|
inline double get_sea_level_radius() const { return sea_level_radius; }
|
||||||
|
|
Loading…
Add table
Reference in a new issue