]> git.mxchange.org Git - flightgear.git/commitdiff
Fixed teleportation and dialog box crashes.
authorcurt <curt>
Thu, 6 May 1999 21:14:06 +0000 (21:14 +0000)
committercurt <curt>
Thu, 6 May 1999 21:14:06 +0000 (21:14 +0000)
Simulator/GUI/gui.cxx
Simulator/GUI/gui.h
Simulator/Main/GLUTkey.cxx
Simulator/Main/GLUTmain.cxx
Simulator/Scenery/tilecache.cxx
Simulator/Scenery/tilemgr.cxx

index b46764bebe792ecac3c22ea15fbe35334279ce81..f2d6aa93a9321676169ae66962cb8a9908aa4f5b 100644 (file)
@@ -27,7 +27,7 @@
 #endif
 
 #ifdef HAVE_WINDOWS_H
-#  include <windows.h>                     
+#  include <windows.h>
 #endif
 
 #include <Include/compiler.h>
 #include <stdlib.h>
 #include <string.h>
 
+#include <Include/general.hxx>
+#include <Debug/logstream.hxx>
 #include <Aircraft/aircraft.hxx>
 #include <Airports/simple.hxx>
-#include <Autopilot/autopilot.hxx>
-#include <Debug/logstream.hxx>
 #include <FDM/flight.hxx>
-#include <Include/general.hxx>
-#include <Main/fg_init.hxx>
 #include <Main/options.hxx>
+#include <Main/fg_init.hxx>
+#include <Time/fg_time.hxx>
 
 #include "gui.h"
 
 FG_USING_STD(string);
 
+static puMenuBar    *mainMenuBar;
+static puButton     *hideMenuButton;
 
-puMenuBar    *mainMenuBar;
-puButton     *hideMenuButton;
-puDialogBox  *dialogBox;
-puText       *dialogBoxMessage;
-puOneShot    *dialogBoxOkButton;
-puText       *timerText;
+static puDialogBox  *dialogBox;
+static puFrame      *dialogFrame;
+static puText       *dialogBoxMessage;
+static puOneShot    *dialogBoxOkButton;
 
+extern void fgAPAdjust( puObject * );
+// extern void fgLatLonFormatToggle( puObject *);
 /* --------------------------------------------------------------------
-       Mouse stuff 
-  ---------------------------------------------------------------------*/
+Mouse stuff
+---------------------------------------------------------------------*/
+
+static int _mX = 0;
+static int  _mY = 0;
+static int last_buttons = 0 ;
 
 void guiMotionFunc ( int x, int y )
 {
+    _mX = x;
+    _mY = y;
     puMouse ( x, y ) ;
     glutPostRedisplay () ;
 }
@@ -78,10 +86,28 @@ void guiMotionFunc ( int x, int y )
 
 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;
+};
+
 /* -----------------------------------------------------------------------
   the Gui callback functions 
   ____________________________________________________________________*/
@@ -91,19 +117,49 @@ void reInit(puObject *cb)
     fgReInitSubsystems();
 }
 
+void guiToggleMenu(void)
+{
+    hideMenuButton -> 
+       setValue ((int) !(hideMenuButton -> getValue() ) );
+    hideMenuButton -> invokeCallback();
+}
+       
+
+void MenuHideMenuCb(puObject *cb)
+{
+    mainMenuBar -> hide  ();
+    // printf("Hiding Menu\n");
+    hideMenuButton -> setLegend ("Show Menu");
+#if defined ( WIN32 ) || defined(__CYGWIN32__)
+    glutSetCursor(GLUT_CURSOR_NONE);
+#else  // I guess this is what we want to do ??
+    // puHideCursor(); // does not work with VooDoo
+#endif
+}
+
 void hideMenuCb (puObject *cb)
 {
     if (cb -> getValue () )
        {
            mainMenuBar -> reveal();
-           printf("Showing Menu");
+           // printf("Showing Menu\n");
            hideMenuButton -> setLegend ("Hide Menu");
+#if defined ( WIN32 ) || defined(__CYGWIN32__)
+           glutSetCursor(GLUT_CURSOR_INHERIT);
+#else  // I guess this is what we want to do ??
+           //    puShowCursor(); // does not work with VooDoo
+#endif
        }
     else
        {
            mainMenuBar -> hide  ();
-           printf("Hiding Menu");
+           // printf("Hiding Menu\n");
            hideMenuButton -> setLegend ("Show Menu");
+#if defined ( WIN32 ) || defined(__CYGWIN32__)
+           glutSetCursor(GLUT_CURSOR_NONE);
+#else  // I guess this is what we want to do ??
+           //    puHideCursor(); // does not work with VooDoo
+#endif
        }
 }
 
@@ -118,9 +174,19 @@ void goodBye(puObject *)
                                
     exit(-1);
 }
-       
-void goAwayCb (puObject *)
+
+
+void goAwayCb (puObject *me)
 {
+    delete dialogBoxOkButton;
+    dialogBoxOkButton = NULL;
+       
+    delete dialogBoxMessage;
+    dialogBoxMessage = NULL;
+       
+    delete dialogFrame;
+    dialogFrame = NULL;
+
     delete dialogBox;
     dialogBox = NULL;
 }
@@ -129,9 +195,9 @@ void mkDialog (char *txt)
 {
     dialogBox = new puDialogBox (150, 50);
     {
-       new puFrame (0,0,400, 100);
-       dialogBoxMessage   new puText         (10, 70);
-       dialogBoxMessage ->  setLabel           (txt);
+       dialogFrame = new puFrame (0,0,400, 100);
+       dialogBoxMessage  =  new puText         (10, 70);
+       dialogBoxMessage  -> setLabel           (txt);
        dialogBoxOkButton =  new puOneShot      (180, 10, 240, 50);
        dialogBoxOkButton -> setLegend          ("OK");
        dialogBoxOkButton -> makeReturnDefault  (TRUE );
@@ -141,6 +207,41 @@ void mkDialog (char *txt)
     dialogBox -> reveal();
 }
 
+void notCb (puObject *)
+{
+    mkDialog ("This function isn't implemented yet");
+}
+
+void helpCb (puObject *)
+{
+    string command;
+       
+#if defined(FX) && !defined(WIN32)
+#  if defined(XMESA_FX_FULLSCREEN) && defined(XMESA_FX_WINDOW)
+    if ( global_fullscreen ) {
+       global_fullscreen = false;
+       XMesaSetFXmode( XMESA_FX_WINDOW );
+    }
+#  endif
+#endif
+       
+#if !defined(WIN32)
+    string url = "http://www.flightgear.org/Docs/InstallGuide/getstart.html";
+       
+    if ( system("xwininfo -name Netscape > /dev/null 2>&1") == 0 ) {
+       command = "netscape -remote \"openURL(" + url + ")\" &";
+    } else {
+       command = "netscape " + url + " &";
+    }
+#else
+    command = "webrun.bat";
+#endif
+       
+    system( command.c_str() );
+    string text = "Help started in netscape window.";
+       
+    mkDialog (text.c_str());
+}
 
 /// The beginnings of teleportation :-)
 //  Needs cleaning up but works
@@ -156,7 +257,7 @@ static puOneShot       *AptDialogResetButton;
 
 static string AptDialog_OldAptId;
 static string AptDialog_NewAptId;
-static int AptDialog_ValidAptId;
+static int    AptDialog_ValidAptId;
 
 static void validateApt (puObject *inpApt)
 {
@@ -167,8 +268,6 @@ static void validateApt (puObject *inpApt)
 
     AptDialog_NewAptId = s;
 
-    FG_LOG( FG_GENERAL, FG_INFO, "Validating apt id = " << s );
-
     if ( AptDialog_NewAptId.length() ) {
        // set initial position from airport id
 
@@ -201,6 +300,8 @@ static void validateApt (puObject *inpApt)
 
 void AptDialog_Cancel(puObject *)
 {
+    FGTime *t = FGTime::cur_time_params;
+       
     delete AptDialogResetButton;
     AptDialogResetButton = NULL;
 
@@ -221,6 +322,8 @@ void AptDialog_Cancel(puObject *)
 
     delete AptDialog;
     AptDialog = NULL;
+       
+    t->togglePauseMode();
 }
 
 void AptDialog_OK (puObject *me)
@@ -238,8 +341,11 @@ void AptDialog_Reset(puObject *)
 void NewAirportInit(puObject *cb)
 {
     FGInterface *f;
+    FGTime *t;
+       
     f = current_aircraft.fdm_state;
-
+    t = FGTime::cur_time_params;
+       
     char *AptLabel = "Enter New Airport ID";
     int len = 350/2 - puGetStringWidth(NULL, AptLabel)/2;
 
@@ -261,80 +367,46 @@ void NewAirportInit(puObject *cb)
        len = 0;
        AptDialogInput   ->    setCursor         ( len );
        AptDialogInput   ->    setSelectRegion   ( 5, 9 );
-
-        AptDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
-        AptDialogOkButton     ->     setLegend         ("OK");
-        AptDialogOkButton     ->     makeReturnDefault (TRUE );
-        AptDialogOkButton     ->     setCallback       (AptDialog_OK);
-
-        AptDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
-        AptDialogCancelButton ->     setLegend         ("Cancel");
-        AptDialogCancelButton ->     makeReturnDefault (TRUE );
-        AptDialogCancelButton ->     setCallback       (AptDialog_Cancel);
-
-        AptDialogResetButton  =  new puOneShot         (240, 10, 300, 50);
-        AptDialogResetButton  ->     setLegend         ("Reset");
-        AptDialogResetButton  ->     makeReturnDefault (TRUE );
-        AptDialogResetButton  ->     setCallback       (AptDialog_Reset);
+               
+       AptDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
+       AptDialogOkButton     ->     setLegend         ("OK");
+       AptDialogOkButton     ->     makeReturnDefault (TRUE );
+       AptDialogOkButton     ->     setCallback       (AptDialog_OK);
+               
+       AptDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
+       AptDialogCancelButton ->     setLegend         ("Cancel");
+       AptDialogCancelButton ->     makeReturnDefault (TRUE );
+       AptDialogCancelButton ->     setCallback       (AptDialog_Cancel);
+               
+       AptDialogResetButton  =  new puOneShot         (240, 10, 300, 50);
+       AptDialogResetButton  ->     setLegend         ("Reset");
+       AptDialogResetButton  ->     makeReturnDefault (TRUE );
+       AptDialogResetButton  ->     setCallback       (AptDialog_Reset);
     }
     AptDialog -> close();
     AptDialog -> reveal();
 }
 
 
-void notCb (puObject *)
-{
-    mkDialog ("This function isn't implemented yet");
-}
-
-void helpCb (puObject *)
-{
-    string command;
-
-#if defined(FX) && !defined(WIN32)
-#  if defined(XMESA_FX_FULLSCREEN) && defined(XMESA_FX_WINDOW)
-    if ( global_fullscreen ) {
-       global_fullscreen = false;
-       XMesaSetFXmode( XMESA_FX_WINDOW );
-    }
-#  endif
-#endif
-
-#if !defined(WIN32)
-    string url = "http://www.flightgear.org/Docs/InstallGuide/getstart.html";
-
-    if ( system("xwininfo -name Netscape > /dev/null 2>&1") == 0 ) {
-       command = "netscape -remote \"openURL(" + url + ")\" &";
-    } else {
-       command = "netscape " + url + " &";
-    }
-#else
-    command = "webrun.bat";
-#endif
-
-    system( command.c_str() );
-    string text = "Help started in netscape window.";
-
-    mkDialog ( (char*)text.c_str() );
-}
-
 /* -----------------------------------------------------------------------
    The menu stuff 
    ---------------------------------------------------------------------*/
-char *fileSubmenu        [] = { "Exit", "Close", "---------", "Print",
-                               "---------", "Save", "Reset", NULL };
-char *editSubmenu        [] = { "Edit text", NULL };
-char *viewSubmenu        [] = { "Cockpit View > ", "View >","------------",
-                               "View options...", NULL };
-char *aircraftSubmenu    [] = { "Autopilot ...", "Engine ...", "Navigation",
-                               "Communication", NULL};
-char *environmentSubmenu [] = { "Airport", "Terrain", "Weather", NULL};
-char *optionsSubmenu     [] = { "Preferences", "Realism & Reliablity...",
-                               NULL};
-char *helpSubmenu        [] = { "About...", "Help", NULL };
-
-puCallback fileSubmenuCb        [] = { goodBye, hideMenuCb, NULL, notCb,
-                                      NULL, notCb, reInit, NULL};
+char *fileSubmenu        [] = {
+    "Exit", "Close", "---------", "Print", "---------", "Save", "Reset", NULL };
+char *editSubmenu        [] = {
+    "Edit text", NULL };
+char *viewSubmenu        [] = {
+    "Cockpit View > ", "View >","------------", "View options...", NULL };
+char *aircraftSubmenu    [] = {
+    "Autopilot ...", "Engine ...", "Navigation", "Communication", NULL};
+char *environmentSubmenu [] = {
+    "Airport", "Terrain", "Weather", NULL};
+char *optionsSubmenu     [] = {
+    "Preferences", "Realism & Reliablity...", NULL};
+char *helpSubmenu        [] = {
+    "About...", "Help", NULL };
+
+puCallback fileSubmenuCb        [] = { goodBye, MenuHideMenuCb, NULL, notCb, NULL, notCb, reInit, NULL};
 puCallback editSubmenuCb        [] = { notCb, NULL };
 puCallback viewSubmenuCb        [] = { notCb, notCb, NULL, notCb, NULL };
 puCallback aircraftSubmenuCb    [] = { fgAPAdjust, notCb, notCb, notCb, NULL };
@@ -365,7 +437,7 @@ void guiInit()
            // Test for the MESA_GLX_FX env variable
            if ( (mesa_win_state = getenv( "MESA_GLX_FX" )) != NULL) {
                // test if we are fullscreen mesa/glide
-               if ( (mesa_win_state[0] == 'f') || 
+               if ( (mesa_win_state[0] == 'f') ||
                     (mesa_win_state[0] == 'F') ) {
                    puShowCursor ();
                }
@@ -380,14 +452,10 @@ void guiInit()
 
     // puSetDefaultStyle         ( PUSTYLE_SMALL_BEVELLED );
     puSetDefaultStyle         ( PUSTYLE_DEFAULT );
-    // puSetDefaultColourScheme  (0.2, 0.4, 0.8, 0.5);
-    puSetDefaultColourScheme  (0.8, 0.8, 0.8, 0.5);
-      
+    //    puSetDefaultColourScheme  (0.2, 0.4, 0.8, 0.5);
+    puSetDefaultColourScheme  (0.8, 0.8, 0.8, 0.4);
     /* OK the rest is largely put in here to mimick Steve Baker's
        "complex" example It should change in future versions */
-      
-    // timerText = new puText (300, 10);
-    // timerText -> setColour (PUCOL_LABEL, 1.0, 1.0, 1.0);
 
     /* Make a button to hide the menu bar */
     hideMenuButton = new puButton       (10,10, 150, 50);
@@ -403,7 +471,7 @@ void guiInit()
     mainMenuBar -> add_submenu ("Edit", editSubmenu, editSubmenuCb);
     mainMenuBar -> add_submenu ("View", viewSubmenu, viewSubmenuCb);
     mainMenuBar -> add_submenu ("Aircraft", aircraftSubmenu, aircraftSubmenuCb);
-    mainMenuBar -> add_submenu ("Environment", environmentSubmenu, 
+    mainMenuBar -> add_submenu ("Environment", environmentSubmenu,
                                environmentSubmenuCb);
     mainMenuBar -> add_submenu ("Options", optionsSubmenu, optionsSubmenuCb);
     mainMenuBar -> add_submenu ("Help", helpSubmenu, helpSubmenuCb);
index 0bfa9de505276dc78df3c8a6d4e651f35eec0f12..dcc3e9463023c74c9b41c9f0151331cde83e6d44 100644 (file)
 
 #include <plib/pu.h>
 
-extern puMenuBar    *mainMenuBar;
-extern puButton     *hideMenuButton;
-extern puDialogBox  *dialogBox;
-extern puText       *dialogBoxMessage;
-extern puOneShot    *dialogBoxOkButton;
-extern puText       *timerText;
-
 extern void guiMotionFunc ( int x, int y );
 extern void guiMouseFunc(int button, int updown, int x, int y);
 extern void guiInit();
+extern void guiToggleMenu(void);
+extern void mkDialog (char *txt);
 
 extern void mkDialog (char *txt);
 
-#endif // _GUI_H_ 
+#endif // _GUI_H_
index 8d9ccced4a5eaf0353b5c3dde2a1707770d04128..ee9d11543335f98e794cc950b73ef7466047aea0 100644 (file)
@@ -364,9 +364,7 @@ void GLUTspecialkey(int k, int x, int y) {
            return;
        case GLUT_KEY_F10: // F10 toggles menu on and off...
            FG_LOG(FG_INPUT, FG_INFO, "Invoking call back function");
-           hideMenuButton -> 
-               setValue ((int) !(hideMenuButton -> getValue() ) );
-           hideMenuButton -> invokeCallback();
+           guiToggleMenu();
            //exit(1);
            return;
        case GLUT_KEY_UP:
index 1e5a9a8436e5acb2fe62c9a5905d7f088b0cd894..cc2b16fc1e06e81cdd93d1438d0151e6ea7e8bfd 100644 (file)
@@ -457,10 +457,13 @@ static void fgMainLoop( void ) {
     FGTime *t;
     static long remainder = 0;
     long elapsed, multi_loop;
-    // int i;
-    // double accum;
+#ifdef FANCY_FRAME_COUNTER
+    int i;
+    double accum;
+#else
     static time_t last_time = 0;
     static int frames = 0;
+#endif // FANCY_FRAME_COUNTER
 
     f = current_aircraft.fdm_state;
     t = FGTime::cur_time_params;
@@ -521,6 +524,25 @@ static void fgMainLoop( void ) {
            << ", previous remainder is = " << remainder );
 
     // Calculate frame rate average
+#ifdef FANCY_FRAME_COUNTER
+    /* old fps calculation */
+    if ( elapsed > 0 ) {
+        double tmp;
+        accum = 0.0;
+        for ( i = FG_FRAME_RATE_HISTORY - 2; i >= 0; i-- ) {
+            tmp = general.get_frame(i);
+            accum += tmp;
+            // printf("frame[%d] = %.2f\n", i, g->frames[i]);
+            general.set_frame(i+1,tmp);
+        }
+        tmp = 1000000.0 / (float)elapsed;
+        general.set_frame(0,tmp);
+        // printf("frame[0] = %.2f\n", general.frames[0]);
+        accum += tmp;
+        general.set_frame_rate(accum / (float)FG_FRAME_RATE_HISTORY);
+        // printf("ave = %.2f\n", general.frame_rate);
+    }
+#else
     if ( (t->get_cur_time() != last_time) && (last_time > 0) ) {
        general.set_frame_rate( frames );
        FG_LOG( FG_ALL, FG_DEBUG, 
@@ -529,22 +551,7 @@ static void fgMainLoop( void ) {
     }
     last_time = t->get_cur_time();
     ++frames;
-
-    /* old fps calculation
-    if ( elapsed > 0 ) {
-       accum = 0.0;
-       for ( i = FG_FRAME_RATE_HISTORY - 2; i >= 0; i-- ) {
-           accum += g->frames[i];
-           // printf("frame[%d] = %.2f\n", i, g->frames[i]);
-           g->frames[i+1] = g->frames[i];
-       }
-       g->frames[0] = 1000.0 / (float)elapsed;
-       // printf("frame[0] = %.2f\n", g->frames[0]);
-       accum += g->frames[0];
-       g->frame_rate = accum / (float)FG_FRAME_RATE_HISTORY;
-       // printf("ave = %.2f\n", g->frame_rate);
-    }
-    */
+#endif
 
     // Run flight model
     if ( ! use_signals ) {
index e008f63ffdd5494d096713a6a7fc846876d61744..74adf3875446ce6f859b10bc74e4be89857186d3 100644 (file)
@@ -34,7 +34,7 @@
 
 #include <Debug/logstream.hxx>
 #include <Airports/genapt.hxx>
-// #include <Bucket/bucketutils.hxx>
+#include <Bucket/newbucket.hxx>
 #include <Main/options.hxx>
 #include <Main/views.hxx>
 #include <Misc/fgpath.hxx>
@@ -64,9 +64,9 @@ fgTILECACHE::init( void )
     for ( i = 0; i < FG_TILE_CACHE_SIZE; i++ ) {
        if ( tile_cache[i].used ) {
            entry_free(i);
-           tile_cache[i].tile_bucket.make_bad();
        }
        tile_cache[i].used = 0;
+       tile_cache[i].tile_bucket.make_bad();
     }
 }
 
index 8dd8d149ac8703f306ed7507001daeefc26dbf74..7d5a99699dfbd996ddfcd6e532a2379d96683fa5 100644 (file)
 #  define FG_MEM_COPY(to,from,n)        bcopy(from, to, n)
 #endif
 
+
+// Tile loading state
+enum fgTileLoadState {
+    START = 0,
+    INITED = 1,
+    RUNNING = 2
+};
+
+
 // closest (potentially viewable) tiles, centered on current tile.
 // This is an array of pointers to cache indexes.
 int tiles[FG_LOCAL_X_Y];
 
+static fgTileLoadState state = START;
+
 
 // Initialize the Tile Manager subsystem
 int fgTileMgrInit( void ) {
@@ -85,6 +96,8 @@ int fgTileMgrInit( void ) {
        material_mgr.load_lib();
     }
 
+    state = INITED;
+
     return 1;
 }
 
@@ -113,7 +126,6 @@ static double point_line_dist_squared( const Point3D& tc, const Point3D& vp,
                                       MAT3vec d )
 {
     MAT3vec p, p0;
-    double dist;
 
     p[0] = tc.x(); p[1] = tc.y(); p[2] = tc.z();
     p0[0] = vp.x(); p0[1] = vp.y(); p0[2] = vp.z();
@@ -349,12 +361,14 @@ int fgTileMgrUpdate( void ) {
     dw = tile_diameter / 2;
     dh = tile_diameter / 2;
 
-    if ( p1 == p_last ) {
+    if ( (p1 == p_last) && (state == RUNNING) ) {
        // same bucket as last time
        FG_LOG( FG_TERRAIN, FG_DEBUG, "Same bucket as last time" );
-    } else if ( p_last.get_lon() == -1000 ) {
-       // First time through, initialize the system and load all
-       // relavant tiles
+    } else if ( (state == START) || (state == INITED) ) {
+       state = RUNNING;
+
+       // First time through or we have teleporte, initialize the
+       // system and load all relavant tiles
 
        FG_LOG( FG_TERRAIN, FG_INFO, "Updating Tile list for " << p1 );
        FG_LOG( FG_TERRAIN, FG_INFO, "  First time through ... " );