]> git.mxchange.org Git - flightgear.git/blobdiff - Main/GLUTmain.cxx
Tweaked FDM interface.
[flightgear.git] / Main / GLUTmain.cxx
index a8b9fd60d3349d4527cc360cce6ee53eaf105bd1..c4558cb259ec4552fd6b77515fce186a58b5f002 100644 (file)
 #   include <stdlib.h>
 #endif
 
-#include <sys/stat.h> /* for stat() */
+#ifdef HAVE_SYS_STAT_H
+#  include <sys/stat.h> /* for stat() */
+#endif
 
 #ifdef HAVE_UNISTD_H
 #  include <unistd.h>    /* for stat() */
 #endif
 
 #include <Include/fg_constants.h>  // for VERSION
-#include <Include/general.h>
+#include <Include/general.hxx>
 
 #include <Aircraft/aircraft.hxx>
 #include <Astro/sky.hxx>
@@ -85,8 +87,8 @@
 #include "views.hxx"
 
 
-// This is a record containing global housekeeping information
-fgGENERAL general;
+// This is a record containing a bit of global housekeeping information
+FGGeneral general;
 
 // Specify our current idle function state.  This is used to run all
 // our initializations out of the glutIdleLoop() so that we can get a
@@ -224,7 +226,6 @@ static void fgUpdateInstrViewParams( void ) {
 
 // Update all Visuals (redraws anything graphics related)
 static void fgRenderFrame( void ) {
-    FGState *f = current_aircraft.fdm_state;
     fgLIGHT *l = &cur_light_params;
     fgTIME *t = &cur_time_params;
     FGView *v = &current_view;
@@ -256,6 +257,9 @@ static void fgRenderFrame( void ) {
        // update view volume parameters
        v->UpdateViewParams();
 
+       // set the sun position
+       xglLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
+
        clear_mask = GL_DEPTH_BUFFER_BIT;
        if ( current_options.get_wireframe() ) {
            clear_mask |= GL_COLOR_BUFFER_BIT;
@@ -365,7 +369,7 @@ static void fgRenderFrame( void ) {
 
 
 // Update internal time dependent calculations (i.e. flight model)
-void fgUpdateTimeDepCalcs(int multi_loop) {
+void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
     FGState *f = current_aircraft.fdm_state;
     fgLIGHT *l = &cur_light_params;
     fgTIME *t = &cur_time_params;
@@ -382,11 +386,11 @@ void fgUpdateTimeDepCalcs(int multi_loop) {
        fgAPRun();
 
        // printf("updating flight model x %d\n", multi_loop);
-       fgFlightModelUpdate( current_options.get_flight_model(), 
-                            cur_fdm_state, multi_loop );
+       fgFDMUpdate( current_options.get_flight_model(), 
+                            cur_fdm_state, multi_loop, remainder );
     } else {
-       fgFlightModelUpdate( current_options.get_flight_model(), 
-                            cur_fdm_state, 0 );
+       fgFDMUpdate( current_options.get_flight_model(), 
+                            cur_fdm_state, 0, remainder );
     }
 
     // update the view angle
@@ -435,10 +439,9 @@ void fgUpdateTimeDepCalcs(int multi_loop) {
 void fgInitTimeDepCalcs( void ) {
     // initialize timer
 
-#ifdef HAVE_SETITIMER
-    fgTimerInit( 1.0 / DEFAULT_TIMER_HZ, fgUpdateTimeDepCalcs );
-#endif HAVE_SETITIMER
-
+    // #ifdef HAVE_SETITIMER
+    //   fgTimerInit( 1.0 / DEFAULT_TIMER_HZ, fgUpdateTimeDepCalcs );
+    // #endif HAVE_SETITIMER
 }
 
 static const double alt_adjust_ft = 3.758099;
@@ -448,20 +451,29 @@ static const double alt_adjust_m = alt_adjust_ft * FEET_TO_METER;
 // for the next move and update the display?
 static void fgMainLoop( void ) {
     FGState *f;
-    fgGENERAL *g;
     fgTIME *t;
-    static int remainder = 0;
-    int elapsed, multi_loop;
-    int i;
-    double accum;
+    static long remainder = 0;
+    long elapsed, multi_loop;
+    // int i;
+    // double accum;
+    static time_t last_time = 0;
+    static int frames = 0;
 
     f = current_aircraft.fdm_state;
-    g = &general;
     t = &cur_time_params;
 
     FG_LOG( FG_ALL, FG_DEBUG, "Running Main Loop");
     FG_LOG( FG_ALL, FG_DEBUG, "======= ==== ====");
 
+#if defined( ENABLE_LINUX_JOYSTICK )
+    // Read joystick and update control settings
+    fgJoystickRead();
+#elif defined( ENABLE_GLUT_JOYSTICK )
+    // Glut joystick support works by feeding a joystick handler
+    // function to glut.  This is taken care of once in the joystick
+    // init routine and we don't have to worry about it again.
+#endif
+
     current_weather.Update();
 
     // Fix elevation.  I'm just sticking this here for now, it should
@@ -480,15 +492,15 @@ static void fgMainLoop( void ) {
                   f->get_Altitude() * FEET_TO_METER,
                   scenery.cur_elev + alt_adjust_m - 3.0,
                   scenery.cur_elev + alt_adjust_m );
-           fgFlightModelSetAltitude( current_options.get_flight_model(), 
-                                     cur_fdm_state, 
-                                     scenery.cur_elev + alt_adjust_m );
+           fgFDMForceAltitude( current_options.get_flight_model(), 
+                               scenery.cur_elev + alt_adjust_m );
 
            FG_LOG( FG_ALL, FG_DEBUG, 
                    "<*> resetting altitude to " 
                    << f->get_Altitude() * FEET_TO_METER << " meters" );
        }
-       f->set_Runway_altitude( scenery.cur_elev * METER_TO_FEET );
+       fgFDMSetGroundElevation( current_options.get_flight_model(),
+                                scenery.cur_elev );  // meters
     }
 
     /* printf("Adjustment - ground = %.2f  runway = %.2f  alt = %.2f\n",
@@ -499,23 +511,24 @@ static void fgMainLoop( void ) {
     // update "time"
     fgTimeUpdate(f, t);
 
-#if defined( ENABLE_LINUX_JOYSTICK )
-    // Read joystick and update control settings
-    fgJoystickRead();
-#elif defined( ENABLE_GLUT_JOYSTICK )
-    // Glut joystick support works by feeding a joystick handler
-    // function to glut.  This is taken care of once in the joystick
-    // init routine and we don't have to worry about it again.
-#endif
-
-    // Get elapsed time for this past frame
+    // Get elapsed time (in usec) for this past frame
     elapsed = fgGetTimeInterval();
-    FG_LOG( FG_ALL, FG_BULK
-           "Time interval is = " << elapsed 
+    FG_LOG( FG_ALL, FG_DEBUG
+           "Elapsed time interval is = " << elapsed 
            << ", previous remainder is = " << remainder );
 
     // Calculate frame rate average
-    if ( elapsed > 0.0 ) {
+    if ( (t->cur_time != last_time) && (last_time > 0) ) {
+       general.set_frame_rate( frames );
+       FG_LOG( FG_ALL, FG_DEBUG, 
+               "--> Frame rate is = " << general.get_frame_rate() );
+       frames = 0;
+    }
+    last_time = t->cur_time;
+    ++frames;
+
+    /* old fps calculation
+    if ( elapsed > 0 ) {
        accum = 0.0;
        for ( i = FG_FRAME_RATE_HISTORY - 2; i >= 0; i-- ) {
            accum += g->frames[i];
@@ -528,34 +541,27 @@ static void fgMainLoop( void ) {
        g->frame_rate = accum / (float)FG_FRAME_RATE_HISTORY;
        // printf("ave = %.2f\n", g->frame_rate);
     }
-
-    // Calculate model iterations needed for next frame
-    FG_LOG( FG_ALL, FG_DEBUG, 
-           "--> Frame rate is = " << g->frame_rate );
-    elapsed += remainder;
-
-    multi_loop = (int)(((float)elapsed * 0.001) * DEFAULT_MODEL_HZ);
-    remainder = elapsed - ((multi_loop*1000) / DEFAULT_MODEL_HZ);
-    FG_LOG( FG_ALL, FG_BULK, 
-           "Model iterations needed = " << multi_loop
-           << ", new remainder = " << remainder );
-       
-    /* printf("right before fm - ground = %.2f  runway = %.2f  alt = %.2f\n",
-          scenery.cur_elev,
-          FG_Runway_altitude * FEET_TO_METER,
-          FG_Altitude * FEET_TO_METER); */
+    */
 
     // Run flight model
     if ( ! use_signals ) {
+       // Calculate model iterations needed for next frame
+       elapsed += remainder;
+
+       multi_loop = (int)(((double)elapsed * 0.000001) * DEFAULT_MODEL_HZ);
+       remainder = elapsed - ((multi_loop*1000000) / DEFAULT_MODEL_HZ);
+       FG_LOG( FG_ALL, FG_DEBUG, 
+               "Model iterations needed = " << multi_loop
+               << ", new remainder = " << remainder );
+       
        // flight model
-       fgUpdateTimeDepCalcs(multi_loop);
+       if ( multi_loop > 0 ) {
+           fgUpdateTimeDepCalcs(multi_loop, remainder);
+       } else {
+           FG_LOG( FG_ALL, FG_INFO, "Elapsed time is zero ... we're zinging" );
+       }
     }
 
-    /* printf("After fm - ground = %.2f  runway = %.2f  alt = %.2f\n",
-          scenery.cur_elev,
-          FG_Runway_altitude * FEET_TO_METER,
-          FG_Altitude * FEET_TO_METER); */
-
     // Do any serial port work that might need to be done
     fgSerialProcess();
 
@@ -648,9 +654,6 @@ static void fgMainLoop( void ) {
 // then on.
 
 static void fgIdleFunction ( void ) {
-    fgGENERAL *g;
-    g = &general;
-
     // printf("idle state == %d\n", idle_state);
 
     if ( idle_state == 0 ) {
@@ -681,7 +684,7 @@ static void fgIdleFunction ( void ) {
        // "subsystems" but still need to be initialized.
 
 #ifdef USE_GLIDE
-       if ( strstr ( g->glRenderer, "Glide" ) ) {
+       if ( strstr ( general.get_glRenderer(), "Glide" ) ) {
            grTexLodBiasValue ( GR_TMU0, 1.0 ) ;
        }
 #endif
@@ -785,21 +788,20 @@ static void fgIdleFunction ( void ) {
 
 // Handle new window size or exposure
 static void fgReshape( int width, int height ) {
-    FGView *v = &current_view;
-
     // Do this so we can call fgReshape(0,0) ourselves without having
     // to know what the values of width & height are.
     if ( (height > 0) && (width > 0) ) {
        if ( ! current_options.get_panel_status() ) {
-           v->set_win_ratio( (GLfloat) width / (GLfloat) height );
+           current_view.set_win_ratio( (GLfloat) width / (GLfloat) height );
        } else {
-           v->set_win_ratio( (GLfloat) width / ((GLfloat) (height)*0.4232) );
+           current_view.set_win_ratio( (GLfloat) width / 
+                                       ((GLfloat) (height)*0.4232) );
        }
     }
 
-    v->set_winWidth( width );
-    v->set_winHeight( height );
-    v->set_update_fov( true );
+    current_view.set_winWidth( width );
+    current_view.set_winHeight( height );
+    current_view.force_update_fov_math();
 
     // Inform gl of our view window size (now handled elsewhere)
     // xglViewport(0, 0, (GLint)width, (GLint)height);
@@ -807,13 +809,11 @@ static 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.
-       v->UpdateViewParams();
+       current_view.UpdateViewParams();
        if ( current_options.get_panel_status() ) {
            fgPanelReInit(0, 0, 1024, 768);
        }
     }
-    
-    // xglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 }
 
 
@@ -850,11 +850,11 @@ int fgGlutInit( int *argc, char **argv ) {
     // This seems to be the absolute earliest in the init sequence
     // that these calls will return valid info.  Too bad it's after
     // we've already created and sized out window. :-(
-    general.glVendor = (char *)glGetString ( GL_VENDOR );
-    general.glRenderer = (char *)glGetString ( GL_RENDERER );
-    general.glVersion = (char *)glGetString ( GL_VERSION );
+    general.set_glVendor( (char *)glGetString ( GL_VENDOR ) );
+    general.set_glRenderer( (char *)glGetString ( GL_RENDERER ) );
+    general.set_glVersion( (char *)glGetString ( GL_VERSION ) );
 
-    FG_LOG ( FG_GENERAL, FG_INFO, general.glRenderer );
+    FG_LOG ( FG_GENERAL, FG_INFO, general.get_glRenderer() );
 
 #if 0
     // try to determine if we should adjust the initial default
@@ -1003,6 +1003,29 @@ int main( int argc, char **argv ) {
 
 
 // $Log$
+// Revision 1.82  1999/01/20 13:42:24  curt
+// Tweaked FDM interface.
+// Testing check sum support for NMEA serial output.
+//
+// Revision 1.81  1999/01/19 20:57:03  curt
+// MacOS portability changes contributed by "Robert Puyol" <puyol@abvent.fr>
+//
+// Revision 1.80  1999/01/09 13:37:40  curt
+// Convert fgTIMESTAMP to FGTimeStamp which holds usec instead of ms.
+//
+// Revision 1.79  1999/01/08 03:23:56  curt
+// Beginning work on compensating for sim time vs. real world time "jitter".
+//
+// Revision 1.78  1999/01/07 20:25:08  curt
+// Updated struct fgGENERAL to class FGGeneral.
+//
+// Revision 1.77  1998/12/18 23:40:55  curt
+// New frame rate counting mechanism.
+//
+// Revision 1.76  1998/12/11 20:26:26  curt
+// Fixed view frustum culling accuracy bug so we can look out the sides and
+// back without tri-stripes dropping out.
+//
 // Revision 1.75  1998/12/09 18:50:23  curt
 // Converted "class fgVIEW" to "class FGView" and updated to make data
 // members private and make required accessor functions.