* Written 1998 by Durk Talsma, started Juni, 1998. For the flight gear
* project.
*
+ * Additional mouse supported added by David Megginson, 1999.
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
# include <config.h>
#endif
-#include <Include/compiler.h>
+#include <simgear/compiler.h>
-#ifdef FG_MATH_EXCEPTION_CLASH
+#ifdef SG_MATH_EXCEPTION_CLASH
# include <math.h>
#endif
#endif
#include <GL/glut.h>
-#include <XGL/xgl.h>
+#include <GL/gl.h>
#if defined(FX) && defined(XMESA)
# include <GL/xmesa.h>
#endif
+#include STL_FSTREAM
#include STL_STRING
#include <stdlib.h>
#include <string.h>
+#include <simgear/constants.h>
+#include <simgear/debug/logstream.hxx>
+#include <simgear/misc/sg_path.hxx>
+#include <simgear/screen/screen-dump.hxx>
+
#include <Include/general.hxx>
-#include <Debug/logstream.hxx>
#include <Aircraft/aircraft.hxx>
#include <Airports/simple.hxx>
+#include <Autopilot/auto_gui.hxx>
+#include <Autopilot/newauto.hxx>
#include <Cockpit/panel.hxx>
+#include <Controls/controls.hxx>
#include <FDM/flight.hxx>
-#include <Main/options.hxx>
#include <Main/fg_init.hxx>
-#include <Main/views.hxx>
-#include <Misc/fgpath.hxx>
-#include <Network/network.h>
-#include <Time/fg_time.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>
+#endif
+
+#if defined( WIN32 ) && !defined( __CYGWIN__ )
+# include <simgear/screen/win32-printer.h>
+# include <simgear/screen/GlBitmaps.h>
+#endif
#include "gui.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
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif /* _MSC_VER */
+
+// main.cxx hack, should come from an include someplace
+extern void fgInitVisuals( void );
+extern void fgReshape( int width, int height );
+extern void fgRenderFrame( void );
+
puFont guiFnt = 0;
fntTexFont *guiFntHandle = 0;
-
+int gui_menu_on = 0;
static puMenuBar *mainMenuBar = 0;
//static puButton *hideMenuButton = 0;
static char global_dialog_string[256];
-extern void NewAltitude( puObject *cb );
-extern void NewHeading( puObject *cb );
-extern void fgAPAdjust( puObject * );
+// from cockpit.cxx
extern void fgLatLonFormatToggle( puObject *);
-/* --------------------------------------------------------------------
-Mouse stuff
----------------------------------------------------------------------*/
-
-static int _mX = 0;
-static int _mY = 0;
-static int last_buttons = 0 ;
-static int mouse_active = 0;
-static int menu_on = 0;
-
-void guiMotionFunc ( int x, int y )
-{
- _mX = x;
- _mY = y;
- puMouse ( x, y ) ;
- glutPostRedisplay () ;
-}
-
-void guiMouseFunc(int button, int updown, int x, int y)
-{
- _mX = x;
- _mY = y;
- if ( updown == PU_DOWN )
- last_buttons |= ( 1 << button ) ;
- else
- last_buttons &= ~( 1 << button ) ;
- puMouse (button, updown, x,y);
- glutPostRedisplay ();
-}
-
-int guiGetMouseButton(void)
-{
- return last_buttons;
-}
-
-void guiGetMouse(int *x, int *y)
-{
- *x = _mX;
- *y = _mY;
-};
-
-static inline void TurnCursorOn( void )
-{
- mouse_active = ~0;
-#if defined ( WIN32 ) || defined(__CYGWIN32__)
- glutSetCursor(GLUT_CURSOR_INHERIT);
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
- glutWarpPointer( glutGet(GLUT_SCREEN_WIDTH)/2, glutGet(GLUT_SCREEN_HEIGHT)/2);
-#endif
-}
-
-static inline void TurnCursorOff( void )
-{
- mouse_active = 0;
-#if defined ( WIN32 ) || defined(__CYGWIN32__)
- glutSetCursor(GLUT_CURSOR_NONE);
-#else // I guess this is what we want to do ??
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
- glutWarpPointer( glutGet(GLUT_SCREEN_WIDTH), glutGet(GLUT_SCREEN_HEIGHT));
-#endif
-#endif
-}
-
-void maybeToggleMouse( void )
-{
-#ifdef WIN32
- static int first_time = ~0;
- static int mouse_changed = 0;
-
- if ( first_time ) {
- if(!mouse_active) {
- mouse_changed = ~mouse_changed;
- TurnCursorOn();
- }
- } else {
- if( mouse_changed ) {
- mouse_changed = ~mouse_changed;
- if(mouse_active) {
- TurnCursorOff();
- }
- }
- }
- first_time = ~first_time;
-#endif // #ifdef WIN32
-}
-// Call with FALSE to init and TRUE to restore
-void BusyCursor( int restore )
-{
- static int cursor = 0;
- if( restore ) {
- glutSetCursor(cursor);
- } else {
- cursor = glutGet( GLUT_WINDOW_CURSOR );
-#ifdef WIN32
- TurnCursorOn();
-#endif
- glutSetCursor( GLUT_CURSOR_WAIT );
- }
-}
/* ================ General Purpose Functions ================ */
// Intercept the Escape Key
FG_PUSH_PUI_DIALOG( dialogBox );
}
-// Repair any damage done to the Panel by other Gui Items
-void guiFixPanel( void )
-{
- int toggle_pause;
-
- if ( current_options.get_panel_status() ) {
- FGView *v = ¤t_view;
- FGTime *t = FGTime::cur_time_params;
-
- if( (toggle_pause = !t->getPause()) )
- t->togglePauseMode();
-
- // this seems to be the only way to do this :-(
- // problem is the viewport has been mucked with
- xglViewport(0, 0 , (GLint)(v->winWidth), (GLint)(v->winHeight) );
- FGPanel::OurPanel->ReInit(0, 0, 1024, 768);
-
- if(toggle_pause)
- t->togglePauseMode();
- }
-}
-
// Toggle the Menu and Mouse display state
void guiToggleMenu(void)
{
- if( menu_on ) {
+ if( gui_menu_on ) {
// printf("Hiding Menu\n");
mainMenuBar->hide ();
-#ifdef WIN32
- TurnCursorOff();
-#endif // #ifdef WIN32
+#if defined(WIN32_CURSOR_TWEAKS)
+ if( mouse_mode == MOUSE_POINTER )
+ TurnCursorOff();
+#endif // #ifdef WIN32_CURSOR_TWEAKS
} else {
// printf("Showing Menu\n");
mainMenuBar->reveal();
TurnCursorOn();
#endif // #ifdef WIN32
}
- menu_on = ~menu_on;
+ gui_menu_on = ~gui_menu_on;
}
/* -----------------------------------------------------------------------
the Gui callback functions
____________________________________________________________________*/
-void reInit(puObject *cb)
+
+// Hier Neu :-) This is my newly added code
+// Added by David Findlay <nedz@bigpond.com>
+// on Sunday 3rd of December
+
+// Start new Save Dialog Box
+static puDialogBox *SaveDialog = 0;
+static puFrame *SaveDialogFrame = 0;
+static puText *SaveDialogMessage = 0;
+static puInput *SaveDialogInput = 0;
+
+static puOneShot *SaveDialogOkButton = 0;
+static puOneShot *SaveDialogCancelButton = 0;
+// static puOneShot *SaveDialogResetButton = 0;
+
+// Default save filename
+static char saveFile[256] = "fgfs.sav";
+
+// Cancel Button
+void SaveDialogCancel(puObject *) {
+ FG_POP_PUI_DIALOG( SaveDialog );
+}
+
+// If press OK do this
+void SaveDialogOk(puObject*) {
+
+ FG_POP_PUI_DIALOG( SaveDialog );
+
+ char *s;
+ SaveDialogInput->getValue(&s);
+
+ ofstream output(s);
+ cout << saveFile << endl;
+ if (output.good() && fgSaveFlight(output)) {
+ output.close();
+ mkDialog("Saved flight");
+ SG_LOG(SG_INPUT, SG_INFO, "Saved flight");
+ } else {
+ mkDialog("Cannot save flight");
+ SG_LOG(SG_INPUT, SG_ALERT, "Cannot save flight");
+ }
+}
+
+// Create Dialog
+static void saveFlight(puObject *cv) {
+ SaveDialog = new puDialogBox (150, 50);
+ {
+ SaveDialogFrame = new puFrame (0,0,350, 150);
+ SaveDialogMessage = new puText (
+ (150 - puGetStringWidth( puGetDefaultLabelFont(), "File Name:" ) / 2), 110);
+ SaveDialogMessage -> setLabel ("File Name:");
+
+ SaveDialogInput = new puInput (50, 70, 300, 100);
+ SaveDialogInput -> setValue (saveFile);
+ SaveDialogInput -> acceptInput();
+
+ SaveDialogOkButton = new puOneShot (50, 10, 110, 50);
+ SaveDialogOkButton -> setLegend (gui_msg_OK);
+ SaveDialogOkButton -> setCallback ( SaveDialogOk );
+ SaveDialogOkButton -> makeReturnDefault(TRUE);
+
+ SaveDialogCancelButton = new puOneShot (140, 10, 210, 50);
+ SaveDialogCancelButton -> setLegend (gui_msg_CANCEL);
+ SaveDialogCancelButton -> setCallback ( SaveDialogCancel );
+ }
+ FG_FINALIZE_PUI_DIALOG( SaveDialog );
+
+ SaveDialog -> reveal();
+}
+
+// Load Dialog Start
+static puDialogBox *LoadDialog = 0;
+static puFrame *LoadDialogFrame = 0;
+static puText *LoadDialogMessage = 0;
+static puInput *LoadDialogInput = 0;
+
+static puOneShot *LoadDialogOkButton = 0;
+static puOneShot *LoadDialogCancelButton = 0;
+// static puOneShot *LoadDialogResetButton = 0;
+
+// Default load filename
+static char loadFile[256] = "fgfs.sav";
+
+// Do this if the person click okay
+void LoadDialogOk(puObject *) {
+
+ FG_POP_PUI_DIALOG( LoadDialog );
+
+ char *l;
+ LoadDialogInput->getValue(&l);
+
+ ifstream input(l);
+ if (input.good() && fgLoadFlight(input)) {
+ input.close();
+ mkDialog("Loaded flight");
+ SG_LOG(SG_INPUT, SG_INFO, "Restored flight");
+ } else {
+ mkDialog("Failed to load flight");
+ SG_LOG(SG_INPUT, SG_ALERT, "Cannot load flight");
+ }
+}
+
+// Do this is the person presses cancel
+void LoadDialogCancel(puObject *) {
+ FG_POP_PUI_DIALOG( LoadDialog );
+}
+
+// Create Load Dialog
+static void loadFlight(puObject *cb)
{
- BusyCursor(0);
- fgReInitSubsystems();
- BusyCursor(1);
+ LoadDialog = new puDialogBox (150, 50);
+ {
+ LoadDialogFrame = new puFrame (0,0,350, 150);
+ LoadDialogMessage = new puText (
+ (150 - puGetStringWidth( puGetDefaultLabelFont(), "File Name:" ) / 2), 110);
+ LoadDialogMessage -> setLabel ("File Name:");
+
+ LoadDialogInput = new puInput (50, 70, 300, 100);
+ LoadDialogInput -> setValue (loadFile);
+ LoadDialogInput -> acceptInput();
+
+ LoadDialogOkButton = new puOneShot (50, 10, 110, 50);
+ LoadDialogOkButton -> setLegend (gui_msg_OK);
+ LoadDialogOkButton -> setCallback ( LoadDialogOk );
+ LoadDialogOkButton -> makeReturnDefault(TRUE);
+
+ LoadDialogCancelButton = new puOneShot (140, 10, 210, 50);
+ LoadDialogCancelButton -> setLegend (gui_msg_CANCEL);
+ LoadDialogCancelButton -> setCallback ( LoadDialogCancel );
+ }
+ FG_FINALIZE_PUI_DIALOG( LoadDialog );
+
+ LoadDialog -> reveal();
}
-
+
// This is the accessor function
void guiTogglePanel(puObject *cb)
{
- current_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;
- // if(gps_bug)
- // fclose(gps_bug);
+#ifdef FG_NETWORK_OLK
+ if ( fgGetBool("/sim/networking/network-olk") ) {
+ if ( net_is_registered == 0 ) fgd_send_com( "8", FGFS_host);
+ }
+#endif
+
+ // close all external I/O connections
+ fgIOShutdownAll();
- exit(-1);
+ exit(0);
}
void mkDialogInit (void)
{
// printf("mkDialogInit\n");
- int x = (current_options.get_xsize()/2 - 400/2);
- int y = (current_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 = (current_options.get_xsize()/2 - 400/2);
- int y = (current_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);
YNdialogBoxOkButton = new puOneShot (100, 10, 160, 50);
YNdialogBoxOkButton -> setLegend (gui_msg_OK);
+ YNdialogBoxOkButton -> makeReturnDefault (TRUE );
YNdialogBoxOkButton -> setCallback (goodBye);
YNdialogBoxNoButton = new puOneShot (240, 10, 300, 50);
YNdialogBoxNoButton -> setLegend (gui_msg_NO);
- // YNdialogBoxNoButton -> makeReturnDefault (TRUE );
YNdialogBoxNoButton -> setCallback (goAwayYesNoCb);
}
FG_FINALIZE_PUI_DIALOG( YNdialogBox );
# 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.");
}
-/// The beginnings of teleportation :-)
-// Needs cleaning up but works
-// These statics should disapear when this is a class
-static puDialogBox *AptDialog = 0;
-static puFrame *AptDialogFrame = 0;
-static puText *AptDialogMessage = 0;
-static puInput *AptDialogInput = 0;
+#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 );
-static char NewAirportId[16];
-static char NewAirportLabel[] = "Enter New Airport ID";
+void fgHiResDump()
+{
+ FILE *f;
+ string message;
+ bool show_pu_cursor = false;
+ bool show_menu = false;
+ char *filename = new char [24];
+ static int count = 1;
-static puOneShot *AptDialogOkButton = 0;
-static puOneShot *AptDialogCancelButton = 0;
-static puOneShot *AptDialogResetButton = 0;
+ int freeze = globals->get_freeze();
+ if(!freeze)
+ globals->set_freeze( true );
-void AptDialog_Cancel(puObject *)
-{
- FG_POP_PUI_DIALOG( AptDialog );
-}
+ if(gui_menu_on) {
+ show_menu = true;
+ guiToggleMenu();
+ }
+
+ if ( !puCursorIsHidden() ) {
+ show_pu_cursor = true;
+ puHideCursor();
+ }
-void AptDialog_OK (puObject *)
-{
- string AptId;
-
- FGTime *t = FGTime::cur_time_params;
- int PauseMode = t->getPause();
- if(!PauseMode)
- t->togglePauseMode();
+ 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 );
- char *s;
- AptDialogInput->getValue(&s);
- AptId = s;
-
- AptDialog_Cancel( NULL );
-
- if ( AptId.length() ) {
- // set initial position from airport id
- fgAIRPORTS airports;
- fgAIRPORT a;
-
- FG_LOG( FG_GENERAL, FG_INFO,
- "Attempting to set starting position from airport code "
- << s );
-
- airports.load("apt_simple");
- if ( airports.search( AptId, &a ) )
- {
- current_options.set_airport_id( AptId.c_str() );
- BusyCursor(0);
- fgReInitSubsystems();
- BusyCursor(1);
- } else {
- AptId += " not in database.";
- mkDialog(AptId.c_str());
+
+ // 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);
+ }
}
+
}
- if( PauseMode != t->getPause() )
- t->togglePauseMode();
-}
-void AptDialog_Reset(puObject *)
-{
- // strncpy( NewAirportId, current_options.get_airport_id().c_str(), 16 );
- sprintf( NewAirportId, "%s", current_options.get_airport_id().c_str() );
- AptDialogInput->setValue ( NewAirportId );
- AptDialogInput->setCursor( 0 ) ;
-}
+ fgReshape( width, height );
-void NewAirport(puObject *cb)
-{
- // strncpy( NewAirportId, current_options.get_airport_id().c_str(), 16 );
- sprintf( NewAirportId, "%s", current_options.get_airport_id().c_str() );
- AptDialogInput->setValue( NewAirportId );
+ trDelete(tr);
- FG_PUSH_PUI_DIALOG( AptDialog );
-}
+ fclose(f);
-static void NewAirportInit(void)
-{
- sprintf( NewAirportId, "%s", current_options.get_airport_id().c_str() );
- int len = 150 - puGetStringWidth( puGetDefaultLabelFont(),
- NewAirportLabel ) / 2;
+ message = "Snap shot saved to ";
+ message += filename;
+ mkDialog (message.c_str());
- AptDialog = new puDialogBox (150, 50);
- {
- AptDialogFrame = new puFrame (0,0,350, 150);
- AptDialogMessage = new puText (len, 110);
- AptDialogMessage -> setLabel (NewAirportLabel);
-
- AptDialogInput = new puInput (50, 70, 300, 100);
- AptDialogInput -> setValue (NewAirportId);
- AptDialogInput -> acceptInput();
-
- AptDialogOkButton = new puOneShot (50, 10, 110, 50);
- AptDialogOkButton -> setLegend (gui_msg_OK);
- AptDialogOkButton -> setCallback (AptDialog_OK);
- AptDialogOkButton -> makeReturnDefault(TRUE);
-
- AptDialogCancelButton = new puOneShot (140, 10, 210, 50);
- AptDialogCancelButton -> setLegend (gui_msg_CANCEL);
- AptDialogCancelButton -> setCallback (AptDialog_Cancel);
-
- AptDialogResetButton = new puOneShot (240, 10, 300, 50);
- AptDialogResetButton -> setLegend (gui_msg_RESET);
- AptDialogResetButton -> setCallback (AptDialog_Reset);
+ 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();
}
- FG_FINALIZE_PUI_DIALOG( AptDialog );
-}
-/// The beginnings of networking :-)
-// Needs cleaning up but works
-// These statics should disapear when this is a class
-static puDialogBox *NetIdDialog = 0;
-static puFrame *NetIdDialogFrame = 0;
-static puText *NetIdDialogMessage = 0;
-static puInput *NetIdDialogInput = 0;
+ if(!freeze)
+ globals->set_freeze( false );
+}
+#endif // #if defined( TR_HIRES_SNAP)
-static char NewNetId[16];
-static char NewNetIdLabel[] = "Enter New Callsign";
-static puOneShot *NetIdDialogOkButton = 0;
-static puOneShot *NetIdDialogCancelButton = 0;
+#if defined( WIN32 ) && !defined( __CYGWIN__)
-void NetIdDialog_Cancel(puObject *)
+static void rotateView( double roll, double pitch, double yaw )
{
- FG_POP_PUI_DIALOG( NetIdDialog );
+ // rotate view
}
-void NetIdDialog_OK (puObject *)
+static GlBitmap *b1 = NULL;
+extern FGInterface cur_view_fdm;
+GLubyte *hiResScreenCapture( int multiplier )
{
- string NetId;
-
- FGTime *t = FGTime::cur_time_params;
- int PauseMode = t->getPause();
- if(!PauseMode)
- t->togglePauseMode();
+ float oldfov = fgGetDouble("/sim/field-of-view");
+ float fov = oldfov / multiplier;
+ FGViewer *v = globals->get_current_view();
+ fgSetDouble("/sim/field-of-view", fov);
+ fgInitVisuals();
+ 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" );
+ int x,y;
+ for ( y = 0; y < multiplier; y++ ) {
+ for ( x = 0; x < multiplier; x++ ) {
+ fgReshape( cur_width, cur_height );
+ // pan to tile
+ rotateView( 0, (y*fov)-((multiplier-1)*fov/2), (x*fov)-((multiplier-1)*fov/2) );
+ fgRenderFrame();
+ // restore view
+ GlBitmap b2;
+ b1->copyBitmap( &b2, cur_width*x, cur_height*y );
+ }
+ }
+ fgSetDouble("/sim/field-of-view", oldfov);
+ return b1->getBitmap();
+}
+#endif
- char *s;
- NetIdDialogInput->getValue(&s);
- NetId = s;
-
- NetIdDialog_Cancel( NULL );
- current_options.set_net_id( NetId.c_str() );
- net_hud_display = 1;
- if( PauseMode != t->getPause() )
- t->togglePauseMode();
+#if defined( WIN32 ) && !defined( __CYGWIN__)
+// win32 print screen function
+void printScreen ( puObject *obj ) {
+ bool show_pu_cursor = false;
+ TurnCursorOff();
+ if ( !puCursorIsHidden() ) {
+ show_pu_cursor = true;
+ puHideCursor();
+ }
+ BusyCursor( 0 );
+ mainMenuBar->hide();
+
+ CGlPrinter p( CGlPrinter::PRINT_BITMAP );
+ 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) );
+
+ if( gui_menu_on ) {
+ mainMenuBar->reveal();
+ }
+ BusyCursor(1);
+ if ( show_pu_cursor ) {
+ puShowCursor();
+ }
+ TurnCursorOn();
}
+#endif // #ifdef WIN32
-void NewCallSign(puObject *cb)
-{
- sprintf( NewNetId, "%s", current_options.get_net_id().c_str() );
- NetIdDialogInput->setValue( NewNetId );
- FG_PUSH_PUI_DIALOG( NetIdDialog );
+void dumpSnapShot ( puObject *obj ) {
+ fgDumpSnapShot();
}
-static void NewNetIdInit(void)
-{
- sprintf( NewNetId, "%s", current_options.get_net_id().c_str() );
- int len = 150 - puGetStringWidth( puGetDefaultLabelFont(),
- NewNetIdLabel ) / 2;
- NetIdDialog = new puDialogBox (150, 50);
- {
- NetIdDialogFrame = new puFrame (0,0,350, 150);
- NetIdDialogMessage = new puText (len, 110);
- NetIdDialogMessage -> setLabel (NewNetIdLabel);
+void dumpHiResSnapShot ( puObject *obj ) {
+ fgHiResDump();
+}
- NetIdDialogInput = new puInput (50, 70, 300, 100);
- NetIdDialogInput -> setValue (NewNetId);
- NetIdDialogInput -> acceptInput();
- NetIdDialogOkButton = new puOneShot (50, 10, 110, 50);
- NetIdDialogOkButton -> setLegend (gui_msg_OK);
- NetIdDialogOkButton -> setCallback (NetIdDialog_OK);
- NetIdDialogOkButton -> makeReturnDefault(TRUE);
+// do a screen snap shot
+void fgDumpSnapShot () {
+ bool show_pu_cursor = false;
+ char *filename = new char [24];
+ string message;
+ static int count = 1;
- NetIdDialogCancelButton = new puOneShot (240, 10, 300, 50);
- NetIdDialogCancelButton -> setLegend (gui_msg_CANCEL);
- NetIdDialogCancelButton -> setCallback (NetIdDialog_Cancel);
+ int freeze = globals->get_freeze();
+ if(!freeze)
+ globals->set_freeze( true );
+ mainMenuBar->hide();
+ TurnCursorOff();
+ if ( !puCursorIsHidden() ) {
+ show_pu_cursor = true;
+ puHideCursor();
}
- FG_FINALIZE_PUI_DIALOG( NetIdDialog );
+
+ 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();
+
+ 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();
+ }
+
+ TurnCursorOn();
+ if( gui_menu_on ) {
+ mainMenuBar->reveal();
+ }
+
+ if(!freeze)
+ globals->set_freeze( false );
}
+#ifdef FG_NETWORK_OLK
static void net_display_toggle( puObject *cb)
{
net_hud_display = (net_hud_display) ? 0 : 1;
+ printf("Toggle net_hud_display : %d\n", net_hud_display);
}
-/*************** End Networking **************/
+static void net_register( puObject *cb)
+{
+ fgd_send_com( "1", FGFS_host );
+ net_is_registered = 0;
+ printf("Registering to deamon\n");
+}
+static void net_unregister( puObject *cb)
+{
+ fgd_send_com( "8", FGFS_host );
+ net_is_registered = -1;
+ printf("Unregistering from deamon\n");
+}
+extern void net_fgd_scan(puObject *cb);
+#endif // #ifdef FG_NETWORK_OLK
/* -----------------------------------------------------------------------
The menu stuff
---------------------------------------------------------------------*/
char *fileSubmenu [] = {
- "Exit", "Close", "---------", "Print", "---------", "Save", "Reset", NULL
+ "Exit", /* "Close", "---------", */
+#if defined( WIN32 ) && !defined( __CYGWIN__)
+ "Print",
+#endif
+ "Snap Shot",
+ "Hires Snap Shot",
+ "---------",
+ "Reset",
+ "Load flight",
+ "Save flight",
+ NULL
};
puCallback fileSubmenuCb [] = {
- MayBeGoodBye, hideMenuCb, NULL, notCb, NULL, notCb, reInit, NULL
+ MayBeGoodBye, /* hideMenuCb, NULL, */
+#if defined( WIN32 ) && !defined( __CYGWIN__)
+ printScreen,
+#endif
+ /* NULL, notCb, */
+ dumpSnapShot,
+ dumpHiResSnapShot,
+ NULL,
+ reInit,
+ loadFlight,
+ saveFlight,
+ NULL
};
+/*
char *editSubmenu [] = {
"Edit text", NULL
};
puCallback editSubmenuCb [] = {
notCb, NULL
};
+*/
+extern void fgHUDalphaAdjust( puObject * );
char *viewSubmenu [] = {
- "Cockpit View > ", "View >","------------", "Toggle Panel...", NULL
+ "HUD Alpha",
+ "Pilot Offset",
+ /* "Cockpit View > ", "View >","------------", */
+ "Toggle Panel...", NULL
};
puCallback viewSubmenuCb [] = {
- notCb, notCb, NULL, guiTogglePanel, NULL
+ fgHUDalphaAdjust,
+ PilotOffsetAdjust,
+ /* notCb, notCb, NULL, */
+ guiTogglePanel, NULL
};
-char *aircraftSubmenu [] = {
- "Autopilot", "Heading", "Altitude", "Navigation", "Communication", NULL
+// "---------",
+
+char *autopilotSubmenu [] = {
+ "Toggle HUD Format", "Adjust AP Settings",
+ "---------",
+ "Clear Route", "Skip Current Waypoint", "Add Waypoint",
+ "---------",
+ "Set Altitude", "Set Heading",
+ NULL
};
-puCallback aircraftSubmenuCb [] = {
- fgAPAdjust, NewHeading, NewAltitude, fgLatLonFormatToggle, notCb, NULL
+
+puCallback autopilotSubmenuCb [] = {
+ fgLatLonFormatToggle, fgAPAdjust,
+ NULL,
+ ClearRoute, PopWayPoint, AddWayPoint,
+ NULL,
+ NewAltitude, NewHeading,
+ /* notCb, */ NULL
};
char *environmentSubmenu [] = {
- "Airport", "Terrain", "Weather", NULL
+ "Goto Airport", /* "Terrain", "Weather", */ NULL
};
puCallback environmentSubmenuCb [] = {
- NewAirport, notCb, notCb, NULL
+ NewAirport, /* notCb, notCb, */ NULL
};
+/*
char *optionsSubmenu [] = {
"Preferences", "Realism & Reliablity...", NULL
};
puCallback optionsSubmenuCb [] = {
notCb, notCb, NULL
};
+*/
#ifdef FG_NETWORK_OLK
char *networkSubmenu [] = {
- "Unregister from FGD ", "Send MSG to All", "Send MSG", "Show Pilots", "Register to FGD",
- "Scan for Deamons", "Enter Callsign", "Display Netinfos", "Toggle Display", NULL
+ "Unregister from FGD ", /* "Send MSG to All", "Send MSG", "Show Pilots", */
+ "Register to FGD",
+ "Scan for Deamons", "Enter Callsign", /* "Display Netinfos", */
+ "Toggle Display", NULL
};
puCallback networkSubmenuCb [] = {
- notCb, notCb, notCb, notCb, notCb, notCb, NewCallSign, notCb,
+ /* notCb, notCb, notCb, notCb, */
+ net_unregister,
+ net_register,
+ net_fgd_scan, NewCallSign,
net_display_toggle, NULL
};
#endif
char *helpSubmenu [] = {
- "About...", "Help", NULL
+ /* "About...", */ "Help", NULL
};
puCallback helpSubmenuCb [] = {
- notCb, helpCb, NULL
+ /* notCb, */ helpCb, 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( current_options.get_fg_root() );
+ fntpath.set( globals->get_fg_root() );
fntpath.append( "Fonts" );
}
// Install our fast fonts
fntpath.append( "typewriter.txf" );
guiFntHandle = new fntTexFont ;
- guiFntHandle -> load ( fntpath.c_str() ) ;
+ guiFntHandle -> load ( (char *)fntpath.c_str() ) ;
puFont GuiFont ( guiFntHandle, 15 ) ;
puSetDefaultFonts( GuiFont, GuiFont ) ;
guiFnt = puGetDefaultLabelFont();
- if ( current_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 ( current_options.get_mouse_pointer() == 1 ) {
+// mouse_active = ~mouse_active;
+ } else if ( !fgGetBool("/sim/startup/mouse-pointer") ) {
// don't show pointer
- } else if ( current_options.get_mouse_pointer() == 2 ) {
+ } else {
// force showing pointer
puShowCursor();
- mouse_active = ~mouse_active;
+// mouse_active = ~mouse_active;
}
+
+ // MOUSE_VIEW mode stuff
+ initMouseQuat();
// Set up our Dialog Boxes
ConfirmExitDialogInit();
NewAirportInit();
#ifdef FG_NETWORK_OLK
NewNetIdInit();
+ NewNetFGDInit();
#endif
- mkDialogInit();
+
+ mkDialogInit();
// Make the menu bar
mainMenuBar = new puMenuBar ();
mainMenuBar -> add_submenu ("File", fileSubmenu, fileSubmenuCb);
- mainMenuBar -> add_submenu ("Edit", editSubmenu, editSubmenuCb);
+ // mainMenuBar -> add_submenu ("Edit", editSubmenu, editSubmenuCb);
mainMenuBar -> add_submenu ("View", viewSubmenu, viewSubmenuCb);
- mainMenuBar -> add_submenu ("Aircraft", aircraftSubmenu, aircraftSubmenuCb);
mainMenuBar -> add_submenu ("Environment", environmentSubmenu, environmentSubmenuCb);
- mainMenuBar -> add_submenu ("Options", optionsSubmenu, optionsSubmenuCb);
+ mainMenuBar -> add_submenu ("Autopilot", autopilotSubmenu, autopilotSubmenuCb);
+ // mainMenuBar -> add_submenu ("Options", optionsSubmenu, optionsSubmenuCb);
#ifdef FG_NETWORK_OLK
- mainMenuBar -> add_submenu ("Network", networkSubmenu, networkSubmenuCb);
+ if ( fgGetBool("/sim/networking/network-olk") ) {
+ mainMenuBar -> add_submenu ("Network", networkSubmenu, networkSubmenuCb);
+ }
#endif
mainMenuBar -> add_submenu ("Help", helpSubmenu, helpSubmenuCb);
mainMenuBar-> close ();
// Set up menu bar toggle
- menu_on = ~0;
+ gui_menu_on = ~0;
}
+