Checkpoint commit for cleaning up the FGViewer class. External views are
not working right, but this will hopefully be fixed soon.
This commit is contained in:
parent
d85d899244
commit
6515f9072c
9 changed files with 284 additions and 195 deletions
|
@ -2061,6 +2061,21 @@ SOURCE=.\src\FDM\LaRCsim.cxx
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\FDM\LaRCsimIC.cxx
|
||||
|
||||
!IF "$(CFG)" == "FlightGear - Win32 Release"
|
||||
|
||||
# PROP Intermediate_Dir "Release\Lib_Flight"
|
||||
|
||||
!ELSEIF "$(CFG)" == "FlightGear - Win32 Debug"
|
||||
|
||||
# PROP Intermediate_Dir "Debug\Lib_Flight"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\FDM\MagicCarpet.cxx
|
||||
|
||||
!IF "$(CFG)" == "FlightGear - Win32 Release"
|
||||
|
|
|
@ -882,35 +882,31 @@ static GlBitmap *b1 = NULL;
|
|||
extern FGInterface cur_view_fdm;
|
||||
GLubyte *hiResScreenCapture( int multiplier )
|
||||
{
|
||||
float oldfov = globals->get_options()->get_fov();
|
||||
float fov = oldfov / multiplier;
|
||||
FGViewer *v = globals->get_current_view();
|
||||
globals->get_options()->set_fov(fov);
|
||||
v->force_update_fov_math();
|
||||
float oldfov = globals->get_options()->get_fov();
|
||||
float fov = oldfov / multiplier;
|
||||
FGViewer *v = globals->get_current_view();
|
||||
globals->get_options()->set_fov(fov);
|
||||
fgInitVisuals();
|
||||
int cur_width = globals->get_current_view()->get_winWidth( );
|
||||
int cur_height = globals->get_current_view()->get_winHeight( );
|
||||
if (b1) delete( b1 );
|
||||
// New empty (mostly) bitmap
|
||||
b1 = new GlBitmap( GL_RGB, 1, 1, (unsigned char *)"123" );
|
||||
int x,y;
|
||||
for ( y = 0; y < multiplier; y++ )
|
||||
{
|
||||
for ( x = 0; x < multiplier; x++ )
|
||||
{
|
||||
fgReshape( cur_width, cur_height );
|
||||
// pan to tile
|
||||
rotateView( 0, (y*fov)-((multiplier-1)*fov/2), (x*fov)-((multiplier-1)*fov/2) );
|
||||
fgRenderFrame();
|
||||
// restore view
|
||||
GlBitmap b2;
|
||||
b1->copyBitmap( &b2, cur_width*x, cur_height*y );
|
||||
}
|
||||
if (b1) delete( b1 );
|
||||
// New empty (mostly) bitmap
|
||||
b1 = new GlBitmap( GL_RGB, 1, 1, (unsigned char *)"123" );
|
||||
int x,y;
|
||||
for ( y = 0; y < multiplier; y++ ) {
|
||||
for ( x = 0; x < multiplier; x++ ) {
|
||||
fgReshape( cur_width, cur_height );
|
||||
// pan to tile
|
||||
rotateView( 0, (y*fov)-((multiplier-1)*fov/2), (x*fov)-((multiplier-1)*fov/2) );
|
||||
fgRenderFrame();
|
||||
// restore view
|
||||
GlBitmap b2;
|
||||
b1->copyBitmap( &b2, cur_width*x, cur_height*y );
|
||||
}
|
||||
globals->get_current_view()->UpdateViewParams(cur_view_fdm);
|
||||
globals->get_options()->set_fov(oldfov);
|
||||
v->force_update_fov_math();
|
||||
return b1->getBitmap();
|
||||
}
|
||||
globals->get_current_view()->UpdateViewParams(cur_view_fdm);
|
||||
globals->get_options()->set_fov(oldfov);
|
||||
return b1->getBitmap();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -191,7 +191,7 @@ bool fgFindAirportID( const string& id, FGAirport *a ) {
|
|||
// Set current_options lon/lat given an airport id
|
||||
bool fgSetPosFromAirportID( const string& id ) {
|
||||
FGAirport a;
|
||||
double lon, lat;
|
||||
// double lon, lat;
|
||||
|
||||
FG_LOG( FG_GENERAL, FG_INFO,
|
||||
"Attempting to set starting position from airport code " << id );
|
||||
|
@ -602,11 +602,25 @@ bool fgInitSubsystems( void ) {
|
|||
|
||||
// Initialize view parameters
|
||||
FG_LOG( FG_GENERAL, FG_DEBUG, "Before current_view.init()");
|
||||
globals->get_current_view()->Init();
|
||||
globals->get_pilot_view()->Init();
|
||||
globals->get_current_view()->init();
|
||||
// globals->get_pilot_view()->Init();
|
||||
FG_LOG( FG_GENERAL, FG_DEBUG, "After current_view.init()");
|
||||
globals->get_current_view()->UpdateViewMath(*cur_fdm_state);
|
||||
globals->get_pilot_view()->UpdateViewMath(*cur_fdm_state);
|
||||
|
||||
globals->get_current_view()->
|
||||
set_geod_view_pos( cur_fdm_state->get_Longitude(),
|
||||
cur_fdm_state->get_Lat_geocentric(),
|
||||
cur_fdm_state->get_Altitude() *
|
||||
FEET_TO_METER );
|
||||
globals->get_current_view()->
|
||||
set_sea_level_radius( cur_fdm_state->get_Sea_level_radius() *
|
||||
FEET_TO_METER );
|
||||
globals->get_current_view()->
|
||||
set_hpr( cur_fdm_state->get_Psi(),
|
||||
cur_fdm_state->get_Theta(),
|
||||
cur_fdm_state->get_Phi() );
|
||||
|
||||
// globals->get_current_view()->UpdateViewMath();
|
||||
// globals->get_pilot_view()->UpdateViewMath();
|
||||
FG_LOG( FG_GENERAL, FG_DEBUG, " abs_view_pos = "
|
||||
<< globals->get_current_view()->get_abs_view_pos());
|
||||
// current_view.UpdateWorldToEye(f);
|
||||
|
@ -879,12 +893,26 @@ void fgReInitSubsystems( void )
|
|||
// Initialize view parameters
|
||||
globals->get_current_view()->set_view_offset( 0.0 );
|
||||
globals->get_current_view()->set_goal_view_offset( 0.0 );
|
||||
globals->get_pilot_view()->set_view_offset( 0.0 );
|
||||
globals->get_pilot_view()->set_goal_view_offset( 0.0 );
|
||||
// globals->get_pilot_view()->set_view_offset( 0.0 );
|
||||
// globals->get_pilot_view()->set_goal_view_offset( 0.0 );
|
||||
|
||||
FG_LOG( FG_GENERAL, FG_DEBUG, "After current_view.init()");
|
||||
globals->get_current_view()->UpdateViewMath(*cur_fdm_state);
|
||||
globals->get_pilot_view()->UpdateViewMath(*cur_fdm_state);
|
||||
|
||||
globals->get_current_view()->
|
||||
set_geod_view_pos( cur_fdm_state->get_Longitude(),
|
||||
cur_fdm_state->get_Lat_geocentric(),
|
||||
cur_fdm_state->get_Altitude() *
|
||||
FEET_TO_METER );
|
||||
globals->get_current_view()->
|
||||
set_sea_level_radius( cur_fdm_state->get_Sea_level_radius() *
|
||||
FEET_TO_METER );
|
||||
globals->get_current_view()->
|
||||
set_hpr( cur_fdm_state->get_Psi(),
|
||||
cur_fdm_state->get_Theta(),
|
||||
cur_fdm_state->get_Phi() );
|
||||
|
||||
// globals->get_current_view()->UpdateViewMath();
|
||||
// globals->get_pilot_view()->UpdateViewMath();
|
||||
FG_LOG( FG_GENERAL, FG_DEBUG, " abs_view_pos = "
|
||||
<< globals->get_current_view()->get_abs_view_pos());
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ private:
|
|||
FGOptions *options;
|
||||
|
||||
// viewers
|
||||
FGViewer *pilot_view;
|
||||
// FGViewer *pilot_view;
|
||||
FGViewer *current_view;
|
||||
|
||||
public:
|
||||
|
@ -99,8 +99,8 @@ public:
|
|||
inline FGOptions *get_options() const { return options; }
|
||||
inline void set_options( FGOptions *o ) { options = o; }
|
||||
|
||||
inline FGViewer *get_pilot_view() const { return pilot_view; }
|
||||
inline void set_pilot_view( FGViewer *v ) { pilot_view = v; }
|
||||
// inline FGViewer *get_pilot_view() const { return pilot_view; }
|
||||
// inline void set_pilot_view( FGViewer *v ) { pilot_view = v; }
|
||||
|
||||
inline FGViewer *get_current_view() const { return current_view; }
|
||||
inline void set_current_view( FGViewer *v ) { current_view = v; }
|
||||
|
|
|
@ -159,7 +159,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(-25.0, 25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(-25.0, 25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 0.75 );
|
||||
}
|
||||
return;
|
||||
|
@ -168,7 +168,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(-25.0, 0.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(-25.0, 0.0, 1.0);
|
||||
v->set_view_offset( FG_PI );
|
||||
}
|
||||
return;
|
||||
|
@ -177,7 +177,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(-25.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(-25.0, -25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 1.25 );
|
||||
}
|
||||
return;
|
||||
|
@ -186,7 +186,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(0.0, 25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(0.0, 25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 0.50 );
|
||||
}
|
||||
return;
|
||||
|
@ -195,7 +195,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(0.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(0.0, -25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 1.50 );
|
||||
}
|
||||
return;
|
||||
|
@ -204,7 +204,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, 25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, 25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 0.25 );
|
||||
}
|
||||
return;
|
||||
|
@ -213,7 +213,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, 0.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, 0.0, 1.0);
|
||||
v->set_view_offset( 0.00 );
|
||||
}
|
||||
return;
|
||||
|
@ -222,7 +222,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, -25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 1.75 );
|
||||
}
|
||||
return;
|
||||
|
@ -270,7 +270,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
fov = FG_FOV_MAX;
|
||||
}
|
||||
globals->get_options()->set_fov(fov);
|
||||
v->force_update_fov_math();
|
||||
// v->force_update_fov_math();
|
||||
return;
|
||||
case 90: // Z key
|
||||
#ifndef FG_OLD_WEATHER
|
||||
|
@ -434,7 +434,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
globals->get_options()->set_view_mode( FGOptions::FG_VIEW_FOLLOW );
|
||||
v->set_goal_view_offset( FG_PI * 1.75 );
|
||||
v->set_view_offset( FG_PI * 1.75 );
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, -25.0, 1.0);
|
||||
}
|
||||
fgReshape( globals->get_options()->get_xsize(),
|
||||
globals->get_options()->get_ysize() );
|
||||
|
@ -446,7 +446,7 @@ void GLUTkey(unsigned char k, int x, int y) {
|
|||
fov = FG_FOV_MIN;
|
||||
}
|
||||
globals->get_options()->set_fov(fov);
|
||||
v->force_update_fov_math();
|
||||
// v->force_update_fov_math();
|
||||
return;
|
||||
case 122: // z key
|
||||
#ifndef FG_OLD_WEATHER
|
||||
|
@ -561,7 +561,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW)
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(-25.0, 25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(-25.0, 25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 0.75 );
|
||||
}
|
||||
return;
|
||||
|
@ -570,7 +570,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(-25.0, 0.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(-25.0, 0.0, 1.0);
|
||||
v->set_view_offset( FG_PI );
|
||||
}
|
||||
return;
|
||||
|
@ -579,7 +579,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW)
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(-25.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(-25.0, -25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 1.25 );
|
||||
}
|
||||
return;
|
||||
|
@ -588,7 +588,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(0.0, 25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(0.0, 25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 0.50 );
|
||||
}
|
||||
return;
|
||||
|
@ -597,7 +597,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(0.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(0.0, -25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 1.50 );
|
||||
}
|
||||
return;
|
||||
|
@ -606,7 +606,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, 25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, 25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 0.25 );
|
||||
}
|
||||
return;
|
||||
|
@ -615,7 +615,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, 0.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, 0.0, 1.0);
|
||||
v->set_view_offset( 0.00 );
|
||||
}
|
||||
return;
|
||||
|
@ -624,7 +624,7 @@ void GLUTspecialkey(int k, int x, int y) {
|
|||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
globals->get_pilot_view()->set_pilot_offset(25.0, -25.0, 1.0);
|
||||
globals->get_current_view()->set_pilot_offset(25.0, -25.0, 1.0);
|
||||
v->set_view_offset( FG_PI * 1.75 );
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -293,7 +293,7 @@ void fgRenderFrame( void ) {
|
|||
fgLIGHT *l = &cur_light_params;
|
||||
static double last_visibility = -9999;
|
||||
|
||||
double angle;
|
||||
// double angle;
|
||||
// GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
|
||||
// GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
|
||||
// GLfloat terrain_color[4] = { 0.54, 0.44, 0.29, 1.0 };
|
||||
|
@ -317,21 +317,51 @@ void fgRenderFrame( void ) {
|
|||
// timerText -> setLabel (ctime (&t->cur_time));
|
||||
// end of hack
|
||||
|
||||
// calculate our current position in cartesian space
|
||||
scenery.center = scenery.next_center;
|
||||
// printf("scenery center = %.2f %.2f %.2f\n", scenery.center.x(),
|
||||
// scenery.center.y(), scenery.center.z());
|
||||
|
||||
globals->get_current_view()->
|
||||
set_geod_view_pos( cur_fdm_state->get_Longitude(),
|
||||
cur_fdm_state->get_Lat_geocentric(),
|
||||
cur_fdm_state->get_Altitude() *
|
||||
FEET_TO_METER );
|
||||
globals->get_current_view()->
|
||||
set_sea_level_radius( cur_fdm_state->get_Sea_level_radius() *
|
||||
FEET_TO_METER );
|
||||
globals->get_current_view()->
|
||||
set_hpr( cur_fdm_state->get_Psi(),
|
||||
cur_fdm_state->get_Theta(),
|
||||
cur_fdm_state->get_Phi() );
|
||||
|
||||
// update view volume parameters
|
||||
// cout << "before pilot_view update" << endl;
|
||||
if ( globals->get_options()->get_view_mode()
|
||||
== FGOptions::FG_VIEW_FOLLOW )
|
||||
if ( globals->get_options()->get_view_mode() ==
|
||||
FGOptions::FG_VIEW_FOLLOW )
|
||||
{
|
||||
float * offset = globals->get_pilot_view()->get_pilot_offset();
|
||||
float * offset = globals->get_current_view()->get_pilot_offset();
|
||||
globals->get_current_view()->set_pilot_offset( offset[0],
|
||||
offset[1],
|
||||
offset[2] );
|
||||
} else {
|
||||
globals->get_current_view()->set_pilot_offset(0.0, 0.0, 0.0);
|
||||
}
|
||||
globals->get_pilot_view()->UpdateViewParams(*cur_fdm_state);
|
||||
// cout << "after pilot_view update" << endl;
|
||||
globals->get_current_view()->UpdateViewParams(cur_view_fdm);
|
||||
|
||||
if ( ! fgPanelVisible() ) {
|
||||
xglViewport( 0, 0 ,
|
||||
(GLint)(globals->get_options()->get_xsize()),
|
||||
(GLint)(globals->get_options()->get_ysize()) );
|
||||
} else {
|
||||
int view_h =
|
||||
int( (current_panel->getViewHeight() -
|
||||
current_panel->getYOffset())
|
||||
* (globals->get_options()->get_ysize() / 768.0) );
|
||||
glViewport( 0,
|
||||
(GLint)(globals->get_options()->get_ysize() - view_h),
|
||||
(GLint)(globals->get_options()->get_xsize()),
|
||||
(GLint)(view_h) );
|
||||
}
|
||||
|
||||
// set the sun position
|
||||
glLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
|
||||
|
@ -505,8 +535,7 @@ void fgRenderFrame( void ) {
|
|||
// glMatrixMode( GL_PROJECTION );
|
||||
// glLoadIdentity();
|
||||
float fov = globals->get_options()->get_fov();
|
||||
// ssgSetFOV(fov * current_view.get_win_ratio(), fov);
|
||||
ssgSetFOV(fov, fov * globals->get_current_view()->get_win_ratio());
|
||||
ssgSetFOV(fov, fov * globals->get_options()->get_win_ratio());
|
||||
|
||||
double agl = current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER
|
||||
- scenery.cur_elev;
|
||||
|
@ -537,9 +566,9 @@ void fgRenderFrame( void ) {
|
|||
|
||||
sgMat4 sgTRANS;
|
||||
sgMakeTransMat4( sgTRANS,
|
||||
globals->get_pilot_view()->get_view_pos().x(),
|
||||
globals->get_pilot_view()->get_view_pos().y(),
|
||||
globals->get_pilot_view()->get_view_pos().z() );
|
||||
globals->get_current_view()->get_view_pos().x(),
|
||||
globals->get_current_view()->get_view_pos().y(),
|
||||
globals->get_current_view()->get_view_pos().z() );
|
||||
|
||||
sgVec3 ownship_up;
|
||||
sgSetVec3( ownship_up, 0.0, 0.0, 1.0);
|
||||
|
@ -555,7 +584,7 @@ void fgRenderFrame( void ) {
|
|||
// sgTUX = ( sgROT * pilot_view.VIEW_ROT ) * sgTRANS
|
||||
sgMat4 sgTUX;
|
||||
sgCopyMat4( sgTUX, sgROT );
|
||||
sgPostMultMat4( sgTUX, globals->get_pilot_view()->get_VIEW_ROT() );
|
||||
sgPostMultMat4( sgTUX, globals->get_current_view()->get_VIEW_ROT() );
|
||||
sgPostMultMat4( sgTUX, sgTRANS );
|
||||
|
||||
sgCoord tuxpos;
|
||||
|
@ -1144,32 +1173,24 @@ static void fgIdleFunction ( void ) {
|
|||
// Handle new window size or exposure
|
||||
void fgReshape( int width, int height ) {
|
||||
if ( ! fgPanelVisible() || idle_state != 1000 ) {
|
||||
globals->get_current_view()->set_win_ratio( (float)height /
|
||||
(float)width );
|
||||
globals->get_options()->set_win_ratio( (float)height /
|
||||
(float)width );
|
||||
glViewport(0, 0 , (GLint)(width), (GLint)(height) );
|
||||
} else {
|
||||
int view_h =
|
||||
int((current_panel->getViewHeight() - current_panel->getYOffset())
|
||||
* (height / 768.0)) + 1;
|
||||
globals->get_current_view()->set_win_ratio( (float)view_h /
|
||||
(float)width );
|
||||
globals->get_options()->set_win_ratio( (float)view_h /
|
||||
(float)width );
|
||||
glViewport(0, (GLint)(height - view_h),
|
||||
(GLint)(width), (GLint)(view_h) );
|
||||
}
|
||||
|
||||
globals->get_options()->set_xsize( width );
|
||||
globals->get_options()->set_ysize( height );
|
||||
globals->get_current_view()->force_update_fov_math();
|
||||
|
||||
// set these fov to be the same as in fgRenderFrame()
|
||||
// float x_fov = globals->get_options()->get_fov();
|
||||
// float y_fov = x_fov * 1.0 / current_view.get_win_ratio();
|
||||
// ssgSetFOV( x_fov, y_fov );
|
||||
|
||||
// glViewport ( 0, 0, width, height );
|
||||
float fov = globals->get_options()->get_fov();
|
||||
// ssgSetFOV(fov * current_view.get_win_ratio(), fov);
|
||||
ssgSetFOV(fov, fov * globals->get_current_view()->get_win_ratio());
|
||||
ssgSetFOV(fov, fov * globals->get_options()->get_win_ratio());
|
||||
|
||||
fgHUDReshape();
|
||||
|
||||
|
@ -1177,7 +1198,7 @@ void fgReshape( int width, int height ) {
|
|||
// yes we've finished all our initializations and are running
|
||||
// the main loop, so this will now work without seg faulting
|
||||
// the system.
|
||||
globals->get_current_view()->UpdateViewParams(cur_view_fdm);
|
||||
// globals->get_current_view()->UpdateViewParams();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1332,9 +1353,9 @@ int main( int argc, char **argv ) {
|
|||
globals->set_options( options );
|
||||
|
||||
FGViewer *pv = new FGViewer;
|
||||
globals->set_pilot_view( pv );
|
||||
FGViewer *cv = new FGViewer;
|
||||
globals->set_current_view( cv );
|
||||
globals->set_current_view( pv );
|
||||
// FGViewer *cv = new FGViewer;
|
||||
// globals->set_current_view( cv );
|
||||
|
||||
// Scan the config file(s) and command line options to see if
|
||||
// fg_root was specified (ignore all other options for now)
|
||||
|
@ -1571,8 +1592,6 @@ int main( int argc, char **argv ) {
|
|||
// $$$ end - added VS Renganathan, 15 Oct 2K
|
||||
void fgLoadDCS(void) {
|
||||
|
||||
double obj_lat,obj_lon,obj_alt;
|
||||
int i = 1;
|
||||
string obj_filename;
|
||||
|
||||
FGPath tile_path( globals->get_options()->get_fg_root());
|
||||
|
@ -1621,14 +1640,13 @@ void fgLoadDCS(void) {
|
|||
|
||||
void fgUpdateDCS (void) {
|
||||
|
||||
double eye_lat,eye_lon,eye_alt;
|
||||
// double eye_lat,eye_lon,eye_alt;
|
||||
static double obj_lat=15.377603*DEG_TO_RAD;
|
||||
static double obj_lon= 73.816436*DEG_TO_RAD;
|
||||
static double obj_alt=0.15;
|
||||
static double obj_head;
|
||||
// static double obj_head;
|
||||
double sl_radius,obj_latgc;
|
||||
float nresultmat[4][4];
|
||||
sgMat4 Trans,rothead,rotlon,rot180,rotlat,resultmat1,resultmat2,resultmat3;
|
||||
// float nresultmat[4][4];
|
||||
double bz[3];
|
||||
|
||||
obj_lat = obj_lat + 0.0000001;
|
||||
|
|
|
@ -191,6 +191,7 @@ private:
|
|||
bool textures; // Textures enabled/disabled
|
||||
bool wireframe; // Wireframe mode enabled/disabled
|
||||
int xsize, ysize; // window size derived from geometry string
|
||||
double win_ratio; // ratio of x and y fov's; fov(y) = fov(x) * win_ratio
|
||||
int bpp; // bits per pixel
|
||||
fgViewMode view_mode; // view mode
|
||||
double default_view_offset; // default forward view offset (for use by
|
||||
|
@ -301,6 +302,7 @@ public:
|
|||
inline bool get_wireframe() const { return wireframe; }
|
||||
inline int get_xsize() const { return xsize; }
|
||||
inline int get_ysize() const { return ysize; }
|
||||
inline double get_win_ratio() const { return win_ratio; }
|
||||
inline int get_bpp() const { return bpp; }
|
||||
inline fgViewMode get_view_mode() const { return view_mode; }
|
||||
inline double get_default_view_offset() const {
|
||||
|
@ -375,6 +377,7 @@ public:
|
|||
void toggle_panel();
|
||||
inline void set_xsize( int x ) { xsize = x; }
|
||||
inline void set_ysize( int y ) { ysize = y; }
|
||||
inline void set_win_ratio( double r ) { win_ratio = r; }
|
||||
inline void set_view_mode (fgViewMode value) { view_mode = value; }
|
||||
inline void set_tile_radius (int value) { tile_radius = value; }
|
||||
inline void set_tile_diameter (int value) { tile_diameter = value; }
|
||||
|
|
|
@ -45,9 +45,11 @@
|
|||
|
||||
|
||||
// Constructor
|
||||
FGViewer::FGViewer( void ) {
|
||||
FGViewer::FGViewer( void )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
#define USE_FAST_VIEWROT
|
||||
#ifdef USE_FAST_VIEWROT
|
||||
// VIEW_ROT = LARC_TO_SSG * ( VIEWo * VIEW_OFFSET )
|
||||
|
@ -79,15 +81,20 @@ inline static void fgMakeViewRot( sgMat4 dst, const sgMat4 m1, const sgMat4 m2 )
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Initialize a view structure
|
||||
void FGViewer::Init( void ) {
|
||||
void FGViewer::init( void ) {
|
||||
dirty = true;
|
||||
|
||||
FG_LOG( FG_VIEW, FG_INFO, "Initializing View parameters" );
|
||||
|
||||
view_offset = goal_view_offset = globals->get_options()->get_default_view_offset();
|
||||
view_offset = goal_view_offset =
|
||||
globals->get_options()->get_default_view_offset();
|
||||
sgSetVec3( pilot_offset, 0.0, 0.0, 0.0 );
|
||||
|
||||
set_win_ratio( globals->get_options()->get_xsize() /
|
||||
globals->get_options()->get_ysize() );
|
||||
globals->get_options()->set_win_ratio( globals->get_options()->get_xsize() /
|
||||
globals->get_options()->get_ysize()
|
||||
);
|
||||
|
||||
#ifndef USE_FAST_VIEWROT
|
||||
// This never changes -- NHV
|
||||
|
@ -111,8 +118,6 @@ void FGViewer::Init( void ) {
|
|||
LARC_TO_SSG[3][2] = 0.0;
|
||||
LARC_TO_SSG[3][3] = 1.0;
|
||||
#endif // USE_FAST_VIEWROT
|
||||
|
||||
force_update_fov_math();
|
||||
}
|
||||
|
||||
|
||||
|
@ -151,25 +156,6 @@ inline static void fgMakeLOCAL( sgMat4 dst, const double Theta,
|
|||
#endif
|
||||
|
||||
|
||||
// Update the view volume, position, and orientation
|
||||
void FGViewer::UpdateViewParams( const FGInterface& f ) {
|
||||
UpdateViewMath(f);
|
||||
|
||||
if ( ! fgPanelVisible() ) {
|
||||
xglViewport( 0, 0 ,
|
||||
(GLint)(globals->get_options()->get_xsize()),
|
||||
(GLint)(globals->get_options()->get_ysize()) );
|
||||
} else {
|
||||
int view_h =
|
||||
int((current_panel->getViewHeight() - current_panel->getYOffset())
|
||||
* (globals->get_options()->get_ysize() / 768.0));
|
||||
glViewport( 0, (GLint)(globals->get_options()->get_ysize() - view_h),
|
||||
(GLint)(globals->get_options()->get_xsize()),
|
||||
(GLint)(view_h) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// convert sgMat4 to MAT3 and print
|
||||
static void print_sgMat4( sgMat4 &in) {
|
||||
int i, j;
|
||||
|
@ -183,36 +169,23 @@ static void print_sgMat4( sgMat4 &in) {
|
|||
|
||||
|
||||
// Update the view parameters
|
||||
void FGViewer::UpdateViewMath( const FGInterface& f ) {
|
||||
void FGViewer::update() {
|
||||
|
||||
Point3D p;
|
||||
sgVec3 v0, minus_z, sgvec, forward;
|
||||
sgMat4 VIEWo, TMP;
|
||||
|
||||
if ( update_fov ) {
|
||||
ssgSetFOV( globals->get_options()->get_fov(),
|
||||
globals->get_options()->get_fov() * win_ratio );
|
||||
update_fov = false;
|
||||
}
|
||||
|
||||
scenery.center = scenery.next_center;
|
||||
|
||||
// printf("scenery center = %.2f %.2f %.2f\n", scenery.center.x,
|
||||
// scenery.center.y, scenery.center.z);
|
||||
sgVec3 v0, minus_z, forward;
|
||||
sgMat4 VIEWo;
|
||||
|
||||
// calculate the cartesion coords of the current lat/lon/0 elev
|
||||
p = Point3D( f.get_Longitude(),
|
||||
f.get_Lat_geocentric(),
|
||||
f.get_Sea_level_radius() * FEET_TO_METER );
|
||||
Point3D p = Point3D( geod_view_pos.lon(),
|
||||
geod_view_pos.lat(),
|
||||
sea_level_radius );
|
||||
|
||||
cur_zero_elev = sgPolarToCart3d(p) - scenery.center;
|
||||
|
||||
// calculate view position in current FG view coordinate system
|
||||
// p.lon & p.lat are already defined earlier, p.radius was set to
|
||||
// the sea level radius, so now we add in our altitude.
|
||||
if ( f.get_Altitude() * FEET_TO_METER >
|
||||
(scenery.cur_elev + 0.5 * METER_TO_FEET) ) {
|
||||
p.setz( p.radius() + f.get_Altitude() * FEET_TO_METER );
|
||||
if ( geod_view_pos.elev() > (scenery.cur_elev + 0.5 * METER_TO_FEET) ) {
|
||||
p.setz( p.radius() + geod_view_pos.elev() );
|
||||
} else {
|
||||
p.setz( p.radius() + scenery.cur_elev + 0.5 * METER_TO_FEET );
|
||||
}
|
||||
|
@ -221,6 +194,7 @@ void FGViewer::UpdateViewMath( const FGInterface& f ) {
|
|||
|
||||
view_pos = abs_view_pos - scenery.center;
|
||||
|
||||
FG_LOG( FG_VIEW, FG_DEBUG, "sea level radius = " << sea_level_radius );
|
||||
FG_LOG( FG_VIEW, FG_DEBUG, "Polar view pos = " << p );
|
||||
FG_LOG( FG_VIEW, FG_DEBUG, "Absolute view pos = " << abs_view_pos );
|
||||
FG_LOG( FG_VIEW, FG_DEBUG, "Relative view pos = " << view_pos );
|
||||
|
@ -231,19 +205,19 @@ void FGViewer::UpdateViewMath( const FGInterface& f ) {
|
|||
|
||||
#ifdef USE_FAST_LOCAL
|
||||
|
||||
fgMakeLOCAL( LOCAL, f.get_Theta(), f.get_Phi(), -f.get_Psi() );
|
||||
fgMakeLOCAL( LOCAL, hpr[1], hpr[2], -hpr[0] );
|
||||
|
||||
#else // USE_TEXT_BOOK_METHOD
|
||||
|
||||
sgVec3 rollvec;
|
||||
sgSetVec3( rollvec, 0.0, 0.0, 1.0 );
|
||||
sgMat4 PHI; // roll
|
||||
sgMakeRotMat4( PHI, f.get_Phi() * RAD_TO_DEG, rollvec );
|
||||
sgMakeRotMat4( PHI, hpr[2] * RAD_TO_DEG, rollvec );
|
||||
|
||||
sgVec3 pitchvec;
|
||||
sgSetVec3( pitchvec, 0.0, 1.0, 0.0 );
|
||||
sgMat4 THETA; // pitch
|
||||
sgMakeRotMat4( THETA, f.get_Theta() * RAD_TO_DEG, pitchvec );
|
||||
sgMakeRotMat4( THETA, hpr[1] * RAD_TO_DEG, pitchvec );
|
||||
|
||||
// ROT = PHI * THETA
|
||||
sgMat4 ROT;
|
||||
|
@ -253,23 +227,23 @@ void FGViewer::UpdateViewMath( const FGInterface& f ) {
|
|||
|
||||
sgVec3 yawvec;
|
||||
sgSetVec3( yawvec, 1.0, 0.0, 0.0 );
|
||||
sgMat4 PSI; // pitch
|
||||
sgMakeRotMat4( PSI, -f.get_Psi() * RAD_TO_DEG, yawvec );
|
||||
sgMat4 PSI; // heading
|
||||
sgMakeRotMat4( PSI, -hpr[0] * RAD_TO_DEG, yawvec );
|
||||
|
||||
// LOCAL = ROT * PSI
|
||||
// sgMultMat4( LOCAL, ROT, PSI );
|
||||
sgCopyMat4( LOCAL, ROT );
|
||||
sgPostMultMat4( LOCAL, PSI );
|
||||
|
||||
#endif // YIKES
|
||||
#endif // USE_FAST_LOCAL
|
||||
|
||||
// cout << "LOCAL matrix" << endl;
|
||||
// print_sgMat4( LOCAL );
|
||||
|
||||
sgMakeRotMat4( UP,
|
||||
f.get_Longitude() * RAD_TO_DEG,
|
||||
geod_view_pos.lon() * RAD_TO_DEG,
|
||||
0.0,
|
||||
-f.get_Latitude() * RAD_TO_DEG );
|
||||
-geod_view_pos.lat() * RAD_TO_DEG );
|
||||
|
||||
sgSetVec3( local_up, UP[0][0], UP[0][1], UP[0][2] );
|
||||
// sgXformVec3( local_up, UP );
|
||||
|
@ -376,6 +350,8 @@ void FGViewer::UpdateViewMath( const FGInterface& f ) {
|
|||
// << surface_east[1] << "," << surface_east[2] << endl;
|
||||
// cout << "Should be close to zero = "
|
||||
// << sgScalarProductVec3(surface_south, surface_east) << endl;
|
||||
|
||||
dirty = false;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -54,6 +54,9 @@ class FGViewer {
|
|||
|
||||
private:
|
||||
|
||||
// flag forcing a recalc of derived view parameters
|
||||
bool dirty;
|
||||
|
||||
// the current view offset angle from forward (rotated about the
|
||||
// view_up vector)
|
||||
double view_offset;
|
||||
|
@ -61,15 +64,11 @@ private:
|
|||
// the goal view offset angle (used for smooth view changes)
|
||||
double goal_view_offset;
|
||||
|
||||
// flag forcing update of fov related stuff
|
||||
bool update_fov;
|
||||
|
||||
// fov of view is specified in the X direction, win_ratio is used to
|
||||
// calculate the fov in the Y direction. fov(y) = fov(x) * win_ratio
|
||||
double win_ratio;
|
||||
// geodetic view position
|
||||
Point3D geod_view_pos;
|
||||
|
||||
// width & height of window
|
||||
// int winWidth, winHeight;
|
||||
// radius to sea level from center of the earth (m)
|
||||
double sea_level_radius;
|
||||
|
||||
// absolute view position in earth coordinates
|
||||
Point3D abs_view_pos;
|
||||
|
@ -83,6 +82,9 @@ private:
|
|||
// Distances in meters of course.
|
||||
sgVec3 pilot_offset;
|
||||
|
||||
// view orientation (heading, pitch, roll)
|
||||
sgVec3 hpr;
|
||||
|
||||
// cartesion coordinates of current lon/lat if at sea level
|
||||
// translated to scenery.center
|
||||
Point3D cur_zero_elev;
|
||||
|
@ -119,9 +121,6 @@ private:
|
|||
// the vector pointing straight out the nose of the aircraft
|
||||
sgVec3 view_forward;
|
||||
|
||||
// Transformation matrix for eye coordinates to aircraft coordinates
|
||||
// sgMat4 AIRCRAFT;
|
||||
|
||||
// Transformation matrix for the view direction offset relative to
|
||||
// the AIRCRAFT matrix
|
||||
sgMat4 VIEW_OFFSET;
|
||||
|
@ -129,6 +128,9 @@ private:
|
|||
// sg versions of our friendly matrices
|
||||
sgMat4 LOCAL, UP, VIEW_ROT, TRANS, VIEW, LARC_TO_SSG;
|
||||
|
||||
// Update the view volume, position, and orientation
|
||||
void update();
|
||||
|
||||
public:
|
||||
|
||||
// Constructor
|
||||
|
@ -138,43 +140,100 @@ public:
|
|||
~FGViewer( void );
|
||||
|
||||
// Initialize a view class
|
||||
void Init( void );
|
||||
|
||||
// Update the view volume, position, and orientation
|
||||
void UpdateViewParams( const FGInterface& f );
|
||||
|
||||
// Flag to request that UpdateFOV() be called next time
|
||||
// UpdateViewMath() is run.
|
||||
inline void force_update_fov_math() { update_fov = true; }
|
||||
|
||||
// Update the view parameters
|
||||
void UpdateViewMath( const FGInterface& f );
|
||||
|
||||
// Update the field of view coefficients
|
||||
void UpdateFOV( const FGOptions *o );
|
||||
void init( void );
|
||||
|
||||
// Transform a vector from world coordinates to the local plane
|
||||
void CurrentNormalInLocalPlane(sgVec3 dst, sgVec3 src);
|
||||
|
||||
// accessor functions
|
||||
inline double get_view_offset() const { return view_offset; }
|
||||
inline void set_view_offset( double a ) { view_offset = a; }
|
||||
inline void inc_view_offset( double amt ) { view_offset += amt; }
|
||||
inline double get_goal_view_offset() const { return goal_view_offset; }
|
||||
inline void set_goal_view_offset( double a) { goal_view_offset = a; }
|
||||
inline double get_win_ratio() const { return win_ratio; }
|
||||
inline void set_win_ratio( double r ) { win_ratio = r; }
|
||||
// inline int get_winWidth() const { return winWidth; }
|
||||
// inline void set_winWidth( int w ) { winWidth = w; }
|
||||
// inline int get_winHeight() const { return winHeight; }
|
||||
// inline void set_winHeight( int h ) { winHeight = h; }
|
||||
inline Point3D get_abs_view_pos() const { return abs_view_pos; }
|
||||
inline Point3D get_view_pos() const { return view_pos; }
|
||||
inline float *get_pilot_offset() { return pilot_offset; }
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// setter functions
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
inline void set_geod_view_pos( double lon, double lat, double alt ) {
|
||||
// data should be in radians and meters asl
|
||||
dirty = true;
|
||||
// cout << "set_geod_view_pos = " << lon << ", " << lat << ", " << alt
|
||||
// << endl;
|
||||
geod_view_pos = Point3D( lon, lat, alt );
|
||||
}
|
||||
inline void set_sea_level_radius( double r ) {
|
||||
// data should be in meters from the center of the earth
|
||||
dirty = true;
|
||||
sea_level_radius = r;
|
||||
}
|
||||
inline void set_hpr( double h, double p, double r ) {
|
||||
// data should be in radians
|
||||
dirty = true;
|
||||
sgSetVec3( hpr, h, p, r );
|
||||
}
|
||||
inline void set_pilot_offset( float x, float y, float z ) {
|
||||
dirty = true;
|
||||
sgSetVec3( pilot_offset, x, y, z );
|
||||
}
|
||||
inline Point3D get_cur_zero_elev() const { return cur_zero_elev; }
|
||||
inline void set_view_offset( double a ) {
|
||||
dirty = true;
|
||||
view_offset = a;
|
||||
}
|
||||
inline void inc_view_offset( double amt ) {
|
||||
dirty = true;
|
||||
view_offset += amt;
|
||||
}
|
||||
inline void set_goal_view_offset( double a) {
|
||||
dirty = true;
|
||||
goal_view_offset = a;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// accessor functions
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
inline double get_view_offset() const { return view_offset; }
|
||||
inline double get_goal_view_offset() const { return goal_view_offset; }
|
||||
inline float *get_pilot_offset() { return pilot_offset; }
|
||||
inline double get_sea_level_radius() const { return sea_level_radius; }
|
||||
inline float *get_hpr() { return hpr; }
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// derived values accessor functions
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
inline Point3D get_abs_view_pos() {
|
||||
if ( dirty ) { update(); }
|
||||
return abs_view_pos;
|
||||
}
|
||||
inline Point3D get_view_pos() {
|
||||
if ( dirty ) { update(); }
|
||||
return view_pos;
|
||||
}
|
||||
inline Point3D get_cur_zero_elev() {
|
||||
if ( dirty ) { update(); }
|
||||
return cur_zero_elev;
|
||||
}
|
||||
inline float *get_surface_south() {
|
||||
if ( dirty ) { update(); }
|
||||
return surface_south;
|
||||
}
|
||||
inline float *get_surface_east() {
|
||||
if ( dirty ) { update(); }
|
||||
return surface_east;
|
||||
}
|
||||
inline float *get_local_up() {
|
||||
if ( dirty ) { update(); }
|
||||
return local_up;
|
||||
}
|
||||
inline float *get_view_forward() {
|
||||
if ( dirty ) { update(); }
|
||||
return view_forward;
|
||||
}
|
||||
inline const sgVec4 *get_VIEW() {
|
||||
if ( dirty ) { update(); }
|
||||
return VIEW;
|
||||
}
|
||||
inline const sgVec4 *get_VIEW_ROT() {
|
||||
if ( dirty ) { update(); }
|
||||
return VIEW_ROT;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// need to fix these
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
inline float *get_to_sun() { return to_sun; }
|
||||
inline void set_to_sun( float x, float y, float z ) {
|
||||
sgSetVec3( to_sun, x, y, z );
|
||||
|
@ -191,15 +250,9 @@ public:
|
|||
inline void set_surface_to_moon( float x, float y, float z) {
|
||||
sgSetVec3( surface_to_moon, x, y, z );
|
||||
}
|
||||
inline float *get_surface_south() { return surface_south; }
|
||||
inline float *get_surface_east() { return surface_east; }
|
||||
inline float *get_local_up() { return local_up; }
|
||||
inline float *get_view_forward() { return view_forward; }
|
||||
|
||||
inline const sgVec4 *get_VIEW() { return VIEW; }
|
||||
inline const sgVec4 *get_VIEW_ROT() { return VIEW_ROT; }
|
||||
};
|
||||
|
||||
|
||||
#endif // _VIEWER_HXX
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue