]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
Panel tweaks to support "shaped" panels.
[flightgear.git] / src / Main / options.cxx
index 756d1935acd9bced1f384e267a1efc585cc57ace..4cf73e7779ffa3a3b40efa08c8736502376c4751 100644 (file)
@@ -29,7 +29,7 @@
 bool global_fullscreen = true;
 #endif
 
-#include <Include/compiler.h>
+#include <simgear/compiler.h>
 
 #include <math.h>            // rint()
 #include <stdio.h>
@@ -38,18 +38,25 @@ bool global_fullscreen = true;
 
 #include STL_STRING
 
-#include <Debug/logstream.hxx>
-#include <Misc/fgstream.hxx>
-#include <Include/fg_constants.h>
+#include <simgear/constants.h>
+#include <simgear/debug/logstream.hxx>
+#include <simgear/misc/fgstream.hxx>
+#include <simgear/misc/props.hxx>
+#include <simgear/timing/sg_time.hxx>
+
 #include <Include/general.hxx>
+#include <Airports/simple.hxx>
 #include <Cockpit/cockpit.hxx>
 #include <FDM/flight.hxx>
+#include <FDM/UIUCModel/uiuc_aircraftdir.h>
 #ifdef FG_NETWORK_OLK
-#  include <Network/network.h>
+#  include <NetworkOLK/network.h>
 #endif
-#include <Time/fg_time.hxx>
 
+#include "fg_init.hxx"
+#include "globals.hxx"
 #include "options.hxx"
+#include "views.hxx"
 
 FG_USING_STD(string);
 FG_USING_NAMESPACE(std);
@@ -80,6 +87,7 @@ atoi( const string& str )
 #endif
 }
 
+
 // Defined the shared options class here
 fgOPTIONS current_options;
 
@@ -143,30 +151,32 @@ fgOPTIONS::fgOPTIONS() :
     pitch(0.424),        // pitch angle in degrees (Theta)
 
     // Initialize current options velocities to 0.0
-    uBody(0.0), vBody(0.0), wBody(0.0),
+    uBody(0.0), vBody(0.0), wBody(0.0), vkcas(0.0), mach(0.0),
 
     // Miscellaneous
     game_mode(0),
     splash_screen(1),
     intro_music(1),
     mouse_pointer(0),
-    pause(0),
     control_mode(FG_JOYSTICK),
     auto_coordination(FG_AUTO_COORD_NOT_SPECIFIED),
 
     // Features
-    hud_status(1),
-    panel_status(0),
+    hud_status(0),
+    panel_status(1),
     sound(1),
+    anti_alias_hud(0),
 
     // Flight Model options
     flight_model( FGInterface::FG_LARCSIM ),
+    aircraft( "c172" ),
     model_hz( NEW_DEFAULT_MODEL_HZ ),
     speed_up( 1 ),
+    trim(0),
 
     // Rendering options
     fog(FG_FOG_NICEST),  // nicest
-    clouds(true),
+    clouds(false),
     clouds_asl(5000*FEET_TO_METER),
     fov(55.0),
     fullscreen(0),
@@ -174,8 +184,9 @@ fgOPTIONS::fgOPTIONS() :
     skyblend(1),
     textures(1),
     wireframe(0),
-    xsize(640),
-    ysize(480),
+    xsize(800),
+    ysize(600),
+    bpp(16),
     view_mode(FG_VIEW_PILOT),
 
     // Scenery options
@@ -186,10 +197,12 @@ fgOPTIONS::fgOPTIONS() :
     tris_or_culled(0),
        
     // Time options
-    time_offset(0)
+    time_offset(0),
+
+    network_olk(false)
 {
     // set initial values/defaults
-    time_offset_type=FG_TIME_SYS_OFFSET;
+    time_offset_type = FG_TIME_SYS_OFFSET;
     char* envp = ::getenv( "FG_ROOT" );
 
     if ( envp != NULL ) {
@@ -197,20 +210,32 @@ fgOPTIONS::fgOPTIONS() :
        // variable $FG_ROOT if it is set.
        fg_root = envp;
     } else {
-       // Otherwise, default to a random compiled in location if
+       // Otherwise, default to a random compiled-in location if
        // $FG_ROOT is not set.  This can still be overridden from the
        // command line or a config file.
 
 #if defined( WIN32 )
        fg_root = "\\FlightGear";
-#elif defined( MACOS )
+#elif defined( macintosh )
        fg_root = "";
 #else
        fg_root = PKGLIBDIR;
 #endif
     }
 
-    airport_id = "";           // default airport id
+    // set a possibly independent location for scenery data
+    envp = ::getenv( "FG_SCENERY" );
+
+    if ( envp != NULL ) {
+       // fg_root could be anywhere, so default to environmental
+       // variable $FG_ROOT if it is set.
+       fg_scenery = envp;
+    } else {
+       // Otherwise, default to Scenery being in $FG_ROOT/Scenery
+       fg_scenery = "";
+    }
+
+    airport_id = "KPAO";       // default airport id
     net_id = "Johnney";                // default pilot's name
 
     // initialize port config string list
@@ -220,29 +245,33 @@ fgOPTIONS::fgOPTIONS() :
 void 
 fgOPTIONS::toggle_panel() {
     
-    FGTime *t = FGTime::cur_time_params;
-    
-    int toggle_pause = t->getPause();
-    
-    if( !toggle_pause )
-        t->togglePauseMode();
+    bool freeze = globals->get_freeze();
+
+    if( !freeze )
+        globals->set_freeze(true);
     
     if( panel_status ) {
        panel_status = false;
+       if ( current_panel != NULL )
+         current_panel->setVisibility(false);
     } else {
        panel_status = true;
+       if ( current_panel != NULL )
+         current_panel->setVisibility(true);
     }
-    if ( panel_status ) {
-       if( FGPanel::OurPanel == 0)
-           new FGPanel;
+
+    // new rule .. "fov" shouldn't get messed with like this.
+    /* if ( panel_status ) {
        fov *= 0.4232;
     } else {
        fov *= (1.0 / 0.4232);
-    }
-    fgReshape( xsize, ysize);
-    
-    if( !toggle_pause )
-        t->togglePauseMode();
+    } */
+
+    // fgReshape( xsize, ysize);
+    fgReshape( current_view.get_winWidth(), current_view.get_winHeight() );
+
+    if( !freeze )
+        globals->set_freeze( false );
 }
 
 double
@@ -422,12 +451,8 @@ long int fgOPTIONS::parse_date( const string& date)
        num[i] = '\0';
        gmt.tm_sec = atoi(num);
     }
-    time_t theTime = FGTime::cur_time_params->get_gmt(gmt.tm_year,
-                                                      gmt.tm_mon,
-                                                     gmt.tm_mday,
-                                                     gmt.tm_hour,
-                                                     gmt.tm_min,
-                                                     gmt.tm_sec);
+    time_t theTime = sgTimeGetGMT( gmt.tm_year, gmt.tm_mon, gmt.tm_mday,
+                                  gmt.tm_hour, gmt.tm_min, gmt.tm_sec );
     //printf ("Date is %s\n", ctime(&theTime));
     //printf ("in seconds that is %d\n", theTime);
     //exit(1);
@@ -495,7 +520,7 @@ fgOPTIONS::parse_tile_radius( const string& arg ) {
 // Parse --fdm=abcdefg type option 
 int
 fgOPTIONS::parse_fdm( const string& fm ) {
-    // printf("fdm = %s\n", fm);
+    // cout << "fdm = " << fm << endl;
 
     if ( fm == "balloon" ) {
        return FGInterface::FG_BALLOONSIM;
@@ -535,7 +560,7 @@ fgOPTIONS::parse_fov( const string& arg ) {
 //
 // Format is "--protocol=medium,direction,hz,medium_options,..."
 //
-//   protocol = { nmea, garmin, fgfs, rul, pve, etc. }
+//   protocol = { native, nmea, garmin, fgfs, rul, pve, etc. }
 //   medium = { serial, socket, file, etc. }
 //   direction = { in, out, bi }
 //   hz = number of times to process channel per second (floating
@@ -546,10 +571,11 @@ fgOPTIONS::parse_fov( const string& arg ) {
 //  device = OS device name of serial line to be open()'ed
 //  baud = {300, 1200, 2400, ..., 230400}
 //
-// Socket exacmple "--fgfs=socket,dir,hz,machine,port" where
+// Socket exacmple "--native=socket,dir,hz,machine,port,style" where
 // 
 //  machine = machine name or ip address if client (leave empty if server)
 //  port = port, leave empty to let system choose
+//  style = tcp or udp
 //
 // File example "--garmin=file,dir,hz,filename" where
 // 
@@ -565,6 +591,36 @@ fgOPTIONS::parse_channel( const string& type, const string& channel_str ) {
 }
 
 
+// Parse --wp=ID[,alt]
+bool fgOPTIONS::parse_wp( const string& arg ) {
+    string id, alt_str;
+    double alt = 0.0;
+
+    int pos = arg.find( "@" );
+    if ( pos != string::npos ) {
+       id = arg.substr( 0, pos );
+       alt_str = arg.substr( pos + 1 );
+       // cout << "id str = " << id << "  alt str = " << alt_str << endl;
+       alt = atof( alt_str.c_str() );
+       if ( units == FG_UNITS_FEET ) {
+           alt *= FEET_TO_METER;
+       }
+    } else {
+       id = arg;
+    }
+
+    FGAirport a;
+    if ( fgFindAirportID( id, &a ) ) {
+       SGWayPoint wp( a.longitude, a.latitude, alt, SGWayPoint::WGS84, id );
+       globals->get_route()->add_waypoint( wp );
+
+       return true;
+    } else {
+       return false;
+    }
+}
+
+
 // Parse a single option
 int fgOPTIONS::parse_option( const string& arg ) {
     // General Options
@@ -587,10 +643,14 @@ int fgOPTIONS::parse_option( const string& arg ) {
        mouse_pointer = 1;
     } else if ( arg == "--enable-mouse-pointer" ) {
        mouse_pointer = 2;
-    } else if ( arg == "--disable-pause" ) {
-       pause = false;  
-    } else if ( arg == "--enable-pause" ) {
-       pause = true;   
+    } else if ( arg == "--disable-freeze" ) {
+       globals->set_freeze( false );
+    } else if ( arg == "--enable-freeze" ) {
+       globals->set_freeze( true );
+    } else if ( arg == "--disable-anti-alias-hud" ) {
+       anti_alias_hud = false; 
+    } else if ( arg == "--enable-anti-alias-hud" ) {
+       anti_alias_hud = true;  
     } else if ( arg.find( "--control=") != string::npos ) {
        parse_control( arg.substr(10) );
     } else if ( arg == "--disable-auto-coordination" ) {
@@ -603,57 +663,100 @@ int fgOPTIONS::parse_option( const string& arg ) {
        hud_status = true;      
     } else if ( arg == "--disable-panel" ) {
        panel_status = false;
+       if ( current_panel != NULL )
+         current_panel->setVisibility(false);
     } else if ( arg == "--enable-panel" ) {
        panel_status = true;
-       fov *= 0.4232;
+       if ( current_panel != NULL )
+           current_panel->setVisibility(true);
+       // fov *= 0.4232; /* NO!!! */
     } else if ( arg == "--disable-sound" ) {
        sound = false;
     } else if ( arg == "--enable-sound" ) {
        sound = true;
     } else if ( arg.find( "--airport-id=") != string::npos ) {
        airport_id = arg.substr( 13 );
+       current_properties.setStringValue("/position/airport-id", airport_id);
     } else if ( arg.find( "--lon=" ) != string::npos ) {
        lon = parse_degree( arg.substr(6) );
+       airport_id = "";
+       current_properties.setDoubleValue("/position/longitude", lon);
+       current_properties.setStringValue("/position/airport-id", airport_id);
     } else if ( arg.find( "--lat=" ) != string::npos ) {
        lat = parse_degree( arg.substr(6) );
+       airport_id = "";
+       current_properties.setDoubleValue("/position/latitude", lat);
+       current_properties.setStringValue("/position/airport-id", airport_id);
     } else if ( arg.find( "--altitude=" ) != string::npos ) {
        if ( units == FG_UNITS_FEET ) {
            altitude = atof( arg.substr(11) ) * FEET_TO_METER;
        } else {
            altitude = atof( arg.substr(11) );
        }
+       current_properties.setDoubleValue("/position/altitude", altitude);
     } else if ( arg.find( "--uBody=" ) != string::npos ) {
+       vkcas=mach=-1;
        if ( units == FG_UNITS_FEET ) {
-           uBody = atof( arg.substr(8) ) * FEET_TO_METER;
-       } else {
            uBody = atof( arg.substr(8) );
+       } else {
+           uBody = atof( arg.substr(8) ) * FEET_TO_METER;
        }
+       current_properties.setDoubleValue("/velocities/speed-north", uBody);
     } else if ( arg.find( "--vBody=" ) != string::npos ) {
+       vkcas=mach=-1;
        if ( units == FG_UNITS_FEET ) {
-           vBody = atof( arg.substr(8) ) * FEET_TO_METER;
-       } else {
            vBody = atof( arg.substr(8) );
+       } else {
+           vBody = atof( arg.substr(8) ) * FEET_TO_METER;
        }
+       current_properties.setDoubleValue("/velocities/speed-east", vBody);
     } else if ( arg.find( "--wBody=" ) != string::npos ) {
+       vkcas=mach=-1;
        if ( units == FG_UNITS_FEET ) {
-           wBody = atof( arg.substr(8) ) * FEET_TO_METER;
-       } else {
            wBody = atof( arg.substr(8) );
+       } else {
+           wBody = atof( arg.substr(8) ) * FEET_TO_METER;
        }
+       current_properties.setDoubleValue("/velocities/speed-down", wBody);
+    } else if ( arg.find( "--vc=" ) != string::npos) {
+       mach=-1;
+       vkcas=atof( arg.substr(5) );
+       cout << "Got vc: " << vkcas << endl;
+    } else if ( arg.find( "--mach=" ) != string::npos) {
+       vkcas=-1;
+       mach=atof( arg.substr(7) );
     } else if ( arg.find( "--heading=" ) != string::npos ) {
        heading = atof( arg.substr(10) );
+       current_properties.setDoubleValue("/orientation/heading", heading);
     } else if ( arg.find( "--roll=" ) != string::npos ) {
        roll = atof( arg.substr(7) );
+       current_properties.setDoubleValue("/orientation/roll", roll);
     } else if ( arg.find( "--pitch=" ) != string::npos ) {
        pitch = atof( arg.substr(8) );
+       current_properties.setDoubleValue("/orientation/pitch", pitch);
     } else if ( arg.find( "--fg-root=" ) != string::npos ) {
        fg_root = arg.substr( 10 );
+    } else if ( arg.find( "--fg-scenery=" ) != string::npos ) {
+       fg_scenery = arg.substr( 13 );
     } else if ( arg.find( "--fdm=" ) != string::npos ) {
        flight_model = parse_fdm( arg.substr(6) );
+       current_properties.setIntValue("/sim/flight-model", flight_model);
+    if((flight_model == FGInterface::FG_JSBSIM) && (get_trim_mode() == 0)) {
+       set_trim_mode(1);
+    } else {
+       set_trim_mode(0);
+    }        
+    } else if ( arg.find( "--aircraft=" ) != string::npos ) {
+       aircraft = arg.substr(11);
+       current_properties.setStringValue("/sim/aircraft", aircraft);
+    } else if ( arg.find( "--aircraft-dir=" ) != string::npos ) {
+       aircraft_dir =  arg.substr(15); //  (UIUC)
     } else if ( arg.find( "--model-hz=" ) != string::npos ) {
        model_hz = atoi( arg.substr(11) );
     } else if ( arg.find( "--speed=" ) != string::npos ) {
        speed_up = atoi( arg.substr(8) );
+    } else if ( arg.find( "--notrim") != string::npos) {
+       trim=-1;
     } else if ( arg == "--fog-disable" ) {
        fog = FG_FOG_DISABLED;  
     } else if ( arg == "--fog-fastest" ) {
@@ -716,6 +819,15 @@ int fgOPTIONS::parse_option( const string& arg ) {
            FG_LOG( FG_GENERAL, FG_ALERT,
                    "Setting geometry to " << xsize << 'x' << ysize << '\n');
        }
+    } else if ( arg.find( "--bpp=" ) != string::npos ) {
+       string bits_per_pix = arg.substr( 6 );
+       if ( bits_per_pix == "16" ) {
+           bpp = 16;
+       } else if ( bits_per_pix == "24" ) {
+           bpp = 24;
+       } else if ( bits_per_pix == "32" ) {
+           bpp = 32;
+       }
     } else if ( arg == "--units-feet" ) {
        units = FG_UNITS_FEET;  
     } else if ( arg == "--units-meters" ) {
@@ -746,22 +858,46 @@ int fgOPTIONS::parse_option( const string& arg ) {
        tris_or_culled = 0;     
     } else if ( arg == "--hud-culled" ) {
        tris_or_culled = 1;
-    } else if ( arg.find( "--fgfs=" ) != string::npos ) {
-       parse_channel( "fgfs", arg.substr(7) );
+    } else if ( arg.find( "--native=" ) != string::npos ) {
+       parse_channel( "native", arg.substr(9) );
     } else if ( arg.find( "--garmin=" ) != string::npos ) {
        parse_channel( "garmin", arg.substr(9) );
     } else if ( arg.find( "--nmea=" ) != string::npos ) {
        parse_channel( "nmea", arg.substr(7) );
+    } else if ( arg.find( "--props=" ) != string::npos ) {
+       parse_channel( "props", arg.substr(8) );
     } else if ( arg.find( "--pve=" ) != string::npos ) {
        parse_channel( "pve", arg.substr(6) );
+    } else if ( arg.find( "--ray=" ) != string::npos ) {
+       parse_channel( "ray", arg.substr(6) );
     } else if ( arg.find( "--rul=" ) != string::npos ) {
        parse_channel( "rul", arg.substr(6) );
+    } else if ( arg.find( "--joyclient=" ) != string::npos ) {
+       parse_channel( "joyclient", arg.substr(12) );
 #ifdef FG_NETWORK_OLK
+    } else if ( arg == "--disable-network-olk" ) {
+       network_olk = false;    
+    } else if ( arg== "--enable-network-olk") {
+       network_olk = true;     
     } else if ( arg == "--net-hud" ) {
        net_hud_display = 1;    
     } else if ( arg.find( "--net-id=") != string::npos ) {
        net_id = arg.substr( 9 );
 #endif
+    } else if ( arg.find( "--prop:" ) == 0 ) {
+        string assign = arg.substr(7);
+       int pos = assign.find('=');
+       if (pos == arg.npos || pos == 0) {
+           FG_LOG(FG_GENERAL, FG_ALERT, "Bad property assignment: " << arg);
+           return FG_OPTIONS_ERROR;
+       }
+       string name = assign.substr(0, pos);
+       string value = assign.substr(pos + 1);
+       current_properties.setStringValue(name.c_str(), value);
+       FG_LOG(FG_GENERAL, FG_INFO, "Setting default value of property "
+              << name << " to \"" << value << '"');
+    } else if ( arg.find( "--wp=" ) != string::npos ) {
+       parse_wp( arg.substr( 5 ) );
     } else {
        FG_LOG( FG_GENERAL, FG_ALERT, "Unknown option '" << arg << "'" );
        return FG_OPTIONS_ERROR;
@@ -771,6 +907,66 @@ int fgOPTIONS::parse_option( const string& arg ) {
 }
 
 
+// Scan the command line options for an fg_root definition and set
+// just that.
+int fgOPTIONS::scan_command_line_for_root( int argc, char **argv ) {
+    int i = 1;
+    int result;
+
+    FG_LOG(FG_GENERAL, FG_INFO, "Processing command line arguments");
+
+    while ( i < argc ) {
+       FG_LOG( FG_GENERAL, FG_DEBUG, "argv[" << i << "] = " << argv[i] );
+
+       string arg = argv[i];
+       if ( arg.find( "--fg-root=" ) != string::npos ) {
+           fg_root = arg.substr( 10 );
+       }
+
+       i++;
+    }
+    
+    return FG_OPTIONS_OK;
+}
+
+
+// Scan the config file for an fg_root definition and set just that.
+int fgOPTIONS::scan_config_file_for_root( const string& path ) {
+    fg_gzifstream in( path );
+    if ( !in.is_open() )
+       return(FG_OPTIONS_ERROR);
+
+    FG_LOG( FG_GENERAL, FG_INFO, "Processing config file: " << path );
+
+    in >> skipcomment;
+#ifndef __MWERKS__
+    while ( ! in.eof() ) {
+#else
+    char c = '\0';
+    while ( in.get(c) && c != '\0' ) {
+       in.putback(c);
+#endif
+       string line;
+
+#ifdef GETLINE_NEEDS_TERMINATOR
+        getline( in, line, '\n' );
+#elif defined( macintosh )
+       getline( in, line, '\r' );
+#else
+        getline( in, line );
+#endif
+
+       if ( line.find( "--fg-root=" ) != string::npos ) {
+           fg_root = line.substr( 10 );
+       }
+
+       in >> skipcomment;
+    }
+
+    return FG_OPTIONS_OK;
+}
+
+
 // Parse the command line options
 int fgOPTIONS::parse_command_line( int argc, char **argv ) {
     int i = 1;
@@ -789,7 +985,7 @@ int fgOPTIONS::parse_command_line( int argc, char **argv ) {
        i++;
     }
     
-    return(FG_OPTIONS_OK);
+    return FG_OPTIONS_OK;
 }
 
 
@@ -812,9 +1008,11 @@ int fgOPTIONS::parse_config_file( const string& path ) {
        string line;
 
 #ifdef GETLINE_NEEDS_TERMINATOR
-       getline( in, line, '\n' );
+        getline( in, line, '\n' );
+#elif defined( macintosh )
+       getline( in, line, '\r' );
 #else
-       getline( in, line );
+        getline( in, line );
 #endif
 
        if ( parse_option( line ) == FG_OPTIONS_ERROR ) {
@@ -839,6 +1037,9 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--help -h:  print usage" << endl;
     cout << "\t--fg-root=path:  specify the root path for all the data files"
         << endl;
+    cout << "\t--fg-scenery=path:  specify the base path for all the scenery"
+        << " data." << endl
+        << "\t\tdefaults to $FG_ROOT/Scenery" << endl;
     cout << "\t--disable-game-mode:  disable full-screen game mode" << endl;
     cout << "\t--enable-game-mode:  enable full-screen game mode" << endl;
     cout << "\t--disable-splash-screen:  disable splash screen" << endl;
@@ -849,8 +1050,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--enable-mouse-pointer:  enable extra mouse pointer (i.e. for"
         << endl;
     cout << "\t\tfull screen voodoo/voodoo-II based cards.)" << endl;
-    cout << "\t--disable-pause:  start out in an active state" << endl;
-    cout << "\t--enable-pause:  start out in a paused state" << endl;
+    cout << "\t--disable-freeze:  start out in an running state" << endl;
+    cout << "\t--enable-freeze:  start out in a frozen state" << endl;
     cout << "\t--control=mode:  primary control mode " 
         << "(joystick, keyboard, mouse)" << endl;
     cout << endl;
@@ -862,13 +1063,22 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--enable-panel:  enable instrumetn panel" << endl;
     cout << "\t--disable-sound:  disable sound effects" << endl;
     cout << "\t--enable-sound:  enable sound effects" << endl;
+    cout << "\t--disable-anti-alias-hud:  disable anti aliased hud" << endl;
+    cout << "\t--enable-anti-alias-hud:  enable anti aliased hud" << endl;
     cout << endl;
  
     cout << "Flight Model:" << endl;
-    cout << "\t--fdm=abcd:  one of slew, jsb, larcsim, or external" << endl;
+    cout << "\t--fdm=abcd:  selects the core flight model code." << endl;
+    cout << "\t\tcan be one of jsb, larcsim, magic, or external" << endl;
+    cout << "\t--aircraft=abcd:  aircraft model to load" << endl;
     cout << "\t--model-hz=n:  run the FDM this rate (iterations per second)" 
         << endl;
     cout << "\t--speed=n:  run the FDM this much faster than real time" << endl;
+    cout << "\t--notrim:  Do NOT attempt to trim the model when initializing JSBsim" << endl;
+    cout << endl;
+    //(UIUC)
+    cout <<"Aircraft model directory:" << endl;
+    cout <<"\t--aircraft-dir=<path> path is relative to the path of the executable" << endl;
     cout << endl;
 
     cout << "Initial Position and Orientation:" << endl;
@@ -891,6 +1101,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--wBody=feet per second:  velocity along the body Z axis"
         << endl;
     cout << "\t\t(unless --units-meters specified" << endl;
+    cout << "\t--vc= initial airspeed in knots (--fdm=jsb only)" << endl;
+    cout << "\t--mach= initial mach number (--fdm=jsb only)" << endl;
     cout << endl;
 
     cout << "Rendering Options:" << endl;
@@ -941,12 +1153,21 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--start-date-lat=yyyy:mm:dd:hh:mm:ss: specify a starting" << endl
         << "\t\tdate/time. Uses Local Aircraft Time" << endl;
 #ifdef FG_NETWORK_OLK
-    cout << "" << endl;
+    cout << endl;
 
     cout << "Network Options:" << endl;
+    cout << "\t--enable-network-olk:  enable Multipilot mode" << endl;
+    cout << "\t--disable-network-olk:  disable Multipilot mode (default)" << endl;
     cout << "\t--net-hud:  Hud displays network info" << endl;
     cout << "\t--net-id=name:  specify your own callsign" << endl;
 #endif
+
+    cout << endl;
+    cout << "Route/Way Point Options:" << endl;
+    cout << "\t--wp=ID[@alt]:  specify a waypoint for the GC autopilot" << endl;
+    cout << "\t\tYou can specify multiple waypoints (a route) with multiple"
+        << endl;
+    cout << "\t\tinstances of --wp=" << endl;
 }