1
0
Fork 0

Added a keyboard binding to dynamically adjust field of view.

Added a command line option to specify fov.
Adjusted terrain color.
Root path info moved to fgOPTIONS.
Added ability to parse options out of a config file.
This commit is contained in:
curt 1998-05-13 18:29:56 +00:00
parent 17cfc04cef
commit c57071acfd
5 changed files with 299 additions and 91 deletions

View file

@ -106,6 +106,9 @@ void GLUTkey(unsigned char k, int x, int y) {
case 87: /* W key */
displayInstruments = !displayInstruments;
return;
case 88: /* X key */
o->fov *= 1.05;
return;
case 90: /* Z key */
w->visibility /= 1.10;
xglFogf (GL_FOG_START, w->visibility / 1000000.0 );
@ -168,6 +171,9 @@ void GLUTkey(unsigned char k, int x, int y) {
case 116: /* t key */
t->warp_delta += 30;
return;
case 120: /* X key */
o->fov /= 1.05;
return;
case 122: /* z key */
w->visibility *= 1.10;
xglFogf (GL_FOG_START, w->visibility / 1000000.0 );
@ -179,7 +185,8 @@ void GLUTkey(unsigned char k, int x, int y) {
// if( fg_DebugOutput ) {
// fclose( fg_DebugOutput );
// }
exit(0);
fgPrintf( FG_INPUT, FG_EXIT,
"Program exiting normally at user request.\n");
}
}
}
@ -267,12 +274,19 @@ void GLUTspecialkey(int k, int x, int y) {
/* $Log$
/* Revision 1.7 1998/05/07 23:14:14 curt
/* Added "D" key binding to set autopilot heading.
/* Made frame rate calculation average out over last 10 frames.
/* Borland C++ floating point exception workaround.
/* Added a --tile-radius=n option.
/* Revision 1.8 1998/05/13 18:29:56 curt
/* Added a keyboard binding to dynamically adjust field of view.
/* Added a command line option to specify fov.
/* Adjusted terrain color.
/* Root path info moved to fgOPTIONS.
/* Added ability to parse options out of a config file.
/*
* Revision 1.7 1998/05/07 23:14:14 curt
* Added "D" key binding to set autopilot heading.
* Made frame rate calculation average out over last 10 frames.
* Borland C++ floating point exception workaround.
* Added a --tile-radius=n option.
*
* Revision 1.6 1998/04/28 01:20:20 curt
* Type-ified fgTIME and fgVIEW.
* Added a command line option to disable textures.

View file

@ -225,10 +225,12 @@ static void fgInitVisuals( void ) {
static void fgUpdateViewParams( void ) {
fgFLIGHT *f;
fgLIGHT *l;
fgOPTIONS *o;
fgVIEW *v;
f = current_aircraft.flight;
l = &cur_light_params;
o = &current_options;
v = &current_view;
fgViewUpdate(f, v, l);
@ -239,13 +241,13 @@ static void fgUpdateViewParams( void ) {
// Tell GL we are about to modify the projection parameters
xglMatrixMode(GL_PROJECTION);
xglLoadIdentity();
gluPerspective(65.0, 2.0/win_ratio, 1.0, 100000.0);
gluPerspective(o->fov, 2.0/win_ratio, 1.0, 100000.0);
} else {
xglViewport(0, 0 , (GLint)winWidth, (GLint) winHeight);
// Tell GL we are about to modify the projection parameters
xglMatrixMode(GL_PROJECTION);
xglLoadIdentity();
gluPerspective(65.0, 1.0/win_ratio, 10.0, 100000.0);
gluPerspective(o->fov, 1.0/win_ratio, 10.0, 100000.0);
}
xglMatrixMode(GL_MODELVIEW);
@ -332,8 +334,8 @@ static void fgRenderFrame( void ) {
double angle;
GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat color[4] = { 0.54, 0.44, 0.29, 1.0 };
GLfloat terrain_color[4] = { 0.54, 0.44, 0.29, 1.0 };
l = &cur_light_params;
o = &current_options;
t = &cur_time_params;
@ -425,8 +427,8 @@ static void fgRenderFrame( void ) {
xglMaterialfv (GL_FRONT, GL_DIFFUSE, white);
} else {
xglDisable( GL_TEXTURE_2D );
xglMaterialfv (GL_FRONT, GL_AMBIENT, color);
xglMaterialfv (GL_FRONT, GL_DIFFUSE, color);
xglMaterialfv (GL_FRONT, GL_AMBIENT, terrain_color);
xglMaterialfv (GL_FRONT, GL_DIFFUSE, terrain_color);
}
fgTileMgrRender();
@ -675,9 +677,12 @@ int fgGlutInitEvents( void ) {
// Main ...
int main( int argc, char **argv ) {
fgFLIGHT *f;
fgOPTIONS *o;
char config[256];
int result; // Used in command line argument.
f = current_aircraft.flight;
o = &current_options;
#ifdef HAVE_BC5PLUS
_control87(MCW_EM, MCW_EM); /* defined in float.h */
@ -693,14 +698,27 @@ int main( int argc, char **argv ) {
fgPrintf( FG_GENERAL, FG_EXIT, "GLUT initialization failed ...\n" );
}
// Parse remaining command line options
result = current_options.parse(argc, argv);
// Attempt to locate and parse a config file
// First check fg_root
strcpy(config, o->fg_root);
strcat(config, "/system.fgfsrc");
result = o->parse_config_file(config);
// Next check home directory
if ( getenv("HOME") != NULL ) {
strcpy(config, getenv("HOME"));
strcat(config, "/.fgfsrc");
result = o->parse_config_file(config);
}
// Parse remaining command line options
// These will override anything specified in a config file
result = o->parse_command_line(argc, argv);
if ( result != FG_OPTIONS_OK ) {
// Something must have gone horribly wrong with the command
// line parsing or maybe the user just requested help ... :-)
current_options.usage();
fgPrintf( FG_GENERAL, FG_EXIT, "\nShutting down ...\n");
o->usage();
fgPrintf( FG_GENERAL, FG_EXIT, "\nExiting ...\n");
}
// These are a few miscellaneous things that aren't really
@ -750,6 +768,13 @@ extern "C" {
// $Log$
// Revision 1.14 1998/05/13 18:29:57 curt
// Added a keyboard binding to dynamically adjust field of view.
// Added a command line option to specify fov.
// Adjusted terrain color.
// Root path info moved to fgOPTIONS.
// Added ability to parse options out of a config file.
//
// Revision 1.13 1998/05/11 18:18:15 curt
// For flat shading use "glHint (GL_FOG_HINT, GL_FASTEST )"
//

View file

@ -169,26 +169,23 @@ int fgInitPosition( void ) {
// General house keeping initializations
int fgInitGeneral( void ) {
fgGENERAL *g;
fgOPTIONS *o;
int i;
g = &general;
o = &current_options;
fgPrintf( FG_GENERAL, FG_INFO, "General Initialization\n" );
fgPrintf( FG_GENERAL, FG_INFO, "======= ==============\n" );
// determine the fg root path.
if( !(g->root_dir) ) {
// If not set by command line test for environmental var..
g->root_dir = getenv("FG_ROOT");
if ( !g->root_dir ) {
// No root path set? Then assume, we will exit if this is
// wrong when looking for support files.
fgPrintf( FG_GENERAL, FG_EXIT, "%s %s\n",
"Cannot continue without environment variable FG_ROOT",
"being defined.");
}
if ( !strlen(o->fg_root) ) {
// No root path set? Then assume, we will exit if this is
// wrong when looking for support files.
fgPrintf( FG_GENERAL, FG_EXIT, "%s %s\n",
"Cannot continue without environment variable FG_ROOT",
"being defined.");
}
fgPrintf( FG_GENERAL, FG_INFO, "FG_ROOT = %s\n\n", g->root_dir);
fgPrintf( FG_GENERAL, FG_INFO, "FG_ROOT = %s\n\n", o->fg_root);
// prime the frame rate counter pump
for ( i = 0; i < FG_FRAME_RATE_HISTORY; i++ ) {
@ -387,6 +384,13 @@ int fgInitSubsystems( void ) {
// $Log$
// Revision 1.12 1998/05/13 18:29:58 curt
// Added a keyboard binding to dynamically adjust field of view.
// Added a command line option to specify fov.
// Adjusted terrain color.
// Root path info moved to fgOPTIONS.
// Added ability to parse options out of a config file.
//
// Revision 1.11 1998/05/07 23:14:15 curt
// Added "D" key binding to set autopilot heading.
// Made frame rate calculation average out over last 10 frames.

View file

@ -33,6 +33,7 @@
#include <string.h>
#include <Debug/fg_debug.h>
#include <Include/fg_zlib.h>
#include "options.hxx"
@ -45,6 +46,24 @@ fgOPTIONS current_options;
fgOPTIONS::fgOPTIONS( void ) {
// set initial values/defaults
if ( getenv("FG_ROOT") != NULL ) {
// fg_root could be anywhere, so default to environmental
// variable $FG_ROOT if it is set.
strcpy(fg_root, getenv("FG_ROOT"));
} else {
// 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)
strcpy(fg_root, "\\FlightGear");
#else
strcpy(fg_root, "/usr/local/lib/FlightGear");
#endif
}
// default airport id
strcpy(airport_id, "");
// Features
@ -52,6 +71,7 @@ fgOPTIONS::fgOPTIONS( void ) {
// Rendering options
fog = 1;
fov = 65.0;
fullscreen = 0;
shading = 1;
skyblend = 1;
@ -66,6 +86,52 @@ fgOPTIONS::fgOPTIONS( void ) {
}
// Parse an int out of a --foo-bar=n type option
static int parse_int(char *arg) {
int result;
// advance past the '='
while ( (arg[0] != '=') && (arg[0] != '\0') ) {
arg++;
}
if ( arg[0] == '=' ) {
arg++;
}
printf("parse_int(): arg = %s\n", arg);
result = atoi(arg);
printf("parse_int(): result = %d\n", result);
return(result);
}
// Parse an int out of a --foo-bar=n type option
static double parse_double(char *arg) {
double result;
// advance past the '='
while ( (arg[0] != '=') && (arg[0] != '\0') ) {
arg++;
}
if ( arg[0] == '=' ) {
arg++;
}
printf("parse_double(): arg = %s\n", arg);
result = atof(arg);
printf("parse_double(): result = %.4f\n", result);
return(result);
}
// parse time string in the form of [+-]hh:mm:ss, returns the value in seconds
static double parse_time(char *time_str) {
char num[256];
@ -163,82 +229,118 @@ static int parse_time_offset(char *time_str) {
}
// Parse an int out of a --foo-bar=n type option
static int parse_int(char *arg, int min, int max) {
int result;
// Parse --tile-radius=n type option
// advance past the '='
while ( (arg[0] != '=') && (arg[0] != '\0') ) {
arg++;
#define FG_RADIUS_MIN 3
#define FG_RADIUS_MAX 9
static int parse_tile_radius(char *arg) {
int radius, tmp;
radius = parse_int(arg);
// radius must be odd
tmp = radius / 2;
if ( radius == ( tmp * 2 ) ) {
radius -= 1;
}
if ( arg[0] == '=' ) {
arg++;
if ( radius < FG_RADIUS_MIN ) { radius = FG_RADIUS_MIN; }
if ( radius > FG_RADIUS_MAX ) { radius = FG_RADIUS_MAX; }
printf("parse_tile_radius(): radius = %d\n", radius);
return(radius);
}
// Parse --fov=x.xx type option
#define FG_FOV_MIN 0.1
#define FG_FOV_MAX 179.9
static double parse_fov(char *arg) {
double fov;
fov = parse_double(arg);
if ( fov < FG_FOV_MIN ) { fov = FG_FOV_MIN; }
if ( fov > FG_FOV_MAX ) { fov = FG_FOV_MAX; }
printf("parse_fov(): result = %.4f\n", fov);
return(fov);
}
// Parse a single option
int fgOPTIONS::parse_option( char *arg ) {
// General Options
if ( (strcmp(arg, "--help") == 0) ||
(strcmp(arg, "-h") == 0) ) {
// help/usage request
return(FG_OPTIONS_HELP);
} else if ( strcmp(arg, "--disable-hud") == 0 ) {
hud_status = 0;
} else if ( strcmp(arg, "--enable-hud") == 0 ) {
hud_status = 1;
} else if ( strncmp(arg, "--airport-id=", 13) == 0 ) {
arg += 13;
strncpy(airport_id, arg, 4);
} else if ( strncmp(arg, "--fg-root=", 10) == 0 ) {
arg += 10;
strcpy(fg_root, arg);
} else if ( strcmp(arg, "--disable-fog") == 0 ) {
fog = 0;
} else if ( strcmp(arg, "--enable-fog") == 0 ) {
fog = 1;
} else if ( strncmp(arg, "--fov=", 6) == 0 ) {
fov = parse_fov(arg);
} else if ( strcmp(arg, "--disable-fullscreen") == 0 ) {
fullscreen = 0;
} else if ( strcmp(arg, "--enable-fullscreen") == 0 ) {
fullscreen = 1;
} else if ( strcmp(arg, "--shading-flat") == 0 ) {
shading = 0;
} else if ( strcmp(arg, "--shading-smooth") == 0 ) {
shading = 1;
} else if ( strcmp(arg, "--disable-skyblend") == 0 ) {
skyblend = 0;
} else if ( strcmp(arg, "--enable-skyblend") == 0 ) {
skyblend = 1;
} else if ( strcmp(arg, "--disable-textures") == 0 ) {
textures = 0;
} else if ( strcmp(arg, "--enable-textures") == 0 ) {
textures = 1;
} else if ( strcmp(arg, "--disable-wireframe") == 0 ) {
wireframe = 0;
} else if ( strcmp(arg, "--enable-wireframe") == 0 ) {
wireframe = 1;
} else if ( strncmp(arg, "--tile-radius=", 14) == 0 ) {
tile_radius = parse_tile_radius(arg);
} else if ( strncmp(arg, "--time-offset=", 14) == 0 ) {
time_offset = parse_time_offset(arg);
} else {
return(FG_OPTIONS_ERROR);
}
printf("parse_int(): arg = %s\n", arg);
result = atoi(arg);
if ( result < min ) { result = min; }
if ( result > max ) { result = max; }
printf("parse_int(): result = %d\n", result);
return(result);
return(FG_OPTIONS_OK);
}
// Parse the command line options
int fgOPTIONS::parse( int argc, char **argv ) {
int fgOPTIONS::parse_command_line( int argc, char **argv ) {
int i = 1;
int result;
fgPrintf(FG_GENERAL, FG_INFO, "Processing arguments\n");
fgPrintf(FG_GENERAL, FG_INFO, "Processing command line arguments\n");
while ( i < argc ) {
fgPrintf(FG_GENERAL, FG_INFO, "argv[%d] = %s\n", i, argv[i]);
// General Options
if ( (strcmp(argv[i], "--help") == 0) ||
(strcmp(argv[i], "-h") == 0) ) {
// help/usage request
return(FG_OPTIONS_HELP);
} else if ( strcmp(argv[i], "--disable-hud") == 0 ) {
hud_status = 0;
} else if ( strcmp(argv[i], "--enable-hud") == 0 ) {
hud_status = 1;
} else if ( strncmp(argv[i], "--airport-id=", 13) == 0 ) {
argv[i] += 13;
strncpy(airport_id, argv[i], 4);
} else if ( strcmp(argv[i], "--disable-fog") == 0 ) {
fog = 0;
} else if ( strcmp(argv[i], "--enable-fog") == 0 ) {
fog = 1;
} else if ( strcmp(argv[i], "--disable-fullscreen") == 0 ) {
fullscreen = 0;
} else if ( strcmp(argv[i], "--enable-fullscreen") == 0 ) {
fullscreen = 1;
} else if ( strcmp(argv[i], "--shading-flat") == 0 ) {
shading = 0;
} else if ( strcmp(argv[i], "--shading-smooth") == 0 ) {
shading = 1;
} else if ( strcmp(argv[i], "--disable-skyblend") == 0 ) {
skyblend = 0;
} else if ( strcmp(argv[i], "--enable-skyblend") == 0 ) {
skyblend = 1;
} else if ( strcmp(argv[i], "--disable-textures") == 0 ) {
textures = 0;
} else if ( strcmp(argv[i], "--enable-textures") == 0 ) {
textures = 1;
} else if ( strcmp(argv[i], "--disable-wireframe") == 0 ) {
wireframe = 0;
} else if ( strcmp(argv[i], "--enable-wireframe") == 0 ) {
wireframe = 1;
} else if ( strncmp(argv[i], "--tile-radius=", 14) == 0 ) {
tile_radius = parse_int(argv[i], 3, 9);
} else if ( strncmp(argv[i], "--time-offset=", 14) == 0 ) {
time_offset = parse_time_offset(argv[i]);
} else {
return(FG_OPTIONS_ERROR);
result = parse_option(argv[i]);
if ( (result == FG_OPTIONS_HELP) || (result == FG_OPTIONS_ERROR) ) {
return(result);
}
i++;
@ -248,6 +350,44 @@ int fgOPTIONS::parse( int argc, char **argv ) {
}
// Parse the command line options
int fgOPTIONS::parse_config_file( char *path ) {
char fgpath[256], line[256];
fgFile f;
int len, result;
strcpy(fgpath, path);
strcat(fgpath, ".gz");
// first try "path.gz"
if ( (f = fgopen(fgpath, "rb")) == NULL ) {
// next try "path"
if ( (f = fgopen(path, "rb")) == NULL ) {
return(FG_OPTIONS_ERROR);
}
}
fgPrintf(FG_GENERAL, FG_INFO, "Processing config file: %s\n", path);
while ( fggets(f, line, 250) != NULL ) {
// strip trailing newline if it exists
len = strlen(line);
if ( line[len-1] == '\n' ) {
line[len-1] = '\0';
}
result = parse_option(line);
if ( result == FG_OPTIONS_ERROR ) {
fgPrintf( FG_GENERAL, FG_EXIT,
"Config file parse error: %s '%s'\n", path, line );
}
}
fgclose(f);
return(FG_OPTIONS_OK);
}
// Print usage message
void fgOPTIONS::usage ( void ) {
printf("Usage: fg [ options ... ]\n");
@ -255,6 +395,7 @@ void fgOPTIONS::usage ( void ) {
printf("General Options:\n");
printf("\t--help -h: print usage\n");
printf("\t--fg-root=path: specify the root path for all the data files\n");
printf("\n");
printf("Features:\n");
@ -269,6 +410,7 @@ void fgOPTIONS::usage ( void ) {
printf("Rendering Options:\n");
printf("\t--disable-fog: disable fog/haze\n");
printf("\t--enable-fog: enable fog/haze\n");
printf("\t--fov=xx.x: specify the field of view angle in degrees\n");
printf("\t--disable-fullscreen: disable fullscreen mode\n");
printf("\t--enable-fullscreen: enable fullscreen mode\n");
printf("\t--shading-flat: enable flat shading\n");
@ -296,6 +438,13 @@ fgOPTIONS::~fgOPTIONS( void ) {
// $Log$
// Revision 1.9 1998/05/13 18:29:59 curt
// Added a keyboard binding to dynamically adjust field of view.
// Added a command line option to specify fov.
// Adjusted terrain color.
// Root path info moved to fgOPTIONS.
// Added ability to parse options out of a config file.
//
// Revision 1.8 1998/05/07 23:14:16 curt
// Added "D" key binding to set autopilot heading.
// Made frame rate calculation average out over last 10 frames.

View file

@ -40,6 +40,8 @@
class fgOPTIONS {
public:
// The flight gear "root" directory
char fg_root[256];
// ID of initial starting airport
char airport_id[5];
@ -49,6 +51,7 @@ public:
// Rendering options
int fog; // Fog enabled/disabled
double fov; // Field of View
int fullscreen; // Full screen mode enabled/disabled
int shading; // shading method, 0 = Flat, 1 = Smooth
int skyblend; // Blend sky to haze (using polygons) or just clear
@ -67,8 +70,14 @@ public:
// Constructor
fgOPTIONS( void );
// Parse a single option
int parse_option( char *arg );
// Parse the command line options
int parse( int argc, char **argv );
int parse_command_line( int argc, char **argv );
// Parse the command line options
int parse_config_file( char *path );
// Print usage message
void usage ( void );
@ -86,6 +95,13 @@ extern fgOPTIONS current_options;
// $Log$
// Revision 1.7 1998/05/13 18:29:59 curt
// Added a keyboard binding to dynamically adjust field of view.
// Added a command line option to specify fov.
// Adjusted terrain color.
// Root path info moved to fgOPTIONS.
// Added ability to parse options out of a config file.
//
// Revision 1.6 1998/05/06 03:16:26 curt
// Added an averaged global frame rate counter.
// Added an option to control tile radius.