#include <simgear/compiler.h>
-#ifdef FG_MATH_EXCEPTION_CLASH
+#ifdef SG_MATH_EXCEPTION_CLASH
# include <math.h>
#endif
#endif
#include <GL/glut.h>
-#include <simgear/xgl/xgl.h>
+#include <GL/gl.h>
#if defined(FX) && defined(XMESA)
# include <GL/xmesa.h>
#include <simgear/constants.h>
#include <simgear/debug/logstream.hxx>
-#include <simgear/misc/fgpath.hxx>
+#include <simgear/misc/sg_path.hxx>
#include <simgear/screen/screen-dump.hxx>
#include <Include/general.hxx>
#include <Cockpit/panel.hxx>
#include <Controls/controls.hxx>
#include <FDM/flight.hxx>
-#include <Main/bfi.hxx>
#include <Main/fg_init.hxx>
#include <Main/fg_io.hxx>
#include <Main/globals.hxx>
#include <Main/fg_props.hxx>
+#include <Main/options.hxx>
#ifdef FG_NETWORK_OLK
#include <NetworkOLK/network.h>
#include "gui_local.hxx"
#include "apt_dlg.hxx"
#include "net_dlg.hxx"
+#include "sgVec3Slider.hxx"
-FG_USING_STD(string);
+SG_USING_STD(string);
-#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
-FG_USING_STD(cout);
+#ifndef SG_HAVE_NATIVE_SGI_COMPILERS
+SG_USING_STD(cout);
#endif
-#if defined(WIN32) || defined(__CYGWIN32__)
-#define WIN32_CURSOR_TWEAKS
-#elif (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-#define X_CURSOR_TWEAKS
-#endif
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif /* _MSC_VER */
// main.cxx hack, should come from an include someplace
extern void fgInitVisuals( void );
static puOneShot *SaveDialogOkButton = 0;
static puOneShot *SaveDialogCancelButton = 0;
-static puOneShot *SaveDialogResetButton = 0;
+// static puOneShot *SaveDialogResetButton = 0;
// Default save filename
static char saveFile[256] = "fgfs.sav";
if (output.good() && fgSaveFlight(output)) {
output.close();
mkDialog("Saved flight");
- FG_LOG(FG_INPUT, FG_INFO, "Saved flight");
+ SG_LOG(SG_INPUT, SG_INFO, "Saved flight");
} else {
mkDialog("Cannot save flight");
- FG_LOG(FG_INPUT, FG_ALERT, "Cannot save flight");
+ SG_LOG(SG_INPUT, SG_ALERT, "Cannot save flight");
}
}
static puOneShot *LoadDialogOkButton = 0;
static puOneShot *LoadDialogCancelButton = 0;
-static puOneShot *LoadDialogResetButton = 0;
+// static puOneShot *LoadDialogResetButton = 0;
// Default load filename
static char loadFile[256] = "fgfs.sav";
if (input.good() && fgLoadFlight(input)) {
input.close();
mkDialog("Loaded flight");
- FG_LOG(FG_INPUT, FG_INFO, "Restored flight");
+ SG_LOG(SG_INPUT, SG_INFO, "Restored flight");
} else {
mkDialog("Failed to load flight");
- FG_LOG(FG_INPUT, FG_ALERT, "Cannot load flight");
+ SG_LOG(SG_INPUT, SG_ALERT, "Cannot load flight");
}
}
// This is the accessor function
void guiTogglePanel(puObject *cb)
{
- globals->get_options()->toggle_panel();
+ if (fgGetBool("/sim/panel/visibility"))
+ fgSetBool("/sim/panel/visibility", false);
+ else
+ fgSetBool("/sim/panel/visibility", true);
+
+ fgReshape(fgGetInt("/sim/startup/xsize"),
+ fgGetInt("/sim/startup/ysize"));
}
//void MenuHideMenuCb(puObject *cb)
void goodBye(puObject *)
{
- // FG_LOG( FG_INPUT, FG_ALERT,
+ // SG_LOG( SG_INPUT, SG_ALERT,
// "Program exiting normally at user request." );
cout << "Program exiting normally at user request." << endl;
#ifdef FG_NETWORK_OLK
- if ( globals->get_options()->get_network_olk() ) {
+ if ( fgGetBool("/sim/networking/network-olk") ) {
if ( net_is_registered == 0 ) fgd_send_com( "8", FGFS_host);
}
#endif
void mkDialogInit (void)
{
// printf("mkDialogInit\n");
- int x = (globals->get_options()->get_xsize()/2 - 400/2);
- int y = (globals->get_options()->get_ysize()/2 - 100/2);
+ int x = (fgGetInt("/sim/startup/xsize")/2 - 400/2);
+ int y = (fgGetInt("/sim/startup/ysize")/2 - 100/2);
dialogBox = new puDialogBox (x, y); // 150, 50
{
dialogFrame = new puFrame (0,0,400,100);
// printf("ConfirmExitDialogInit\n");
int len = 200 - puGetStringWidth( puGetDefaultLabelFont(), msg )/2;
- int x = (globals->get_options()->get_xsize()/2 - 400/2);
- int y = (globals->get_options()->get_ysize()/2 - 100/2);
+ int x = (fgGetInt("/sim/startup/xsize")/2 - 400/2);
+ int y = (fgGetInt("/sim/startup/ysize")/2 - 100/2);
YNdialogBox = new puDialogBox (x, y); // 150, 50
// YNdialogBox = new puDialogBox (150, 50);
# endif
#endif
-#if !defined(WIN32)
- string url = "http://www.flightgear.org/Docs/InstallGuide/getstart.html";
+ SGPath path( globals->get_fg_root() );
+ path.append( "Docs/index.html" );
+ string help_app = fgGetString("/sim/startup/browser-app");
+
if ( system("xwininfo -name Netscape > /dev/null 2>&1") == 0 ) {
- command = "netscape -remote \"openURL(" + url + ")\" &";
+ command = help_app + " -remote \"openURL(" + path.str() + ")\"";
} else {
- command = "netscape " + url + " &";
+ command = help_app + " " + path.str();
}
-#else
- command = "webrun.bat";
+#if !defined(WIN32)
+ command += " &";
#endif
system( command.c_str() );
- //string text = "Help started in netscape window.";
-
- //mkDialog (text.c_str());
mkDialog ("Help started in netscape window.");
}
+#define TR_HIRES_SNAP
+#if defined( TR_HIRES_SNAP)
+#include <simgear/screen/tr.h>
+extern void trRenderFrame( void );
+extern void fgUpdateHUD( GLfloat x_start, GLfloat y_start,
+ GLfloat x_end, GLfloat y_end );
+
+void fgHiResDump()
+{
+ FILE *f;
+ string message;
+ bool show_pu_cursor = false;
+ bool show_menu = false;
+ char *filename = new char [24];
+ static int count = 1;
+
+ int freeze = globals->get_freeze();
+ if(!freeze)
+ globals->set_freeze( true );
+
+ if(gui_menu_on) {
+ show_menu = true;
+ guiToggleMenu();
+ }
+
+ if ( !puCursorIsHidden() ) {
+ show_pu_cursor = true;
+ puHideCursor();
+ }
+
+ fgInitVisuals();
+ fgReshape( fgGetInt("/sim/startup/xsize"),
+ fgGetInt("/sim/startup/ysize") );
+
+ // we need two render frames here to clear the menu and cursor
+ // ... not sure why but doing an extra fgRenderFrame() shouldn't
+ // hurt anything
+ fgRenderFrame();
+ fgRenderFrame();
+
+ // Make sure we have SSG projection primed for current view
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ ssgSetCamera( (sgVec4 *)globals->get_current_view()->get_VIEW() );
+ float fov = globals->get_current_view()->get_fov();
+ ssgSetFOV(fov, fov * globals->get_current_view()->get_win_ratio());
+ // ssgSetNearFar( 10.0f, 120000.0f );
+ ssgSetNearFar( 0.5f, 1200000.0f );
+
+
+ // This ImageSize stuff is a temporary hack
+ // should probably use 128x128 tile size and
+ // support any image size
+
+ // This should be a requester to get multiplier from user
+ int multiplier = 3;
+ int width = fgGetInt("/sim/startup/xsize");
+ int height = fgGetInt("/sim/startup/ysize");
+
+ /* allocate buffer large enough to store one tile */
+ GLubyte *tile = (GLubyte *)malloc(width * height * 3 * sizeof(GLubyte));
+ if (!tile) {
+ printf("Malloc of tile buffer failed!\n");
+ return;
+ }
+
+ int imageWidth = multiplier*width;
+ int imageHeight = multiplier*height;
+
+ /* allocate buffer to hold a row of tiles */
+ GLubyte *buffer
+ = (GLubyte *)malloc(imageWidth * height * 3 * sizeof(GLubyte));
+ if (!buffer) {
+ free(tile);
+ printf("Malloc of tile row buffer failed!\n");
+ return;
+ }
+ TRcontext *tr = trNew();
+ trTileSize(tr, width, height, 0);
+ trTileBuffer(tr, GL_RGB, GL_UNSIGNED_BYTE, tile);
+ trImageSize(tr, imageWidth, imageHeight);
+ trRowOrder(tr, TR_TOP_TO_BOTTOM);
+ sgFrustum *frustum = ssgGetFrustum();
+ trFrustum(tr,
+ frustum->getLeft(), frustum->getRight(),
+ frustum->getBot(), frustum->getTop(),
+ frustum->getNear(), frustum->getFar());
+
+ /* Prepare ppm output file */
+ while (count < 1000) {
+ snprintf(filename, 24, "fgfs-screen-%03d.ppm", count++);
+ if ( (f = fopen(filename, "r")) == NULL )
+ break;
+ fclose(f);
+ }
+ f = fopen(filename, "wb");
+ if (!f) {
+ printf("Couldn't open image file: %s\n", filename);
+ free(buffer);
+ free(tile);
+ return;
+ }
+ fprintf(f,"P6\n");
+ fprintf(f,"# ppm-file created by %s\n", "trdemo2");
+ fprintf(f,"%i %i\n", imageWidth, imageHeight);
+ fprintf(f,"255\n");
+
+ /* just to be safe... */
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ /* Because the HUD and Panel change the ViewPort we will
+ * need to handle some lowlevel stuff ourselves */
+ int ncols = trGet(tr, TR_COLUMNS);
+ int nrows = trGet(tr, TR_ROWS);
+
+ bool do_hud = fgGetBool("/sim/hud/visibility");
+ GLfloat hud_col_step = 640.0 / ncols;
+ GLfloat hud_row_step = 480.0 / nrows;
+
+ bool do_panel = fgPanelVisible();
+ GLfloat panel_col_step = current_panel->getWidth() / ncols;
+ GLfloat panel_row_step = current_panel->getHeight() / nrows;
+
+ /* Draw tiles */
+ int more = 1;
+ while (more) {
+ trBeginTile(tr);
+ int curColumn = trGet(tr, TR_CURRENT_COLUMN);
+ int curRow = trGet(tr, TR_CURRENT_ROW);
+ trRenderFrame();
+ if ( do_hud )
+ fgUpdateHUD( curColumn*hud_col_step, curRow*hud_row_step,
+ (curColumn+1)*hud_col_step, (curRow+1)*hud_row_step );
+ if (do_panel)
+ current_panel->update( curColumn*panel_col_step, panel_col_step,
+ curRow*panel_row_step, panel_row_step );
+ more = trEndTile(tr);
+
+ /* save tile into tile row buffer*/
+ int curTileWidth = trGet(tr, TR_CURRENT_TILE_WIDTH);
+ int bytesPerImageRow = imageWidth * 3*sizeof(GLubyte);
+ int bytesPerTileRow = (width) * 3*sizeof(GLubyte);
+ int xOffset = curColumn * bytesPerTileRow;
+ int bytesPerCurrentTileRow = (curTileWidth) * 3*sizeof(GLubyte);
+ int i;
+ for (i=0;i<height;i++) {
+ memcpy(buffer + i*bytesPerImageRow + xOffset, /* Dest */
+ tile + i*bytesPerTileRow, /* Src */
+ bytesPerCurrentTileRow); /* Byte count*/
+ }
+
+ if (curColumn == trGet(tr, TR_COLUMNS)-1) {
+ /* write this buffered row of tiles to the file */
+ int curTileHeight = trGet(tr, TR_CURRENT_TILE_HEIGHT);
+ int bytesPerImageRow = imageWidth * 3*sizeof(GLubyte);
+ int i;
+ for (i=0;i<curTileHeight;i++) {
+ /* Remember, OpenGL images are bottom to top. Have to reverse. */
+ GLubyte *rowPtr = buffer + (curTileHeight-1-i) * bytesPerImageRow;
+ fwrite(rowPtr, 1, imageWidth*3, f);
+ }
+ }
+
+ }
+
+ fgReshape( width, height );
+
+ trDelete(tr);
+
+ fclose(f);
+
+ message = "Snap shot saved to ";
+ message += filename;
+ mkDialog (message.c_str());
+
+ free(tile);
+ free(buffer);
+
+ // message = "Snap shot saved to ";
+ // message += filename;
+ // mkDialog (message.c_str());
+
+ delete [] filename;
+
+ if( show_menu )
+ guiToggleMenu();
+
+ if ( show_pu_cursor ) {
+ puShowCursor();
+ }
+
+ if(!freeze)
+ globals->set_freeze( false );
+}
+#endif // #if defined( TR_HIRES_SNAP)
+
+
#if defined( WIN32 ) && !defined( __CYGWIN__)
static void rotateView( double roll, double pitch, double yaw )
extern FGInterface cur_view_fdm;
GLubyte *hiResScreenCapture( int multiplier )
{
- float oldfov = globals->get_options()->get_fov();
+ float oldfov = fgGetDouble("/sim/field-of-view");
float fov = oldfov / multiplier;
FGViewer *v = globals->get_current_view();
- globals->get_options()->set_fov(fov);
+ fgSetDouble("/sim/field-of-view", fov);
fgInitVisuals();
- int cur_width = globals->get_options()->get_xsize( );
- int cur_height = globals->get_options()->get_ysize( );
+ int cur_width = fgGetInt("/sim/startup/xsize");
+ int cur_height = fgGetInt("/sim/startup/ysize");
if (b1) delete( b1 );
// New empty (mostly) bitmap
b1 = new GlBitmap( GL_RGB, 1, 1, (unsigned char *)"123" );
b1->copyBitmap( &b2, cur_width*x, cur_height*y );
}
}
- globals->get_options()->set_fov(oldfov);
+ fgSetDouble("/sim/field-of-view", oldfov);
return b1->getBitmap();
}
#endif
mainMenuBar->hide();
CGlPrinter p( CGlPrinter::PRINT_BITMAP );
- int cur_width = globals->get_options()->get_xsize( );
- int cur_height = globals->get_options()->get_ysize( );
+ int cur_width = fgGetInt("/sim/startup/xsize");
+ int cur_height = fgGetInt("/sim/startup/ysize");
p.Begin( "FlightGear", cur_width*3, cur_height*3 );
p.End( hiResScreenCapture(3) );
}
+void dumpHiResSnapShot ( puObject *obj ) {
+ fgHiResDump();
+}
+
+
// do a screen snap shot
void fgDumpSnapShot () {
bool show_pu_cursor = false;
+ char *filename = new char [24];
+ string message;
+ static int count = 1;
int freeze = globals->get_freeze();
if(!freeze)
}
fgInitVisuals();
- fgReshape( globals->get_options()->get_xsize(),
- globals->get_options()->get_ysize() );
+ fgReshape( fgGetInt("/sim/startup/xsize"),
+ fgGetInt("/sim/startup/ysize") );
// we need two render frames here to clear the menu and cursor
- // ... not sure why but doing an extra fgFenderFrame() shoulnd't
+ // ... not sure why but doing an extra fgRenderFrame() shouldn't
// hurt anything
fgRenderFrame();
fgRenderFrame();
- my_glDumpWindow( "fgfs-screen.ppm",
- globals->get_options()->get_xsize(),
- globals->get_options()->get_ysize() );
-
- mkDialog ("Snap shot saved to fgfs-screen.ppm");
+ while (count < 1000) {
+ FILE *fp;
+ snprintf(filename, 24, "fgfs-screen-%03d.ppm", count++);
+ if ( (fp = fopen(filename, "r")) == NULL )
+ break;
+ fclose(fp);
+ }
+
+ if ( sg_glDumpWindow( filename,
+ fgGetInt("/sim/startup/xsize"),
+ fgGetInt("/sim/startup/ysize")) ) {
+ message = "Snap shot saved to ";
+ message += filename;
+ } else {
+ message = "Failed to save to ";
+ message += filename;
+ }
+
+ mkDialog (message.c_str());
+
+ delete [] filename;
if ( show_pu_cursor ) {
puShowCursor();
"Print",
#endif
"Snap Shot",
+ "Hires Snap Shot",
"---------",
"Reset",
"Load flight",
#endif
/* NULL, notCb, */
dumpSnapShot,
+ dumpHiResSnapShot,
NULL,
reInit,
loadFlight,
extern void fgHUDalphaAdjust( puObject * );
char *viewSubmenu [] = {
"HUD Alpha",
+ "Pilot Offset",
/* "Cockpit View > ", "View >","------------", */
"Toggle Panel...", NULL
};
puCallback viewSubmenuCb [] = {
fgHUDalphaAdjust,
+ PilotOffsetAdjust,
/* notCb, notCb, NULL, */
guiTogglePanel, NULL
};
gui_msg_RESET = msg_RESET; // "RESET"
// Next check home directory
- FGPath fntpath;
+ SGPath fntpath;
char* envp = ::getenv( "FG_FONTS" );
if ( envp != NULL ) {
fntpath.set( envp );
} else {
- fntpath.set( globals->get_options()->get_fg_root() );
+ fntpath.set( globals->get_fg_root() );
fntpath.append( "Fonts" );
}
puSetDefaultFonts( GuiFont, GuiFont ) ;
guiFnt = puGetDefaultLabelFont();
- if ( globals->get_options()->get_mouse_pointer() == 0 ) {
+ if (!fgHasNode("/sim/startup/mouse-pointer")) {
// no preference specified for mouse pointer, attempt to autodetect...
// Determine if we need to render the cursor, or if the windowing
// system will do it. First test if we are rendering with glide.
}
}
// mouse_active = ~mouse_active;
- } else if ( globals->get_options()->get_mouse_pointer() == 1 ) {
+ } else if ( !fgGetBool("/sim/startup/mouse-pointer") ) {
// don't show pointer
- } else if ( globals->get_options()->get_mouse_pointer() == 2 ) {
+ } else {
// force showing pointer
puShowCursor();
// mouse_active = ~mouse_active;
mainMenuBar -> add_submenu ("Autopilot", autopilotSubmenu, autopilotSubmenuCb);
// mainMenuBar -> add_submenu ("Options", optionsSubmenu, optionsSubmenuCb);
#ifdef FG_NETWORK_OLK
- if ( globals->get_options()->get_network_olk() ) {
+ if ( fgGetBool("/sim/networking/network-olk") ) {
mainMenuBar -> add_submenu ("Network", networkSubmenu, networkSubmenuCb);
}
#endif