]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/main.cxx
Code reorganization.
[flightgear.git] / src / Main / main.cxx
index 21202736e4baf433487f3798f4568bda935ad8e7..eabc9788ddac7cdb5b949b31da5d77e28dcdb877 100644 (file)
@@ -38,7 +38,8 @@
 #endif
 
 #include <GL/glut.h>
-#include <XGL/xgl.h>
+#include <simgear/xgl.h>
+
 #include <stdio.h>
 #include <string.h>
 #include <string>
 #  include <unistd.h>    /* for stat() */
 #endif
 
-#include <pu.h>                        // plib include
-#include <ssg.h>               // plib include
+#include <plib/pu.h>                   // plib include
+#include <plib/ssg.h>          // plib include
 
 #ifdef ENABLE_AUDIO_SUPPORT
-#  include <sl.h>              // plib include
-#  include <sm.h>              // plib include
+#  include <plib/sl.h>         // plib include
+#  include <plib/sm.h>         // plib include
 #endif
 
-#include <Include/fg_constants.h>  // for VERSION
+#include <simgear/constants.h>  // for VERSION
+#include <simgear/logstream.hxx>
+#include <simgear/fg_geodesy.hxx>
+#include <simgear/mat3.h>
+#include <simgear/polar3d.hxx>
+#include <simgear/fg_random.h>
+#include <simgear/fgpath.hxx>
+
 #include <Include/general.hxx>
 
-#include <Debug/logstream.hxx>
 #include <Aircraft/aircraft.hxx>
 #include <Astro/sky.hxx>
 #include <Astro/stars.hxx>
 #include <Cockpit/cockpit.hxx>
 #include <GUI/gui.h>
 #include <Joystick/joystick.hxx>
-#include <Math/fg_geodesy.hxx>
-#include <Math/mat3.h>
-#include <Math/polar3d.hxx>
-#include <Math/fg_random.h>
-#include <Misc/fgpath.hxx>
 #ifdef FG_NETWORK_OLK
-#include <Network/network.h>
+#include <NetworkOLK/network.h>
 #endif
 #include <Objects/materialmgr.hxx>
 #include <Scenery/scenery.hxx>
 #endif
 
 #include "fg_init.hxx"
+#include "fg_io.hxx"
 #include "keyboard.hxx"
 #include "options.hxx"
 #include "splash.hxx"
 #include "views.hxx"
-#include "fg_serial.hxx"
 
 
 // -dw- use custom sioux settings so I can see output window
@@ -122,6 +124,7 @@ FGGeneral general;
 // our initializations out of the glutIdleLoop() so that we can get a
 // splash screen up and running right away.
 static int idle_state = 0;
+static int global_multi_loop;
 
 // Another hack
 int use_signals = 0;
@@ -143,6 +146,12 @@ ssgBranch *terrain = NULL;
 ssgSelector *penguin_sel = NULL;
 ssgTransform *penguin_pos = NULL;
 
+#ifdef FG_NETWORK_OLK
+ssgSelector *fgd_sel = NULL;
+ssgTransform *fgd_pos = NULL;
+//sgMat4 sgTUX;
+#endif
+
 // current fdm/position used for view
 FGInterface cur_view_fdm;
 
@@ -231,6 +240,11 @@ void fgRenderFrame( void ) {
     FGTime *t = FGTime::cur_time_params;
     // FGView *v = &current_view;
     static double last_visibility = -9999;
+    static bool in_puff = false;
+    static double puff_length = 0;
+    static double puff_progression = 0;
+    const double ramp_up = 0.15;
+    const double ramp_down = 0.15;
 
     double angle;
     // GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
@@ -303,12 +317,21 @@ void fgRenderFrame( void ) {
        xglDisable( GL_DEPTH_TEST );
        xglDisable( GL_LIGHTING );
        xglDisable( GL_CULL_FACE );
+
        xglDisable( GL_FOG );
+       /* if ( current_options.get_fog() > 0 ) {
+           xglEnable( GL_FOG );
+           xglFogi( GL_FOG_MODE, GL_EXP2 );
+           xglFogfv( GL_FOG_COLOR, l->adj_fog_color );
+       } */
+
        xglShadeModel( GL_SMOOTH );
        if ( current_options.get_skyblend() ) {
            fgSkyRender();
        }
 
+       // xglDisable( GL_FOG );
+
        // setup transformation for drawing astronomical objects
        xglPushMatrix();
        // Translate to view position
@@ -346,15 +369,71 @@ void fgRenderFrame( void ) {
        }
 
        // update fog params if visibility has changed
+#ifndef FG_OLD_WEATHER
        double cur_visibility = WeatherDatabase->getWeatherVisibility();
+#else
+       double cur_visibility = current_weather.get_visibility();
+#endif
        double actual_visibility = cur_visibility;
 
        if ( current_options.get_clouds() ) {
            double diff = fabs( cur_fdm_state->get_Altitude() * FEET_TO_METER -
                                current_options.get_clouds_asl() );
            // cout << "altitude diff = " << diff << endl;
-           if ( diff < 125 ) {
-               actual_visibility = cur_visibility * (diff - 25) / 100.0;
+           if ( diff < 75 ) {
+               if ( ! in_puff ) {
+                   // calc chance of entering cloud puff
+                   double rnd = fg_random();
+                   double chance = rnd * rnd * rnd;
+                   if ( chance > 0.95 /* * (diff - 25) / 50.0 */ ) {
+                       in_puff = true;
+                       do {
+                           puff_length = fg_random() * 2.0; // up to 2 seconds
+                       } while ( puff_length <= 0.0 );
+                       puff_progression = 0.0;
+                   }
+               }
+
+               actual_visibility = cur_visibility * (diff - 25) / 50.0;
+
+               if ( in_puff ) {
+                   // modify actual_visibility based on puff envelope
+
+                   if ( puff_progression <= ramp_up ) {
+                       double x = FG_PI_2 * puff_progression / ramp_up;
+                       double factor = 1.0 - sin( x );
+                       actual_visibility = actual_visibility * factor;
+                   } else if ( puff_progression >= ramp_up + puff_length ) {
+                       double x = FG_PI_2 * 
+                           (puff_progression - (ramp_up + puff_length)) /
+                           ramp_down;
+                       double factor = sin( x );
+                       actual_visibility = actual_visibility * factor;
+                   } else {
+                       actual_visibility = 0.0;
+                   }
+
+                   /* cout << "len = " << puff_length
+                        << "  x = " << x 
+                        << "  factor = " << factor
+                        << "  actual_visibility = " << actual_visibility 
+                        << endl; */
+
+                   puff_progression += ( global_multi_loop * 
+                                         current_options.get_speed_up() ) /
+                       (double)current_options.get_model_hz();
+
+                   /* cout << "gml = " << global_multi_loop 
+                        << "  speed up = " << current_options.get_speed_up()
+                        << "  hz = " << current_options.get_model_hz() << endl;
+                        */ 
+
+                   if ( puff_progression > puff_length + ramp_up + ramp_down) {
+                       in_puff = false; 
+                   }
+               }
+
+               // never let visibility drop below zero
                if ( actual_visibility < 0 ) {
                    actual_visibility = 0;
                }
@@ -474,6 +553,25 @@ void fgRenderFrame( void ) {
            penguin_pos->setTransform( &tuxpos );
        }
 
+# ifdef FG_NETWORK_OLK
+       sgCoord fgdpos;
+       other = head->next;             /* put listpointer to start  */
+       while ( other != tail) {        /* display all except myself */
+           if ( strcmp( other->ipadr, fgd_mcp_ip) != 0) {
+               other->fgd_sel->select(1);
+               sgSetCoord( &fgdpos, other->sgFGD_COORD );
+               other->fgd_pos->setTransform( &fgdpos );
+           }
+           other = other->next;
+       }
+
+       // fgd_sel->select(1);
+       // sgCopyMat4( sgTUX, current_view.sgVIEW);
+       // sgCoord fgdpos;
+       // sgSetCoord( &fgdpos, sgFGD_VIEW );
+       // fgd_pos->setTransform( &fgdpos);
+# endif
+
        ssgSetCamera( current_view.VIEW );
 
        // position tile nodes and update range selectors
@@ -622,7 +720,7 @@ static const double alt_adjust_m = alt_adjust_ft * FEET_TO_METER;
 static void fgMainLoop( void ) {
     FGTime *t;
     static long remainder = 0;
-    long elapsed, multi_loop;
+    long elapsed;
 #ifdef FANCY_FRAME_COUNTER
     int i;
     double accum;
@@ -636,6 +734,14 @@ static void fgMainLoop( void ) {
     FG_LOG( FG_ALL, FG_DEBUG, "Running Main Loop");
     FG_LOG( FG_ALL, FG_DEBUG, "======= ==== ====");
 
+#ifdef FG_NETWORK_OLK
+    if ( net_is_registered == 0 ) {           // We first have to reg. to fgd
+        // printf("FGD: Netupdate\n");
+        fgd_send_com( "A", FGFS_host);   // Send Mat4 data
+        fgd_send_com( "B", FGFS_host);   // Recv Mat4 data
+    }
+#endif
+
 #if defined( ENABLE_PLIB_JOYSTICK )
     // Read joystick and update control settings
     if ( current_options.get_control_mode() == fgOPTIONS::FG_JOYSTICK ) {
@@ -663,7 +769,7 @@ static void fgMainLoop( void ) {
        if ( cur_fdm_state->get_Altitude() * FEET_TO_METER < 
             (scenery.cur_elev + alt_adjust_m - 3.0) ) {
            // now set aircraft altitude above ground
-           printf("Current Altitude = %.2f < %.2f forcing to %.2f\n", 
+           printf("(*) Current Altitude = %.2f < %.2f forcing to %.2f\n", 
                   cur_fdm_state->get_Altitude() * FEET_TO_METER,
                   scenery.cur_elev + alt_adjust_m - 3.0,
                   scenery.cur_elev + alt_adjust_m );
@@ -727,17 +833,17 @@ static void fgMainLoop( void ) {
        // Calculate model iterations needed for next frame
        elapsed += remainder;
 
-       multi_loop = (int)(((double)elapsed * 0.000001) * 
+       global_multi_loop = (int)(((double)elapsed * 0.000001) * 
                           current_options.get_model_hz());
-       remainder = elapsed - ( (multi_loop*1000000) / 
+       remainder = elapsed - ( (global_multi_loop*1000000) / 
                                current_options.get_model_hz() );
        FG_LOG( FG_ALL, FG_DEBUG, 
-               "Model iterations needed = " << multi_loop
+               "Model iterations needed = " << global_multi_loop
                << ", new remainder = " << remainder );
        
        // flight model
-       if ( multi_loop > 0 ) {
-           fgUpdateTimeDepCalcs(multi_loop, remainder);
+       if ( global_multi_loop > 0 ) {
+           fgUpdateTimeDepCalcs(global_multi_loop, remainder);
        } else {
            FG_LOG( FG_ALL, FG_DEBUG, 
                    "Elapsed time is zero ... we're zinging" );
@@ -745,8 +851,8 @@ static void fgMainLoop( void ) {
     }
 
 #if ! defined( MACOS )
-    // Do any serial port work that might need to be done
-    fgSerialProcess();
+    // Do any I/O channel work that might need to be done
+    fgIOProcess();
 #endif
 
     // see if we need to load any new scenery tiles
@@ -923,40 +1029,42 @@ static void fgIdleFunction ( void ) {
        }
 #endif // WIN32
 
-       audio_sched = new slScheduler ( 8000 );
-       audio_mixer = new smMixer;
-       audio_mixer -> setMasterVolume ( 80 ) ;  /* 80% of max volume. */
-       audio_sched -> setSafetyMargin ( 1.0 ) ;
+       if ( current_options.get_sound() ) {
+           audio_sched = new slScheduler ( 8000 );
+           audio_mixer = new smMixer;
+           audio_mixer -> setMasterVolume ( 80 ) ;  /* 80% of max volume. */
+           audio_sched -> setSafetyMargin ( 1.0 ) ;
 
-       FGPath slfile( current_options.get_fg_root() );
-       slfile.append( "Sounds/wasp.wav" );
+           FGPath slfile( current_options.get_fg_root() );
+           slfile.append( "Sounds/wasp.wav" );
 
-       s1 = new slSample ( (char *)slfile.c_str() );
-       FG_LOG( FG_GENERAL, FG_INFO,
-               "Rate = " << s1 -> getRate()
-               << "  Bps = " << s1 -> getBps()
-               << "  Stereo = " << s1 -> getStereo() );
-       audio_sched -> loopSample ( s1 );
+           s1 = new slSample ( (char *)slfile.c_str() );
+           FG_LOG( FG_GENERAL, FG_INFO,
+                   "Rate = " << s1 -> getRate()
+                   << "  Bps = " << s1 -> getBps()
+                   << "  Stereo = " << s1 -> getStereo() );
+           audio_sched -> loopSample ( s1 );
 
-       if ( audio_sched->not_working() ) {
-           // skip
-       } else {
-           pitch_envelope.setStep  ( 0, 0.01, 0.6 );
-           volume_envelope.setStep ( 0, 0.01, 0.6 );
-
-           audio_sched -> addSampleEnvelope( s1, 0, 0, 
-                                             &pitch_envelope,
-                                             SL_PITCH_ENVELOPE );
-           audio_sched -> addSampleEnvelope( s1, 0, 1, 
-                                             &volume_envelope,
-                                             SL_VOLUME_ENVELOPE );
-       }
+           if ( audio_sched->not_working() ) {
+               // skip
+           } else {
+               pitch_envelope.setStep  ( 0, 0.01, 0.6 );
+               volume_envelope.setStep ( 0, 0.01, 0.6 );
+
+               audio_sched -> addSampleEnvelope( s1, 0, 0, 
+                                                 &pitch_envelope,
+                                                 SL_PITCH_ENVELOPE );
+               audio_sched -> addSampleEnvelope( s1, 0, 1, 
+                                                 &volume_envelope,
+                                                 SL_VOLUME_ENVELOPE );
+           }
 
-       // strcpy(slfile, path);
-       // strcat(slfile, "thunder.wav");
-       // s2 -> loadFile ( slfile );
-       // s2 -> adjustVolume(0.5);
-       // audio_sched -> playSample ( s2 );
+           // strcpy(slfile, path);
+           // strcat(slfile, "thunder.wav");
+           // s2 -> loadFile ( slfile );
+           // s2 -> adjustVolume(0.5);
+           // audio_sched -> playSample ( s2 );
+       }
 #endif
 
        // sleep(1);
@@ -1207,10 +1315,11 @@ int main( int argc, char **argv ) {
     penguin_sel->addKid( penguin_pos );
     ssgFlatten( tux_obj );
     ssgStripify( penguin_sel );
+    penguin_sel->clrTraversalMaskBits( SSGTRAV_HOT );
 
 #ifdef FG_NETWORK_OLK
     // Do the network intialization
-    printf("Multipilot mode %s\n", fg_net_init() );
+    printf("Multipilot mode %s\n", fg_net_init( scene ) );
 #endif
 
     scene->addKid( terrain );