From 35819b8c4d98207560392b80020f2d0cc3a4c2c9 Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 26 Oct 2000 18:10:28 +0000 Subject: [PATCH] Check point ... making progress with a FGViewerLookAt class so we can more easily do nifty external views. --- src/Main/Makefile.am | 1 + src/Main/main.cxx | 56 ++++++++++++++++++++++++++++------------- src/Main/viewer.cxx | 39 ---------------------------- src/Main/viewer.hxx | 20 +++++++++++---- src/Main/viewer_rph.cxx | 29 ++++++++------------- src/Main/viewer_rph.hxx | 13 ++-------- src/Scenery/tilemgr.cxx | 2 +- src/Time/moonpos.cxx | 4 +-- src/Time/sunpos.cxx | 4 +-- 9 files changed, 72 insertions(+), 96 deletions(-) diff --git a/src/Main/Makefile.am b/src/Main/Makefile.am index 3484187c7..0baa34931 100644 --- a/src/Main/Makefile.am +++ b/src/Main/Makefile.am @@ -44,6 +44,7 @@ fgfs_SOURCES = \ save.cxx save.hxx \ splash.cxx splash.hxx \ viewer.cxx viewer.hxx \ + viewer_lookat.cxx viewer_lookat.hxx \ viewer_rph.cxx viewer_rph.hxx fgfs_LDADD = \ diff --git a/src/Main/main.cxx b/src/Main/main.cxx index be67cefd6..9003f43e0 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -118,6 +118,9 @@ ssgTransform *ship_pos = NULL; #include "keyboard.hxx" #include "splash.hxx" +// temporary? +#include "viewer_lookat.hxx" +FGViewerLookAt *tv; // -dw- use custom sioux settings so I can see output window #ifdef macintosh @@ -336,6 +339,38 @@ void fgRenderFrame( void ) { cur_fdm_state->get_Theta(), cur_fdm_state->get_Psi() ); + // this is a test, we are trying to match RPH and LookAt + // matrices + tv->set_geod_view_pos( cur_fdm_state->get_Longitude(), + cur_fdm_state->get_Lat_geocentric(), + cur_fdm_state->get_Altitude() * + FEET_TO_METER ); + tv->set_sea_level_radius( cur_fdm_state->get_Sea_level_radius() * + FEET_TO_METER ); + tv->set_view_forward( globals->get_current_view()->get_view_forward() ); + tv->set_view_up( globals->get_current_view()->get_view_up() ); + + sgMat4 rph; + sgCopyMat4( rph, globals->get_current_view()->get_VIEW() ); + cout << "RPH Matrix = " << endl; + int i, j; + for ( i = 0; i < 4; i++ ) { + for ( j = 0; j < 4; j++ ) { + printf("%10.4f ", rph[i][j]); + } + cout << endl; + } + sgMat4 la; + sgCopyMat4( la, tv->get_VIEW() ); + cout << "LookAt Matrix = " << endl; + for ( i = 0; i < 4; i++ ) { + for ( j = 0; j < 4; j++ ) { + printf("%10.4f ", la[i][j]); + } + cout << endl; + } + + // update view volume parameters // cout << "before pilot_view update" << endl; if ( globals->get_options()->get_view_mode() == @@ -480,7 +515,7 @@ void fgRenderFrame( void ) { thesky->reposition( globals->get_current_view()->get_view_pos(), globals->get_current_view()->get_zero_elev(), - globals->get_current_view()->get_local_up(), + globals->get_current_view()->get_world_up(), cur_fdm_state->get_Longitude(), cur_fdm_state->get_Latitude(), cur_fdm_state->get_Altitude() * FEET_TO_METER, @@ -1181,13 +1216,6 @@ void fgReshape( int width, int height ) { ssgSetFOV(fov, fov * globals->get_options()->get_win_ratio()); fgHUDReshape(); - - if ( idle_state == 1000 ) { - // 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(); - } } @@ -1342,8 +1370,8 @@ int main( int argc, char **argv ) { FGViewerRPH *pv = new FGViewerRPH; globals->set_current_view( pv ); - // FGViewer *cv = new FGViewer; - // globals->set_current_view( cv ); + tv = new FGViewerLookAt; + tv->init(); // Scan the config file(s) and command line options to see if // fg_root was specified (ignore all other options for now) @@ -1582,14 +1610,6 @@ void fgLoadDCS(void) { string obj_filename; - FGPath tile_path( globals->get_options()->get_fg_root()); - tile_path.append( "Scenery" ); - tile_path.append( "Objects.txt" ); - fg_gzifstream in( tile_path.str() ); - if ( ! in.is_open() ) { - FG_LOG( FG_TERRAIN, FG_ALERT, "Cannot open file: " << tile_path.str() ); - } - FGPath modelpath( globals->get_options()->get_fg_root() ); modelpath.append( "Models" ); modelpath.append( "Geometry" ); diff --git a/src/Main/viewer.cxx b/src/Main/viewer.cxx index 4922be6a0..33a286823 100644 --- a/src/Main/viewer.cxx +++ b/src/Main/viewer.cxx @@ -28,15 +28,8 @@ # include #endif -#include // plib include - -#include #include -#include -#include -#include -#include "globals.hxx" #include "viewer.hxx" @@ -46,38 +39,6 @@ FGViewer::FGViewer( void ) } -#define USE_FAST_VIEWROT -#ifdef USE_FAST_VIEWROT -// VIEW_ROT = LARC_TO_SSG * ( VIEWo * VIEW_OFFSET ) -// This takes advantage of the fact that VIEWo and VIEW_OFFSET -// only have entries in the upper 3x3 block -// and that LARC_TO_SSG is just a shift of rows NHV -inline static void fgMakeViewRot( sgMat4 dst, const sgMat4 m1, const sgMat4 m2 ) -{ - for ( int j = 0 ; j < 3 ; j++ ) { - dst[2][j] = m2[0][0] * m1[0][j] + - m2[0][1] * m1[1][j] + - m2[0][2] * m1[2][j]; - - dst[0][j] = m2[1][0] * m1[0][j] + - m2[1][1] * m1[1][j] + - m2[1][2] * m1[2][j]; - - dst[1][j] = m2[2][0] * m1[0][j] + - m2[2][1] * m1[1][j] + - m2[2][2] * m1[2][j]; - } - dst[0][3] = - dst[1][3] = - dst[2][3] = - dst[3][0] = - dst[3][1] = - dst[3][2] = SG_ZERO; - dst[3][3] = SG_ONE; -} -#endif - - // Initialize a view structure void FGViewer::init( void ) { FG_LOG( FG_VIEW, FG_ALERT, "Shouldn't ever see this" ); diff --git a/src/Main/viewer.hxx b/src/Main/viewer.hxx index 288c9543c..b9ba984cf 100644 --- a/src/Main/viewer.hxx +++ b/src/Main/viewer.hxx @@ -31,7 +31,6 @@ #endif #include -#include #include // plib include @@ -53,6 +52,9 @@ protected: // the goal view offset angle (used for smooth view changes) double goal_view_offset; + // geodetic view position + sgdVec3 geod_view_pos; + // absolute view position in earth coordinates sgdVec3 abs_view_pos; @@ -93,9 +95,9 @@ protected: // with sun) sgVec3 surface_east; - // local up vector (normal to the plane tangent to the earth's + // world up vector (normal to the plane tangent to the earth's // surface at the spot we are directly above - sgVec3 local_up; + sgVec3 world_up; // sg versions of our friendly matrices sgMat4 VIEW, VIEW_ROT, UP; @@ -132,6 +134,13 @@ public: set_dirty(); goal_view_offset = a; } + inline void set_geod_view_pos( double lon, double lat, double alt ) { + // data should be in radians and meters asl + set_dirty(); + // cout << "set_geod_view_pos = " << lon << ", " << lat << ", " << alt + // << endl; + sgdSetVec3( geod_view_pos, lon, lat, alt ); + } inline void set_pilot_offset( float x, float y, float z ) { set_dirty(); sgSetVec3( pilot_offset, x, y, z ); @@ -148,6 +157,7 @@ public: inline bool is_dirty() const { return dirty; } inline double get_view_offset() const { return view_offset; } inline double get_goal_view_offset() const { return goal_view_offset; } + inline double *get_geod_view_pos() { return geod_view_pos; } inline float *get_pilot_offset() { return pilot_offset; } inline double get_sea_level_radius() const { return sea_level_radius; } @@ -174,9 +184,9 @@ public: if ( dirty ) { update(); } return surface_east; } - inline float *get_local_up() { + inline float *get_world_up() { if ( dirty ) { update(); } - return local_up; + return world_up; } inline const sgVec4 *get_VIEW() { if ( dirty ) { update(); } diff --git a/src/Main/viewer_rph.cxx b/src/Main/viewer_rph.cxx index 9b0a7c0e9..f900abfe4 100644 --- a/src/Main/viewer_rph.cxx +++ b/src/Main/viewer_rph.cxx @@ -37,12 +37,10 @@ #include #include -#include -#include #include #include "globals.hxx" -#include "viewer.hxx" +#include "viewer_rph.hxx" // Constructor @@ -257,12 +255,12 @@ void FGViewerRPH::update() { 0.0, -geod_view_pos[1] * RAD_TO_DEG ); - sgSetVec3( local_up, UP[0][0], UP[0][1], UP[0][2] ); - // sgXformVec3( local_up, UP ); - // cout << "Local Up = " << local_up[0] << "," << local_up[1] << "," - // << local_up[2] << endl; + sgSetVec3( world_up, UP[0][0], UP[0][1], UP[0][2] ); + // sgXformVec3( world_up, UP ); + // cout << "World Up = " << world_up[0] << "," << world_up[1] << "," + // << world_up[2] << endl; - // Alternative method to Derive local up vector based on + // Alternative method to Derive world up vector based on // *geodetic* coordinates // alt_up = sgPolarToCart(FG_Longitude, FG_Latitude, 1.0); // printf( " Alt Up = (%.4f, %.4f, %.4f)\n", @@ -330,7 +328,7 @@ void FGViewerRPH::update() { // local direction for moving "south". sgSetVec3( minus_z, 0.0, 0.0, -1.0 ); - sgmap_vec_onto_cur_surface_plane(local_up, view_pos, minus_z, + sgmap_vec_onto_cur_surface_plane(world_up, view_pos, minus_z, surface_south); sgNormalizeVec3(surface_south); // cout << "Surface direction directly south " << surface_south[0] << "," @@ -339,16 +337,11 @@ void FGViewerRPH::update() { // now calculate the surface east vector #define USE_FAST_SURFACE_EAST #ifdef USE_FAST_SURFACE_EAST - sgVec3 local_down; - sgNegateVec3(local_down, local_up); - sgVectorProductVec3(surface_east, surface_south, local_down); + sgVec3 world_down; + sgNegateVec3(world_down, world_up); + sgVectorProductVec3(surface_east, surface_south, world_down); #else -#define USE_LOCAL_UP -#ifdef USE_LOCAL_UP - sgMakeRotMat4( TMP, FG_PI_2 * RAD_TO_DEG, local_up ); -#else - sgMakeRotMat4( TMP, FG_PI_2 * RAD_TO_DEG, view_up ); -#endif // USE_LOCAL_UP + sgMakeRotMat4( TMP, FG_PI_2 * RAD_TO_DEG, world_up ); // cout << "sgMat4 TMP" << endl; // print_sgMat4( TMP ); sgXformVec3(surface_east, surface_south, TMP); diff --git a/src/Main/viewer_rph.hxx b/src/Main/viewer_rph.hxx index 6ae5dd8b8..fc8a580a5 100644 --- a/src/Main/viewer_rph.hxx +++ b/src/Main/viewer_rph.hxx @@ -40,9 +40,6 @@ class FGViewerRPH: public FGViewer { private: - // geodetic view position - sgdVec3 geod_view_pos; - // view orientation (roll, pitch, heading) sgVec3 rph; @@ -77,13 +74,6 @@ public: ////////////////////////////////////////////////////////////////////// // setter functions ////////////////////////////////////////////////////////////////////// - inline void set_geod_view_pos( double lon, double lat, double alt ) { - // data should be in radians and meters asl - set_dirty(); - // cout << "set_geod_view_pos = " << lon << ", " << lat << ", " << alt - // << endl; - sgdSetVec3( geod_view_pos, lon, lat, alt ); - } inline void set_rph( double r, double p, double h ) { // data should be in radians set_dirty(); @@ -93,8 +83,9 @@ public: ////////////////////////////////////////////////////////////////////// // accessor functions ////////////////////////////////////////////////////////////////////// - inline double *get_geod_view_pos() { return geod_view_pos; } inline float *get_rph() { return rph; } + inline float *get_view_forward() { return view_forward; } + inline float *get_view_up() { return view_up; } ////////////////////////////////////////////////////////////////////// // derived values accessor functions diff --git a/src/Scenery/tilemgr.cxx b/src/Scenery/tilemgr.cxx index b497972ed..9c59da5e1 100644 --- a/src/Scenery/tilemgr.cxx +++ b/src/Scenery/tilemgr.cxx @@ -206,7 +206,7 @@ bool FGTileMgr::current_elev_ssg( sgdVec3 abs_view_pos, sgVec3 view_pos ) { } else { FG_LOG( FG_TERRAIN, FG_INFO, "no terrain intersection" ); scenery.cur_elev = 0.0; - float *up = globals->get_current_view()->get_local_up(); + float *up = globals->get_current_view()->get_world_up(); sgdSetVec3(scenery.cur_normal, up[0], up[1], up[2]); return false; } diff --git a/src/Time/moonpos.cxx b/src/Time/moonpos.cxx index 4126fc5d4..19be698c2 100644 --- a/src/Time/moonpos.cxx +++ b/src/Time/moonpos.cxx @@ -374,7 +374,7 @@ void fgUpdateMoonPos( void ) { // << ","<< l->moon_vec[2] << endl; // calculate the moon's relative angle to local up - sgCopyVec3( nup, v->get_local_up() ); + sgCopyVec3( nup, v->get_world_up() ); sgSetVec3( nmoon, l->fg_moonpos.x(), l->fg_moonpos.y(), l->fg_moonpos.z() ); sgNormalizeVec3(nup); sgNormalizeVec3(nmoon); @@ -400,7 +400,7 @@ void fgUpdateMoonPos( void ) { // earth's surface the moon is directly over, map into onto the // local plane representing "horizontal". - sgmap_vec_onto_cur_surface_plane( v->get_local_up(), v->get_view_pos(), + sgmap_vec_onto_cur_surface_plane( v->get_world_up(), v->get_view_pos(), v->get_to_moon(), surface_to_moon ); sgNormalizeVec3(surface_to_moon); v->set_surface_to_moon( surface_to_moon[0], surface_to_moon[1], diff --git a/src/Time/sunpos.cxx b/src/Time/sunpos.cxx index 53457aed8..6f1d6f79f 100644 --- a/src/Time/sunpos.cxx +++ b/src/Time/sunpos.cxx @@ -281,7 +281,7 @@ void fgUpdateSunPos( void ) { // << ","<< l->sun_vec[2] << endl; // calculate the sun's relative angle to local up - sgCopyVec3( nup, v->get_local_up() ); + sgCopyVec3( nup, v->get_world_up() ); sgSetVec3( nsun, l->fg_sunpos.x(), l->fg_sunpos.y(), l->fg_sunpos.z() ); sgNormalizeVec3(nup); sgNormalizeVec3(nsun); @@ -306,7 +306,7 @@ void fgUpdateSunPos( void ) { // earth's surface the sun is directly over, map into onto the // local plane representing "horizontal". - sgmap_vec_onto_cur_surface_plane( v->get_local_up(), v->get_view_pos(), + sgmap_vec_onto_cur_surface_plane( v->get_world_up(), v->get_view_pos(), v->get_to_sun(), surface_to_sun ); sgNormalizeVec3(surface_to_sun); v->set_surface_to_sun( surface_to_sun[0], surface_to_sun[1], -- 2.39.5