]> git.mxchange.org Git - flightgear.git/blob - src/Main/options.hxx
9a6eb41a78e6637aa33eedf1b75e6e88144a441b
[flightgear.git] / src / Main / options.hxx
1 // options.hxx -- class to handle command line options
2 //
3 // Written by Curtis Olson, started April 1998.
4 //
5 // Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 //
21 // $Id$
22
23
24 #ifndef _OPTIONS_HXX
25 #define _OPTIONS_HXX
26
27
28 #ifndef __cplusplus
29 # error This library requires C++
30 #endif                                   
31
32 #ifdef HAVE_CONFIG_H
33 #  include <config.h>
34 #endif
35
36 #include <simgear/compiler.h>
37
38 #ifdef HAVE_WINDOWS_H
39 #  include <windows.h>
40 #endif
41
42 #include <GL/glut.h>
43 #include <simgear/xgl/xgl.h>
44
45 #if defined(FX) && defined(XMESA)
46 extern bool global_fullscreen;
47 #endif
48
49 #include <simgear/math/sg_types.hxx>
50 #include <simgear/timing/sg_time.hxx>
51
52 #include STL_STRING
53 #include <vector>
54
55 FG_USING_STD(vector);
56 FG_USING_STD(string);
57
58 #define NEW_DEFAULT_MODEL_HZ 120
59 #define FG_FOV_MIN 0.1
60 #define FG_FOV_MAX 179.9
61
62
63 class FGOptions {
64
65 public:
66
67     enum
68     {
69         FG_OPTIONS_OK = 0,
70         FG_OPTIONS_HELP = 1,
71         FG_OPTIONS_ERROR = 2
72     };
73
74     enum
75     {
76         FG_UNITS_FEET = 0,
77         FG_UNITS_METERS = 1
78     };
79
80     enum fgFogKind
81     {
82         FG_FOG_DISABLED = 0,
83         FG_FOG_FASTEST  = 1,
84         FG_FOG_NICEST   = 2
85     };
86
87     enum
88     {
89         FG_RADIUS_MIN = 1,
90         FG_RADIUS_MAX = 4
91     };
92
93     enum fgControlMode
94     {
95         FG_JOYSTICK = 0,
96         FG_KEYBOARD = 1,
97         FG_MOUSE = 2
98     };
99
100     enum fgViewMode
101     {
102         FG_VIEW_PILOT = 0,      // Pilot perspective
103         FG_VIEW_FOLLOW  = 1,    // Following in the "foot steps" so to speak
104         FG_VIEW_CHASE = 2,      // Chase
105         FG_VIEW_CIRCLING = 3,   // Circling
106         FG_VIEW_SATELLITE = 4,  // From high above
107         FG_VIEW_ANCHOR = 5,     // Drop an anchor and watch from there
108         FG_VIEW_TOWER = 6,      // From nearest tower?
109         FG_VIEW_SPOTTER = 7     // Fron a ground spotter
110     };
111
112     enum fgAutoCoordMode
113     {
114         FG_AUTO_COORD_NOT_SPECIFIED = 0,
115         FG_AUTO_COORD_DISABLED = 1,
116         FG_AUTO_COORD_ENABLED = 2
117     };
118
119     enum fgTimingOffsetType {
120         FG_TIME_SYS_OFFSET   = 0,
121         FG_TIME_GMT_OFFSET   = 1,
122         FG_TIME_LAT_OFFSET   = 2,
123         FG_TIME_SYS_ABSOLUTE = 3,
124         FG_TIME_GMT_ABSOLUTE = 4,
125         FG_TIME_LAT_ABSOLUTE = 5
126     };
127     
128     enum fgSpeedSet {
129         FG_VC    = 1,
130         FG_MACH  = 2,
131         FG_VTUVW  = 3,
132         FG_VTNED = 4
133     };
134
135 private:
136
137     // The flight gear "root" directory
138     string fg_root;
139
140     // The scenery "root" directory
141     string fg_scenery;
142
143     // Starting position and orientation
144     string airport_id;  // ID of initial starting airport
145     double lon;         // starting longitude in degrees (west = -)
146     double lat;         // starting latitude in degrees (south = -)
147     double altitude;    // starting altitude in meters
148     double heading;     // heading (yaw) angle in degress (Psi)
149     double roll;        // roll angle in degrees (Phi)
150     double pitch;       // pitch angle in degrees (Theta)
151     fgSpeedSet speedset; // which speed does the user want
152     double uBody;       // Body axis X velocity (U)
153     double vBody;       // Body axis Y velocity (V)
154     double wBody;       // Body axis Z velocity (W)
155     double vNorth;      // North component of vt
156     double vEast;       // East component of vt
157     double vDown;       // Down component of vt
158     double vkcas;       // Calibrated airspeed, knots
159     double mach;        // Mach number
160
161     // Miscellaneous
162     bool game_mode;     // Game mode enabled/disabled
163     bool splash_screen; // show splash screen
164     bool intro_music;   // play introductory music
165     int mouse_pointer;  // show mouse pointer
166     fgControlMode control_mode; // primary control mode
167     fgAutoCoordMode auto_coordination;  // enable auto coordination
168
169     // Features
170     bool hud_status;    // HUD on/off
171     bool panel_status;  // Panel on/off
172     bool sound;         // play sound effects
173     bool anti_alias_hud;
174
175     // Flight Model options
176     int flight_model;   // Core flight model code:  jsb, larcsim, magic, etc.
177     string aircraft;    // Aircraft to model
178     int model_hz;       // number of FDM iterations per second
179     int speed_up;       // Sim mechanics run this much faster than normal speed
180     int trim;           // use the FDM trimming routine during init
181                         // <0 --notrim set, 0 no trim, >0 trim
182                         // default behavior is to enable trimming for jsbsim
183                         // disable for all other fdm's
184
185     // Rendering options
186     fgFogKind fog;      // Fog nicest/fastest/disabled
187     bool clouds;        // Enable clouds
188     double clouds_asl;  // Cloud layer height above sea level
189     double fov;         // Field of View
190     bool fullscreen;    // Full screen mode enabled/disabled
191     int shading;        // shading method, 0 = Flat, 1 = Smooth
192     bool skyblend;      // Blend sky to haze (using polygons) or just clear
193     bool textures;      // Textures enabled/disabled
194     bool wireframe;     // Wireframe mode enabled/disabled
195     int xsize, ysize;   // window size derived from geometry string
196     double win_ratio;   // ratio of x and y fov's; fov(y) = fov(x) * win_ratio
197     int bpp;            // bits per pixel
198     fgViewMode view_mode; // view mode
199     double default_view_offset; // default forward view offset (for use by
200                                 // multi-display configuration
201
202     // Scenery options
203     int tile_radius;   // Square radius of rendered tiles (around center 
204                        // square.)
205     int tile_diameter; // Diameter of rendered tiles.  for instance
206                        // if tile_diameter = 3 then a 3 x 3 grid of tiles will 
207                        // be drawn.  Increase this to see terrain that is 
208                        // further away.
209
210     // HUD options
211     int units;         // feet or meters
212     int tris_or_culled;
213
214     // Time options
215     int time_offset;            // Use this value to change time.
216     fgTimingOffsetType time_offset_type; // Will be set to one of the
217                                 // FG_TIME_* enums, to deterine how
218                                 // time_offset should be used 
219
220     // Serial port configuration strings
221     string_list channel_options_list;
222
223     // Network options
224     bool network_olk;
225     string net_id;
226     
227 public:
228
229     FGOptions();
230     ~FGOptions();
231
232     // Parse a single option
233     int parse_option( const string& arg );
234
235     // Scan the command line options for an fg_root definition and set
236     // just that.
237     int scan_command_line_for_root( int argc, char **argv );
238
239     // Scan the config file for an fg_root definition and set just
240     // that.
241     int scan_config_file_for_root( const string& path );
242
243     // Parse the command line options
244     int parse_command_line( int argc, char **argv );
245
246     // Parse the command line options
247     int parse_config_file( const string& path );
248
249     // Print usage message
250     void usage ( void );
251
252     // Query functions
253     inline string get_fg_root() const { return fg_root; }
254     inline string get_fg_scenery() const { return fg_scenery; }
255     inline string get_airport_id() const { return airport_id; }
256     inline double get_lon() const { return lon; }
257     inline double get_lat() const { return lat; }
258     inline double get_altitude() const { return altitude; }
259     inline double get_heading() const { return heading; }
260     inline double get_roll() const { return roll; }
261     inline double get_pitch() const { return pitch; }
262     inline fgSpeedSet get_speedset() const { return speedset; }
263     inline double get_uBody() const {return uBody;}
264     inline double get_vBody() const {return vBody;}
265     inline double get_wBody() const {return wBody;}
266     inline double get_vNorth() const {return vNorth;}
267     inline double get_vEast() const {return vEast;}
268     inline double get_vDown() const {return vDown;}
269     inline double get_vc() const {return vkcas;}
270     inline double get_mach() const {return mach;}
271         
272     inline bool get_game_mode() const { return game_mode; }
273     inline bool get_splash_screen() const { return splash_screen; }
274     inline bool get_intro_music() const { return intro_music; }
275     inline int get_mouse_pointer() const { return mouse_pointer; }
276     inline bool get_anti_alias_hud() const { return anti_alias_hud; }
277     inline fgControlMode get_control_mode() const { return control_mode; }
278     inline void set_control_mode( fgControlMode mode ) { control_mode = mode; }
279     inline fgAutoCoordMode get_auto_coordination() const { 
280         return auto_coordination;
281     }
282     inline void set_auto_coordination(fgAutoCoordMode m) { 
283         auto_coordination = m;
284     }
285     inline bool get_hud_status() const { return hud_status; }
286     inline bool get_panel_status() const { return panel_status; }
287     inline bool get_sound() const { return sound; }
288     inline int get_flight_model() const { return flight_model; }
289     inline string get_aircraft() const { return aircraft; }
290     inline int get_model_hz() const { return model_hz; }
291     inline int get_speed_up() const { return speed_up; }
292     inline void set_speed_up( int speed ) { speed_up = speed; }
293     inline int get_trim_mode(void) { return trim; }
294         
295     inline bool fog_enabled() const { return fog != FG_FOG_DISABLED; }
296     inline fgFogKind get_fog() const { return fog; }
297     inline bool get_clouds() const { return clouds; }
298     inline double get_clouds_asl() const { return clouds_asl; }
299     inline double get_fov() const { return fov; }
300     inline bool get_fullscreen() const { return fullscreen; }
301     inline int get_shading() const { return shading; }
302     inline bool get_skyblend() const { return skyblend; }
303     inline bool get_textures() const { return textures; }
304     inline bool get_wireframe() const { return wireframe; }
305     inline int get_xsize() const { return xsize; }
306     inline int get_ysize() const { return ysize; }
307     inline double get_win_ratio() const { return win_ratio; }
308     inline int get_bpp() const { return bpp; }
309     inline fgViewMode get_view_mode() const { return view_mode; }
310     inline double get_default_view_offset() const {
311         return default_view_offset;
312     }
313
314
315     inline int get_tile_radius() const { return tile_radius; }
316     inline int get_tile_diameter() const { return tile_diameter; }
317
318     inline int get_units() const { return units; }
319     inline int get_tris_or_culled() const { return tris_or_culled; }
320
321     inline int get_time_offset() const { return time_offset; }
322     inline fgTimingOffsetType  get_time_offset_type() const {
323         return time_offset_type;
324     };
325
326     inline string_list get_channel_options_list() const { 
327         return channel_options_list;
328     }
329
330     inline bool get_network_olk() const { return network_olk; }
331     inline string get_net_id() const { return net_id; }
332
333     // Update functions
334     inline void set_fg_root (const string value) { fg_root = value; }
335     inline void set_fg_scenery (const string value) { fg_scenery = value; }
336     inline void set_airport_id( const string id ) { airport_id = id; }
337     inline void set_lon (double value) { lon = value; }
338     inline void set_lat (double value) { lat = value; }
339     inline void set_altitude (double value) { altitude = value; }
340     inline void set_heading (double value) { heading = value; }
341     inline void set_roll (double value) { roll = value; }
342     inline void set_pitch (double value) { pitch = value; }
343     inline void set_uBody (double value) { uBody = value; }
344     inline void set_vBody (double value) { vBody = value; }
345     inline void set_wBody (double value) { wBody = value; }
346     inline void set_vc (double value) { vkcas = value; }
347     inline void set_mach(double value) { mach = value; }
348     inline void set_game_mode (bool value) { game_mode = value; }
349     inline void set_splash_screen (bool value) { splash_screen = value; }
350     inline void set_intro_music (bool value) { intro_music = value; }
351     inline void set_mouse_pointer (int value) { mouse_pointer = value; }
352     inline void set_anti_alias_hud (bool value) { anti_alias_hud = value; }
353     inline void set_hud_status( bool status ) { hud_status = status; }
354     inline void set_sound (bool value) { sound = value; }
355     inline void set_flight_model (int value) { flight_model = value; }
356     inline void set_aircraft (const string &ac) { aircraft = ac; }
357     inline void set_model_hz (int value) { model_hz = value; }
358     inline void set_trim_mode(int value) { trim = value; }
359     inline void set_fog (fgFogKind value) { fog = value; }
360     inline void set_clouds( bool value ) { clouds = value; }
361     inline void set_clouds_asl( double value ) { clouds_asl = value; }
362     inline void set_fov( double amount ) { fov = amount; }
363     inline void set_fullscreen (bool value) { fullscreen = value; }
364     inline void set_shading (int value) { shading = value; }
365     inline void set_skyblend (bool value) { skyblend = value; }
366     inline void set_textures( bool status ) { textures = status; }
367     inline void set_wireframe (bool status) { wireframe = status; }
368     inline void cycle_fog( void ) { 
369         if ( fog == FG_FOG_DISABLED ) {
370             fog = FG_FOG_FASTEST;
371         } else if ( fog == FG_FOG_FASTEST ) {
372             fog = FG_FOG_NICEST;
373             xglHint ( GL_FOG_HINT, GL_NICEST );
374         } else if ( fog == FG_FOG_NICEST ) {
375             fog = FG_FOG_DISABLED;
376             xglHint ( GL_FOG_HINT, GL_FASTEST );
377         }
378     }
379     void toggle_panel();
380     inline void set_xsize( int x ) { xsize = x; }
381     inline void set_ysize( int y ) { ysize = y; }
382     inline void set_win_ratio( double r ) { win_ratio = r; }
383     inline void set_view_mode (fgViewMode value) { view_mode = value; }
384     inline void set_tile_radius (int value) { tile_radius = value; }
385     inline void set_tile_diameter (int value) { tile_diameter = value; }
386     inline void set_units (int value) { units = value; }
387     inline void set_tris_or_culled (int value) { tris_or_culled = value; }
388     inline void set_time_offset (int value) { time_offset = value; }
389     inline void set_time_offset_type (fgTimingOffsetType value) {
390         time_offset_type = value;
391     }
392     inline void cycle_view_mode() { 
393         if ( view_mode == FG_VIEW_PILOT ) {
394             view_mode = FG_VIEW_FOLLOW;
395         } else if ( view_mode == FG_VIEW_FOLLOW ) {
396             view_mode = FG_VIEW_PILOT;
397         }
398     }
399
400     inline void set_network_olk( bool net ) { network_olk = net; }
401     inline void set_net_id( const string id ) { net_id = id; }
402
403 private:
404
405     void parse_control( const string& mode );
406     double parse_time( const string& time_str );
407     long int parse_date( const string& date_str );
408     double parse_degree( const string& degree_str );
409     int parse_time_offset( const string& time_str );
410     int parse_tile_radius( const string& arg );
411     int parse_fdm( const string& fm );
412     double parse_fov( const string& arg );
413     bool parse_channel( const string& type, const string& channel_str );
414     bool parse_wp( const string& arg );
415 };
416
417
418 // extern FGOptions current_options;
419
420
421 #endif /* _OPTIONS_HXX */
422
423