]> git.mxchange.org Git - flightgear.git/commitdiff
A grab bag of tweaks and patches from Norman Vine.
authorcurt <curt>
Tue, 5 Feb 2002 20:54:08 +0000 (20:54 +0000)
committercurt <curt>
Tue, 5 Feb 2002 20:54:08 +0000 (20:54 +0000)
- Better mingwin/cygwin support
- Various gui tweaks and code clean ups
- Initialization clean ups
- Hitlist/scenery tweaks
- other misc. stuff.

13 files changed:
src/Autopilot/auto_gui.cxx
src/Autopilot/auto_gui.hxx
src/Autopilot/newauto.cxx
src/FDM/flight.cxx
src/GUI/gui.cxx
src/GUI/gui.h
src/GUI/mouse.cxx
src/GUI/sgVec3Slider.cxx
src/Main/fg_init.cxx
src/Main/main.cxx
src/Network/atc610x.hxx
src/Scenery/hitlist.cxx
src/Scenery/hitlist.hxx

index 43c63b84aa9d4056f6119a0d44cad88d7127bc32..a4859803d83d615ee7bdce17d6bf7df3b13e4201 100644 (file)
 #  include <config.h>
 #endif
 
+#include <simgear/compiler.h>
+
 #include <assert.h>
 #include <stdlib.h>
+#include <string.h>
+
+#include STL_STRING
 
+#include <Aircraft/aircraft.hxx>
+#include <FDM/flight.hxx>
+#include <Controls/controls.hxx>
 #include <Scenery/scenery.hxx>
 
 #include <simgear/constants.h>
+#include <simgear/sg_inlines.h>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/math/sg_geodesy.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -46,6 +55,8 @@
 #include "auto_gui.hxx"
 #include "newauto.hxx"
 
+SG_USING_STD(string);
+
 
 #define mySlider puSlider
 
@@ -212,7 +223,7 @@ void NewHeading(puObject *cb)
     FG_PUSH_PUI_DIALOG( ApHeadingDialog );
 }
 
-void NewHeadingInit(void)
+void NewHeadingInit()
 {
     // printf("NewHeadingInit\n");
     char NewHeadingLabel[] = "Enter New Heading";
@@ -284,7 +295,7 @@ void NewAltitude(puObject *cb)
     FG_PUSH_PUI_DIALOG( ApAltitudeDialog );
 }
 
-void NewAltitudeInit(void)
+void NewAltitudeInit()
 {
     // printf("NewAltitudeInit\n");
     char NewAltitudeLabel[] = "Enter New Altitude";
@@ -331,15 +342,12 @@ void NewAltitudeInit(void)
     FG_FINALIZE_PUI_DIALOG( ApAltitudeDialog );
 }
 
-/////// simple AutoPilot GAIN / LIMITS ADJUSTER
-
-#define fgAP_CLAMP(val,min,max) ( (val) = (val) > (max) ? (max) : (val) < (min) ? (min) : (val) )
 
 static void maxroll_adj( puObject *hs ) {
     float val ;
     
     hs-> getValue ( &val ) ;
-    fgAP_CLAMP ( val, 0.1, 1.0 ) ;
+    SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
     //    printf ( "maxroll_adj( %p ) %f %f\n", hs, val, MaxRollAdjust * val ) ;
     current_autopilot->set_MaxRoll( MaxRollAdjust * val );
     sprintf( SliderText[ 0 ], "%05.2f", current_autopilot->get_MaxRoll() );
@@ -350,7 +358,7 @@ static void rollout_adj( puObject *hs ) {
     float val ;
 
     hs-> getValue ( &val ) ;
-    fgAP_CLAMP ( val, 0.1, 1.0 ) ;
+    SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
     //    printf ( "rollout_adj( %p ) %f %f\n", hs, val, RollOutAdjust * val ) ;
     current_autopilot->set_RollOut( RollOutAdjust * val );
     sprintf( SliderText[ 1 ], "%05.2f", current_autopilot->get_RollOut() );
@@ -361,7 +369,7 @@ static void maxaileron_adj( puObject *hs ) {
     float val ;
 
     hs-> getValue ( &val ) ;
-    fgAP_CLAMP ( val, 0.1, 1.0 ) ;
+    SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
     //    printf ( "maxaileron_adj( %p ) %f %f\n", hs, val, MaxAileronAdjust * val ) ;
     current_autopilot->set_MaxAileron( MaxAileronAdjust * val );
     sprintf( SliderText[ 3 ], "%05.2f", current_autopilot->get_MaxAileron() );
@@ -372,7 +380,7 @@ static void rolloutsmooth_adj( puObject *hs ) {
     float val ;
 
     hs -> getValue ( &val ) ;
-    fgAP_CLAMP ( val, 0.1, 1.0 ) ;
+    SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
     //    printf ( "rolloutsmooth_adj( %p ) %f %f\n", hs, val, RollOutSmoothAdjust * val ) ;
     current_autopilot->set_RollOutSmooth( RollOutSmoothAdjust * val );
     sprintf( SliderText[ 2 ], "%5.2f", current_autopilot->get_RollOutSmooth() );
@@ -405,7 +413,7 @@ void resetAPAdjust( puObject *self ) {
     fgAPAdjust( self );
 }
 
-void fgAPAdjust( puObject * ) {
+void fgAPAdjust( puObject *self ) {
     TmpMaxRollValue       = current_autopilot->get_MaxRoll();
     TmpRollOutValue       = current_autopilot->get_RollOut();
     TmpMaxAileronValue    = current_autopilot->get_MaxAileron();
@@ -426,7 +434,7 @@ void fgAPAdjust( puObject * ) {
 }
 
 // Done once at system initialization
-void fgAPAdjustInit( void ) {
+void fgAPAdjustInit() {
 
     // printf("fgAPAdjustInit\n");
 #define HORIZONTAL  FALSE
@@ -671,7 +679,7 @@ void ClearRoute(puObject *cb)
     globals->get_route()->clear();
 }
 
-void NewTgtAirportInit(void)
+void NewTgtAirportInit()
 {
     SG_LOG( SG_AUTOPILOT, SG_INFO, " enter NewTgtAirportInit()" );
     sprintf( NewTgtAirportId, "%s",
index 6b7e490d8192b992556bbceab511c34868ee7c0b..e3e1e53bdc8e2aee2690ec8eb0a258b10324094a 100644 (file)
 #ifndef _AUTO_GUI_HXX
 #define _AUTO_GUI_HXX
 
-#include <simgear/compiler.h>
-                       
-#include STL_STRING
-
-#include <string.h>
-
-#include <Aircraft/aircraft.hxx>
-#include <FDM/flight.hxx>
-#include <Controls/controls.hxx>
-                       
-SG_USING_STD(string);
-
-                  
 // Defines
 #define AP_CURRENT_HEADING -1
 
index d553097035d62b5a1d4e19fa5e5e7776727f9320..78a1dcf29faeaaf0599728f9e98f91fc70e3b7a2 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdio.h>             // sprintf()
 
 #include <simgear/constants.h>
+#include <simgear/sg_inlines.h>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/math/sg_geodesy.hxx>
 #include <simgear/math/sg_random.h>
@@ -126,7 +127,7 @@ void FGAutopilot::MakeTargetAltitudeStr( double altitude ) {
 
 
 void FGAutopilot::MakeTargetHeadingStr( double bearing ) {
-    if( bearing < 0. ) {
+    if ( bearing < 0. ) {
        bearing += 360.;
     } else if (bearing > 360. ) {
        bearing -= 360.;
@@ -273,7 +274,7 @@ void FGAutopilot::init() {
        
     TargetHeading = 0.0;       // default direction, due north
     TargetAltitude = 3000;     // default altitude in meters
-    alt_error_accum = 0;    
+    alt_error_accum = 0.0;
     climb_error_accum = 0.0;
 
     MakeTargetAltitudeStr( TargetAltitude );
@@ -306,11 +307,6 @@ void FGAutopilot::init() {
 
     update_old_control_values();
        
-    // Initialize GUI components of autopilot
-    // NewTgtAirportInit();
-    // fgAPAdjustInit() ;
-    // NewHeadingInit();
-    // NewAltitudeInit();
 };
 
 
@@ -328,8 +324,7 @@ void FGAutopilot::reset() {
     // TargetAltitude = 3000;   // default altitude in meters
     MakeTargetAltitudeStr( TargetAltitude );
        
-    alt_error_accum = 0;    
-
+    alt_error_accum = 0.0;
     climb_error_accum = 0.0;
        
     update_old_control_values();
@@ -344,13 +339,10 @@ static double NormalizeDegrees( double Input ) {
     // normalize the input to the range (-180,180]
     // Input should not be greater than -360 to 360.
     // Current rules send the output to an undefined state.
-    if ( Input > 180 )
-       while(Input > 180 )
-           Input -= 360;
-    else if ( Input <= -180 )
-       while ( Input <= -180 )
-           Input += 360;
-    return ( Input );
+    while ( Input > 180.0 ) { Input -= 360.0; }
+    while ( Input <= -180.0 ) { Input += 360.0; }
+
+    return Input;
 };
 
 static double LinearExtrapolate( double x, double x1, double y1, double x2, double y2 ) {
@@ -467,8 +459,7 @@ int FGAutopilot::run() {
            double adjustment = 
                current_radiostack->get_nav1_heading_needle_deflection()
                * (current_radiostack->get_nav1_loc_dist() * SG_METER_TO_NM);
-           if ( adjustment < -30.0 ) { adjustment = -30.0; }
-           if ( adjustment >  30.0 ) { adjustment =  30.0; }
+           SG_CLAMP_RANGE( adjustment, -30.0, 30.0 );
 
            // determine the target heading to fly to intercept the
            // tgt_radial
@@ -546,8 +537,7 @@ int FGAutopilot::run() {
            double turn = FGSteam::get_TC_std();
            // cout << "turn rate = " << turn << endl;
            double AileronSet = -turn / 2.0;
-           if ( AileronSet < -1.0 ) { AileronSet = -1.0; }
-           if ( AileronSet >  1.0 ) { AileronSet =  1.0; }
+            SG_CLAMP_RANGE( AileronSet, -1.0, 1.0 );
            globals->get_controls()->set_aileron( AileronSet );
            globals->get_controls()->set_rudder( AileronSet / 4.0 );
        } else {
@@ -894,7 +884,7 @@ void FGAutopilot::set_HeadingMode( fgAutoHeadingMode mode ) {
 void FGAutopilot::set_AltitudeMode( fgAutoAltitudeMode mode ) {
     altitude_mode = mode;
 
-    alt_error_accum = 0;    
+    alt_error_accum = 0.0;
 
 
     if ( altitude_mode == FG_ALTITUDE_LOCK ) {
index 796842e9b1798e5379d3cfd8fc73a2a63391838d..15404ec27f6df506299daafe3ec386777b8a480a 100644 (file)
@@ -47,7 +47,7 @@
 // world time, so we introduce cur_fdm_state which is extrapolated by
 // the difference between sim time and real world time
 
-FGInterface *cur_fdm_state;
+FGInterface *cur_fdm_state = 0;
 FGInterface base_fdm_state;
 
 inline void init_vec(FG_VECTOR_3 vec) {
index 850423e32b90f1de1869809f2d8c4b3ecf39283d..3ecbcb6c955a29f8033cabf0576d2018c356966f 100644 (file)
@@ -1034,6 +1034,7 @@ void guiInit()
     // Set up our Dialog Boxes
     ConfirmExitDialogInit();
     NewAirportInit();
+       
 #ifdef FG_NETWORK_OLK
     NewNetIdInit();
     NewNetFGDInit();
index 121ed76c34f4ab18561edad7dbebbc6500966efb..496c3306cb2eccab6710be5dcc36349f14401311 100644 (file)
@@ -60,6 +60,7 @@ extern char *gui_msg_CANCEL; // "CANCEL"
 extern char *gui_msg_RESET;  // "RESET"
 
 // mouse.cxx
+extern void guiInitMouse(int width, int height);
 extern void guiMotionFunc ( int x, int y );
 extern void guiMouseFunc(int button, int updown, int x, int y);
 extern void maybeToggleMouse( void );
@@ -74,21 +75,24 @@ extern void TurnCursorOff( void );
 // These will also repair any damage done to the Panel if active
 
 // Activate Dialog Box
-#define FG_PUSH_PUI_DIALOG( X ) \
-    maybeToggleMouse(); \
-    puPushLiveInterface( (X) ) ; \
-    ( X )->reveal()
+inline void FG_PUSH_PUI_DIALOG( puObject *X ) {
+    maybeToggleMouse(); 
+    puPushLiveInterface( (puInterface *)X ) ; 
+    X->reveal() ;
+}
 
 // Deactivate Dialog Box
-#define FG_POP_PUI_DIALOG( X ) \
-    (X)->hide(); \
-    puPopLiveInterface(); \
+inline void FG_POP_PUI_DIALOG( puObject *X ) {
+    X->hide(); 
+    puPopLiveInterface(); 
     maybeToggleMouse();
+}
 
 // Finalize Dialog Box Construction 
-#define FG_FINALIZE_PUI_DIALOG( X ) \
-    ( X )->close(); \
-    ( X )->hide(); \
+inline void FG_FINALIZE_PUI_DIALOG( puObject *X ) {
+    ((puGroup *)X)->close();
+    X->hide();
     puPopLiveInterface();
+}
             
 #endif // _GUI_H_
index 9cf80a794a95e96a7bea7d9115fc0c83bc44c3eb..1c6a49476ddfd4d57cbd4cfc07eec8fc73974d5e 100644 (file)
@@ -96,13 +96,16 @@ static int mouse_joystick_control = 0;
 // on second left click in MOUSE_VIEW mode
 // This has file scope so that it can be reset
 // if the little rodent is moved  NHV
-static  int _mVtoggle;
+static  int _mVtoggle = 0;
 
 // we break up the glutGetModifiers return mask
 // once per loop and stash what we need in these
-static int glut_active_shift;
-static int glut_active_ctrl;
-static int glut_active_alt;
+static int glut_active_shift = 0;
+static int glut_active_ctrl = 0;
+static int glut_active_alt = 0;
+
+static int MOUSE_XSIZE = 0;
+static int MOUSE_YSIZE = 0;
 
 // uncomment this for view to exactly follow mouse in MOUSE_VIEW mode
 // else smooth out the view panning to .01 radian per frame
@@ -141,6 +144,12 @@ static double throttle_sensitivity = 1.0/250.0;
 static double rudder_sensitivity = 1.0/500.0;
 static double trim_sensitivity = 1.0/1000.0;
 
+void guiInitMouse(int width, int height)
+{
+       MOUSE_XSIZE = width;
+       MOUSE_YSIZE = height;
+}
+
 static inline int guiGetMouseButton(void)
 {
        return last_buttons;
@@ -164,6 +173,64 @@ static inline int right_button( void ) {
     return( last_buttons & (1 << GLUT_RIGHT_BUTTON) );
 }
 
+static inline void set_goal_view_offset( float offset )
+{
+       globals->get_current_view()->set_goal_view_offset(offset);
+}
+
+static inline void set_view_offset( float offset )
+{
+       globals->get_current_view()->set_view_offset(offset);
+}
+
+static inline float get_view_offset() {
+       return globals->get_current_view()->get_view_offset();
+}
+
+static inline float get_goal_view_offset() {
+       return globals->get_current_view()->get_goal_view_offset();
+}
+
+static inline void move_brake(float offset) {
+       globals->get_controls()->move_brake(FGControls::ALL_WHEELS, offset);
+}
+
+static inline void move_throttle(float offset) {
+       globals->get_controls()->move_throttle(FGControls::ALL_ENGINES, offset);
+}
+
+static inline void move_rudder(float offset) {
+       globals->get_controls()->move_rudder(offset);
+}
+
+static inline void move_elevator_trim(float offset) {
+       globals->get_controls()->move_elevator_trim(offset);
+}
+
+static inline void move_aileron(float offset) {
+       globals->get_controls()->move_aileron(offset);
+}
+
+static inline void move_elevator(float offset) {
+       globals->get_controls()->move_elevator(offset);
+}
+
+static inline float get_aileron() {
+       return globals->get_controls()->get_aileron();
+}
+
+static inline float get_elevator() {
+       return globals->get_controls()->get_elevator();
+}
+
+static inline bool AP_HeadingEnabled() {
+       return current_autopilot->get_HeadingEnabled();
+}
+
+static inline bool AP_AltitudeEnabled() {
+       return current_autopilot->get_AltitudeEnabled();
+}
+
 void TurnCursorOn( void )
 {
     mouse_active = ~0;
@@ -181,8 +248,8 @@ void TurnCursorOn( void )
     }
 #endif
 #if defined(X_CURSOR_TWEAKS)
-    glutWarpPointer( fgGetInt("/sim/startup/xsize")/2,
-                    fgGetInt("/sim/startup/ysize")/2);
+    glutWarpPointer( MOUSE_XSIZE/2,
+                    MOUSE_YSIZE/2);
 #endif
 }
 
@@ -192,8 +259,8 @@ void TurnCursorOff( void )
 #if defined(WIN32_CURSOR_TWEAKS)
     glutSetCursor(GLUT_CURSOR_NONE);
 #elif defined(X_CURSOR_TWEAKS)
-    glutWarpPointer( fgGetInt("/sim/startup/xsize"),
-                    fgGetInt("/sim/startup/ysize"));
+    glutWarpPointer( MOUSE_XSIZE,
+                    MOUSE_YSIZE);
 #endif
 }
 
@@ -242,8 +309,8 @@ void BusyCursor( int restore )
 void CenterView( void ) {
     if( mouse_mode == MOUSE_VIEW ) {
        mouse_mode = MOUSE_POINTER;
-       _savedX = fgGetInt("/sim/startup/xsize")/2;
-       _savedY = fgGetInt("/sim/startup/ysize")/2;
+       _savedX = MOUSE_XSIZE/2;
+       _savedY = MOUSE_YSIZE/2;
        _mVtoggle = 0;
        Quat0();
        build_rotmatrix(GuiQuat_mat, curGuiQuat);
@@ -254,32 +321,58 @@ void CenterView( void ) {
 
        glutWarpPointer( _savedX, _savedY );
     }
-    globals->get_current_view()->set_goal_view_offset(0.0);
-    globals->get_current_view()->set_view_offset(0.0);
+    set_goal_view_offset(0.0);
+    set_view_offset(0.0);
 }
 
 
+//#define TRANSLATE_HUD
+// temporary hack until pitch_offset is added to view pipeline
+void fgTranslateHud( void ) {
+#ifdef TRANSLATE_HUD
+    if(mouse_mode == MOUSE_VIEW) {
+
+        int ww = MOUSE_XSIZE;
+        int wh = MOUSE_YSIZE;
+
+        float y = 4*(_mY-(wh/2));// * ((wh/SGD_PI)*SG_RADIANS_TO_DEGREES);
+       
+        float x =  get_view_offset() * SG_RADIANS_TO_DEGREES;
+
+        if( x < -180 )     x += 360;
+        else if( x > 180 )     x -= 360;
+
+        x *= ww/90.0;
+        //     x *= ww/180.0;
+        //     x *= ww/360.0;
+
+        //     glTranslatef( x*ww/640, y*wh/480, 0 );
+        glTranslatef( x*640/ww, y*480/wh, 0 );
+    }
+#endif // TRANSLATE_HUD
+}
+
 void guiMotionFunc ( int x, int y )
 {
     int ww, wh, need_warp = 0;
     float W, H;
     double offset;
 
-    ww = fgGetInt("/sim/startup/xsize");
-    wh = fgGetInt("/sim/startup/ysize");
+    ww = MOUSE_XSIZE;
+    wh = MOUSE_YSIZE;
 
     if (mouse_mode == MOUSE_POINTER) {
         // TURN MENU ON IF MOUSE AT TOP
-        if( y == 0 ) {
+        if( y < 1 ) {
             if( !gui_menu_on )
                 guiToggleMenu();                       
         }
         // TURN MENU OFF IF MOUSE AT BOTTOM
-        else if( y > wh-1 ) {
+        else if( y > wh-2 ) {
             if( gui_menu_on )
                 guiToggleMenu();                       
         }
-        puMouse ( x, y ) ;
+        // puMouse ( x, y ) ;
         glutPostRedisplay () ;
     } else {
         if( x == _mX && y == _mY)
@@ -295,27 +388,21 @@ void guiMotionFunc ( int x, int y )
                    fgSetString("/sim/control-mode", "mouse");
                 } else {
                     if ( left_button() ) {
-                        offset = (_mX - x) * brake_sensitivity;
-                        globals->get_controls()->move_brake(FGControls::ALL_WHEELS, offset);
-                        offset = (_mY - y) * throttle_sensitivity;
-                        globals->get_controls()->move_throttle(FGControls::ALL_ENGINES, offset);
+                        move_brake(   (_mX - x) * brake_sensitivity);
+                        move_throttle((_mY - y) * throttle_sensitivity);
                     } else if ( right_button() ) {
-                        if( ! current_autopilot->get_HeadingEnabled() ) {
-                            offset = (x - _mX) * rudder_sensitivity;
-                            globals->get_controls()->move_rudder(offset);
+                        if( ! AP_HeadingEnabled() ) {
+                            move_rudder((x - _mX) * rudder_sensitivity);
                         }
-                        if( ! current_autopilot->get_AltitudeEnabled() ) {
-                            offset = (_mY - y) * trim_sensitivity;
-                            globals->get_controls()->move_elevator_trim(offset);
+                        if( ! AP_AltitudeEnabled() ) {
+                            move_elevator_trim((_mY - y) * trim_sensitivity);
                         }
                     } else {
-                        if( ! current_autopilot->get_HeadingEnabled() ) {
-                            offset = (x - _mX) * aileron_sensitivity;
-                            globals->get_controls()->move_aileron(offset);
+                        if( ! AP_HeadingEnabled() ) {
+                            move_aileron((x - _mX) * aileron_sensitivity);
                         }
-                        if( ! current_autopilot->get_AltitudeEnabled() ) {
-                            offset = (_mY - y) * elevator_sensitivity;
-                            globals->get_controls()->move_elevator(offset);
+                        if( ! AP_AltitudeEnabled() ) {
+                            move_elevator((_mY - y) * elevator_sensitivity);
                         }
                     }
                 }
@@ -380,7 +467,7 @@ void guiMotionFunc ( int x, int y )
                 // do horizontal pan
                 // this could be done in above quat
                 // but requires redoing view pipeline
-                offset = globals->get_current_view()->get_goal_view_offset();
+                offset = get_goal_view_offset();
                 offset += ((_mX - x) * SGD_2PI / W );
                 while (offset < 0.0) {
                     offset += SGD_2PI;
@@ -388,9 +475,9 @@ void guiMotionFunc ( int x, int y )
                 while (offset > SGD_2PI) {
                     offset -= SGD_2PI;
                 }
-                globals->get_current_view()->set_goal_view_offset(offset);
+                set_goal_view_offset(offset);
 #ifdef NO_SMOOTH_MOUSE_VIEW
-                globals->get_current_view()->set_view_offset(offset);
+                set_view_offset(offset);
 #endif
                 break;
             
@@ -443,13 +530,10 @@ void guiMouseFunc(int button, int updown, int x, int y)
                         _mY = _mVy;
                         x = _Vx;
                         y = _Vy;
-                        curGuiQuat[0] = _quat[0];
-                        curGuiQuat[1] = _quat[1];
-                        curGuiQuat[2] = _quat[2];
-                        curGuiQuat[3] = _quat[3];
-                        globals->get_current_view()->set_goal_view_offset(_view_offset);
+                        sgCopyVec4(curGuiQuat, _quat);
+                        set_goal_view_offset(_view_offset);
 #ifdef NO_SMOOTH_MOUSE_VIEW
-                        globals->get_current_view()->set_view_offset(_view_offset);
+                        set_view_offset(_view_offset);
 #endif
                     } else {
                         // center view
@@ -457,18 +541,14 @@ void guiMouseFunc(int button, int updown, int x, int y)
                         _mVy = _mY;
                         _Vx = x;
                         _Vy = y;
-                        _quat[0] = curGuiQuat[0];
-                        _quat[1] = curGuiQuat[1];
-                        _quat[2] = curGuiQuat[2];
-                        _quat[3] = curGuiQuat[3];
-                        x = fgGetInt("/sim/startup/xsize")/2;
-                        y = fgGetInt("/sim/startup/ysize")/2;
+                        sgCopyVec4(_quat,curGuiQuat);
+                        x = MOUSE_XSIZE/2;
+                        y = MOUSE_YSIZE/2;
                         Quat0();
-                        _view_offset =
-                           globals->get_current_view()->get_goal_view_offset();
-                        globals->get_current_view()->set_goal_view_offset(0.0);
+                        _view_offset = get_goal_view_offset();
+                        set_goal_view_offset(0.0);
 #ifdef NO_SMOOTH_MOUSE_VIEW
-                        globals->get_current_view()->set_view_offset(0.0);
+                        set_view_offset(0.0);
 #endif
                     }
                     glutWarpPointer( x , y);
@@ -476,50 +556,57 @@ void guiMouseFunc(int button, int updown, int x, int y)
                     _mVtoggle = ~_mVtoggle;
                     break;
             }
-        }else if ( button == GLUT_RIGHT_BUTTON) {
+        } else if ( button == GLUT_RIGHT_BUTTON) {
             switch (mouse_mode) {
+                               
                 case MOUSE_POINTER:
+                    SG_LOG( SG_INPUT, SG_INFO, "Mouse in yoke mode" );
+                                       
                     mouse_mode = MOUSE_YOKE;
                     mouse_joystick_control = 0;
                     _savedX = x;
                     _savedY = y;
                     // start with zero point in center of screen
-                    _mX = fgGetInt("/sim/startup/xsize")/2;
-                    _mY = fgGetInt("/sim/startup/ysize")/2;
+                    _mX = MOUSE_XSIZE/2;
+                    _mY = MOUSE_YSIZE/2;
                     
                     // try to have the MOUSE_YOKE position
                     // reflect the current stick position
-                    offset = globals->get_controls()->get_aileron();
-                    x = _mX - (int)(offset * aileron_sensitivity);
-                    offset = globals->get_controls()->get_elevator();
-                    y = _mY - (int)(offset * elevator_sensitivity);
+                    x = _mX - (int)(get_aileron() * aileron_sensitivity);
+                    y = _mY - (int)(get_elevator() * elevator_sensitivity);
                     
                     glutSetCursor(GLUT_CURSOR_CROSSHAIR);
-                    SG_LOG( SG_INPUT, SG_INFO, "Mouse in yoke mode" );
                     break;
                     
                 case MOUSE_YOKE:
+                    SG_LOG( SG_INPUT, SG_INFO, "Mouse in view mode" );
+                                       
                     mouse_mode = MOUSE_VIEW;
                     fgSetString("/sim/control-mode", "joystick");
-                    x = fgGetInt("/sim/startup/xsize")/2;
-                    y = fgGetInt("/sim/startup/ysize")/2;
+                                       
+                                       // recenter cursor and reset 
+                    x = MOUSE_XSIZE/2;
+                    y = MOUSE_YSIZE/2;
                     _mVtoggle = 0;
+// #ifndef RESET_VIEW_ON_LEAVING_MOUSE_VIEW
                     Quat0();
                     build_rotmatrix(GuiQuat_mat, curGuiQuat);
+// #endif
                     glutSetCursor(GLUT_CURSOR_LEFT_RIGHT);
-                    SG_LOG( SG_INPUT, SG_INFO, "Mouse in view mode" );
                     break;
                     
                 case MOUSE_VIEW:
+                    SG_LOG( SG_INPUT, SG_INFO, "Mouse in pointer mode" );
+                                       
                     mouse_mode = MOUSE_POINTER;
                     x = _savedX;
                     y = _savedY;
 #ifdef RESET_VIEW_ON_LEAVING_MOUSE_VIEW
                     Quat0();
                     build_rotmatrix(GuiQuat_mat, curGuiQuat);
-                    globals->get_current_view()->set_goal_view_offset(0.0);
+                    set_goal_view_offset(0.0);
 #ifdef NO_SMOOTH_MOUSE_VIEW
-                    globals->get_current_view()->set_view_offset(0.0);
+                    set_view_offset(0.0);
 #endif // NO_SMOOTH_MOUSE_VIEW
 #endif // RESET_VIEW_ON_LEAVING_MOUSE_VIEW
                     glutSetCursor(GLUT_CURSOR_INHERIT);
@@ -528,8 +615,6 @@ void guiMouseFunc(int button, int updown, int x, int y)
                     if(!gui_menu_on)
                         TurnCursorOff();
 #endif // WIN32_CURSOR_TWEAKS_OFF
-                                       
-                    SG_LOG( SG_INPUT, SG_INFO, "Mouse in pointer mode" );
                     break;
             } // end switch (mouse_mode)
             glutWarpPointer( x, y );
index df752b42baa218815b93cf1d89d997ce1e3adc03..41223728195f49aaea59e319a0b25bbe1c98aaf7 100644 (file)
@@ -286,7 +286,8 @@ sgVec3Slider::sgVec3Slider ( int x, int y, sgVec3 vec, const char *title,
         dialer_x = dialer_x + 170;
 
         /* pitch */
-       HS1 = new FloatDial (  dialer_x, dialer_y, dialer_size, vec[1], Ytitle, 89.99f, -89.99f );
+        // HS1 = new FloatDial (  dialer_x, dialer_y, dialer_size, vec[1], Ytitle, 89.99f, -89.99f );
+       HS1 = new FloatDial (  dialer_x, dialer_y, dialer_size, vec[1], Ytitle, 179.99f, -179.99f );
 
         /* radius */
        HS2 = new FloatSlider (  slider_x, slider_y, slider_width, vec[2], Ztitle, 100.0f, 0.0f );
index 56c4d9592c94e36a70fdc2fa29721c613f36f0ce..c0922a59840294710189dddbff927296057313b7 100644 (file)
@@ -353,71 +353,71 @@ bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) {
     double found_dir = 0.0;
 
     if ( id.length() ) {
-       // set initial position from runway and heading
-
-       SGPath path( globals->get_fg_root() );
-       path.append( "Airports" );
-       path.append( "runways.mk4" );
-       FGRunways runways( path.c_str() );
-
-       SG_LOG( SG_GENERAL, SG_INFO,
-               "Attempting to set starting position from runway code "
-               << id << " heading " << tgt_hdg );
-
-       // SGPath inpath( globals->get_fg_root() );
-       // inpath.append( "Airports" );
-       // inpath.append( "apt_simple" );
-       // airports.load( inpath.c_str() );
-
-       // SGPath outpath( globals->get_fg_root() );
-       // outpath.append( "Airports" );
-       // outpath.append( "simple.gdbm" );
-       // airports.dump_gdbm( outpath.c_str() );
-
-       if ( ! runways.search( id, &r ) ) {
-           SG_LOG( SG_GENERAL, SG_ALERT,
-                   "Failed to find " << id << " in database." );
-           return false;
-       }
-
-       double diff;
-       double min_diff = 360.0;
-
-       while ( r.id == id ) {
-           // forward direction
-           diff = tgt_hdg - r.heading;
-           while ( diff < -180.0 ) { diff += 360.0; }
-           while ( diff >  180.0 ) { diff -= 360.0; }
-           diff = fabs(diff);
-           SG_LOG( SG_GENERAL, SG_INFO,
-                   "Runway " << r.rwy_no << " heading = " << r.heading <<
-                   " diff = " << diff );
-           if ( diff < min_diff ) {
-               min_diff = diff;
-               found_r = r;
-               found_dir = 0;
-           }
-
-           // reverse direction
-           diff = tgt_hdg - r.heading - 180.0;
-           while ( diff < -180.0 ) { diff += 360.0; }
-           while ( diff >  180.0 ) { diff -= 360.0; }
-           diff = fabs(diff);
-           SG_LOG( SG_GENERAL, SG_INFO,
-                   "Runway -" << r.rwy_no << " heading = " <<
-                   r.heading + 180.0 <<
-                   " diff = " << diff );
-           if ( diff < min_diff ) {
-               min_diff = diff;
-               found_r = r;
-               found_dir = 180.0;
-           }
-
-           runways.next( &r );
-       }
-
-       SG_LOG( SG_GENERAL, SG_INFO, "closest runway = " << found_r.rwy_no
-               << " + " << found_dir );
+        // set initial position from runway and heading
+
+        SGPath path( globals->get_fg_root() );
+        path.append( "Airports" );
+        path.append( "runways.mk4" );
+        FGRunways runways( path.c_str() );
+
+        SG_LOG( SG_GENERAL, SG_INFO,
+                "Attempting to set starting position from runway code "
+                << id << " heading " << tgt_hdg );
+
+        // SGPath inpath( globals->get_fg_root() );
+        // inpath.append( "Airports" );
+        // inpath.append( "apt_simple" );
+        // airports.load( inpath.c_str() );
+
+        // SGPath outpath( globals->get_fg_root() );
+        // outpath.append( "Airports" );
+        // outpath.append( "simple.gdbm" );
+        // airports.dump_gdbm( outpath.c_str() );
+
+        if ( ! runways.search( id, &r ) ) {
+            SG_LOG( SG_GENERAL, SG_ALERT,
+                    "Failed to find " << id << " in database." );
+            return false;
+        }
+
+        double diff;
+        double min_diff = 360.0;
+
+        while ( r.id == id ) {
+            // forward direction
+            diff = tgt_hdg - r.heading;
+            while ( diff < -180.0 ) { diff += 360.0; }
+            while ( diff >  180.0 ) { diff -= 360.0; }
+            diff = fabs(diff);
+            SG_LOG( SG_GENERAL, SG_INFO,
+                    "Runway " << r.rwy_no << " heading = " << r.heading <<
+                    " diff = " << diff );
+            if ( diff < min_diff ) {
+                min_diff = diff;
+                found_r = r;
+                found_dir = 0;
+            }
+
+            // reverse direction
+            diff = tgt_hdg - r.heading - 180.0;
+            while ( diff < -180.0 ) { diff += 360.0; }
+            while ( diff >  180.0 ) { diff -= 360.0; }
+            diff = fabs(diff);
+            SG_LOG( SG_GENERAL, SG_INFO,
+                    "Runway -" << r.rwy_no << " heading = " <<
+                    r.heading + 180.0 <<
+                    " diff = " << diff );
+            if ( diff < min_diff ) {
+                min_diff = diff;
+                found_r = r;
+                found_dir = 180.0;
+            }
+
+            runways.next( &r );
+        }
+
+        SG_LOG( SG_GENERAL, SG_INFO, "closest runway = " << found_r.rwy_no
+                << " + " << found_dir );
 
     } else {
        return false;
@@ -452,6 +452,7 @@ bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) {
        lat2=olat;
        lon2=olon;
     }
+       
     fgSetDouble("/position/longitude-deg",  lon2 );
     fgSetDouble("/position/latitude-deg",  lat2 );
     fgSetDouble("/orientation/heading-deg", heading );
@@ -506,6 +507,82 @@ bool fgInitGeneral( void ) {
 }
 
 
+// Initialize the flight model subsystem.  This just creates the
+// object.  The actual fdm initialization is delayed until we get a
+// proper scenery elevation hit.  This is checked for in main.cxx
+
+void fgInitFDM() {
+
+    if ( cur_fdm_state ) {
+        delete cur_fdm_state;
+        cur_fdm_state = 0;
+    }
+
+    double dt = 1.0 / fgGetInt("/sim/model-hz");
+    aircraft_dir = fgGetString("/sim/aircraft-dir");
+    const string &model = fgGetString("/sim/flight-model");
+
+    try {
+       if (model == "larcsim") {
+           cur_fdm_state = new FGLaRCsim( dt );
+       } else if (model == "jsb") {
+           cur_fdm_state = new FGJSBsim( dt );
+       } else if (model == "ada") {
+           cur_fdm_state = new FGADA( dt );
+       } else if (model == "balloon") {
+           cur_fdm_state = new FGBalloonSim( dt );
+       } else if (model == "magic") {
+           cur_fdm_state = new FGMagicCarpet( dt );
+       } else if (model == "external") {
+           cur_fdm_state = new FGExternal( dt );
+       } else if (model == "null") {
+           cur_fdm_state = new FGNullFDM( dt );
+       } else if (model == "yasim") {
+           cur_fdm_state = new YASim( dt );
+       } else {
+           SG_LOG(SG_GENERAL, SG_ALERT,
+                  "Unrecognized flight model '" << model
+                  << "', cannot init flight dynamics model.");
+           exit(-1);
+       }
+    } catch ( ... ) {
+       SG_LOG(SG_GENERAL, SG_ALERT, "FlightGear aborting\n\n");
+       exit(-1);
+    }
+}
+
+
+// Initialize view parameters
+void fgInitView() {
+    // Initialize pilot view
+    static const SGPropertyNode *longitude
+       = fgGetNode("/position/longitude-deg");
+    static const SGPropertyNode *latitude
+       = fgGetNode("/position/latitude-deg");
+    static const SGPropertyNode *altitude
+       = fgGetNode("/position/altitude-ft");
+
+    FGViewerRPH *pilot_view
+        = (FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
+
+    pilot_view->set_geod_view_pos( longitude->getDoubleValue()
+                                    * SGD_DEGREES_TO_RADIANS, 
+                                  latitude->getDoubleValue()
+                                    * SGD_DEGREES_TO_RADIANS,
+                                  altitude->getDoubleValue()
+                                    * SG_FEET_TO_METER );
+    pilot_view->set_rph( cur_fdm_state->get_Phi(),
+                        cur_fdm_state->get_Theta(),
+                        cur_fdm_state->get_Psi() );
+
+    // set current view to 0 (first) which is our main pilot view
+    globals->set_current_view( pilot_view );
+
+    SG_LOG( SG_GENERAL, SG_DEBUG, "  abs_view_pos = "
+           << globals->get_current_view()->get_abs_view_pos());
+}
+
+
 // This is the top level init routine which calls all the other
 // initialization routines.  If you are adding a subsystem to flight
 // gear, its initialization call should located in this routine.
@@ -530,8 +607,7 @@ bool fgInitSubsystems( void ) {
 
     SGPath mpath( globals->get_fg_root() );
     mpath.append( "materials.xml" );
-    if ( material_lib.load( mpath.str() ) ) {
-    } else {
+    if ( ! material_lib.load( mpath.str() ) ) {
        SG_LOG( SG_GENERAL, SG_ALERT, "Error loading material lib!" );
        exit(-1);
     }
@@ -562,44 +638,8 @@ bool fgInitSubsystems( void ) {
     // Initialize the flight model subsystem.
     ////////////////////////////////////////////////////////////////////
 
-    double dt = 1.0 / fgGetInt("/sim/model-hz");
-    // cout << "dt = " << dt << endl;
-
-    aircraft_dir = fgGetString("/sim/aircraft-dir");
-    const string &model = fgGetString("/sim/flight-model");
-    try {
-       if (model == "larcsim") {
-           cur_fdm_state = new FGLaRCsim( dt );
-       } else if (model == "jsb") {
-           cur_fdm_state = new FGJSBsim( dt );
-       } else if (model == "ada") {
-           cur_fdm_state = new FGADA( dt );
-       } else if (model == "balloon") {
-           cur_fdm_state = new FGBalloonSim( dt );
-       } else if (model == "magic") {
-           cur_fdm_state = new FGMagicCarpet( dt );
-       } else if (model == "external") {
-           cur_fdm_state = new FGExternal( dt );
-       } else if (model == "null") {
-           cur_fdm_state = new FGNullFDM( dt );
-       } else if (model == "yasim") {
-           cur_fdm_state = new YASim( dt );
-       } else {
-           SG_LOG(SG_GENERAL, SG_ALERT,
-                  "Unrecognized flight model '" << model
-                  << "', cannot init flight dynamics model.");
-           exit(-1);
-       }
-    } catch ( ... ) {
-       SG_LOG(SG_GENERAL, SG_ALERT, "FlightGear aborting\n\n");
-       exit(-1);
-    }
-
-    // Actual fdm initialization is delayed until we get a proper
-    // scenery elevation hit.  This is checked for in main.cxx
-    // cur_fdm_state->init();
-    // cur_fdm_state->bind();
-    
+    fgInitFDM();
+       
     // allocates structures so must happen before any of the flight
     // model or control parameters are set
     fgAircraftInit();   // In the future this might not be the case.
@@ -622,34 +662,7 @@ bool fgInitSubsystems( void ) {
     // Initialize the view manager subsystem.
     ////////////////////////////////////////////////////////////////////
 
-#if 0  /* As this wrongly does an integer division and gets x and y the wrong way around, I guess it's not needed.  JAF */
-    // Initialize win_ratio parameters
-    for ( int i = 0; i < globals->get_viewmgr()->size(); ++i ) {
-       globals->get_viewmgr()->get_view(i)->
-           set_win_ratio( fgGetInt("/sim/startup/xsize") /
-                          fgGetInt("/sim/startup/ysize") );
-    }
-#endif
-
-    // Initialize pilot view
-    FGViewerRPH *pilot_view =
-       (FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
-
-    pilot_view->set_geod_view_pos( longitude->getDoubleValue()
-                                    * SGD_DEGREES_TO_RADIANS, 
-                                  latitude->getDoubleValue()
-                                    * SGD_DEGREES_TO_RADIANS,
-                                  altitude->getDoubleValue()
-                                    * SG_FEET_TO_METER );
-    pilot_view->set_rph( cur_fdm_state->get_Phi(),
-                        cur_fdm_state->get_Theta(),
-                        cur_fdm_state->get_Psi() );
-
-    // set current view to 0 (first) which is our main pilot view
-    globals->set_current_view( pilot_view );
-
-    SG_LOG( SG_GENERAL, SG_DEBUG, "  abs_view_pos = "
-           << globals->get_current_view()->get_abs_view_pos());
+    fgInitView();
 
 
     ////////////////////////////////////////////////////////////////////
@@ -786,6 +799,7 @@ bool fgInitSubsystems( void ) {
     fgInitCommands();
 
 
+#ifdef ENABLE_AUDIO_SUPPORT
     ////////////////////////////////////////////////////////////////////
     // Initialize the sound subsystem.
     ////////////////////////////////////////////////////////////////////
@@ -802,6 +816,7 @@ bool fgInitSubsystems( void ) {
     globals->get_fx()->init();
     globals->get_fx()->bind();
 
+#endif
 
     ////////////////////////////////////////////////////////////////////
     // Initialize the radio stack subsystem.
@@ -843,12 +858,11 @@ bool fgInitSubsystems( void ) {
     current_autopilot->init();
 
     // initialize the gui parts of the autopilot
+    fgAPAdjustInit();
     NewTgtAirportInit();
-    fgAPAdjustInit() ;
     NewHeadingInit();
     NewAltitudeInit();
 
-    
     ////////////////////////////////////////////////////////////////////
     // Initialize I/O subsystem.
     ////////////////////////////////////////////////////////////////////
@@ -930,71 +944,20 @@ void fgReInitSubsystems( void )
     // Initialize the Scenery Management subsystem
     scenery.init();
 
-    // if( global_tile_mgr.init() ) {
-       // Load the local scenery data
+#if 0
+    if( global_tile_mgr.init() ) {
+       Load the local scenery data
        global_tile_mgr.update( longitude->getDoubleValue(),
                                latitude->getDoubleValue() );
-    // } else {
-       // SG_LOG( SG_GENERAL, SG_ALERT, "Error in Tile Manager initialization!" );
-               // exit(-1);
-    // }
-
-    // Delete then Initialize the flight model subsystem.
-    delete cur_fdm_state;
-
-    double dt = 1.0 / fgGetInt("/sim/model-hz");
-    aircraft_dir = fgGetString("/sim/aircraft-dir");
-    const string &model = fgGetString("/sim/flight-model");
-    try {
-       if (model == "larcsim") {
-           cur_fdm_state = new FGLaRCsim( dt );
-       } else if (model == "jsb") {
-           cur_fdm_state = new FGJSBsim( dt );
-       } else if (model == "ada") {
-           cur_fdm_state = new FGADA( dt );
-       } else if (model == "balloon") {
-           cur_fdm_state = new FGBalloonSim( dt );
-       } else if (model == "magic") {
-           cur_fdm_state = new FGMagicCarpet( dt );
-       } else if (model == "external") {
-           cur_fdm_state = new FGExternal( dt );
-       } else if (model == "null") {
-           cur_fdm_state = new FGNullFDM( dt );
-       } else if (model == "yasim") {
-           cur_fdm_state = new YASim( dt );
-       } else {
-           SG_LOG(SG_GENERAL, SG_ALERT,
-                  "Unrecognized flight model '" << model
-                  << "', cannot init flight dynamics model.");
-           exit(-1);
-       }
-    } catch ( ... ) {
-       SG_LOG(SG_GENERAL, SG_ALERT, "FlightGear aborting\n\n");
-       exit(-1);
+    } else {
+       SG_LOG( SG_GENERAL, SG_ALERT, "Error in Tile Manager initialization!" );
+        exit(-1);
     }
+#endif
 
-    // Initialize view parameters
-    FGViewerRPH *pilot_view =
-       (FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
-
-    pilot_view->set_view_offset( 0.0 );
-    pilot_view->set_goal_view_offset( 0.0 );
-
-    pilot_view->set_geod_view_pos( longitude->getDoubleValue()
-                                    * SGD_DEGREES_TO_RADIANS, 
-                                  latitude->getDoubleValue()
-                                    * SGD_DEGREES_TO_RADIANS, 
-                                  cur_fdm_state->get_Altitude()
-                                    * SG_FEET_TO_METER );
-    pilot_view->set_rph( cur_fdm_state->get_Phi(),
-                        cur_fdm_state->get_Theta(),
-                        cur_fdm_state->get_Psi() );
-
-    // set current view to 0 (first) which is our main pilot view
-    globals->set_current_view( pilot_view );
+    fgInitFDM();
 
-    SG_LOG( SG_GENERAL, SG_DEBUG, "  abs_view_pos = "
-           << globals->get_current_view()->get_abs_view_pos());
+    fgInitView();
 
     globals->get_controls()->reset_all();
     current_autopilot->reset();
index 291fa049c772f9cf530e7d4c196386fda63e0aef..c935e4da2b96da481b00e5a888ccd0c59d36e379 100644 (file)
 #include <FDM/flight.hxx>
 #include <FDM/ADA.hxx>
 #include <Scenery/tileentry.hxx>
+
 // Should already be inlcluded by gl.h if needed by your platform so
 // we shouldn't include this here.
 // #include <GL/glext.h>
@@ -203,7 +204,7 @@ sgMat4 copy_of_ssgOpenGLAxisSwapMatrix =
   {  0.0f,  0.0f, -1.0f,  0.0f },
   {  0.0f,  1.0f,  0.0f,  0.0f },
   {  0.0f,  0.0f,  0.0f,  1.0f }
-} ;
+};
 
 // The following defines flightgear options. Because glutlib will also
 // want to parse its own options, those options must not be included here
@@ -259,20 +260,20 @@ void fgBuildRenderStates( void ) {
 
 // fgFindNode -- a function that finds a named node in an ssg graph
 ssgEntity *fgFindNode( ssgEntity *node, const char *name ) {
-  if ( node->getName() != NULL && strcmp( name, node->getName() ) == 0 ) {
-    return node;
-  } else if ( node->isAKindOf( ssgTypeBranch() ) ) {
-    ssgEntity *kid = ((ssgBranch*)node)->getKid(0);
-    while (kid != NULL) {
-      ssgEntity *n = fgFindNode(kid, name);
-      if (n != NULL)
-       return n;
-
-      kid = ((ssgBranch*)node)->getNextKid();
+    if ( node->getName() != NULL && strcmp( name, node->getName() ) == 0 ) {
+        return node;
+    } else if ( node->isAKindOf(ssgTypeBranch()) ) {
+        ssgEntity *kid = ((ssgBranch*)node)->getKid(0);
+        while ( kid != NULL ) {
+            ssgEntity *n = fgFindNode(kid, name);
+            if ( n != NULL ) {
+                return n;
+            }
+            kid = ((ssgBranch*)node)->getNextKid();
+        }
     }
-  }
 
-  return NULL;
+    return NULL;
 }
 
 // fgInitVisuals() -- Initialize various GL/view parameters
@@ -951,7 +952,7 @@ void fgUpdateTimeDepCalcs() {
            // run Autopilot system
            current_autopilot->run();
 
-           // update autopilot
+           // update FDM
            cur_fdm_state->update( 1 );
        }
        FGSteam::update( multi_loop * fgGetInt("/sim/speed-up") );
@@ -1308,6 +1309,7 @@ void fgReshape( int width, int height ) {
 
     fgSetInt("/sim/startup/xsize", width);
     fgSetInt("/sim/startup/ysize", height);
+    guiInitMouse(width, height);
 
     ssgSetFOV( globals->get_current_view()->get_h_fov(),
               globals->get_current_view()->get_v_fov() );
@@ -1400,7 +1402,7 @@ int fgGlutInitEvents( void ) {
     // draw the scene
     glutDisplayFunc( fgRenderFrame );
 
-    return(1);
+    return 1;
 }
 
 
@@ -1544,7 +1546,7 @@ int mainLoop( int argc, char **argv ) {
     int offset = fgGetInt("/sim/startup/time-offset");
     const string &offset_type = fgGetString("/sim/startup/time-offset-type");
     if (offset_type == "system-offset") {
-       globals->set_warp( offset );
+        globals->set_warp( offset );
     } else if (offset_type == "gmt-offset") {
        globals->set_warp( offset - (currGMT - systemLocalTime) );
     } else if (offset_type == "latitude-offset") {
index 085092afcf222abfd4db02f00eaa80b006325f5d..0b68462a1c1e4a5d68de67a9ecd8aec139560571 100644 (file)
@@ -86,9 +86,9 @@ class FGATC610x : public FGProtocol {
 
 public:
 
-    inline FGATC610x() { }
+    FGATC610x() { }
 
-    inline ~FGATC610x() { }
+    ~FGATC610x() { }
 
     bool open();
 
index 3db38628c11e57ece13d94dce4fb2c1a7c33da52..c52848ad3f705ebd00d535ca2937b2de9e0c7884 100644 (file)
@@ -12,6 +12,8 @@
 #include <GL/glut.h>
 #include <GL/gl.h>
 
+#include <plib/sg.h>
+
 #include <simgear/constants.h>
 #include <simgear/sg_inlines.h>
 #include <simgear/debug/logstream.hxx>
@@ -27,7 +29,7 @@
 
 extern ssgBranch *terrain;
 
-
+#if 0
 // check to see if the intersection point is
 // actually inside this face
 static bool pointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
@@ -167,6 +169,121 @@ static void sgdXformPnt3 ( sgdVec3 dst, const sgVec3 src, const sgdMat4 mat )
                t2 * mat[ 2 ][ 2 ] +
                mat[ 3 ][ 2 ] ) ;
 }
+#endif // 0
+
+
+/*
+   Find the intersection of an infinite line with a plane
+   (the line being defined by a point and direction).
+
+   Norman Vine -- nhv@yahoo.com  (with hacks by Steve)
+*/
+
+int sgdIsectInfLinePlane( sgdVec3 dst, sgdVec3 l_org,
+                          sgdVec3 l_vec, sgdVec4 plane )
+{
+  SGDfloat tmp = sgdScalarProductVec3 ( l_vec, plane ) ;
+
+  /* Is line parallel to plane? */
+
+  if ( sgdAbs ( tmp ) < DBL_EPSILON )
+    return FALSE ;
+
+  sgdScaleVec3 ( dst, l_vec, -( sgdScalarProductVec3 ( l_org, plane )
+                                                + plane[3] ) / tmp ) ;
+  sgdAddVec3  ( dst, l_org ) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * Given a point and a triangle lying on the same plane
+ * check to see if the point is inside the triangle
+ */
+bool sgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
+{
+       sgdVec3 dif;
+
+       int i;
+       for( i=0; i<3; i++ ) {
+               SGDfloat min, max;
+               SG_MIN_MAX3 ( min, max, tri[0][i], tri[1][i], tri[2][i] );
+               // punt if outside bouding cube
+               if( (point[i] < min) || (point[i] > max) )
+                       return false;
+               dif[i] = max - min;
+       }
+
+       // drop the smallest dimension so we only have to work in 2d.
+       SGDfloat min_dim = SG_MIN3 (dif[0], dif[1], dif[2]);
+       SGDfloat x1, y1, x2, y2, x3, y3, rx, ry;
+       if ( fabs(min_dim-dif[0]) <= DBL_EPSILON ) {
+               // x is the smallest dimension
+               x1 = point[1];
+               y1 = point[2];
+               x2 = tri[0][1];
+               y2 = tri[0][2];
+               x3 = tri[1][1];
+               y3 = tri[1][2];
+               rx = tri[2][1];
+               ry = tri[2][2];
+       } else if ( fabs(min_dim-dif[1]) <= DBL_EPSILON ) {
+               // y is the smallest dimension
+               x1 = point[0];
+               y1 = point[2];
+               x2 = tri[0][0];
+               y2 = tri[0][2];
+               x3 = tri[1][0];
+               y3 = tri[1][2];
+               rx = tri[2][0];
+               ry = tri[2][2];
+       } else if ( fabs(min_dim-dif[2]) <= DBL_EPSILON ) {
+               // z is the smallest dimension
+               x1 = point[0];
+               y1 = point[1];
+               x2 = tri[0][0];
+               y2 = tri[0][1];
+               x3 = tri[1][0];
+               y3 = tri[1][1];
+               rx = tri[2][0];
+               ry = tri[2][1];
+       } else {
+               // all dimensions are really small so lets call it close
+               // enough and return a successful match
+               return true;
+       }
+
+       // check if intersection point is on the same side of p1 <-> p2 as p3  
+       SGDfloat tmp = (y2 - y3) / (x2 - x3);
+       int side1 = SG_SIGN (tmp * (rx - x3) + y3 - ry);
+       int side2 = SG_SIGN (tmp * (x1 - x3) + y3 - y1);
+       if ( side1 != side2 ) {
+               // printf("failed side 1 check\n");
+               return false;
+       }
+
+       // check if intersection point is on correct side of p2 <-> p3 as p1
+       tmp = (y3 - ry) / (x3 - rx);
+       side1 = SG_SIGN (tmp * (x2 - rx) + ry - y2);
+       side2 = SG_SIGN (tmp * (x1 - rx) + ry - y1);
+       if ( side1 != side2 ) {
+               // printf("failed side 2 check\n");
+               return false;
+       }
+
+       // check if intersection point is on correct side of p1 <-> p3 as p2
+       tmp = (y2 - ry) / (x2 - rx);
+       side1 = SG_SIGN (tmp * (x3 - rx) + ry - y3);
+       side2 = SG_SIGN (tmp * (x1 - rx) + ry - y1);
+       if ( side1 != side2 ) {
+               // printf("failed side 3  check\n");
+               return false;
+       }
+
+       return true;
+}
+
 
 /*
    Find the intersection of an infinite line with a leaf
@@ -187,18 +304,18 @@ static void sgdXformPnt3 ( sgdVec3 dst, const sgVec3 src, const sgdMat4 mat )
     false otherwise
 */
 int FGHitList::IntersectLeaf( ssgLeaf *leaf, sgdMat4 m,
-                                                         sgdVec3 orig, sgdVec3 dir )
+                              sgdVec3 orig, sgdVec3 dir )
 {
     int num_hits = 0;
     for ( int i = 0; i < leaf->getNumTriangles(); ++i ) {
        short i1, i2, i3;
        leaf->getTriangle( i, &i1, &i2, &i3 );
 
-       sgdVec3 tri[3];
-       sgdXformPnt3( tri[0], leaf->getVertex( i1 ), m );
-       sgdXformPnt3( tri[1], leaf->getVertex( i2 ), m );
-       sgdXformPnt3( tri[2], leaf->getVertex( i3 ), m );
-
+        sgdVec3 tri[3];
+        sgdSetVec3( tri[0], leaf->getVertex( i1 ) );
+        sgdSetVec3( tri[1], leaf->getVertex( i2 ) );
+        sgdSetVec3( tri[2], leaf->getVertex( i3 ) );
+       
         //avoid division by zero when two points are the same
         if ( sgdEqualVec3(tri[0], tri[1]) ||
              sgdEqualVec3(tri[1], tri[2]) ||
@@ -209,13 +326,21 @@ int FGHitList::IntersectLeaf( ssgLeaf *leaf, sgdMat4 m,
        sgdVec4 plane;
        sgdMakePlane( plane, tri[0], tri[1], tri[2] );
 
-       sgdVec3 point;
-       if( sgdIsectInfLinePlane( point, orig, dir, plane ) ) {
-           if( pointInTriangle( point, tri ) ) {
-               add(leaf,i,point,plane);
-               num_hits++;
-           }
-       }
+        sgdVec3 point;
+        if( sgdIsectInfLinePlane( point, orig, dir, plane ) ) {
+#if 0
+            if( pointInTriangle( point, tri ) ) {
+                add(leaf,i,point,plane);
+                num_hits++;
+            }
+#endif // 0
+            if( sgdPointInTriangle( point, tri ) ) {
+                // transform point into passed into desired coordinate frame
+                sgdXformPnt3( point, point, m );
+                add(leaf,i,point,plane);
+                num_hits++;
+            }
+        }
     }
     return num_hits;
 }
@@ -224,6 +349,14 @@ void FGHitList::IntersectBranch( ssgBranch *branch, sgdMat4 m,
                                 sgdVec3 orig, sgdVec3 dir )
 {
     sgSphere *bsphere;
+
+    // lookat vector in branch's coordinate frame
+    sgdVec3 _orig, _dir;
+    sgdMat4 _m;
+    sgdTransposeNegateMat4( _m, m);
+    sgdXformPnt3( _orig, orig, _m );
+    sgdXformPnt3( _dir,  dir,  _m );
+       
     for ( ssgEntity *kid = branch->getKid( 0 );
          kid != NULL; 
          kid = branch->getNextKid() )
@@ -233,9 +366,7 @@ void FGHitList::IntersectBranch( ssgBranch *branch, sgdMat4 m,
            sgVec3 fcenter;
            sgCopyVec3( fcenter, bsphere->getCenter() );
            sgdVec3 center;
-           center[0] = fcenter[0]; 
-           center[1] = fcenter[1];
-           center[2] = fcenter[2];
+           sgdSetVec3( center, fcenter ); 
            sgdXformPnt3( center, m ) ;
             // watch out for overflow
            if ( sgdClosestPointToLineDistSquared( center, orig, dir ) <
@@ -253,8 +384,8 @@ void FGHitList::IntersectBranch( ssgBranch *branch, sgdMat4 m,
                         sgdPreMultMat4( m_new, xform );
                    }
                    IntersectBranch( (ssgBranch *)kid, m_new, orig, dir );
-               } else if ( kid->isAKindOf ( ssgTypeLeaf() ) ) {
-                   IntersectLeaf( (ssgLeaf *)kid, m, orig, dir );
+               } else if ( kid->isAKindOf( ssgTypeLeaf() ) ) {
+                   IntersectLeaf( (ssgLeaf *)kid, m, _orig, _dir );
                }
            } else {
                // end of the line for this branch
@@ -322,6 +453,33 @@ void FGHitList::IntersectCachedLeaf( sgdMat4 m,
 }
 
 
+void FGHitList::Intersect( ssgBranch *scene, sgdVec3 orig, sgdVec3 dir ) {
+    sgdMat4 m;
+
+// #define USE_CACHED_HIT
+
+#ifdef USE_CACHED_HIT
+    // This optimization gives a slight speedup
+    // but it precludes using the hitlist for dynamic
+    // objects  NHV
+    init();
+    if( last_hit() ) {
+        sgdMakeIdentMat4 ( m ) ;
+        IntersectCachedLeaf(m, orig, dir);
+    }
+    if( ! num_hits() ) {
+#endif
+
+        clear();
+        sgdMakeIdentMat4 ( m ) ;
+        IntersectBranch( scene, m, orig, dir);
+
+#ifdef USE_CACHED_HIT
+    }
+#endif
+}
+
+
 static void CurrentNormalInLocalPlane(sgVec3 dst, sgVec3 src) {
     sgVec3 tmp;
     sgSetVec3(tmp, src[0], src[1], src[2] );
index b734897002d389897b816150911179c4e9ec69da..f76361653c3c3c16e8899f19237bebc316aa5548 100644 (file)
@@ -75,31 +75,6 @@ public:
 };
 
 
-inline void FGHitList::Intersect( ssgBranch *scene,
-                                 sgdVec3 orig, sgdVec3 dir )
-{
-    sgdMat4 m;
-
-#ifdef USE_CACHED_HIT
-       // This optimization gives a slight speedup
-       // but it precludes using the hitlist for dynamic
-       // objects  NHV
-    init();
-    if( last_hit() ) {
-       sgdMakeIdentMat4 ( m ) ;
-       IntersectCachedLeaf(m, orig, dir);
-    }
-    if( ! num_hits() ) {
-#endif
-       clear();
-       sgdMakeIdentMat4 ( m ) ;
-       IntersectBranch( scene, m, orig, dir);
-#ifdef USE_CACHED_HIT
-    }
-#endif
-}
-
-
 // Associated function, assuming a wgs84 world with 0,0,0 at the
 // center, find the current terrain intersection elevation for the
 // point specified.