]> git.mxchange.org Git - flightgear.git/commitdiff
GUI updates contributed by Norman Vine.
authorcurt <curt>
Tue, 1 Jun 1999 21:17:10 +0000 (21:17 +0000)
committercurt <curt>
Tue, 1 Jun 1999 21:17:10 +0000 (21:17 +0000)
13 files changed:
Simulator/Autopilot/autopilot.cxx
Simulator/Cockpit/cockpit.cxx
Simulator/Cockpit/hud.cxx
Simulator/Cockpit/hud.hxx
Simulator/Cockpit/hud_card.cxx
Simulator/Cockpit/hud_guag.cxx
Simulator/Cockpit/hud_labl.cxx
Simulator/Cockpit/hud_ladr.cxx
Simulator/Cockpit/hud_lat.cxx
Simulator/Cockpit/hud_lon.cxx
Simulator/GUI/gui.cxx
Simulator/GUI/gui.h
Simulator/Main/GLUTkey.cxx

index 1f270ed48d315d4b1717f997556a41af62cb4e0a..5c57eabd0354f5fc350f69106319d8f156cee135 100644 (file)
 
 #include "autopilot.hxx"
 
-#include <GUI/gui.h>
 #include <Include/fg_constants.h>
-#include <Cockpit/panel.hxx>
 #include <Debug/logstream.hxx>
 #include <Main/options.hxx>
-#include <Main/views.hxx>
+#include <GUI/gui.h>
 
 
 // The below routines were copied right from hud.c ( I hate reinventing
@@ -103,7 +101,7 @@ static double fgAPget_agl( void )
 
 // Local Prototype section
 
-double LinearExtrapolate( double x,double x1, double y1, double x2, double y2);
+double LinearExtrapolate( double x, double x1, double y1, double x2, double y2);
 double NormalizeDegrees( double Input);
 
 // End Local ProtoTypes
@@ -155,8 +153,7 @@ bool fgAPAutoThrottleEnabled( void )
 void fgAPAltitudeAdjust( double inc )
 {
     // Remove at a later date
-    fgAPDataPtr APData;
-    APData = APDataGlobal;
+    fgAPDataPtr APData = APDataGlobal;
     // end section
 
     double target_alt, target_agl;
@@ -181,6 +178,21 @@ void fgAPAltitudeAdjust( double inc )
     APData->TargetAGL = target_agl;
 }
 
+void fgAPAltitudeSet( double new_altitude ) {
+    // Remove at a later date
+    fgAPDataPtr APData = APDataGlobal;
+    // end section
+    double target_alt = new_altitude;
+    
+    if ( current_options.get_units() == fgOPTIONS::FG_UNITS_FEET )
+        target_alt = new_altitude * FEET_TO_METER;
+
+    if( target_alt < scenery.cur_elev )
+        target_alt = scenery.cur_elev;
+        
+    APData->TargetAltitude = target_alt;
+}
+
 void fgAPHeadingAdjust( double inc )
 {
     fgAPDataPtr APData;
@@ -191,6 +203,13 @@ void fgAPHeadingAdjust( double inc )
     APData->TargetHeading = NormalizeDegrees(target);
 }
 
+void fgAPHeadingSet( double new_heading ) {
+    fgAPDataPtr APData = APDataGlobal;
+
+    new_heading = NormalizeDegrees( new_heading );
+    APData->TargetHeading = new_heading;
+}
+
 void fgAPAutoThrottleAdjust( double inc )
 {
     fgAPDataPtr APData;
@@ -203,6 +222,8 @@ void fgAPAutoThrottleAdjust( double inc )
 
 void fgAPReset(void)
 {
+    fgAPDataPtr APData = APDataGlobal;
+    
     if( fgAPTerrainFollowEnabled() )
        fgAPToggleTerrainFollow( );
 
@@ -214,6 +235,10 @@ void fgAPReset(void)
                
     if( fgAPAutoThrottleEnabled() )
        fgAPToggleAutoThrottle();
+    
+    APData->TargetHeading = 0.0;     // default direction, due north
+    APData->TargetAltitude = 3000;   // default altitude in meters
+    APData->alt_error_accum = 0.0;
 }
 
 #define mySlider puSlider
@@ -242,9 +267,6 @@ static puText          *APAdjustDialogMessage;
 static puFont          APAdjustLegendFont;
 static puFont          APAdjustLabelFont;
 
-static int DialogX = 40;
-static int DialogY = 100;
-
 static puOneShot       *APAdjustOkButton;
 static puOneShot       *APAdjustResetButton;
 static puOneShot       *APAdjustCancelButton;
@@ -268,7 +290,210 @@ static mySlider        *APAdjustHS3;
 
 static char SliderText[4][8];
 
+// THIS NEEDS IMPROVEMENT !!!!!!!!!!!!!
+static int scan_number(char *s, double *new_value)
+{
+    int ret = 0;
+    char WordBuf[64];
+    char *cptr = s;
+    char *WordBufPtr = WordBuf;
+
+    if (*cptr == '+')
+        cptr++;
+    if (*cptr == '-') {
+        *WordBufPtr++ = *cptr++;
+    }
+    while (isdigit(*cptr) ) {
+        *WordBufPtr++ = *cptr++;
+        ret = 1;
+    }
+    if (*cptr == '.') 
+        *WordBufPtr++ = *cptr++;  // put the '.' into the string
+    while (isdigit(*cptr)) {
+        *WordBufPtr++ = *cptr++;
+        ret = 1;
+    }
+    if( ret == 1 ) {
+        *WordBufPtr = '\0';
+        sscanf(WordBuf, "%lf", new_value);
+    }
+    
+    return(ret);
+} // scan_number
+
+
+///////// AutoPilot New Heading Dialog
+
+static puDialogBox     *ApHeadingDialog;
+static puFrame         *ApHeadingDialogFrame;
+static puText          *ApHeadingDialogMessage;
+static puInput         *ApHeadingDialogInput;
+static puOneShot       *ApHeadingDialogOkButton;
+static puOneShot       *ApHeadingDialogCancelButton;
+
+void ApHeadingDialog_Cancel(puObject *)
+{
+    ApHeadingDialogInput->rejectInput();
+    FG_POP_PUI_DIALOG( ApHeadingDialog );
+}
+
+void ApHeadingDialog_OK (puObject *me)
+{
+    int error = 0;
+    char *c;
+    string s;
+    ApHeadingDialogInput -> getValue( &c );
+    
+    if( strlen(c) ) {
+        double NewHeading;
+        if( scan_number( c, &NewHeading ) )
+           {
+               if(!fgAPHeadingEnabled())
+                   fgAPToggleHeading();
+               fgAPHeadingSet( NewHeading );
+           } else {
+               error = 1;
+               s = c;
+               s += " is not a valid number.";
+           }
+    }
+    ApHeadingDialog_Cancel(me);
+    if( error )  mkDialog(s.c_str());
+}
+
+void NewHeading(puObject *cb)
+{
+    //  string ApHeadingLabel( "Enter New Heading" );
+    //  ApHeadingDialogMessage  -> setLabel(ApHeadingLabel.c_str());
+    ApHeadingDialogInput    -> acceptInput();
+    FG_PUSH_PUI_DIALOG( ApHeadingDialog );
+}
+
+void NewHeadingInit(void)
+{
+    //  printf("NewHeadingInit\n");
+    char NewHeadingLabel[] = "Enter New Heading";
+    char *s;
+
+    float heading = fgAPget_heading();
+    int len = 260/2 -
+       (puGetStringWidth( puGetDefaultLabelFont(), NewHeadingLabel ) /2 );
+    
+    ApHeadingDialog = new puDialogBox (150, 50);
+    {
+        ApHeadingDialogFrame   = new puFrame (0, 0, 260, 150);
+        
+        ApHeadingDialogMessage = new puText   (len, 110);
+        ApHeadingDialogMessage    -> setDefaultValue (NewHeadingLabel);
+        ApHeadingDialogMessage    -> getDefaultValue (&s);
+        ApHeadingDialogMessage    -> setLabel        (s);
+    
+        ApHeadingDialogInput   = new puInput  ( 50, 70, 210, 100 );
+        ApHeadingDialogInput   ->    setValue ( heading );
+
+        ApHeadingDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
+        ApHeadingDialogOkButton     ->     setLegend         (gui_msg_OK);
+        ApHeadingDialogOkButton     ->     makeReturnDefault (TRUE);
+        ApHeadingDialogOkButton     ->     setCallback       (ApHeadingDialog_OK);
+        
+        ApHeadingDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
+        ApHeadingDialogCancelButton ->     setLegend         (gui_msg_CANCEL);
+        ApHeadingDialogCancelButton ->     setCallback       (ApHeadingDialog_Cancel);
+        
+    }
+    FG_FINALIZE_PUI_DIALOG( ApHeadingDialog );
+}
+
+///////// AutoPilot New Altitude Dialog
+
+static puDialogBox     *ApAltitudeDialog = 0;
+static puFrame         *ApAltitudeDialogFrame = 0;
+static puText          *ApAltitudeDialogMessage = 0;
+static puInput         *ApAltitudeDialogInput = 0;
+
+static puOneShot       *ApAltitudeDialogOkButton = 0;
+static puOneShot       *ApAltitudeDialogCancelButton = 0;
+
+void ApAltitudeDialog_Cancel(puObject *)
+{
+    ApAltitudeDialogInput -> rejectInput();
+    FG_POP_PUI_DIALOG( ApAltitudeDialog );
+}
+
+void ApAltitudeDialog_OK (puObject *me)
+{
+    int error = 0;
+    string s;
+    char *c;
+    ApAltitudeDialogInput->getValue( &c );
+
+    if( strlen( c ) ) {
+        double NewAltitude;
+        if( scan_number( c, &NewAltitude) )
+           {
+               if(!(fgAPAltitudeEnabled()))
+                   fgAPToggleAltitude();
+               fgAPAltitudeSet( NewAltitude );
+           } else {
+               error = 1;
+               s = c;
+               s += " is not a valid number.";
+           }
+    }
+    ApAltitudeDialog_Cancel(me);
+    if( error )  mkDialog(s.c_str());
+}
+
+void NewAltitude(puObject *cb)
+{
+    ApAltitudeDialogInput -> acceptInput();
+    FG_PUSH_PUI_DIALOG( ApAltitudeDialog );
+}
+
+void NewAltitudeInit(void)
+{
+    //  printf("NewAltitudeInit\n");
+    char NewAltitudeLabel[] = "Enter New Altitude";
+    char *s;
+
+    float alt = current_aircraft.fdm_state->get_Altitude();
+    int len = 260/2 -
+       (puGetStringWidth( puGetDefaultLabelFont(), NewAltitudeLabel )/2);
+    
+    ApAltitudeDialog = new puDialogBox (150, 50);
+    {
+        ApAltitudeDialogFrame   = new puFrame  (0, 0, 260, 150);
+        ApAltitudeDialogMessage = new puText   (len, 110);
+        ApAltitudeDialogMessage    -> setDefaultValue (NewAltitudeLabel);
+        ApAltitudeDialogMessage    -> getDefaultValue (&s);
+        ApAltitudeDialogMessage    -> setLabel (s);
+        
+        ApAltitudeDialogInput   = new puInput  ( 50, 70, 210, 100 );
+        ApAltitudeDialogInput      -> setValue ( alt );
+        // Uncomment the next line to have input active on startup
+        // ApAltitudeDialogInput   ->    acceptInput       ( );
+        // cursor at begining or end of line ?
+        //len = strlen(s);
+       //      len = 0;
+       //      ApAltitudeDialogInput   ->    setCursor         ( len );
+       //      ApAltitudeDialogInput   ->    setSelectRegion   ( 5, 9 );
+
+        ApAltitudeDialogOkButton     =  new puOneShot         (50, 10, 110, 50);
+        ApAltitudeDialogOkButton     ->     setLegend         (gui_msg_OK);
+        ApAltitudeDialogOkButton     ->     makeReturnDefault (TRUE);
+        ApAltitudeDialogOkButton     ->     setCallback       (ApAltitudeDialog_OK);
+        
+        ApAltitudeDialogCancelButton =  new puOneShot         (140, 10, 210, 50);
+        ApAltitudeDialogCancelButton ->     setLegend         (gui_msg_CANCEL);
+        ApAltitudeDialogCancelButton ->     setCallback       (ApAltitudeDialog_Cancel);
+        
+    }
+    FG_FINALIZE_PUI_DIALOG( ApAltitudeDialog );
+}
+
+/////// simple AutoPilot GAIN / LIMITS ADJUSTER
 
+   
 #define fgAP_CLAMP(val,min,max) \
 ( (val) = (val) > (max) ? (max) : (val) < (min) ? (min) : (val) )
 
@@ -331,21 +556,10 @@ static void rolloutsmooth_adj( puObject *hs )
 
 static void goAwayAPAdjust (puObject *)
 {
-    FGView *v = &current_view;
-    puPopLiveInterface ( ) ;
-    puPopGroup ( ) ;   
-    APAdjustDialog -> hide();
-    if ( current_options.get_panel_status() ) {
-       // this seems to be the only way to do this :-(
-       // problem is the viewport has been mucked with
-       // current_options.toggle_panel();
-       // current_options.toggle_panel();
-       xglViewport(0, 0, (GLint)(v->winWidth), (GLint)(v->winHeight) );
-       FGPanel::OurPanel->ReInit(0, 0, 1024, 768);
-    }
+    FG_POP_PUI_DIALOG( APAdjustDialog );
 }
 
-void cancelAPAdjust(puObject *)
+void cancelAPAdjust(puObject *self)
 {
     fgAPDataPtr APData  = APDataGlobal;
        
@@ -353,13 +567,8 @@ void cancelAPAdjust(puObject *)
     APData->RollOut       = TmpRollOutValue;
     APData->MaxAileron    = TmpMaxAileronValue;
     APData->RollOutSmooth = TmpRollOutSmoothValue;
-       
-    puPopLiveInterface ( ) ;
-    // puPopInterface ( ) ;
-    puPopGroup ( ) ;   
-
-       
-    APAdjustDialog -> hide();
+    
+    goAwayAPAdjust(self);
 }
 
 void resetAPAdjust(puObject *self)
@@ -370,13 +579,10 @@ void resetAPAdjust(puObject *self)
     APData->RollOut       = RollOutAdjust / 2;
     APData->MaxAileron    = MaxAileronAdjust / 2;
     APData->RollOutSmooth = RollOutSmoothAdjust / 2;
-       
-    puPopLiveInterface ( ) ;
-    // puPopInterface ( ) ;
-    puPopGroup ( ) ;   
-
-    APAdjustDialog -> hide();
-    fgAPAdjust(self);
+    
+    FG_POP_PUI_DIALOG( APAdjustDialog );
+    
+    fgAPAdjust( self );
 }
 
 void fgAPAdjust( puObject * )
@@ -397,180 +603,140 @@ void fgAPAdjust( puObject * )
     APAdjustHS1 -> setValue ( RollOutValue ) ;
     APAdjustHS2 -> setValue ( RollOutSmoothValue ) ;
     APAdjustHS3 -> setValue ( MaxAileronValue ) ;
-       
-    // puPushInterface     ( APAdjustDialog ) ;
-    puPushGroup     ( APAdjustDialog ) ;       
-    puPushLiveInterface ( APAdjustDialog ) ;
-       
-    APAdjustDialog -> reveal();
+    
+    FG_PUSH_PUI_DIALOG( APAdjustDialog );
 }
 
-#ifdef NOT_USED
-void dragAPAdjust(puObject *self)
-{
 
-    return;
-                       
-    int LastX, LastY;
-    int DeltaX, DeltaY, X, Y;
-    int button,  count;
+// Done once at system initialization
+// Done once at system initialization
+void fgAPAdjustInit( void ) {
 
-    // button = guiGetMouseButton();
-    guiGetMouse(&LastX, &LastY);
+    //  printf("fgAPAdjustInit\n");
+#define HORIZONTAL  FALSE
 
-    button = 0;
-    printf("button %d  LastX %d  LastY %d\n", button, LastX, LastY);
+    int DialogX = 40;
+    int DialogY = 100;
+    int DialogWidth = 230;
 
-    // count = 0;
-    // while( guiGetMouseButton() == button )
-    for(count=0;count<1000;count++)
-       {
-           guiGetMouse(&X, &Y);
-           printf("    X %d  Y %d\n", X, Y);
-       }
-       
-    DeltaX = X - LastX;
-    DeltaY = Y - LastY;
-
-    // LiveInterface is Dialog Box
-    puInterface *Interface = puGetBaseLiveInterface();
-    puObject *dlist = Interface->getFirstChild() ;
-    // printf("%s %p  %s %p\n",
-    //            Interface->getTypeString(), Interface, dlist->getTypeString(), dlist);
-       
-    Interface -> getPosition ( &X, &Y ) ;
-    Interface -> setPosition ( X + DeltaX, Y + DeltaY ) ;
-    // Interface -> recalc_bbox();
-       
-    for ( puObject *bo = dlist ; bo != NULL ; bo = bo->next )
-       {
-           bo -> getPosition ( &X, &Y ) ;
-           bo -> setPosition ( X + DeltaX, Y + DeltaY ) ;
-           bo -> recalc_bbox();
-           //          printf("%s %p  X %d  Y %d\n", bo->getTypeString(), bo, X, Y);
-       }
+    char Label[] =  "AutoPilot Adjust";
+    char *s;
 
-    Interface->recalc_bbox();
-       
-    puPopLiveInterface ( ) ;
-    // puPopInterface ( ) ;
-    puPopGroup ( ) ;   
+    fgAPDataPtr APData = APDataGlobal;
 
-    APAdjustDialog -> hide();
-    fgAPAdjust(dlist);
-}
-#endif // NOT_USED
+    int labelX = (DialogWidth / 2) -
+       (puGetStringWidth( puGetDefaultLabelFont(), Label ) / 2);
+    labelX -= 30;  // KLUDGEY
 
-// Done once at system initialization
-void fgAPAdjustInit( void )
-{
-#define HORIZONTAL  FALSE
+    int nSliders = 4;
+    int slider_x = 10;
+    int slider_y = 55;
+    int slider_width = 210;
+    int slider_title_x = 15;
+    int slider_value_x = 160;
+    float slider_delta = 0.1f;
+    
+    TmpMaxRollValue       = APData-> MaxRoll;
+    TmpRollOutValue       = APData-> RollOut;
+    TmpMaxAileronValue    = APData-> MaxAileron;
+    TmpRollOutSmoothValue = APData-> RollOutSmooth;
 
-    fgAPDataPtr APData  = APDataGlobal;
-       
-    TmpMaxRollValue        = APData->MaxRoll;
-    TmpRollOutValue        = APData->RollOut;
-    TmpMaxAileronValue     = APData->MaxAileron;
-    TmpRollOutSmoothValue  = APData->RollOutSmooth;
-
-    MaxRollValue        = APData->MaxRoll       / MaxRollAdjust;
-    RollOutValue        = APData->RollOut       / RollOutAdjust;
-    MaxAileronValue     = APData->MaxAileron    / MaxAileronAdjust;
-    RollOutSmoothValue  = APData->RollOutSmooth / RollOutSmoothAdjust;
+    MaxRollValue       = APData-> MaxRoll / MaxRollAdjust;
+    RollOutValue       = APData-> RollOut / RollOutAdjust;
+    MaxAileronValue    = APData-> MaxAileron / MaxAileronAdjust;
+    RollOutSmoothValue = APData-> RollOutSmooth / RollOutSmoothAdjust;
 
     puGetDefaultFonts (  &APAdjustLegendFont,  &APAdjustLabelFont );
-    APAdjustDialog = new puDialogBox (DialogX, DialogY);
-    {
-        int horiz_slider_height =  puGetStringHeight (APAdjustLabelFont) +
+    APAdjustDialog = new puDialogBox ( DialogX, DialogY ); {
+        int horiz_slider_height = puGetStringHeight (APAdjustLabelFont) +
            puGetStringDescender (APAdjustLabelFont) +
-           PUSTR_TGAP + PUSTR_BGAP+5;
-
-        APAdjustFrame  =  new puFrame (0,0,230, 85+4*horiz_slider_height);
-               
-        APAdjustDialogMessage =  new puText   (40, 52 + 4*horiz_slider_height);
-        APAdjustDialogMessage ->     setLabel ("AutoPilot Adjust");
-        
-       //        APAdjustDragButton =  new puButton    (0, 75+4*horiz_slider_height,
-       //                                                                                         230, 85+4*horiz_slider_height);
-       //        APAdjustDragButton -> setLegend   ("*");
-       //        APAdjustDragButton -> setCallback (dragAPAdjust);
-               
-        int slider_y = 55;
-        APAdjustHS0  =   new mySlider    ( 10, slider_y, 210, HORIZONTAL ) ;
-        APAdjustHS0  ->      setDelta    ( 0.1 ) ;
-        APAdjustHS0  ->      setValue    ( MaxRollValue ) ;
-        APAdjustHS0  ->      setCBMode   ( PUSLIDER_DELTA ) ;
-        APAdjustHS0  ->      setCallback ( maxroll_adj ) ;
-               
-       sprintf(SliderText[0],"%05.2f", APData->MaxRoll );
-        APAdjustMaxRollTitle =  new puText   ( 15, slider_y ) ;
-        APAdjustMaxRollTitle ->     setLabel ( "MaxRoll" ) ;
-       APAdjustMaxRollText  =  new puText   ( 160, slider_y ) ;
-       APAdjustMaxRollText  ->     setLabel ( SliderText[0] ) ;
+           PUSTR_TGAP + PUSTR_BGAP + 5;
+
+        APAdjustFrame = new puFrame ( 0, 0,
+                                      DialogWidth, 85 + nSliders * horiz_slider_height );
+
+        APAdjustDialogMessage = new puText ( labelX, 52 + nSliders * horiz_slider_height );
+        APAdjustDialogMessage -> setDefaultValue ( Label );
+        APAdjustDialogMessage -> getDefaultValue ( &s );
+        APAdjustDialogMessage -> setLabel        ( s );
+
+        APAdjustHS0 = new mySlider ( slider_x, slider_y, slider_width, HORIZONTAL ) ;
+        APAdjustHS0-> setDelta ( slider_delta ) ;
+        APAdjustHS0-> setValue ( MaxRollValue ) ;
+        APAdjustHS0-> setCBMode ( PUSLIDER_DELTA ) ;
+        APAdjustHS0-> setCallback ( maxroll_adj ) ;
+
+        sprintf( SliderText[ 0 ], "%05.2f", APData->MaxRoll );
+        APAdjustMaxRollTitle = new puText ( slider_title_x, slider_y ) ;
+        APAdjustMaxRollTitle-> setDefaultValue ( "MaxRoll" ) ;
+        APAdjustMaxRollTitle-> getDefaultValue ( &s ) ;
+        APAdjustMaxRollTitle-> setLabel ( s ) ;
+        APAdjustMaxRollText = new puText ( slider_value_x, slider_y ) ;
+        APAdjustMaxRollText-> setLabel ( SliderText[ 0 ] ) ;
 
         slider_y += horiz_slider_height;
-        
-        APAdjustHS1  = new mySlider    ( 10, slider_y, 210, HORIZONTAL ) ;
-        APAdjustHS1  ->    setDelta    ( 0.1 ) ;
-        APAdjustHS1  ->    setValue    ( RollOutValue ) ;
-        APAdjustHS1  ->    setCBMode   ( PUSLIDER_DELTA ) ;
-        APAdjustHS1  ->    setCallback ( rollout_adj ) ;
-
-       sprintf(SliderText[1],"%05.2f", APData->RollOut );
-        APAdjustRollOutTitle = new puText   ( 15, slider_y ) ;
-        APAdjustRollOutTitle ->    setLabel ( "AdjustRollOut" ) ;
-       APAdjustRollOutText  = new puText   ( 160, slider_y ) ;
-       APAdjustRollOutText  ->    setLabel ( SliderText[1] );
-       
+
+        APAdjustHS1 = new mySlider ( slider_x, slider_y, slider_width, HORIZONTAL ) ;
+        APAdjustHS1-> setDelta ( slider_delta ) ;
+        APAdjustHS1-> setValue ( RollOutValue ) ;
+        APAdjustHS1-> setCBMode ( PUSLIDER_DELTA ) ;
+        APAdjustHS1-> setCallback ( rollout_adj ) ;
+
+        sprintf( SliderText[ 1 ], "%05.2f", APData->RollOut );
+        APAdjustRollOutTitle = new puText ( slider_title_x, slider_y ) ;
+        APAdjustRollOutTitle-> setDefaultValue ( "AdjustRollOut" ) ;
+        APAdjustRollOutTitle-> getDefaultValue ( &s ) ;
+        APAdjustRollOutTitle-> setLabel ( s ) ;
+        APAdjustRollOutText = new puText ( slider_value_x, slider_y ) ;
+        APAdjustRollOutText-> setLabel ( SliderText[ 1 ] );
+
         slider_y += horiz_slider_height;
-        
-        APAdjustHS2  = new mySlider    ( 10, slider_y, 210, HORIZONTAL ) ;
-        APAdjustHS2  ->    setDelta    ( 0.1 ) ;
-        APAdjustHS2  ->    setValue    ( RollOutSmoothValue ) ;
-        APAdjustHS2  ->    setCBMode   ( PUSLIDER_DELTA ) ;
-        APAdjustHS2  ->    setCallback ( rolloutsmooth_adj ) ;
-               
-       sprintf(SliderText[2],"%5.2f", APData->RollOutSmooth );
-        APAdjustRollOutSmoothTitle = new puText   ( 15, slider_y ) ;
-        APAdjustRollOutSmoothTitle ->    setLabel ( "RollOutSmooth" ) ;
-       APAdjustRollOutSmoothText  = new puText   ( 160, slider_y ) ;
-       APAdjustRollOutSmoothText  ->    setLabel ( SliderText[2] );
+
+        APAdjustHS2 = new mySlider ( slider_x, slider_y, slider_width, HORIZONTAL ) ;
+        APAdjustHS2-> setDelta ( slider_delta ) ;
+        APAdjustHS2-> setValue ( RollOutSmoothValue ) ;
+        APAdjustHS2-> setCBMode ( PUSLIDER_DELTA ) ;
+        APAdjustHS2-> setCallback ( rolloutsmooth_adj ) ;
+
+        sprintf( SliderText[ 2 ], "%5.2f", APData->RollOutSmooth );
+        APAdjustRollOutSmoothTitle = new puText ( slider_title_x, slider_y ) ;
+        APAdjustRollOutSmoothTitle-> setDefaultValue ( "RollOutSmooth" ) ;
+        APAdjustRollOutSmoothTitle-> getDefaultValue ( &s ) ;
+        APAdjustRollOutSmoothTitle-> setLabel ( s ) ;
+        APAdjustRollOutSmoothText = new puText ( slider_value_x, slider_y ) ;
+        APAdjustRollOutSmoothText-> setLabel ( SliderText[ 2 ] );
 
         slider_y += horiz_slider_height;
-        
-        APAdjustHS3  = new mySlider    ( 10, slider_y, 210, HORIZONTAL ) ;
-        APAdjustHS3  ->    setDelta    ( 0.1 ) ;
-        APAdjustHS3  ->    setValue    ( MaxAileronValue ) ;
-        APAdjustHS3  ->    setCBMode   ( PUSLIDER_DELTA ) ;
-        APAdjustHS3  ->    setCallback ( maxaileron_adj ) ;
-        
-       sprintf(SliderText[3],"%05.2f", APData->MaxAileron );
-        APAdjustMaxAileronTitle = new puText   ( 15, slider_y ) ;
-        APAdjustMaxAileronTitle ->    setLabel ( "MaxAileron" ) ;
-       APAdjustMaxAileronText =  new puText   ( 160, slider_y ) ;
-       APAdjustMaxAileronText ->     setLabel ( SliderText[3] );
-       
-        APAdjustOkButton =  new puOneShot         (10, 10, 60, 50);
-        APAdjustOkButton ->     setLegend         ("OK");
-        APAdjustOkButton ->     makeReturnDefault (TRUE );
-        APAdjustOkButton ->     setCallback       (goAwayAPAdjust);
-               
-        APAdjustCancelButton =  new puOneShot         (70, 10, 150, 50);
-        APAdjustCancelButton ->     setLegend         ("Cancel");
-        APAdjustCancelButton ->     makeReturnDefault (TRUE );
-        APAdjustCancelButton ->     setCallback       (cancelAPAdjust);
-               
-        APAdjustResetButton =  new puOneShot         (160, 10, 220, 50);
-        APAdjustResetButton ->     setLegend         ("Reset");
-        APAdjustResetButton ->     makeReturnDefault (TRUE );
-        APAdjustResetButton ->     setCallback       (resetAPAdjust);
+
+        APAdjustHS3 = new mySlider ( slider_x, slider_y, slider_width, HORIZONTAL ) ;
+        APAdjustHS3-> setDelta ( slider_delta ) ;
+        APAdjustHS3-> setValue ( MaxAileronValue ) ;
+        APAdjustHS3-> setCBMode ( PUSLIDER_DELTA ) ;
+        APAdjustHS3-> setCallback ( maxaileron_adj ) ;
+
+        sprintf( SliderText[ 3 ], "%05.2f", APData->MaxAileron );
+        APAdjustMaxAileronTitle = new puText ( slider_title_x, slider_y ) ;
+        APAdjustMaxAileronTitle-> setDefaultValue ( "MaxAileron" ) ;
+        APAdjustMaxAileronTitle-> getDefaultValue ( &s ) ;
+        APAdjustMaxAileronTitle-> setLabel ( s ) ;
+        APAdjustMaxAileronText = new puText ( slider_value_x, slider_y ) ;
+        APAdjustMaxAileronText-> setLabel ( SliderText[ 3 ] );
+
+        APAdjustOkButton = new puOneShot ( 10, 10, 60, 50 );
+        APAdjustOkButton-> setLegend ( gui_msg_OK );
+        APAdjustOkButton-> makeReturnDefault ( TRUE );
+        APAdjustOkButton-> setCallback ( goAwayAPAdjust );
+
+        APAdjustCancelButton = new puOneShot ( 70, 10, 150, 50 );
+        APAdjustCancelButton-> setLegend ( gui_msg_CANCEL );
+        APAdjustCancelButton-> setCallback ( cancelAPAdjust );
+
+        APAdjustResetButton = new puOneShot ( 160, 10, 220, 50 );
+        APAdjustResetButton-> setLegend ( gui_msg_RESET );
+        APAdjustResetButton-> setCallback ( resetAPAdjust );
     }
-    APAdjustDialog -> close();
-    //  APAdjustDialog -> reveal();
-    // Take it off the Stack 
-    puPopLiveInterface ( ) ;
-    // puPopInterface ( ) ;
-    puPopGroup ( ) ;   
+    FG_FINALIZE_PUI_DIALOG( APAdjustDialog );
+    
 #undef HORIZONTAL
 }
 
@@ -632,6 +798,8 @@ void fgAPInit( fgAIRCRAFT *current_aircraft )
 #endif // !defined( USING_SLIDER_CLASS )
 
     fgAPAdjustInit( ) ;
+    NewHeadingInit();
+    NewAltitudeInit();
 };
 
 int fgAPRun( void )
@@ -805,27 +973,27 @@ int fgAPRun( void )
     /*
     if (APData->Mode == 2) // Glide slope hold
     {
-       double RelSlope;
-       double RelElevator;
-               
-       // First, calculate Relative slope and normalize it
-       RelSlope = NormalizeDegrees( APData->TargetSlope - get_pitch());
-       
-       // Now calculate the elevator offset from current angle
-       if ( abs(RelSlope) > APData->SlopeSmooth )
-       {
-           if ( RelSlope < 0 )         //  set RelElevator to max in the correct direction
-               RelElevator = -APData->MaxElevator;
-           else
-               RelElevator = APData->MaxElevator;
-       }
-               
-       else
-           RelElevator = LinearExtrapolate(RelSlope,-APData->SlopeSmooth,-APData->MaxElevator,APData->SlopeSmooth,APData->MaxElevator);
-               
-       // set the elevator
-       fgElevMove(RelElevator);
-               
+    double RelSlope;
+    double RelElevator;
+        
+    // First, calculate Relative slope and normalize it
+    RelSlope = NormalizeDegrees( APData->TargetSlope - get_pitch());
+    
+    // Now calculate the elevator offset from current angle
+    if ( abs(RelSlope) > APData->SlopeSmooth )
+    {
+        if ( RelSlope < 0 )     //  set RelElevator to max in the correct direction
+        RelElevator = -APData->MaxElevator;
+        else
+        RelElevator = APData->MaxElevator;
+    }
+        
+    else
+        RelElevator = LinearExtrapolate(RelSlope,-APData->SlopeSmooth,-APData->MaxElevator,APData->SlopeSmooth,APData->MaxElevator);
+        
+    // set the elevator
+    fgElevMove(RelElevator);
+        
     }
     */
     
@@ -947,11 +1115,11 @@ double LinearExtrapolate( double x,double x1,double y1,double x2,double y2)
     // This procedure extrapolates the y value for the x posistion on a line defined by x1,y1; x2,y2
     //assert(x1 != x2); // Divide by zero error.  Cold abort for now
     
-    double m, b, y;    // the constants to find in y=mx+b
-    m=(y2-y1)/(x2-x1); // calculate the m
-    b= y1- m * x1;     // calculate the b
-    y = m * x + b;     // the final calculation
-       
+    double m, b, y;     // the constants to find in y=mx+b
+    m=(y2-y1)/(x2-x1);  // calculate the m
+    b= y1- m * x1;  // calculate the b
+    y = m * x + b;  // the final calculation
+    
     return y;
 };
 
index bd0c5398901042f7a82bb305cdddc8c2c4b575f4..648c0a83e282e7f14fab19bc3d524ce69a3401c0 100644 (file)
@@ -38,7 +38,6 @@
 
 #include <Aircraft/aircraft.hxx>
 #include <Debug/logstream.hxx>
-#include <GUI/gui.h>
 #include <Include/fg_constants.h>
 #include <Include/general.hxx>
 #include <Main/options.hxx>
@@ -49,6 +48,7 @@
 #include <Scenery/scenery.hxx>
 #include <Time/fg_timer.hxx>
 #include <Time/fg_time.hxx>
+#include <GUI/gui.h>
 
 #include "cockpit.hxx"
 
 // cockpit/panel/hud system
 
 static pCockpit ac_cockpit;
+fntRenderer *HUDtext = 0;
+float  HUD_TextSize = 0;
+int HUD_style = 0;
 
+float HUD_matrix[16];
 // The following routines obtain information concerntin the aircraft's
 // current state and return it to calling instrument display routines.
 // They should eventually be member functions of the aircraft.
@@ -65,32 +69,19 @@ static pCockpit ac_cockpit;
 
 float get_latitude( void )
 {
-//  FGState *f;
     double lat;
-    
-//  current_aircraft.fdm_state
 
     lat = current_aircraft.fdm_state->get_Latitude() * RAD_TO_DEG;
 
     float flat = lat;
     return(flat);
 
-//  if(fabs(lat)<1.0)
-//  {
-//      if(lat<0)
-//          return( -(double)((int)lat) );
-//      else
-//          return( (double)((int)lat) );
-//  }
-//  return( (double)((int)lat) );
 }
+
 float get_lat_min( void )
 {
-//  FGState *f;
     double      a, d;
 
-//  current_aircraft.fdm_state
-    
     a = current_aircraft.fdm_state->get_Latitude() * RAD_TO_DEG;    
     if (a < 0.0) {
         a = -a;
@@ -104,23 +95,11 @@ float get_lat_min( void )
 float get_longitude( void )
 {
     double lon;
-//  FGState *f;
-    
-//  current_aircraft.fdm_state
 
     lon = current_aircraft.fdm_state->get_Longitude() * RAD_TO_DEG;
 
     float flon = lon;
     return(flon);
-    
-//  if(fabs(lon)<1.0)
-//  {
-//      if(lon<0)
-//          return( -(double)((int)lon) );
-//      else
-//          return( (double)((int)lon) );
-//  }
-//  return( (double)((int)lon) );
 }
 
 
@@ -139,11 +118,7 @@ get_formated_gmt_time( void )
 
 float get_long_min( void )
 {
-//  FGState *f;
     double  a, d;
-
-//  current_aircraft.fdm_state
-    
     a = current_aircraft.fdm_state->get_Longitude() * RAD_TO_DEG;   
     if (a < 0.0) {
         a = -a;
@@ -234,10 +209,6 @@ float get_altitude( void )
 
 float get_agl( void )
 {
-//  FGState *f;
-
-//  f = current_aircraft.fdm_state;
-
     float agl;
 
     if ( current_options.get_units() == fgOPTIONS::FG_UNITS_FEET ) {
@@ -252,11 +223,7 @@ float get_agl( void )
 
 float get_sideslip( void )
 {
-//  FGState *f;
-        
-//  f = current_aircraft.fdm_state;
     float sideslip = current_aircraft.fdm_state->get_Beta();
-        
     return( sideslip );
 }
 
@@ -292,10 +259,6 @@ float get_vfc_tris_culled   ( void )
 
 float get_climb_rate( void )
 {
-//  FGState *f;
-
-//  current_aircraft.fdm_state
-
     float climb_rate;
     if ( current_options.get_units() == fgOPTIONS::FG_UNITS_FEET ) {
         climb_rate = current_aircraft.fdm_state->get_Climb_Rate() * 60.0;
@@ -308,22 +271,16 @@ float get_climb_rate( void )
 
 float get_view_direction( void )
 {
-//  FGState *f;
-
-
-//    FGView *pview;
     double view;
  
-//    pview = &current_view;
-//  current_aircraft.fdm_state
-
     view = FG_2PI - current_view.get_view_offset();
-
     view = ( current_aircraft.fdm_state->get_Psi() + view) * RAD_TO_DEG;
+    
     if(view > 360.)
         view -= 360.;
     else if(view<0.)
         view += 360.;
+    
     float fview = view;
     return( fview );
 }
@@ -352,7 +309,7 @@ char *dmshh_format(double degrees)
     if (min_part >= 60)
       min_part -= 60, deg_part += 1;
 
-    sprintf(buf,"%02d*%02d\'%05.2f\"",deg_part,min_part,sec_part);
+    sprintf(buf,"%02d*%02d %05.2f",deg_part,min_part,sec_part);
 
     return buf;
 }
@@ -387,7 +344,7 @@ static char *toDMS(float a)
   if (neg)
     d = -d;
   
-  sprintf(dms, "%.0f*%02.0f'%04.1f\"", d, m, s);
+  sprintf(dms, "%.0f*%02.0f %04.1f", d, m, s);
   return dms;
 }
 
@@ -415,10 +372,12 @@ static char *toDM(float a)
   }
   if (neg) d = -d;
   
-  sprintf(dm, "%.0f*%06.3f'", d, m);
+  sprintf(dm, "%.0f*%06.3f", d, m);
   return dm;
 }
 
+// Have to set the LatLon display type
+//static char *(*fgLatLonFormat)(float) = toDM;
 static char *(*fgLatLonFormat)(float);
 
 char *coord_format_lat(float latitude)
@@ -473,105 +432,6 @@ char *coord_format_latlon(double latitude, double longitude)
 }
 #endif
 
-#ifdef FAST_TEXT_TEST
-#undef FAST_TEXT_TEST
-#endif
-
-#ifdef FAST_TEXT_TEST
-
-static unsigned int first=0, last=128;
-unsigned int font_base;
-
-#define FONT "-adobe-courier-medium-r-normal--24-240-75-75-m-150-iso8859-1"
-HFONT hFont;
-
-void Font_Setup(void)
-{
-#ifdef _WIN32
-  int count;
-  HDC    hdc;  
-  HGLRC  hglrc; 
-
-
-  hdc = wglGetCurrentDC();
-  hglrc = wglGetCurrentContext();
-  
-  if (hdc == 0 || hglrc == 0) {
-    printf("Could not get context or DC\n");
-    exit(1);
-  }
-  
-  if (!wglMakeCurrent(hdc, hglrc)) {
-    printf("Could not make context current\n");
-    exit(1);
-  }
-
-#define FONTBASE 0x1000
-    /*
-    hFont = GetStockObject(SYSTEM_FONT);
-    hFont = CreateFont(h, w, esc, orient, weight,
-        ital, under, strike, set, out, clip, qual, pitch/fam, face);
-    */
-    hFont = CreateFont(30, 0, 0, 0, FW_NORMAL,
-        FALSE, FALSE, FALSE, ANSI_CHARSET,
-        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DRAFT_QUALITY,
-        FIXED_PITCH | FF_MODERN, "Arial");
-    if (!hFont) {
-    MessageBox(WindowFromDC(hdc),
-        "Failed to find acceptable bitmap font.",
-        "OpenGL Application Error",
-        MB_ICONERROR | MB_OK);
-    exit(1);
-    }
-    (void) SelectObject(hdc, hFont);
-    wglUseFontBitmaps(hdc, 0, 255, FONTBASE);
-    glListBase(FONTBASE);
-#if 0
-  SelectObject (hdc, GetStockObject (SYSTEM_FONT));
-
-  count=last-first+1;
-  font_base = glGenLists(count);
-  wglUseFontBitmaps (hdc, first, last, font_base);
-  if (font_base == 0) {
-    printf("Could not generate Text_Setup list\n");
-    exit(1);
-  }
-#endif // 0  
-#else
-  Display *Dpy;
-  XFontStruct *fontInfo;
-  Font id;
-
-  Dpy = XOpenDisplay(NULL);
-  fontInfo = XLoadQueryFont(Dpy, FONT);
-  if (fontInfo == NULL)
-    {
-      printf("Failed to load font %s\n", FONT);
-      exit(1);
-    }
-
-  id = fontInfo->fid;
-  first = fontInfo->min_char_or_byte2;
-  last = fontInfo->max_char_or_byte2;
-  
-  base = glGenLists((GLuint) last+1);
-  if (base == 0) {
-    printf ("out of display lists\n");
-    exit (1);
-  }
-  glXUseXFont(id, first, last-first+1, base+first);
-#endif
-}
-
-static void
-drawString(char *string, GLfloat x, GLfloat y, GLfloat color[4])
-{
-    glColor4fv(color);
-    glRasterPos2f(x, y);
-    glCallLists(strlen(string), GL_BYTE, (GLbyte *) string);
-}
-
-#endif // #ifdef FAST_TEXT_TEST
 
 bool fgCockpitInit( fgAIRCRAFT *cur_aircraft )
 {
@@ -589,10 +449,6 @@ bool fgCockpitInit( fgAIRCRAFT *cur_aircraft )
     // HI_Head is now a null pointer so we can generate a new list from the
     // current aircraft.
 
-#ifdef FAST_TEXT_TEST
-    Font_Setup();
-#endif // #ifdef FAST_TEXT_TEST
-    
     fgHUDInit( cur_aircraft );
     ac_cockpit = new fg_Cockpit();
     
@@ -606,80 +462,61 @@ bool fgCockpitInit( fgAIRCRAFT *cur_aircraft )
     FG_LOG( FG_COCKPIT, FG_INFO,
         "  Code " << ac_cockpit->code() << " Status " 
         << ac_cockpit->status() );
-    
+
+//  HUD_TextSize = (current_options.get_xsize() > 1000) ? 10 : 8;
+    HUD_TextSize = 10;
+    HUDtext = new fntRenderer();
+    HUDtext -> setFont      ( guiFntHandle ) ;
+    HUDtext -> setPointSize ( HUD_TextSize ) ;
+    HUD_TextList.setFont( HUDtext );
+
     return true;
 }
 
 
 void fgCockpitUpdate( void ) {
 
-#define DISPLAY_COUNTER
-#ifdef DISPLAY_COUNTER
-    static float lightCheck[4] = { 0.7F, 0.7F, 0.7F, 1.0F };
-    char buf[64],*ptr;
-//  int fontSize;
-    int c;
-#endif
+    int iwidth   = current_view.get_winWidth();
+    int iheight  = current_view.get_winHeight();
+    float width  = iwidth;
+    float height = iheight;
     
     FG_LOG( FG_COCKPIT, FG_DEBUG,
         "Cockpit: code " << ac_cockpit->code() << " status " 
         << ac_cockpit->status() );
 
     if ( current_options.get_hud_status() ) {
-    // This will check the global hud linked list pointer.
-    // If these is anything to draw it will.
-    fgUpdateHUD();
+        // This will check the global hud linked list pointer.
+        // If these is anything to draw it will.
+        fgUpdateHUD();
     }
+#define DISPLAY_COUNTER
 #ifdef DISPLAY_COUNTER
     else
     {
+        char buf[64];
         float fps    =       get_frame_rate();
-        float tris   = fps * get_vfc_tris_drawn();
-        float culled = fps * get_vfc_tris_culled();
-        
-        int len = sprintf(buf," %4.1f  %7.0f  %7.0f",
-                          fps, tris, culled);
-//      sprintf(buf,"Tris Per Sec: %7.0f", t);      
-//      fontSize = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
+//      float tris   = fps * get_vfc_tris_drawn();
+//      float culled = fps * get_vfc_tris_culled();
+//      sprintf(buf,"%-4.1f  %7.0f  %7.0f", fps, tris, culled);
+        sprintf(buf,"%-5.1f", fps);
+
         glMatrixMode(GL_PROJECTION);
         glPushMatrix();
-
         glLoadIdentity();
-        gluOrtho2D(0, 1024, 0, 768);
+        gluOrtho2D(0, width, 0, height);
         glMatrixMode(GL_MODELVIEW);
         glPushMatrix();
         glLoadIdentity();
 
         glDisable(GL_DEPTH_TEST);
         glDisable(GL_LIGHTING);
-
-//      glColor3f (.90, 0.27, 0.67);
         
+        glColor3f (0.9, 0.4, 0.2);
 
-#ifdef FAST_TEXT_TEST
-        drawString(buf, 250.0F, 10.0F, lightCheck);
-//      glRasterPos2f( 220, 10);
-//      for (int i=0; i < len; i++) {
-//          glCallList(font_base+buf[i]);
-//      }
-#else
-        glColor3f (.8, 0.8, 0.8);
-        glTranslatef( 400, 10, 0);
-        glScalef(.1, .1, 0.0);
-        ptr = buf;
-        while ( ( c = *ptr++) ){
-            glutStrokeCharacter( GLUT_STROKE_MONO_ROMAN, c);
-        }
-#endif // #ifdef FAST_TEXT_TEST
-
-//      glutStrokeCharacter( GLUT_STROKE_MONO_ROMAN, ' ');
-//      glutStrokeCharacter( GLUT_STROKE_MONO_ROMAN, ' ');
-        
-//      ptr = get_formated_gmt_time();
-//      while ( ( c = *ptr++) ){
-//          glutStrokeCharacter( GLUT_STROKE_MONO_ROMAN, c);
-//      }
-        
+        guiFnt.drawString( buf,
+                           width/2 - guiFnt.getStringWidth(buf)/2,
+                           10 );
         glEnable(GL_DEPTH_TEST);
         glEnable(GL_LIGHTING);
         glMatrixMode(GL_PROJECTION);
@@ -687,14 +524,13 @@ void fgCockpitUpdate( void ) {
         glMatrixMode(GL_MODELVIEW);
         glPopMatrix();
     }
-#endif // DISPLAY_COUNTER
-
-    if ( current_options.get_panel_status() && 
-     (fabs( current_view.get_view_offset() ) < 0.2) )
+#endif // #ifdef DISPLAY_COUNTER
+    
+    if( current_options.get_panel_status() && 
+         (fabs( current_view.get_view_offset() ) < 0.2) )
     {
-    xglViewport( 0, 0, 
-             current_view.get_winWidth(), 
-             current_view.get_winHeight() );
-    FGPanel::OurPanel->Update();
+        xglViewport( 0, 0, iwidth, iheight );
+
+        FGPanel::OurPanel->Update();
     }
 }
index 0bc36600a1a139f98de3d5e46a1b0a7a64da121e..e98f855cf7269fcf6997001013390bfa3a54a839 100644 (file)
@@ -69,14 +69,10 @@ static char units[5];
 //
 
 deque< instr_item * > HUD_deque;
-vector< fgLineSeg2D > HUD_LineList;
-vector< fgLineSeg2D > HUD_StippleLineList;
 
-#ifdef USE_HUD_TextList
-vector< fgTextString > HUD_TextList;
-#endif
-
-//GLFONT *myFont;
+fgTextList         HUD_TextList;
+fgLineList         HUD_LineList;
+fgLineList         HUD_StippleLineList;
 
 class locRECT {
   public:
@@ -158,6 +154,17 @@ void strokeString(int x, int y, char *msg, void *font, float theta)
     }
 }
 
+int getStringWidth ( char *str )
+{
+    if ( HUDtext && str )
+    {
+        float r, l ;
+        guiFntHandle->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ;
+        return FloatToInt( r - l );
+    }
+    return 0 ;
+}
+
 //========================= End of Class Implementations===================
 // fgHUDInit
 //
@@ -187,10 +194,12 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
   unsigned int ladr_w2 = 60;
   int ladr_h2 = 90;
   int ladr_t = 35;
-//  int compass_w2 = 100;
+  int compass_w = 200;
   int gap = 10;
 
   font_size = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
+  
+  HUD_style = 1;
 
   FG_LOG( FG_COCKPIT, FG_INFO, "Initializing current aircraft HUD" );
 
@@ -223,9 +232,9 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
   HUD_deque.insert( HUD_deque.begin(), HIptr);
 
 //      case 4:    // GYRO COMPASS
-  HIptr = (instr_item *) new hud_card( cen_x-100,
+  HIptr = (instr_item *) new hud_card( cen_x-(compass_w/2),
                                        max_y,
-                                       200,
+                                       compass_w,
                                        28,
                                        get_heading,
                                        HUDS_TOP,
@@ -240,9 +249,9 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
 
 //      case 5:    // AMSL
   HIptr = (instr_item *) new hud_card( max_x - 35 -15, // 15 to balance speed card
-                                       cen_y-100,
+                                       cen_y-(compass_w/2),
                                        35,
-                                       200,
+                                       compass_w,
                                        get_altitude,
 //                                     HUDS_RIGHT | HUDS_VERT,
                                        HUDS_LEFT | HUDS_VERT,
@@ -276,7 +285,7 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
                                        HUDS_LEFT | HUDS_VERT,
                                        1000, 0,
                                        1.0,
-                                       25,    5,
+                                       25, 5,
                                        0,
                                        0,
                                        200.0,
@@ -309,9 +318,9 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
 
 //      case 2:    // KIAS
   HIptr = (instr_item *) new hud_card( min_x +10 +5, //min_x +18,
-                                       cen_y-100,
+                                       cen_y-(compass_w/2),
                                        28,
-                                       200,
+                                       compass_w,
                                        get_speed,
 //                                     HUDS_LEFT | HUDS_VERT,
                                        HUDS_RIGHT | HUDS_VERT,                                     
@@ -340,7 +349,7 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
 // Remove this when below uncommented       
 //      case 10:
   HIptr = (instr_item *) new instr_label( 10,
-                                          10,
+                                          25,
                                           60,
                                           10,
                                           get_frame_rate,
@@ -355,9 +364,9 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
                                           TRUE );
   HUD_deque.insert( HUD_deque.begin(), HIptr);
   
-    HIptr = (instr_item *) new lat_label( (cen_x -ladr_w2)/2,
+  HIptr = (instr_item *) new lat_label(  (cen_x - (compass_w/2))/2,
                                           max_y,    
-                                          60,
+                                          1,
                                           text_h,
                                           get_latitude,
                                           "%s%", //"%.0f",
@@ -371,21 +380,19 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
                                           TRUE );
   HUD_deque.insert( HUD_deque.begin(), HIptr);
     
-    HIptr = (instr_item *) new lon_label(
-                                         //(cen_x+ladr_x2) +((max_x-(cen_x+ladr_x2))/2),
-                                         (2*cen_x) - ((cen_x -ladr_w2)/2),
-                                         max_y,
-                                         60, text_h,
-                                         get_longitude,
-                                         "%s%",//"%.0f",
-                                         "", //"Lon ",  
-                                         "",
-                                         1.0,
-                                         HUDS_TOP,
-                                         CENTER_JUST,
-                                         font_size,
-                                         0,
-                                         TRUE );
+    HIptr = (instr_item *) new lon_label(((cen_x+compass_w/2)+(2*cen_x))/2,
+                                          max_y,
+                                          1, text_h,
+                                          get_longitude,
+                                          "%s%",//"%.0f",
+                                          "", //"Lon ", 
+                                          "",
+                                          1.0,
+                                          HUDS_TOP,
+                                          CENTER_JUST,
+                                          font_size,
+                                          0,
+                                          TRUE );
   HUD_deque.insert( HUD_deque.begin(), HIptr);
     
 /*
@@ -644,11 +651,13 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
     int ladr_w2 = 60;
 //  int ladr_h2 = 90;
 //  int ladr_t = 35;
-//  int compass_w2 = 100;
+    int compass_w = 200;
 //  int gap = 10;
 
     font_size = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
 
+    HUD_style = 2;
+
     FG_LOG( FG_COCKPIT, FG_INFO, "Initializing current aircraft HUD" );
 
 //  deque < instr_item * > :: iterator first = HUD_deque.begin();
@@ -672,9 +681,9 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
     instr_item* p;
 
 //      case 4:    // GYRO COMPASS
-    p =new hud_card( cen_x-100,
+    p =new hud_card( cen_x-(compass_w/2),
                      max_y,
-                     200,
+                     compass_w,
                      28,
                      get_view_direction,
                      HUDS_TOP,
@@ -687,9 +696,9 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
                      true);
     HUD_deque.push_front( p );
 
-    p = new lat_label( (cen_x -ladr_w2)/2,
+    p = new lat_label( (cen_x - compass_w/2)/2,
                        max_y,
-                       60, text_h,
+                       0, text_h,
                        get_latitude,
                        "%s%", //"%.0f",
                        "", //"Lat ",
@@ -715,9 +724,9 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
 //           TRUE );
 //    HUD_deque.push_front( p );
     
-    p = new lon_label( (2*cen_x) - ((cen_x -ladr_w2)/2),
+    p = new lon_label(((cen_x+compass_w/2)+(2*cen_x))/2,
                        max_y,
-                       60, text_h,
+                       1, text_h,
                        get_longitude,
                        "%s%",//"%.0f",
                        "", //"Lon ",
@@ -730,72 +739,61 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
                        TRUE );
     HUD_deque.push_front( p );
     
-//    p = new instr_label( 480, 450, 60, 10,
-//           get_long_min,
-//           "%05.2f",
-//           "",
-//           NULL,
-//           1.0,
-//           HUDS_TOP,
-//           CENTER_JUST,
-//           font_size,
-//           0,
-//           TRUE );
-//    HUD_deque.push_front( p );
+    int x_pos = 40;
     
-    p = new instr_label( 10, 10, 60, 10,
+    p = new instr_label( x_pos, 25, 60, 10,
                          get_frame_rate,
                          "%7.1f",
                          "Frame rate =",
                          NULL,
                          1.0,
                          HUDS_TOP,
-                         RIGHT_JUST,
+                         LEFT_JUST,
                          font_size,
                          0, 
                          TRUE );
     HUD_deque.push_front( p );
 
-    p = new instr_label( 10, 25, 120, 10,
+    p = new instr_label( x_pos, 40, 120, 10,
                          get_vfc_tris_culled,
                          "%7.0f",
-                         "Culled     =",
+                         "Culled       =",
                          NULL,
                          1.0,
                          HUDS_TOP,
-                         RIGHT_JUST,
+                         LEFT_JUST,
                          font_size,
                          0,
                          TRUE );
     HUD_deque.push_front( p );
 
-    p = new instr_label( 10, 40, 120, 10,
+    p = new instr_label( x_pos, 55, 120, 10,
                          get_vfc_tris_drawn,
                          "%7.0f",
                          "Rendered   =",
                          NULL,
                          1.0,
                          HUDS_TOP,
-                         RIGHT_JUST,
+                         LEFT_JUST,
                          font_size,
                          0,
                          TRUE );
     HUD_deque.push_front( p );
     
-    p = new instr_label( 10, 55, 90, 10,
+    p = new instr_label( x_pos, 70, 90, 10,
                          get_fov,
                          "%7.1f",
-                         "FOV         ",
+                         "FOV          = ",
                          NULL,
                          1.0,
                          HUDS_TOP,
-                         RIGHT_JUST,
+                         LEFT_JUST,
                          font_size,
                          0,
                          TRUE );
     HUD_deque.push_front( p );
 
-    const int x_pos = 480;
+    x_pos = 480;
     
     p = new instr_label ( x_pos,
                           70,
@@ -803,11 +801,11 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
                           10,
                           get_aoa,
                           "%7.2f",
-                          "AOA    ",
+                          "AOA      ",
                           " Deg",
                           1.0,
                           HUDS_TOP,
-                          RIGHT_JUST,
+                          LEFT_JUST,
                           font_size,
                           0,
                           TRUE );
@@ -820,7 +818,7 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
                          " Kts",
                          1.0,
                          HUDS_TOP,
-                         RIGHT_JUST,
+                         LEFT_JUST,
                          font_size,
                          0,
                          TRUE );
@@ -838,7 +836,7 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
              units,
              1.0,
              HUDS_TOP,
-             RIGHT_JUST,
+             LEFT_JUST,
              font_size,
              0,
              TRUE );
@@ -851,7 +849,7 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
              units,
              1.0,
              HUDS_TOP,
-             RIGHT_JUST,
+             LEFT_JUST,
              font_size,
              0,
              TRUE );
@@ -864,7 +862,7 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
              " Deg",
              1.0,
              HUDS_TOP,
-             RIGHT_JUST,
+             LEFT_JUST,
              font_size,
              0,
              TRUE );
@@ -1001,35 +999,20 @@ int brightness        = pHUDInstr->get_brightness();
 // all C++.
 //
 void fgUpdateHUD( void ) {
-//  int i;
   int brightness;
 //  int day_night_sw = current_aircraft.controls->day_night_switch;
   int day_night_sw = global_day_night_switch;
   int hud_displays = HUD_deque.size();
   instr_item *pHUDInstr;
-  int line_width;
+  float line_width;
 
   if( !hud_displays ) {  // Trust everyone, but ALWAYS cut the cards!
     return;
     }
 
-//  vector < fgLineSeg2D > :: iterator first_lineSeg = HUD_LineList.begin();
-//  vector < fgLineSeg2D > :: iterator last_lineSeg  = HUD_LineList.end();
-//  HUD_LineList.erase( first_lineSeg, last_lineSeg);
-  HUD_LineList.erase( HUD_LineList.begin(), HUD_LineList.end() );
-//  first = HUD_StippleLineList.begin();
-//  last  = HUD_StippleLineList.end();
-//  HUD_StippleLineList.erase( first, last);
-//  HUD_StippleLineList.erase( HUD_StippleLineList.begin(),
-//                           HUD_StippleLineList.end() );
-#ifdef USE_HUD_TextList
-//  vector < fgTextString > :: iterator first_string = HUD_TextList.begin();
-//  vector < fgTextString > :: iterator last_string  = HUD_TextList.end();
-//  HUD_TextList.erase( first_string, last_string);
-  HUD_TextList.erase( HUD_TextList.begin(), HUD_TextList.end() );
-#endif
-  
-  line_width = (current_options.get_xsize() > 1000) ? 2 : 1;
+  HUD_TextList.erase();
+  HUD_LineList.erase();
+//  HUD_StippleLineList.erase();
   
   pHUDInstr = HUD_deque[0];
   brightness = pHUDInstr->get_brightness();
@@ -1040,7 +1023,6 @@ void fgUpdateHUD( void ) {
 
   glLoadIdentity();
   gluOrtho2D(0, 640, 0, 480);
-//  gluOrtho2D(0, 1024, 0, 768);  
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();
@@ -1051,8 +1033,6 @@ void fgUpdateHUD( void ) {
   glDisable(GL_DEPTH_TEST);
   glDisable(GL_LIGHTING);
 
-  glLineWidth(line_width);
-
   // We can do translucency, so why not. :-)
 //  glEnable    ( GL_BLEND ) ;
 //  glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
@@ -1060,18 +1040,22 @@ void fgUpdateHUD( void ) {
   if( day_night_sw == DAY) {
       switch (brightness) {
           case BRT_LIGHT:
+//            glColor4f (0.1, 0.9, 0.1, 0.75);
             glColor3f (0.1, 0.9, 0.1);
             break;
 
           case BRT_MEDIUM:
+//            glColor4f (0.1, 0.7, 0.0, 0.75);
             glColor3f (0.1, 0.7, 0.0);
             break;
 
           case BRT_DARK:
-            glColor3f (0.0, 0.5, 0.0);
+//            glColor4f (0.0, 0.6, 0.0, 0.75);
+            glColor3f(0.0, 0.6, 0.0);
             break;
 
           case BRT_BLACK:
+//            glColor4f( 0.0, 0.0, 0.0, 0.75);
             glColor3f( 0.0, 0.0, 0.0);
             break;
 
@@ -1082,31 +1066,33 @@ void fgUpdateHUD( void ) {
       if( day_night_sw == NIGHT) {
           switch (brightness) {
               case BRT_LIGHT:
+//                glColor4f (0.9, 0.1, 0.1, 0.75);
                 glColor3f (0.9, 0.1, 0.1);
                 break;
 
               case BRT_MEDIUM:
+//                glColor4f (0.7, 0.0, 0.1, 0.75);
                 glColor3f (0.7, 0.0, 0.1);
                 break;
 
               case BRT_DARK:
               default:
-                  glColor3f (0.5, 0.0, 0.0);
+//                glColor4f (0.6, 0.0, 0.0, 0.75);
+                  glColor3f (0.6, 0.0, 0.0);
           }
       }
           else {     // Just in case default
+//            glColor4f (0.1, 0.9, 0.1, 0.75);
               glColor3f (0.1, 0.9, 0.1);
           }
   }
+
   deque < instr_item * > :: iterator current = HUD_deque.begin();
   deque < instr_item * > :: iterator last = HUD_deque.end();
 
   for ( ; current != last; ++current ) {
       pHUDInstr = *current;
 
-      // for( i = hud_displays; i; --i) { // Draw everything
-      // if( HUD_deque.at(i)->enabled()) {
-      // pHUDInstr = HUD_deque[i - 1];
       if( pHUDInstr->enabled()) {
           //  fgPrintf( FG_COCKPIT, FG_DEBUG, "HUD Code %d  Status %d\n",
           //            hud->code, hud->status );
@@ -1116,52 +1102,22 @@ void fgUpdateHUD( void ) {
       }
   }
 
-  vector < fgLineSeg2D > :: iterator curSeg = HUD_LineList.begin();
-  vector < fgLineSeg2D > :: iterator lastSeg = HUD_LineList.end();
-
-  glBegin(GL_LINES);
-  for ( ; curSeg != lastSeg; curSeg++ ) {
-      curSeg->draw();
-  }
-  glEnd();
-  
-//  curSeg = HUD_StippleLineList.begin();
-//  lastSeg = HUD_StippleLineList.end();
+  char *gmt_str = get_formated_gmt_time();
+  HUD_TextList.add( fgText( gmt_str, 40, 10) );
   
+  HUD_TextList.draw();
+
+  line_width = (current_options.get_xsize() > 1000) ? 1.0 : 0.5;
+  glLineWidth(line_width);
+  HUD_LineList.draw();
+
 //  glEnable(GL_LINE_STIPPLE);
 //  glLineStipple( 1, 0x00FF );
-//  glBegin(GL_LINES);
-//  for ( ; curSeg != lastSeg; curSeg++ ) {
-//    curSeg->draw();
-//  }
-//  glEnd();
+//  HUD_StippleLineList.draw();
 //  glDisable(GL_LINE_STIPPLE);
-#ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( font, text, x , y )
-#endif
-  
-#ifdef USE_HUD_TextList
-  GLfloat mat[16];
-  glPushMatrix();
-  glGetFloatv(GL_MODELVIEW_MATRIX, mat);
-  HUD_TextList.push_back( fgTextString( GLUT_BITMAP_8_BY_13,
-                                        get_formated_gmt_time(),
-                                        450, 445)
-                        );
-//  glFontBegin ( myFont );
-  vector < fgTextString > :: iterator curString = HUD_TextList.begin();
-  vector < fgTextString > :: iterator lastString = HUD_TextList.end();
-  
-  for ( ; curString != lastString; curString++ ) {
-      glLoadMatrixf( mat );
-      curString->draw();
-  }
-//  glFontEnd ();
-  glPopMatrix();
-#endif
-  
-//  glDisable   ( GL_BLEND ) ;
 
+//  glDisable( GL_BLEND );
+  
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHTING);
   glMatrixMode(GL_PROJECTION);
index 0ba59a95732473f423c970b287f2e52bda583988..e262456424cce507ddbf7f7058b478cca6d0ed80 100644 (file)
 #include <Aircraft/aircraft.hxx>
 #include <FDM/flight.hxx>
 #include <Controls/controls.hxx>
-
-//#include "glfont.h"
-
-//extern GLFONT *myFont;
+#include <GUI/gui.h>
+#include <Math/mat3.h>
 
 FG_USING_STD(deque);
 FG_USING_STD(vector);
@@ -203,26 +201,10 @@ typedef struct gltagRGBTRIPLE { // rgbt
     GLfloat Green;
     GLfloat Red;
 } glRGBTRIPLE;
-/*
-struct fgVertex2D {
-    UINT x, y;
-
-    fgVertex2D( UINT a = 0, UINT b =0 )
-        : x(a), y(b) {}
 
-    fgVertex2D( const fgVertex2D & image )
-        : x(image.x), y(image.y) {}
-
-    fgVertex2D& operator= ( const fgVertex2D & image ) {
-        x = image.x; y = image.y; return *this;
-    }
-
-    ~fgVertex2D() {}
-};
-*/
 class fgLineSeg2D {
 private:
-    GLfloat x0, y0, x1, y1;  //UINT
+    GLfloat x0, y0, x1, y1;
 
 public:
     fgLineSeg2D( GLfloat a = 0, GLfloat b =0, GLfloat c = 0, GLfloat d =0 )
@@ -245,89 +227,141 @@ public:
 };
 
 #define USE_HUD_TextList
-#ifdef USE_HUD_TextList
-
-//#define FAST_TEXT_TEST
-#ifdef FAST_TEXT_TEST
-extern void Font_Setup(void);
-extern unsigned int font_base;
-#endif
+extern float              HUD_TextSize;
+extern fntRenderer       *HUDtext;
+extern float HUD_matrix[16];
 
-class fgTextString {
+class fgText {
 private:
-    void *font;
-    char msg[80];
+    char msg[32];
     float x, y;
-//  static GLfloat mat[16];
-
 public:
-    fgTextString( void *d = NULL, char *c = NULL, UINT x = 0, UINT y =0 )
-        :  font(d), x(x), y(y) {strcpy(msg,c);}
+    fgText( char *c = NULL, float x = 0, float y =0 )
+        : x(x), y(y) {strncpy(msg,c,32-1);}
 
-    fgTextString( const fgTextString & image )
-        : font(image.font), x(image.x), y(image.y) {strcpy(msg,image.msg);}
+    fgText( float x = 0, float y = 0, char *c = NULL )
+        : x(x), y(y) {strncpy(msg,c,32-1);}
 
-    fgTextString& operator = ( const fgTextString & image ) {
-        font = image.font; strcpy(msg,image.msg); x = image.x; y = image.y;
+    fgText( const fgText & image )
+        : x(image.x), y(image.y) {strcpy(msg,image.msg);}
+
+    fgText& operator = ( const fgText & image ) {
+        strcpy(msg,image.msg); x = image.x; y = image.y;
         return *this;
     }
 
-    ~fgTextString() {msg[0]='\0';}
-
-//  void set_mat(void) {
-//          glScalef(.075, .075, 0.0);
-//          glGetFloatv(GL_MODELVIEW_MATRIX, mat);
-//  }
-    
+    ~fgText() {msg[0]='\0';}
 
-    void draw()
+    int getStringWidth ( char *str )
     {
-#ifdef FAST_TEXT_TEST
-        glRasterPos2f( x, y);
-        int len = (int) strlen(msg);
-        for (int i=0; i < len; i++) {
-            glCallList(font_base+msg[i]);
-        }
-//      glFontTextOut ( msg, x, y, 0.0f);
-        
-#else
-#define USE_STROKED_CHAR
-#ifdef USE_STROKED_CHAR
-        int c;
-        char *buf;
-        buf = msg;
-        if(*buf)
+        if ( HUDtext && str )
         {
-//          glRasterPos2f( x, y);
-            glTranslatef( x, y, 0);
-            glScalef(.075, .075, 0.0);
-            while ((c=*buf++)) {
-                glutStrokeCharacter( GLUT_STROKE_MONO_ROMAN, c);
-            }
+            float r, l ;
+            guiFntHandle->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ;
+            return FloatToInt( r - l );
         }
-#else
-        char *c = msg;
-        if(*c)
+        return 0 ;
+    }
+    
+    int StringWidth (void )
+    {
+        if ( HUDtext && strlen( msg ))
         {
-            glRasterPos2f(x, y);
-            while (*c) {
-                glutBitmapCharacter(font, *c);
-                c++;
-            }
+            float r, l ;
+            guiFntHandle->getBBox ( msg, HUD_TextSize, 0, &l, &r, NULL, NULL ) ;
+            return FloatToInt( r - l );
         }
-#endif // #ifdef USE_STROKED_CHAR
-#endif // FAST_TEXT_TEST
+        return 0 ;
+    }
+    
+    void Draw(fntRenderer *fnt)
+    {
+        fnt->start2f( x, y );
+        fnt->puts   ( msg ) ;
+    }
+
+    void Draw()
+    {
+        puDrawString ( guiFnt, msg, FloatToInt(x), FloatToInt(y) );
     }
 };
 
-typedef vector< fgTextString > TYPE_HUD_TextList;
-extern TYPE_HUD_TextList HUD_TextList;
-#endif //#ifdef USE_HUD_TextList
+class fgLineList {
+    vector < fgLineSeg2D > List;
+public:
+    fgLineList( void ) {}
+    ~fgLineList( void ) {}
+    void add( fgLineSeg2D seg ) { List.push_back(seg); }
+    void erase( void ) { List.erase( List.begin(), List.end() ); }
+    void draw( void ) {
+        vector < fgLineSeg2D > :: iterator curSeg;
+        vector < fgLineSeg2D > :: iterator lastSeg;
+        curSeg  = List.begin();
+        lastSeg = List.end();
+        glBegin(GL_LINES);
+        for ( ; curSeg != lastSeg; curSeg++ ) {
+            curSeg->draw();
+        }
+        glEnd();
+    }
+};
+
+class fgTextList {
+    fntRenderer *Font;
+    vector< fgText > List;
+public:
+    fgTextList ( void ) { Font = 0; }
+    ~fgTextList( void ) {}
+    
+    void setFont( fntRenderer *Renderer ) { Font = Renderer; }
+    void add( fgText String ) { List.push_back(String); }
+    void erase( void ) { List.erase( List.begin(), List.end() ); }
+    
+    void draw( void ) {
+        vector < fgText > :: iterator curString;
+        vector < fgText > :: iterator lastString;
+        if( Font == 0 ) return;
+        curString  = List.begin();
+        lastString = List.end();
+        glPushAttrib( GL_COLOR_BUFFER_BIT );
+        glEnable    ( GL_ALPHA_TEST   ) ;
+        glEnable    ( GL_BLEND        ) ;
+        glAlphaFunc ( GL_GREATER, 0.1 ) ;
+        glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
+
+        Font->begin();
+        for( ; curString != lastString; curString++ ) {
+            curString->Draw(Font);
+        }
+        Font->end();
+
+        glDisable ( GL_TEXTURE_2D ) ;
+        glPopAttrib();
+    }
+};
 
 
-typedef vector< fgLineSeg2D > TYPE_HUD_LineList;
-extern TYPE_HUD_LineList HUD_LineList;
-extern TYPE_HUD_LineList HUD_StippleLineList;
+inline void Text( fgTextList &List, float x, float y, char *s)
+{
+    List.add( fgText( x, y, s) );
+}
+
+inline void Text( fgTextList &List, fgText &me)
+{
+    List.add(me);
+}
+
+inline void Line( fgLineList &List, float x1, float y1, float x2, float y2)
+{
+    List.add(fgLineSeg2D(x1,y1,x2,y2));
+}
+
+
+// Declare our externals
+extern fgTextList         HUD_TextList;
+extern fgLineList         HUD_LineList;
+extern fgLineList         HUD_StippleLineList;
+
 
 class instr_item {  // An Abstract Base Class (ABC)
   private:
@@ -361,16 +395,16 @@ class instr_item {  // An Abstract Base Class (ABC)
     instr_item & operator = ( const instr_item & rhs );
     virtual ~instr_item ();
 
-    int          get_brightness  ( void ) { return brightness;}
-    RECT         get_location    ( void ) { return scrn_pos;  }
-    bool         is_broken       ( void ) { return broken;    }
-    bool         enabled         ( void ) { return is_enabled;}
-    bool         data_available  ( void ) { return !!load_value_fn; }
-    float       get_value       ( void ) { return load_value_fn(); }
-    float       data_scaling    ( void ) { return disp_factor; }
-    UINT         get_span        ( void ) { return scr_span;  }
-    POINT        get_centroid    ( void ) { return mid_span;  }
-    UINT         get_options     ( void ) { return opts;      }
+    int     get_brightness  ( void ) { return brightness;}
+    RECT    get_location    ( void ) { return scrn_pos;  }
+    bool    is_broken       ( void ) { return broken;    }
+    bool    enabled         ( void ) { return is_enabled;}
+    bool    data_available  ( void ) { return !!load_value_fn; }
+    float   get_value       ( void ) { return load_value_fn(); }
+    float   data_scaling    ( void ) { return disp_factor; }
+    UINT    get_span        ( void ) { return scr_span;  }
+    POINT   get_centroid    ( void ) { return mid_span;  }
+    UINT    get_options     ( void ) { return opts;      }
 
     UINT    huds_vert     (UINT options) { return( options  & HUDS_VERT ); }
     UINT    huds_left     (UINT options) { return( options  & HUDS_LEFT ); }
@@ -387,34 +421,32 @@ class instr_item {  // An Abstract Base Class (ABC)
     virtual void break_display ( bool bad );
     virtual void SetBrightness( int illumination_level ); // fgHUDSetBright...
     void         SetPosition  ( int x, int y, UINT width, UINT height );
-    UINT    get_Handle( void );
+    UINT         get_Handle( void );
     virtual void draw( void ) = 0;   // Required method in derived classes
     
-    void drawOneLine( UINT x1, UINT y1, UINT x2, UINT y2)
+    void drawOneLine( float x1, float y1, float x2, float y2)
     {
-        HUD_LineList.push_back(fgLineSeg2D(x1,y1,x2,y2));
-//    glBegin(GL_LINES);
-//    glVertex2i(x1, y1);
-//    glVertex2i(x2, y2);
-//    glEnd();
+        HUD_LineList.add(fgLineSeg2D(x1,y1,x2,y2));
     }
-    void drawOneStippleLine( UINT x1, UINT y1, UINT x2, UINT y2)
+    void drawOneStippleLine( float x1, float y1, float x2, float y2)
     {
-        HUD_StippleLineList.push_back(fgLineSeg2D(x1,y1,x2,y2));
-//      glEnable(GL_LINE_STIPPLE);
-//      glLineStipple( 1, 0x00FF );
-//      glBegin(GL_LINES);
-//      glVertex2i(x1, y1);
-//      glVertex2i(x2, y2);
-//      glEnd();
-//      glDisable(GL_LINE_STIPPLE);
+        HUD_StippleLineList.add(fgLineSeg2D(x1,y1,x2,y2));
     }
-#ifdef USE_HUD_TextList
-    void TextString( void *font, char *msg, UINT x, UINT y )
+    void TextString( char *msg, float x, float y )
     {
-        HUD_TextList.push_back(fgTextString(font, msg, x, y));      
+        HUD_TextList.add(fgText(msg, x, y));        
     }
-#endif
+    int getStringWidth ( char *str )
+    {
+        if ( HUDtext && str )
+        {
+            float r, l ;
+            guiFntHandle->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ;
+            return FloatToInt( r - l );
+        }
+        return 0 ;
+    }
+    
 };
 
 typedef instr_item *HIptr;
@@ -423,6 +455,7 @@ typedef instr_item *HIptr;
 //typedef hud_deque_type::const_iterator hud_deque_const_iterator;
 
 extern deque< instr_item *> HUD_deque;
+extern int HUD_style;
 //extern hud_deque_type HUD_deque;
 
 // instr_item           This class has no other purpose than to maintain
@@ -713,6 +746,10 @@ class HudLadder : public dual_instr_item {
     float vmin;
     float factor;
 
+    fgTextList         TextList;
+    fgLineList         LineList;
+    fgLineList         StippleLineList;
+
   public:
     HudLadder( int       x,
                int       y,
@@ -720,9 +757,9 @@ class HudLadder : public dual_instr_item {
                UINT      height,
                FLTFNPTR  ptch_source    = get_roll,
                FLTFNPTR  roll_source    = get_pitch,
-               float    span_units     = 45.0,
-               float    division_units = 10.0,
-               float    minor_division =  0.0,
+               float     span_units     = 45.0,
+               float     division_units = 10.0,
+               float     minor_division =  0.0,
                UINT      screen_hole    =   70,
                UINT      lbl_pos        =    0,
                bool      working        = true );
@@ -732,6 +769,21 @@ class HudLadder : public dual_instr_item {
     HudLadder( const HudLadder & image );
     HudLadder & operator = ( const HudLadder & rhs );
     virtual void draw( void );
+    
+    void Text( float x, float y, char *s)
+    {
+        TextList.add( fgText( x, y, s) );
+    }
+
+    void Line( float x1, float y1, float x2, float y2)
+    {
+        LineList.add(fgLineSeg2D(x1,y1,x2,y2));
+    }
+
+    void StippleLine( float x1, float y1, float x2, float y2)
+    {
+        StippleLineList.add(fgLineSeg2D(x1,y1,x2,y2));
+    }
 };
 
 
index 965c34704b1c8034f199fca88bd159b2b9fd363d..5aa8066512af8bb6f3b67a7205382b4e5c9b84fb 100644 (file)
@@ -19,7 +19,9 @@
 #include "hud.hxx"
 
 #ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( font, text, x , y )
+#define textString( x , y, text, font )  TextString( text, x , y )
+#else
+#define textString( x , y, text, font )  puDrawString ( guiFnt, text, x, y );
 #endif
 
 //========== Top of hud_card class member definitions =============
index fec2aa4cdc47f6f59aa571fe451a267eacea8eec..dc4c4362de0b2627d4a631ddc9c964f1b7f4ebf1 100644 (file)
 #include "hud.hxx"
 
 #ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( font, text, x , y )
+#define textString( x , y, text, font )  TextString( text, x , y )
+#else
+#define textString( x , y, text, font )  puDrawString ( guiFnt, text, x, y );
 #endif
 
 //============== Top of guage_instr class member definitions ==============
 
 guage_instr ::
-    guage_instr( int          x,
-                 int          y,
-                 UINT         width,
-                 UINT         height,
-                 FLTFNPTR     load_fn,
-                 UINT         options,
-                 float       disp_scale,
-                 float       maxValue,
-                 float       minValue,
-                 UINT         major_divs,
-                 UINT         minor_divs,
-                 int          dp_showing,
-                 UINT         modulus,
-                 bool         working) :
-           instr_scale( x, y, width, height,
-                        load_fn, options,
-                        (maxValue - minValue), // Always shows span?
-                        maxValue, minValue,
-                        disp_scale,
-                        major_divs, minor_divs,
-                        modulus, dp_showing,
-                        working)
+guage_instr( int          x,
+            int          y,
+            UINT         width,
+            UINT         height,
+            FLTFNPTR     load_fn,
+            UINT         options,
+            float       disp_scale,
+            float       maxValue,
+            float       minValue,
+            UINT         major_divs,
+            UINT         minor_divs,
+            int          dp_showing,
+            UINT         modulus,
+            bool         working) :
+    instr_scale( x, y, width, height,
+                load_fn, options,
+                (maxValue - minValue), // Always shows span?
+                maxValue, minValue,
+                disp_scale,
+                major_divs, minor_divs,
+                modulus, dp_showing,
+                working)
 {
-//  UINT options = get_options();
-//  huds_vert    = options & HUDS_VERT;
-//  huds_left    = options & HUDS_LEFT;
-//  huds_right   = options & HUDS_RIGHT;
-//  huds_both    = (options & HUDS_BOTH) == HUDS_BOTH;
-//  huds_noticks = options & HUDS_NOTICKS;
-//  huds_notext  = options & HUDS_NOTEXT;
-//  huds_top     = options & HUDS_TOP;
-//  huds_bottom  = options & HUDS_BOTTOM;
+    //  UINT options = get_options();
+    //  huds_vert    = options & HUDS_VERT;
+    //  huds_left    = options & HUDS_LEFT;
+    //  huds_right   = options & HUDS_RIGHT;
+    //  huds_both    = (options & HUDS_BOTH) == HUDS_BOTH;
+    // huds_noticks = options & HUDS_NOTICKS;
+    //  huds_notext  = options & HUDS_NOTEXT;
+    //  huds_top     = options & HUDS_TOP;
+    //  huds_bottom  = options & HUDS_BOTTOM;
 }
 
 guage_instr ::
-   ~guage_instr()
+~guage_instr()
 {
 }
 
 guage_instr ::
-    guage_instr( const guage_instr & image):
-       instr_scale( (instr_scale &) image)
+guage_instr( const guage_instr & image):
+    instr_scale( (instr_scale &) image)
 {
-//  UINT options = get_options();
-//  huds_vert = options & HUDS_VERT;
-//  huds_left = options & HUDS_LEFT;
-//  huds_right = options & HUDS_RIGHT;
-//  huds_both = (options & HUDS_BOTH) == HUDS_BOTH;
-//  huds_noticks = options & HUDS_NOTICKS;
-//  huds_notext = options & HUDS_NOTEXT;
-//  huds_top = options & HUDS_TOP;
-//  huds_bottom =  options & HUDS_BOTTOM;
+    //  UINT options = get_options();
+    //  huds_vert = options & HUDS_VERT;
+    //  huds_left = options & HUDS_LEFT;
+    //  huds_right = options & HUDS_RIGHT;
+    //  huds_both = (options & HUDS_BOTH) == HUDS_BOTH;
+    //  huds_noticks = options & HUDS_NOTICKS;
+    //  huds_notext = options & HUDS_NOTEXT;
+    //  huds_top = options & HUDS_TOP;
+    //  huds_bottom =  options & HUDS_BOTTOM;
 }
 
 guage_instr & guage_instr ::
-    operator = (const guage_instr & rhs )
+operator = (const guage_instr & rhs )
 {
-  if( !(this == &rhs)) {
-    instr_scale::operator = (rhs);
+    if( !(this == &rhs)) {
+       instr_scale::operator = (rhs);
     }
-  return *this;
+    return *this;
 }
 
 // As implemented, draw only correctly draws a horizontal or vertical
@@ -96,295 +98,298 @@ guage_instr & guage_instr ::
 
 void guage_instr :: draw (void)
 {
-  int marker_xs, marker_xe;
-  int marker_ys, marker_ye;
-  int text_x, text_y;
-  int width, height, bottom_4;
-  int lenstr;
-  int i;
-  char TextScale[80];
-  bool condition;
-  int disp_val = 0;
-  float vmin         = min_val();
-  float vmax         = max_val();
-  POINT mid_scr       = get_centroid();
-  float cur_value    = get_value();
-  RECT   scrn_rect    = get_location();
-  UINT options     = get_options();
-
-  width = scrn_rect.left + scrn_rect.right;
-  height = scrn_rect.top  + scrn_rect.bottom;
-  bottom_4 = scrn_rect.bottom / 4;
-
+    int marker_xs, marker_xe;
+    int marker_ys, marker_ye;
+    int text_x, text_y;
+    int width, height, bottom_4;
+    int lenstr;
+    int i;
+    char TextScale[80];
+    bool condition;
+    int disp_val = 0;
+    float vmin         = min_val();
+    float vmax         = max_val();
+    POINT mid_scr       = get_centroid();
+    float cur_value    = get_value();
+    RECT   scrn_rect    = get_location();
+    UINT options     = get_options();
+
+    width = scrn_rect.left + scrn_rect.right;
+    height = scrn_rect.top  + scrn_rect.bottom,
+       bottom_4 = scrn_rect.bottom / 4;
     // Draw the basic markings for the scale...
 
-  if( huds_vert(options) ) { // Vertical scale
-    drawOneLine( scrn_rect.left,     // Bottom tick bar
-                 scrn_rect.top,
-                 width,
-                 scrn_rect.top);
-
-    drawOneLine( scrn_rect.left,    // Top tick bar
-                 height,
-                 width,
-                 height );
-
-    marker_xs = scrn_rect.left;
-    marker_xe = width;
-
-    if( huds_left(options) ) {     // Read left, so line down right side
-      drawOneLine( width,
-                   scrn_rect.top,
-                   width,
-                   height);
-      
-      marker_xs  = marker_xe - scrn_rect.right / 3;   // Adjust tick xs
-    }
-    
-    if( huds_right(options) ) {     // Read  right, so down left sides
-      drawOneLine( scrn_rect.left,
-                   scrn_rect.top,
-                   scrn_rect.left,
-                   height);
-      
-      marker_xe = scrn_rect.left + scrn_rect.right / 3;     // Adjust tick xe
-    }
-
-    // At this point marker x_start and x_end values are transposed.
-    // To keep this from confusing things they are now interchanged.
-    if( huds_both(options) ) {
-      marker_ye = marker_xs;
-      marker_xs = marker_xe;
-      marker_xe = marker_ye;
-      }
-
-    // Work through from bottom to top of scale. Calculating where to put
-    // minor and major ticks.
-
-    if( !huds_noticks(options)) {    // If not no ticks...:)
-                                          // Calculate x marker offsets
-     int last = (int)vmax + 1; //FloatToInt(vmax)+1;
-     i = (int)vmin; //FloatToInt(vmin);
-    for(; i <last ; i++ )      {
-//  for( i = (int)vmin; i <= (int)vmax; i++ ) {
-
-        // Calculate the location of this tick
-        marker_ys = scrn_rect.top + FloatToInt((i - vmin) * factor()/* +.5f*/);
-
-        // We compute marker_ys even though we don't know if we will use
-        // either major or minor divisions. Simpler.
-
-        if( div_min()) {                  // Minor tick marks
-          if( !(i%(int)div_min()) ) {
-            if( huds_left(options) && huds_right(options) ) {
-                drawOneLine( scrn_rect.left, marker_ys,
-                             marker_xs - 3, marker_ys );
-                drawOneLine( marker_xe + 3, marker_ys,
-                             width, marker_ys );
-              }
-            else {
-              if( huds_left(options) ) {
-                drawOneLine( marker_xs + 3, marker_ys, marker_xe, marker_ys );
-                }
-              else {
-                drawOneLine( marker_xs, marker_ys, marker_xe - 3, marker_ys );
-               }
-              }
-            }
-          }
-
-          // Now we work on the major divisions. Since these are also labeled
-          // and no labels are drawn otherwise, we label inside this if
-          // statement.
-
-        if( div_max()) {                  // Major tick mark
-          if( !(i%(int)div_max()) )            {
-            if( huds_left(options) && huds_right(options) ) {
-                drawOneLine( scrn_rect.left, marker_ys,
-                             marker_xs, marker_ys );
-                drawOneLine( marker_xe, marker_ys,
-                             width, marker_ys );
-              }
-            else {
-              drawOneLine( marker_xs, marker_ys, marker_xe, marker_ys );
-            }
-
-            if( !huds_notext(options) ) {
-              disp_val = i;
-              lenstr = sprintf( TextScale, "%d",
-                                FloatToInt(disp_val * data_scaling()/*+.5*/ ));
-
-              if( huds_left(options) && huds_right(options) ) {
-                text_x = mid_scr.x -  2 - ((3 * lenstr) >> 1);
-                }
-              else {
-                if( huds_left(options) )              {
-                  text_x = marker_xs - 2 - 3 * lenstr;
-                  }
-                else {
-                  text_x = marker_xe + 10 - lenstr;
-                  }
-                }
-              // Now we know where to put the text.
-              text_y = marker_ys;
-              textString( text_x, text_y, TextScale, GLUT_BITMAP_8_BY_13 );
-              }
-            }
-          }  //
-        }  //
-      }  //
-    // Now that the scale is drawn, we draw in the pointer(s). Since labels
-    // have been drawn, text_x and text_y may be recycled. This is used
-    // with the marker start stops to produce a pointer for each side reading
-
-    text_y = scrn_rect.top + FloatToInt((cur_value - vmin) * factor() /*+.5f*/);
-//    text_x = marker_xs - scrn_rect.left;
-
-    if( huds_right(options) ) {
-      glBegin(GL_LINE_STRIP);
-      glVertex2f( scrn_rect.left, text_y + 5);
-      glVertex2f( marker_xe,      text_y);
-      glVertex2f( scrn_rect.left, text_y - 5);
-      glEnd();
-      }
-    if( huds_left(options) ) {
-      glBegin(GL_LINE_STRIP);
-      glVertex2f( width,      text_y + 5);
-      glVertex2f( marker_xs,  text_y);
-      glVertex2f( width,      text_y - 5);
-      glEnd();
-      }
+    if( huds_vert(options) ) { // Vertical scale
+       drawOneLine( scrn_rect.left,     // Bottom tick bar
+                    scrn_rect.top,
+                    width,
+                    scrn_rect.top);
+
+       drawOneLine( scrn_rect.left,    // Top tick bar
+                    height,
+                    width,
+                    height );
+
+       marker_xs = scrn_rect.left;
+       marker_xe = width;
+
+       if( huds_left(options) ) {     // Read left, so line down right side
+           drawOneLine( width,
+                        scrn_rect.top,
+                        width,
+                        height);
+         
+           marker_xs  = marker_xe - scrn_rect.right / 3;   // Adjust tick xs
+       }
+       
+       if( huds_right(options) ) {     // Read  right, so down left sides
+           drawOneLine( scrn_rect.left,
+                        scrn_rect.top,
+                        scrn_rect.left,
+                        height);
+         
+           marker_xe = scrn_rect.left + scrn_rect.right / 3;     // Adjust tick xe
+       }
+
+       // At this point marker x_start and x_end values are transposed.
+       // To keep this from confusing things they are now interchanged.
+       if( huds_both(options) ) {
+           marker_ye = marker_xs;
+           marker_xs = marker_xe;
+           marker_xe = marker_ye;
+       }
+
+       // Work through from bottom to top of scale. Calculating where to put
+       // minor and major ticks.
+
+       if( !huds_noticks(options)) {    // If not no ticks...:)
+           // Calculate x marker offsets
+           int last = (int)vmax + 1; //FloatToInt(vmax)+1;
+           i = (int)vmin; //FloatToInt(vmin);
+           for(; i <last ; i++ )      {
+               //      for( i = (int)vmin; i <= (int)vmax; i++ ) {
+
+               // Calculate the location of this tick
+               marker_ys = scrn_rect.top + FloatToInt((i - vmin) * factor()/* +.5f*/);
+
+               // We compute marker_ys even though we don't know if we will use
+               // either major or minor divisions. Simpler.
+
+               if( div_min()) {                  // Minor tick marks
+                   if( !(i%(int)div_min()) ) {
+                       if( huds_left(options) && huds_right(options) ) {
+                           drawOneLine( scrn_rect.left, marker_ys,
+                                        marker_xs - 3, marker_ys );
+                           drawOneLine( marker_xe + 3, marker_ys,
+                                        width, marker_ys );
+                       }
+                       else {
+                           if( huds_left(options) ) {
+                               drawOneLine( marker_xs + 3, marker_ys, marker_xe, marker_ys );
+                           }
+                           else {
+                               drawOneLine( marker_xs, marker_ys, marker_xe - 3, marker_ys );
+                           }
+                       }
+                   }
+               }
+
+               // Now we work on the major divisions. Since these are also labeled
+               // and no labels are drawn otherwise, we label inside this if
+               // statement.
+
+               if( div_max()) {                  // Major tick mark
+                   if( !(i%(int)div_max()) )            {
+                       if( huds_left(options) && huds_right(options) ) {
+                           drawOneLine( scrn_rect.left, marker_ys,
+                                        marker_xs, marker_ys );
+                           drawOneLine( marker_xe, marker_ys,
+                                        width, marker_ys );
+                       }
+                       else {
+                           drawOneLine( marker_xs, marker_ys, marker_xe, marker_ys );
+                       }
+
+                       if( !huds_notext(options) ) {
+                           disp_val = i;
+                           sprintf( TextScale, "%d",
+                                    FloatToInt(disp_val * data_scaling()/*+.5*/ ));
+
+                           lenstr = getStringWidth( TextScale );
+                                               
+                           if( huds_left(options) && huds_right(options) ) {
+                               text_x = mid_scr.x -  lenstr/2 ;
+                           }
+                           else {
+                               if( huds_left(options) )              {
+                                   text_x = marker_xs - lenstr;
+                               }
+                               else {
+                                   text_x = marker_xe - lenstr;
+                               }
+                           }
+                           // Now we know where to put the text.
+                           text_y = marker_ys;
+                           textString( text_x, text_y, TextScale, GLUT_BITMAP_8_BY_13 );
+                       }
+                   }
+               }  //
+           }  //
+       }  //
+       // Now that the scale is drawn, we draw in the pointer(s). Since labels
+       // have been drawn, text_x and text_y may be recycled. This is used
+       // with the marker start stops to produce a pointer for each side reading
+
+       text_y = scrn_rect.top + FloatToInt((cur_value - vmin) * factor() /*+.5f*/);
+       //    text_x = marker_xs - scrn_rect.left;
+
+       if( huds_right(options) ) {
+           glBegin(GL_LINE_STRIP);
+           glVertex2f( scrn_rect.left, text_y + 5);
+           glVertex2f( marker_xe,      text_y);
+           glVertex2f( scrn_rect.left, text_y - 5);
+           glEnd();
+       }
+       if( huds_left(options) ) {
+           glBegin(GL_LINE_STRIP);
+           glVertex2f( width,      text_y + 5);
+           glVertex2f( marker_xs,  text_y);
+           glVertex2f( width,      text_y - 5);
+           glEnd();
+       }
     }  // End if VERTICAL SCALE TYPE
-  else {                                // Horizontal scale by default
-    drawOneLine( scrn_rect.left,     // left tick bar
-                 scrn_rect.top,
-                 scrn_rect.left,
-                 height);
-
-    drawOneLine( width,    // right tick bar
-                 scrn_rect.top,
-                 width,
-                 height );
-
-    marker_ys = scrn_rect.top;                       // Starting point for
-    marker_ye = height;                              // tick y location calcs
-    marker_xs = scrn_rect.left + FloatToInt((cur_value - vmin) * factor() /*+ .5f*/);
-
-    if( huds_top(options) ) {
-      drawOneLine( scrn_rect.left,
-                   scrn_rect.top,
-                   width,
-                   scrn_rect.top);                    // Bottom box line
-      
-      marker_ye  = scrn_rect.top + scrn_rect.bottom / 2;   // Tick point adjust
-                                                      // Bottom arrow
-      glBegin(GL_LINE_STRIP);
-      glVertex2f( marker_xs - bottom_4, scrn_rect.top);
-      glVertex2f( marker_xs, marker_ye);
-      glVertex2f( marker_xs + bottom_4, scrn_rect.top);
-      glEnd();
-      }
-    if( huds_bottom(options) ) {
-        // Top box line
-        drawOneLine( scrn_rect.left, height, width, height);
-        // Tick point adjust
-        marker_ys = height - scrn_rect.bottom  / 2;
-
-        // Top arrow
-        glBegin(GL_LINE_STRIP);
-        glVertex2f( marker_xs + bottom_4, height);
-        glVertex2f( marker_xs, marker_ys );
-        glVertex2f( marker_xs - bottom_4, height);
-        glEnd();
-    }
-
-    
-    int last = (int)vmax + 1; //FloatToInt(vmax)+1;
-    i = (int)vmin; //FloatToInt(vmin);
-    for( ; i <last ; i++ )      {
-      condition = true;
-      if( !modulo()) {
-        if( i < min_val()) {
-          condition = false;
-          }
-        }
-      if( condition )        {
-        marker_xs = scrn_rect.left + FloatToInt((i - vmin) * factor()/* +.5f*/);
-//        marker_xs = scrn_rect.left + (int)((i - vmin) * factor() + .5f);
-        if( div_min()){
-          if( !(i%(int)div_min()) ) {           
-            // draw in ticks only if they aren't too close to the edge.
-            if((( marker_xs + 5) > scrn_rect.left ) ||
-               (( marker_xs - 5 )< (width))){
-
-              if( huds_both(options) ) {
-                drawOneLine( marker_xs, scrn_rect.top,
-                             marker_xs, marker_ys - 4);
-                drawOneLine( marker_xs, marker_ye + 4,
-                             marker_xs, height);
-              }
-              else {
-                if( huds_top(options) ) {
-                  drawOneLine( marker_xs, marker_ys,
-                               marker_xs, marker_ye - 4);
-                  }
-                else {
-                  drawOneLine( marker_xs, marker_ys + 4,
-                               marker_xs, marker_ye);
-                  }
-                }
-              }
-            }
-          }
-        if( div_max()) {
-          if( !(i%(int)div_max()) ) {           
-              if(modulo()) {
-                  if( disp_val < 0) {
-                      while( disp_val < 0 ) {
-                          disp_val += modulo();
-                      } 
-                  }
-                  disp_val = i % (int)modulo();
-              } else {
-                  disp_val = i;
-              }
-            lenstr = 4 * sprintf( TextScale, "%d",
-                                  FloatToInt(disp_val  * data_scaling()/* +.5*/ ));
-            // Draw major ticks and text only if far enough from the edge.
-            if(( (marker_xs - 10)> scrn_rect.left ) &&
-               ( (marker_xs + 10) < width )){
-              if( huds_both(options) ) {
-                drawOneLine( marker_xs, scrn_rect.top,
-                             marker_xs, marker_ys);
-                drawOneLine( marker_xs, marker_ye,
-                             marker_xs, height);
-
-                if( !huds_notext(options) ) {
-                  textString ( marker_xs - lenstr, marker_ys + 4,
-                               TextScale,  GLUT_BITMAP_8_BY_13 );
-                  }
-                }
-              else {
-                drawOneLine( marker_xs, marker_ys,
-                             marker_xs, marker_ye );
-                
-                if( !huds_notext(options) ) {
-                  if( huds_top(options) )              {
-                  textString ( marker_xs - lenstr,
-                               height - 10,
-                               TextScale, GLUT_BITMAP_8_BY_13 );
-                    }
-                  else  {
-                    textString( marker_xs - lenstr, scrn_rect.top,
-                                TextScale, GLUT_BITMAP_8_BY_13 );
-                    }            
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
+    else {                                // Horizontal scale by default
+       drawOneLine( scrn_rect.left,     // left tick bar
+                    scrn_rect.top,
+                    scrn_rect.left,
+                    height);
+
+       drawOneLine( width,    // right tick bar
+                    scrn_rect.top,
+                    width,
+                    height );
+
+       marker_ys = scrn_rect.top;                       // Starting point for
+       marker_ye = height;                              // tick y location calcs
+       marker_xs = scrn_rect.left + FloatToInt((cur_value - vmin) * factor() /*+ .5f*/);
+
+       if( huds_top(options) ) {
+           drawOneLine( scrn_rect.left,
+                        scrn_rect.top,
+                        width,
+                        scrn_rect.top);                    // Bottom box line
+         
+           marker_ye  = scrn_rect.top + scrn_rect.bottom / 2;   // Tick point adjust
+           // Bottom arrow
+           glBegin(GL_LINE_STRIP);
+           glVertex2f( marker_xs - bottom_4, scrn_rect.top);
+           glVertex2f( marker_xs, marker_ye);
+           glVertex2f( marker_xs + bottom_4, scrn_rect.top);
+           glEnd();
+       }
+       if( huds_bottom(options) ) {
+           // Top box line
+           drawOneLine( scrn_rect.left, height, width, height);
+           // Tick point adjust
+           marker_ys = height - scrn_rect.bottom  / 2;
+
+           // Top arrow
+           glBegin(GL_LINE_STRIP);
+           glVertex2f( marker_xs + bottom_4, height);
+           glVertex2f( marker_xs, marker_ys );
+           glVertex2f( marker_xs - bottom_4, height);
+           glEnd();
+       }
+
+       
+       int last = (int)vmax + 1; //FloatToInt(vmax)+1;
+       i = (int)vmin; //FloatToInt(vmin);
+       for( ; i <last ; i++ )      {
+           condition = true;
+           if( !modulo()) {
+               if( i < min_val()) {
+                   condition = false;
+               }
+           }
+           if( condition )        {
+               marker_xs = scrn_rect.left + FloatToInt((i - vmin) * factor()/* +.5f*/);
+               //        marker_xs = scrn_rect.left + (int)((i - vmin) * factor() + .5f);
+               if( div_min()){
+                   if( !(i%(int)div_min()) ) {                 
+                       // draw in ticks only if they aren't too close to the edge.
+                       if((( marker_xs + 5) > scrn_rect.left ) ||
+                          (( marker_xs - 5 )< (width))){
+
+                           if( huds_both(options) ) {
+                               drawOneLine( marker_xs, scrn_rect.top,
+                                            marker_xs, marker_ys - 4);
+                               drawOneLine( marker_xs, marker_ye + 4,
+                                            marker_xs, height);
+                           }
+                           else {
+                               if( huds_top(options) ) {
+                                   drawOneLine( marker_xs, marker_ys,
+                                                marker_xs, marker_ye - 4);
+                               }
+                               else {
+                                   drawOneLine( marker_xs, marker_ys + 4,
+                                                marker_xs, marker_ye);
+                               }
+                           }
+                       }
+                   }
+               }
+               if( div_max()) {
+                   if( !(i%(int)div_max()) ) {                 
+                       if(modulo()) {
+                           if( disp_val < 0) {
+                               while( disp_val < 0 ) {
+                                   disp_val += modulo();
+                               }       
+                           }
+                           disp_val = i % (int)modulo();
+                       } else {
+                           disp_val = i;
+                       }
+                       sprintf( TextScale, "%d",
+                                FloatToInt(disp_val  * data_scaling()/* +.5*/ ));
+                       lenstr = getStringWidth( TextScale);
+                                               
+                       // Draw major ticks and text only if far enough from the edge.
+                       if(( (marker_xs - 10)> scrn_rect.left ) &&
+                          ( (marker_xs + 10) < width )){
+                           if( huds_both(options) ) {
+                               drawOneLine( marker_xs, scrn_rect.top,
+                                            marker_xs, marker_ys);
+                               drawOneLine( marker_xs, marker_ye,
+                                            marker_xs, height);
+
+                               if( !huds_notext(options) ) {
+                                   textString ( marker_xs - lenstr, marker_ys + 4,
+                                                TextScale,  GLUT_BITMAP_8_BY_13 );
+                               }
+                           }
+                           else {
+                               drawOneLine( marker_xs, marker_ys,
+                                            marker_xs, marker_ye );
+                               
+                               if( !huds_notext(options) ) {
+                                   if( huds_top(options) )              {
+                                       textString ( marker_xs - lenstr,
+                                                    height - 10,
+                                                    TextScale, GLUT_BITMAP_8_BY_13 );
+                                   }
+                                   else  {
+                                       textString( marker_xs - lenstr, scrn_rect.top,
+                                                   TextScale, GLUT_BITMAP_8_BY_13 );
+                                   }            
+                               }
+                           }
+                       }
+                   }
+               }
+           }
+       }
     }
 }
 
index 340810d32a7f1607a3c8d2d9ee8cd3111691b6ba..9d4ee38c25abf603b238d153813b057a5f571eab 100644 (file)
@@ -19,7 +19,9 @@
 #include "hud.hxx"
 
 #ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( font, text, x , y )
+#define textString( x , y, text, font )  TextString( text, x , y )
+#else
+#define textString( x , y, text, font )  puDrawString ( guiFnt, text, x, y );
 #endif
 
 //======================= Top of instr_label class =========================
@@ -105,9 +107,9 @@ instr_label & instr_label ::operator = (const instr_label & rhs )
     justify    = rhs.justify;
     pre_str    = rhs.pre_str;
     post_str   = rhs.post_str;
-    strcpy(format_buffer,rhs.format_buffer);    
+    strcpy(format_buffer,rhs.format_buffer);   
     }
-    return *this;
+  return *this;
 }
 
 //
@@ -123,45 +125,33 @@ draw( void )       // Required method in base class
   int lenstr;
   RECT  scrn_rect = get_location();
 
-//  if( pre_str != NULL) {
-//    if( post_str != NULL ) {
-//      sprintf( format_buffer, "%s%s%s", pre_str, pformat, post_str );
-//      }
-//    else {
-//      sprintf( format_buffer, "%s%s",   pre_str, pformat );
-//      }
-//    }
-//  else {
-//    if( post_str != NULL ) {
-//      sprintf( format_buffer, "%s%s",   pformat, post_str );
-//      }
-//    } // else do nothing if both pre and post strings are nulls. Interesting.
-
   if( data_available() ) {
-    lenstr = sprintf( label_buffer, format_buffer, get_value() );
+    sprintf( label_buffer, format_buffer, get_value() );
     }
   else {
-    lenstr = sprintf( label_buffer, format_buffer );
+    sprintf( label_buffer, format_buffer );
     }
+  
+  lenstr = getStringWidth( label_buffer );
+                                               
     
 #ifdef DEBUGHUD
-    fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
-    fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
-    fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
-    fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" );
+  fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
+  fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
+  fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
+  fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" );
 #endif
 //  lenstr = strlen( label_buffer );
 
-  posincr = 0;   //  default to RIGHT_JUST ... center located calc: -lenstr*8;
-
-  if( justify == CENTER_JUST ) {
-    posincr =  - (lenstr << 2); //  -lenstr*4;
-    }
-  else {
-    if( justify == LEFT_JUST ) {
-      posincr = - (lenstr << 8);  // 0;
-      }
-    }
+  if( justify == RIGHT_JUST ) {
+         posincr = scrn_rect.right - lenstr;
+  }else if( justify == CENTER_JUST ) {
+         posincr = get_span() - (lenstr/2); //  -lenstr*4;
+  }  else {
+      //  justify == LEFT_JUST
+      posincr = 0;  // 0;
+  }
+  
   if( fontSize == SMALL ) {
     textString( scrn_rect.left + posincr, scrn_rect.top,
                 label_buffer, GLUT_BITMAP_8_BY_13);
index a20dd47e10ee897f9e1caf0d3faf2512becb2778..b4d329be1b65f963f7d329a2b1889d47b8bf0625 100644 (file)
@@ -14,7 +14,7 @@
 #include <Math/polar3d.hxx>
 #include <Scenery/scenery.hxx>
 #include <Time/fg_timer.hxx>
-
+#include <GUI/gui.h>
 
 #include "hud.hxx"
 //====================== Top of HudLadder Class =======================
@@ -83,251 +83,157 @@ HudLadder & HudLadder ::  operator = ( const HudLadder & rhs )
 //
 //  Draws a climb ladder in the center of the HUD
 //
-    
-inline static void _strokeString(float xx, float yy, char *msg, void *font)
-{
-    int c;
-    if(*msg)
-    {
-        glTranslatef( xx, yy, 0);
-        glScalef(.075, .075, 0.0);
-        while ((c=*msg++)) {
-            glutStrokeCharacter( font, c);
-        }
-    }
-}
 
 void HudLadder :: draw( void )
 {
-    float roll_value;
-    float pitch_value;
-    float    marker_y;
-    float    x_ini;
-    float    x_end;
-    float    y_ini;
-    float    y_end;
-
-    int    i;
-    POINT  centroid   = get_centroid();
-    RECT   box        = get_location();
+    float  x_ini;
+    float  x_end;
+    float  y;
 
-    int    half_span  = box.right >> 1;
-    char   TextLadder[80];
+    POINT  centroid    = get_centroid();
+    RECT   box         = get_location();
 
-    int    label_length;
-    roll_value        = current_ch2();
-    
-    float hole = (float)((scr_hole)/2);
-    
-    GLfloat mat[16];
+    float   half_span  = box.right / 2.0;
+    float   roll_value = current_ch2();
     
-    pitch_value       = current_ch1() * RAD_TO_DEG;
+    float pitch_value = current_ch1() * RAD_TO_DEG;
     vmin              = pitch_value - (float)width_units/2.0;
     vmax              = pitch_value + (float)width_units/2.0;
 
-
-    // We will do everything with glLoadMatrix :-)
-    // to avoid multiple pushing and popping matrix stack
     glPushMatrix();
-    //  glTranslatef( centroid.x, centroid.y, 0);
-    //  glRotatef(roll_value * RAD_TO_DEG, 0.0, 0.0, 1.0);
-    //  glGetFloatv(GL_MODELVIEW_MATRIX, mat);
-    // this is the same as above
-    float sinx = sin(roll_value);
-    float cosx = cos(roll_value);
-    mat[0] = cosx;
-    mat[1] = sinx;
-    mat[2] = mat[3] = 0.0;
-    mat[4] = -sinx;
-    mat[5] = cosx;
-    mat[6] = mat[7] = mat[8] = mat[9];
-    mat[10] = 1.0;
-    mat[11] = 0.0;
-    mat[12] = centroid.x;
-    mat[13] = centroid.y;
-    mat[14] = 0;
-    mat[15] = 1.0;
-    glLoadMatrixf( mat );
-    
+    glTranslatef( centroid.x, centroid.y, 0);
+    glRotatef(roll_value * RAD_TO_DEG, 0.0, 0.0, 1.0);
+
     // Draw the target spot.
-#define CENTER_DIAMOND_SIZE 5.0
+#define CENTER_DIAMOND_SIZE 6.0
     glBegin(GL_LINE_LOOP);
         glVertex2f( -CENTER_DIAMOND_SIZE, 0.0);
         glVertex2f(0.0, CENTER_DIAMOND_SIZE);
         glVertex2f( CENTER_DIAMOND_SIZE, 0.0);
         glVertex2f(0.0, -CENTER_DIAMOND_SIZE);
     glEnd();
-#if 0
-    glBegin(GL_LINES);
-        glVertex2f( -CENTER_DIAMOND_SIZE, 0);
-        glVertex2f( -(CENTER_DIAMOND_SIZE*2), 0);
-        glVertex2f(0, CENTER_DIAMOND_SIZE);
-        glVertex2f(0, (CENTER_DIAMOND_SIZE*2));
-        glVertex2f( CENTER_DIAMOND_SIZE, 0);
-        glVertex2f( (CENTER_DIAMOND_SIZE*2), 0);
-        glVertex2f(0, -CENTER_DIAMOND_SIZE);
-        glVertex2f(0, -(CENTER_DIAMOND_SIZE*2));
-    glEnd();
-#endif // 0
 #undef CENTER_DIAMOND_SIZE
 
-    int last =FloatToInt(vmax)+1;
-    i = FloatToInt(vmin);
     if( div_units ) {
+        char     TextLadder[8] ;
+        float    label_length ;
+        float    label_height ;
+        float    left ;
+        float    right ;
+        float    bot ;
+        float    top ;
+        float    text_offset = 4.0f ;
+        float    zero_offset = 10.0f ;
+  
+        fntFont *font      = HUDtext->getFont();
+        float    pointsize = HUDtext->getPointSize();
+        float    italic    = HUDtext->getSlant();
+        
+        TextList.setFont( HUDtext );
+        TextList.erase();
+        LineList.erase();
+        StippleLineList.erase();
+  
+        int last = FloatToInt(vmax)+1;
+        int i    = FloatToInt(vmin);
+        
         if( !scr_hole ) {
-            for( ; i <last ; i++ ) {
+            for( ; i<last ; i++ ) {
                 
-                marker_y =  /*(int)*/(((float)(i - pitch_value) * factor) + .5);
+                y =  (((float)(i - pitch_value) * factor) + .5f);
                 if( !(i % div_units ))    {        //  At integral multiple of div
                 
-                    label_length = sprintf( TextLadder, "%d", i );
+                    sprintf( TextLadder, "%d", i );
+                    font->getBBox ( TextLadder, pointsize, italic,
+                                    &left, &right, &bot, &top ) ;
+                    label_length  = right - left;
+                    label_length += text_offset;
+                    label_height  = (top - bot)/2.0f;
                 
-                    if( i ) {
-                        x_ini = -half_span;
-                    } else {       // Make zero point wider on left
-                        x_ini = -half_span - 10;
-                    }
-                    x_end = half_span;
-                    
-                    y_ini = marker_y;
-                    y_end = marker_y;
+                    x_ini = -half_span;
+                    x_end =  half_span;
                     
-//                  printf("(%.1f %.1f) (%.1f %.1f)\n",x_ini,y_ini,x_end,y_end);
-                    
-                    if( i >= 0 ) { // Above zero draw solid lines
-                        glBegin(GL_LINES);
-                            glVertex2f( x_ini, y_ini);
-                            glVertex2f( x_end, y_end );
-                        glEnd();
-                    } else { // Below zero draw dashed lines.
-                        glEnable(GL_LINE_STIPPLE);
-                        glLineStipple( 1, 0x00FF );
-                        glBegin(GL_LINES);
-                            glVertex2f( x_ini, y_ini);
-                            glVertex2f( x_end, y_end );
-                        glEnd();
-                        glDisable(GL_LINE_STIPPLE);
+                    if( i >= 0 ) {
+                        // Make zero point wider on left
+                        if( i == 0 )
+                            x_ini -= zero_offset;
+                        // Zero or above draw solid lines
+                        Line(x_ini, y, x_end, y);
+                    } else {
+                        // Below zero draw dashed lines.
+                        StippleLine(x_ini, y, x_end, y);
                     }
                     
                     // Calculate the position of the left text and write it.
-                    x_ini -= ( 8*label_length - 4);
-                    y_ini -= 4;
-                    _strokeString(x_ini, y_ini,
-                                  TextLadder, GLUT_STROKE_ROMAN );
-                    
-                    glLoadMatrixf( mat );
-                    // Calculate the position of the right text and write it.
-                    x_end -= (24 - 8 * label_length);
-                    y_end -= 4;
-                    _strokeString(x_end, y_end,
-                                  TextLadder, GLUT_STROKE_ROMAN );
-                    glLoadMatrixf( mat );
+                    Text( x_ini-label_length, y-label_height, TextLadder );
+                    Text( x_end+text_offset,  y-label_height, TextLadder );
                 }
             }
         }
         else // if(scr_hole )
         {    // Draw ladder with space in the middle of the lines
-            last =FloatToInt(vmax)+1;
-            i = FloatToInt(vmin);
-            for( ; i <last ; i++ )      {  
-                marker_y =  /*(int)*/(((float)(i - pitch_value) * factor) + .5);
+            float hole = (float)((scr_hole)/2.0f);
+            for( ; i<last ; i++ )      {
+                
+                y = (((float)(i - pitch_value) * factor) + .5);
                 if( !(i % div_units ))    {        //  At integral multiple of div
                 
-                    label_length = sprintf( TextLadder, "%d", i );
+                    sprintf( TextLadder, "%d", i );
+                    font->getBBox ( TextLadder, pointsize, italic,
+                                    &left, &right, &bot, &top ) ;
+                    label_length  = right - left;
+                    label_length += text_offset;
+                    label_height  = (top - bot)/2.0f;
+//                  printf("l %f r %f b %f t %f\n",left, right, bot, top );
                 
                     // Start by calculating the points and drawing the
                     // left side lines.
-                    if( i != 0 )  {
-                        x_ini =  -half_span;
-                    } else {
-                        x_ini = -half_span - 10;
-                    }
-                    x_end =  -half_span + hole;
-                    
-                    y_ini = marker_y;
-                    y_end = marker_y;
+                    x_ini = -half_span;
+                    x_end = -half_span + hole;
                     
-//                  printf("half_span(%d) scr_hole(%d)\n", half_span, scr_hole);
-//                  printf("x_end(%f) %f\n",x_end,(float)(-half_span + scr_hole/2));
-//                  printf("L: (%.1f %.1f) (%.1f %.1f)\n",x_ini,y_ini,x_end,y_end);
-                    
-                    if( i >= 0 ) { // Above zero draw solid lines
-                        glBegin(GL_LINES);
-                            glVertex2f( x_ini, y_ini);
-                            glVertex2f( x_end, y_end );
-                        glEnd();
-                    } else { // Below zero draw dashed lines.
-                        glEnable(GL_LINE_STIPPLE);
-                        glLineStipple( 1, 0x00FF );
-                        glBegin(GL_LINES);
-                            glVertex2f( x_ini, y_ini);
-                            glVertex2f( x_end, y_end );
-                        glEnd();
-                        glDisable(GL_LINE_STIPPLE);
+                    if( i >= 0 ) { 
+                        // Make zero point wider on left
+                        if( i == 0 )
+                            x_ini -= zero_offset;
+                        // Zero or above draw solid lines
+                        Line(x_ini, y, x_end, y);
+                    } else {
+                        // Below zero draw dashed lines.
+                        StippleLine(x_ini, y, x_end, y);
                     }
                     
                     // Now calculate the location of the left side label using
-                    // the previously calculated start of the left side line.
-                    
-                    x_ini -= (label_length + 32);
-                    if( i < 0) {
-                        x_ini -= 8;
-                    } else {
-                        if( i == 0 ) {
-                            x_ini += 15; //20;
-                        }
-                    }
-                    y_ini -= 4;
-
-                    _strokeString(x_ini, y_ini,
-                                  TextLadder, GLUT_STROKE_MONO_ROMAN );
-                    glLoadMatrixf( mat );
+                    Text( x_ini-label_length, y-label_height, TextLadder );
                     
                     // Now calculate and draw the right side line location
                     x_ini = half_span - hole;
-                    y_ini = marker_y;
-                    if( i != 0 )  {
-                        x_end = half_span;
-                    } else {
-                        x_end = half_span + 10;
-                    }
-                    y_end = marker_y;
-                    
-//                  printf("R: (%.1f %.1f) (%.1f %.1f)\n",x_ini,y_ini,x_end,y_end);
+                    x_end = half_span;
                     
-                    if( i >= 0 ) { // Above zero draw solid lines
-                        glBegin(GL_LINES);
-                            glVertex2f( x_ini, y_ini);
-                            glVertex2f( x_end, y_end );
-                        glEnd();
-                    } else { // Below zero draw dashed lines.
-                        glEnable(GL_LINE_STIPPLE);
-                        glLineStipple( 1, 0x00FF );
-                        glBegin(GL_LINES);
-                            glVertex2f( x_ini, y_ini);
-                            glVertex2f( x_end, y_end );
-                        glEnd();
-                        glDisable(GL_LINE_STIPPLE);
+                    if( i >= 0 ) {
+                        if( i == 0 ) 
+                            x_end += zero_offset;
+                        // Zero or above draw solid lines
+                        Line(x_ini, y, x_end, y);
+                    } else {
+                        // Below zero draw dashed lines.
+                        StippleLine(x_ini, y, x_end, y);
                     }
                     
                     // Calculate the location and draw the right side label
-                    // using the end of the line as previously calculated.
-                    x_end -=  (label_length - 24);
-                        
-                    if( i <= 0 ) {
-                        x_end -= 8;
-                    } // else if( i==0)
-//                  {
-//                      x_end -=4;
-//                  }
-                    
-                    y_end  = marker_y - 4;
-                    _strokeString(x_end,  y_end,
-                                  TextLadder, GLUT_STROKE_MONO_ROMAN );
-                    glLoadMatrixf( mat );
+                    Text( x_end+text_offset,  y-label_height, TextLadder );
                 }
             }
         }
+        TextList.draw();
+
+        glLineWidth(0.2);
+        
+        LineList.draw();
+        
+        glEnable(GL_LINE_STIPPLE);
+        glLineStipple( 1, 0x00FF );
+        StippleLineList.draw( );
+        glDisable(GL_LINE_STIPPLE);
     }
     glPopMatrix();
 }
index 5ee014b51c85d49ead0d162d383f2db648bab769..177a58fb34b146d980c16c0b2ae80eae9fa52177 100644 (file)
@@ -20,7 +20,9 @@
 
 
 #ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( font, text, x , y )
+#define textString( x , y, text, font )  TextString( text, x , y )
+#else
+#define textString( x , y, text, font )  puDrawString ( guiFnt, text, x, y );
 #endif
 
 //======================= Top of instr_label class =========================
@@ -30,12 +32,10 @@ lat_label ::
                       UINT          width,
                       UINT          height,
                       FLTFNPTR      data_source,
-//                      DBLFNPTR      data_source,                  
                       const char   *label_format,
                       const char   *pre_label_string,
                       const char   *post_label_string,
                       float        scale_data,
-//                      double        scale_data,                   
                       UINT          options,
                       fgLabelJust   justification,
                       int           font_size,
@@ -108,9 +108,9 @@ lat_label & lat_label ::operator = (const lat_label & rhs )
     justify    = rhs.justify;
     pre_str    = rhs.pre_str;
     post_str   = rhs.post_str;
-    strcpy(format_buffer,rhs.format_buffer);    
+    strcpy(format_buffer,rhs.format_buffer);   
     }
-    return *this;
+  return *this;
 }
 
 //
@@ -120,40 +120,37 @@ lat_label & lat_label ::operator = (const lat_label & rhs )
 void lat_label ::
 draw( void )       // Required method in base class
 {
-//  char format_buffer[80];
   char label_buffer[80];
   int posincr;
   int lenstr;
   RECT  scrn_rect = get_location();
   float lat = get_value();
-//  double lat = get_value();  
   
   if( data_available() ) {
-//  char *latstring = coord_format_lat(lat);
-    lenstr = sprintf( label_buffer, format_buffer, coord_format_lat(lat) );
+     sprintf( label_buffer, format_buffer, coord_format_lat(lat) );
     }
   else {
-    lenstr = sprintf( label_buffer, format_buffer );
+     sprintf( label_buffer, format_buffer );
     }
     
 #ifdef DEBUGHUD
-    fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
-    fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
-    fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
-    fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" );
+  fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
+  fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
+  fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
+  fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" );
 #endif
-//  lenstr = strlen( label_buffer );
 
-  posincr = 0;   //  default to RIGHT_JUST ... center located calc: -lenstr*8;
-
-  if( justify == CENTER_JUST ) {
-    posincr =  - (lenstr << 2); //  -lenstr*4;
-    }
-  else {
-    if( justify == LEFT_JUST ) {
-      posincr = - (lenstr << 8);  // 0;
-      }
-    }
+       lenstr = getStringWidth(label_buffer);
+                                               
+  if( justify == RIGHT_JUST ) {
+         posincr = scrn_rect.right - lenstr;
+  }else if( justify == CENTER_JUST ) {
+         posincr = get_span() - (lenstr/2); //  -lenstr*4;
+  }  else {
+      //  justify == LEFT_JUST
+      posincr = 0;  // 0;
+  }
+  
   if( fontSize == SMALL ) {
     textString( scrn_rect.left + posincr, scrn_rect.top,
                 label_buffer, GLUT_BITMAP_8_BY_13);
index 9ac38eab0d06643a1a42dcf53e9cd0efdf04d39e..07a75fea1b5b410f8b5a3a91ee00ed8c33c14ac2 100644 (file)
@@ -20,7 +20,9 @@
 #include "hud.hxx"
 
 #ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( font, text, x , y )
+#define textString( x , y, text, font )  TextString( text, x , y )
+#else
+#define textString( x , y, text, font )  puDrawString ( guiFnt, text, x, y );
 #endif
 
 //======================= Top of instr_label class =========================
@@ -30,12 +32,12 @@ lon_label ::
                       UINT          width,
                       UINT          height,
                       FLTFNPTR      data_source,
-//                      DBLFNPTR      data_source,                  
+//                      DBLFNPTR      data_source,                                     
                       const char   *label_format,
                       const char   *pre_label_string,
                       const char   *post_label_string,
                       float        scale_data,
-//                      double        scale_data,                   
+//                      double        scale_data,                                      
                       UINT          options,
                       fgLabelJust   justification,
                       int           font_size,
@@ -108,9 +110,9 @@ lon_label & lon_label ::operator = (const lon_label & rhs )
     justify    = rhs.justify;
     pre_str    = rhs.pre_str;
     post_str   = rhs.post_str;
-    strcpy(format_buffer,rhs.format_buffer);    
+    strcpy(format_buffer,rhs.format_buffer);   
     }
-    return *this;
+  return *this;
 }
 
 //
@@ -128,7 +130,7 @@ draw( void )       // Required method in base class
   float lon = get_value();
 //  double lon = get_value();  
   if( data_available() ) {
-//  char *lonstring = coord_format_lon(lon);
+//     char *lonstring = coord_format_lon(lon);
     lenstr = sprintf( label_buffer, format_buffer, coord_format_lon(lon) );
     }
   else {
@@ -136,23 +138,23 @@ draw( void )       // Required method in base class
     }
     
 #ifdef DEBUGHUD
-    fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
-    fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
-    fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
-    fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" );
+  fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
+  fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
+  fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
+  fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" );
 #endif
-//  lenstr = strlen( label_buffer );
-
-  posincr = 0;   //  default to RIGHT_JUST ... center located calc: -lenstr*8;
-
-  if( justify == CENTER_JUST ) {
-    posincr =  - (lenstr << 2); //  -lenstr*4;
-    }
-  else {
-    if( justify == LEFT_JUST ) {
-      posincr = - (lenstr << 8);  // 0;
-      }
-    }
+       
+       lenstr = getStringWidth(label_buffer);
+                                               
+  if( justify == RIGHT_JUST ) {
+         posincr = scrn_rect.right - lenstr;
+  }else if( justify == CENTER_JUST ) {
+         posincr = get_span() - (lenstr/2); //  -lenstr*4;
+  }  else {
+      //  justify == LEFT_JUST
+      posincr = 0;  // 0;
+  }
+  
   if( fontSize == SMALL ) {
     textString( scrn_rect.left + posincr, scrn_rect.top,
                 label_buffer, GLUT_BITMAP_8_BY_13);
index dc661d141b0538df30f1a0cb87d553b2a098737b..303e1ac3c1e8029bcf37279041838532e20b8dfa 100644 (file)
@@ -61,7 +61,6 @@
 
 #include "gui.h"
 
-FG_USING_STD(cout);
 FG_USING_STD(string);
 
 puFont guiFnt = 0;
@@ -82,8 +81,22 @@ static puText       *YNdialogBoxMessage = 0;
 static puOneShot    *YNdialogBoxOkButton = 0;
 static puOneShot    *YNdialogBoxNoButton = 0;
 
-// extern void NewAltitude( puObject *cb );
-// extern void NewHeading( puObject *cb );
+static char msg_OK[]     = "OK";
+static char msg_NO[]     = "NO";
+static char msg_YES[]    = "YES";
+static char msg_CANCEL[] = "Cancel";
+static char msg_RESET[]  = "Reset";
+
+char *gui_msg_OK;     // "OK"
+char *gui_msg_NO;     // "NO"
+char *gui_msg_YES;    // "YES"
+char *gui_msg_CANCEL; // "CANCEL"
+char *gui_msg_RESET;  // "RESET"
+
+static char global_dialog_string[256];
+
+extern void NewAltitude( puObject *cb );
+extern void NewHeading( puObject *cb );
 extern void fgAPAdjust( puObject * );
 extern void fgLatLonFormatToggle( puObject *);
 
@@ -105,7 +118,6 @@ void guiMotionFunc ( int x, int y )
     glutPostRedisplay () ;
 }
 
-
 void guiMouseFunc(int button, int updown, int x, int y)
 {
     _mX = x;
@@ -114,7 +126,6 @@ void guiMouseFunc(int button, int updown, int x, int y)
         last_buttons |=  ( 1 << button ) ;
     else
         last_buttons &= ~( 1 << button ) ;
-    
     puMouse (button, updown, x,y);
     glutPostRedisplay ();
 }
@@ -147,14 +158,15 @@ static inline void TurnCursorOff( void )
 #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)
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
     glutWarpPointer( glutGet(GLUT_SCREEN_WIDTH), glutGet(GLUT_SCREEN_HEIGHT));
- #endif
+#endif
 #endif
 }
 
 void maybeToggleMouse( void )
 {
+#ifdef WIN32
     static int first_time = ~0;
     static int mouse_changed = 0;
 
@@ -172,6 +184,7 @@ void maybeToggleMouse( void )
         }
     }
     first_time = ~first_time;
+#endif // #ifdef WIN32
 }
 
 // Call with FALSE to init and TRUE to restore
@@ -182,7 +195,9 @@ void BusyCursor( int restore )
         glutSetCursor(cursor);
     } else {
         cursor = glutGet( GLUT_WINDOW_CURSOR );
+#ifdef WIN32
         TurnCursorOn();
+#endif
         glutSetCursor( GLUT_CURSOR_WAIT );
     }
 }
@@ -191,20 +206,14 @@ void BusyCursor( int restore )
 // Intercept the Escape Key
 void ConfirmExitDialog(void)
 {
-    string Msg("Really Quit");
-    YNdialogBoxMessage -> setLabel(Msg.c_str());
-    YNdialogBoxNoButton-> makeReturnDefault  (TRUE );
     FG_PUSH_PUI_DIALOG( YNdialogBox );
 }
 
 // General Purpose Message Box
-void mkDialog (char *txt)
+void mkDialog (const char *txt)
 {
-    void goAwayCb(puObject *);
-    dialogBoxMessage->setLabel(txt);
-    dialogBoxOkButton -> setLegend          ("OK");
-    dialogBoxOkButton -> makeReturnDefault  (TRUE );
-    dialogBoxOkButton -> setCallback        (goAwayCb);
+    strncpy(global_dialog_string, txt, 256);
+    dialogBoxMessage->setLabel(global_dialog_string);
     FG_PUSH_PUI_DIALOG( dialogBox );
 }
 
@@ -212,22 +221,21 @@ void mkDialog (char *txt)
 void guiFixPanel( void )
 {
     int toggle_pause;
-    
+
     if ( current_options.get_panel_status() ) {
-               
-       FGView *v = &current_view;
-       FGTime *t = FGTime::cur_time_params;
+        FGView *v = &current_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();
+        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();
     }
 }
 
@@ -235,13 +243,17 @@ void guiFixPanel( void )
 void guiToggleMenu(void)
 {
     if( menu_on ) {
-       // printf("Hiding Menu\n");
-       mainMenuBar->hide  ();
-       TurnCursorOff();
+        // printf("Hiding Menu\n");
+        mainMenuBar->hide  ();
+#ifdef WIN32
+        TurnCursorOff();
+#endif // #ifdef WIN32
     } else {
-       // printf("Showing Menu\n");
-       mainMenuBar->reveal();
-       TurnCursorOn();
+        // printf("Showing Menu\n");
+        mainMenuBar->reveal();
+#ifdef WIN32
+        TurnCursorOn();
+#endif // #ifdef WIN32
     }
     menu_on = ~menu_on;
 }
@@ -272,12 +284,12 @@ void hideMenuCb (puObject *cb)
 void goodBye(puObject *)
 {
     // FG_LOG( FG_INPUT, FG_ALERT,
-    //         "Program exiting normally at user request." );
+    //      "Program exiting normally at user request." );
     cout << "Program exiting normally at user request." << endl;
 
-    // if(gps_bug)
-    //         fclose(gps_bug);
-                               
+    //  if(gps_bug)
+    //      fclose(gps_bug);
+
     exit(-1);
 }
 
@@ -289,15 +301,18 @@ void goAwayCb (puObject *me)
 
 void mkDialogInit (void)
 {
-    // printf("mkDialogInit\n");
+    //  printf("mkDialogInit\n");
     int x = (current_options.get_xsize()/2 - 400/2);
     int y = (current_options.get_ysize()/2 - 100/2);
     dialogBox = new puDialogBox (x, y); // 150, 50
     {
-       dialogFrame = new puFrame (0,0,400,100);
-       dialogBoxMessage  =  new puText         (10, 70);
-       dialogBoxMessage  -> setLabel           ("");
-       dialogBoxOkButton =  new puOneShot      (180, 10, 240, 50);
+        dialogFrame = new puFrame (0,0,400,100);
+        dialogBoxMessage  =  new puText         (10, 70);
+        dialogBoxMessage  -> setLabel           ("");
+        dialogBoxOkButton =  new puOneShot      (180, 10, 240, 50);
+        dialogBoxOkButton -> setLegend          (gui_msg_OK);
+        dialogBoxOkButton -> makeReturnDefault  (TRUE );
+        dialogBoxOkButton -> setCallback        (goAwayCb);
     }
     FG_FINALIZE_PUI_DIALOG( dialogBox );
 }
@@ -314,30 +329,33 @@ void goAwayYesNoCb(puObject *me)
 
 void ConfirmExitDialogInit(void)
 {
-    // printf("ConfirmExitDialogInit\n");
-    string Msg("Really Quit");
-    // int len = 350/2 - puGetStringWidth( puGetDefaultLabelFont(), AptLabel )/2;
-    int len = 200 - puGetStringWidth( puGetDefaultLabelFont(), Msg.c_str() )/2;
-       
+    char msg[] = "Really Quit";
+    char *s;
+
+    //  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);
        
     YNdialogBox = new puDialogBox (x, y); // 150, 50
-    // YNdialogBox = new puDialogBox (150, 50);
+    //  YNdialogBox = new puDialogBox (150, 50);
     {
-       YNdialogFrame = new puFrame (0,0,400, 100);
-               
-       YNdialogBoxMessage  =  new puText         (len, 70);
-       YNdialogBoxMessage  -> setLabel           (Msg.c_str());
-               
-       YNdialogBoxOkButton =  new puOneShot      (100, 10, 160, 50);
-       YNdialogBoxOkButton -> setLegend          ("OK");
-       YNdialogBoxOkButton -> setCallback        (goodBye);
-               
-       YNdialogBoxNoButton =  new puOneShot      (240, 10, 300, 50);
-       YNdialogBoxNoButton -> setLegend          ("NO");
-       //              YNdialogBoxNoButton -> makeReturnDefault  (TRUE );
-       YNdialogBoxNoButton -> setCallback        (goAwayYesNoCb);
+        YNdialogFrame = new puFrame (0,0,400, 100);
+        
+        YNdialogBoxMessage  =  new puText         (len, 70);
+        YNdialogBoxMessage  -> setDefaultValue    (msg);
+        YNdialogBoxMessage  -> getDefaultValue    (&s);
+        YNdialogBoxMessage  -> setLabel           (s);
+        
+        YNdialogBoxOkButton =  new puOneShot      (100, 10, 160, 50);
+        YNdialogBoxOkButton -> setLegend          (gui_msg_OK);
+        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 );
 }
@@ -354,8 +372,8 @@ void helpCb (puObject *)
 #if defined(FX) && !defined(WIN32)
 #  if defined(XMESA_FX_FULLSCREEN) && defined(XMESA_FX_WINDOW)
     if ( global_fullscreen ) {
-       global_fullscreen = false;
-       XMesaSetFXmode( XMESA_FX_WINDOW );
+        global_fullscreen = false;
+        XMesaSetFXmode( XMESA_FX_WINDOW );
     }
 #  endif
 #endif
@@ -364,18 +382,19 @@ void helpCb (puObject *)
     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 + ")\" &";
+        command = "netscape -remote \"openURL(" + url + ")\" &";
     } else {
-       command = "netscape " + url + " &";
+        command = "netscape " + url + " &";
     }
 #else
     command = "webrun.bat";
 #endif
        
     system( command.c_str() );
-    string text = "Help started in netscape window.";
-       
-    mkDialog (text.c_str());
+    //string text = "Help started in netscape window.";
+
+    //mkDialog (text.c_str());
+    mkDialog ("Help started in netscape window.");
 }
 
 /// The beginnings of teleportation :-)
@@ -386,14 +405,15 @@ static puFrame         *AptDialogFrame = 0;
 static puText          *AptDialogMessage = 0;
 static puInput         *AptDialogInput = 0;
 
+static char NewAirportId[16];
+static char NewAirportLabel[] = "Enter New Airport ID"; 
+
 static puOneShot       *AptDialogOkButton = 0;
 static puOneShot       *AptDialogCancelButton = 0;
 static puOneShot       *AptDialogResetButton = 0;
 
 void AptDialog_Cancel(puObject *)
 {
-    AptDialogOkButton->makeReturnDefault(FALSE);
-    AptDialogInput->rejectInput();
     FG_POP_PUI_DIALOG( AptDialog );
 }
 
@@ -404,7 +424,7 @@ void AptDialog_OK (puObject *)
     FGTime *t = FGTime::cur_time_params;
     int PauseMode = t->getPause();
     if(!PauseMode)
-       t->togglePauseMode();
+        t->togglePauseMode();
 
     char *s;
     AptDialogInput->getValue(&s);
@@ -413,74 +433,75 @@ void AptDialog_OK (puObject *)
     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());
-           }
+        // 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());
+        }
     }
     if( PauseMode != t->getPause() )
-       t->togglePauseMode();
+        t->togglePauseMode();
 }
 
 void AptDialog_Reset(puObject *)
 {
-    AptDialogInput->setValue ( current_options.get_airport_id().c_str() );
+    //  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 ) ;
 }
 
 void NewAirport(puObject *cb)
 {
-    string AptLabel("Enter New Airport ID");
-    AptDialogMessage ->setLabel( AptLabel.c_str() );
-    AptDialogInput   ->setValue( current_options.get_airport_id().c_str() );
-    AptDialogInput   ->acceptInput();
-    AptDialogOkButton->makeReturnDefault(TRUE);
-    
+    //  strncpy( NewAirportId, current_options.get_airport_id().c_str(), 16 );
+    sprintf( NewAirportId, "%s", current_options.get_airport_id().c_str() );
+    AptDialogInput->setValue( NewAirportId );
+
     FG_PUSH_PUI_DIALOG( AptDialog );
 }
 
 static void NewAirportInit(void)
 {
-    cout << "NewAirportInit" << endl;
+    sprintf( NewAirportId, "%s", current_options.get_airport_id().c_str() );
+    int len = 150 - puGetStringWidth( puGetDefaultLabelFont(),
+                                      NewAirportLabel ) / 2;
 
-    string AptLabel("Enter New Airport ID");
-    //  int len = 350/2 - puGetStringWidth( puGetDefaultLabelFont(), AptLabel )/2;
-    int len = 150 - puGetStringWidth( puGetDefaultLabelFont(), AptLabel.c_str() )/2;
-    
     AptDialog = new puDialogBox (150, 50);
     {
-       AptDialogFrame   = new puFrame           (0,0,350, 150);
-       AptDialogMessage = new puText            (len, 110);
-               
-       AptDialogInput   = new puInput           ( 50, 70, 300, 100 );
-               
-       AptDialogOkButton     =  new puOneShot   (50, 10, 110, 50);
-       AptDialogOkButton     ->     setLegend   ("OK");
-       AptDialogOkButton     ->     setCallback (AptDialog_OK);
-               
-       AptDialogCancelButton =  new puOneShot   (140, 10, 210, 50);
-       AptDialogCancelButton ->     setLegend   ("Cancel");
-       AptDialogCancelButton ->     setCallback (AptDialog_Cancel);
-               
-       AptDialogResetButton  =  new puOneShot   (240, 10, 300, 50);
-       AptDialogResetButton  ->     setLegend   ("Reset");
-       AptDialogResetButton  ->     setCallback (AptDialog_Reset);
+        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);
     }
     FG_FINALIZE_PUI_DIALOG( AptDialog );
 }
@@ -490,59 +511,87 @@ static void NewAirportInit(void)
 The menu stuff 
 ---------------------------------------------------------------------*/
 char *fileSubmenu               [] = {
-    "Exit", "Close", "---------", "Print", "---------", "Save", "Reset", NULL };
+    "Exit", "Close", "---------", "Print", "---------", "Save", "Reset", NULL
+};
 puCallback fileSubmenuCb        [] = {
-    MayBeGoodBye, hideMenuCb, NULL, notCb, NULL, notCb, reInit, NULL}; 
-       
+    MayBeGoodBye, hideMenuCb, NULL, notCb, NULL, notCb, reInit, NULL
+};
+
 char *editSubmenu               [] = {
-    "Edit text", NULL };
+    "Edit text", NULL
+};
 puCallback editSubmenuCb        [] = {
-    notCb, NULL };
+    notCb, NULL
+};
 
 char *viewSubmenu               [] = {
-    "Cockpit View > ", "View >","------------", "Toggle Panel...", NULL };
+    "Cockpit View > ", "View >","------------", "Toggle Panel...", NULL
+};
 puCallback viewSubmenuCb        [] = {
-    notCb, notCb, NULL, guiTogglePanel, NULL };
-       
+    notCb, notCb, NULL, guiTogglePanel, NULL
+};
+
 char *aircraftSubmenu           [] = {
-    "Autopilot", "Heading", "Altitude", "Navigation", "Communication", NULL};
+    "Autopilot", "Heading", "Altitude", "Navigation", "Communication", NULL
+};
 puCallback aircraftSubmenuCb    [] = {
-    fgAPAdjust, notCb, notCb, fgLatLonFormatToggle, notCb, NULL };
+    fgAPAdjust, NewHeading, NewAltitude, fgLatLonFormatToggle, notCb, NULL
+};
 
 char *environmentSubmenu        [] = {
-    "Airport", "Terrain", "Weather", NULL};
+    "Airport", "Terrain", "Weather", NULL
+};
 puCallback environmentSubmenuCb [] = {
-    NewAirport, notCb, notCb, NULL };
+    NewAirport, notCb, notCb, NULL
+};
 
 char *optionsSubmenu            [] = {
-    "Preferences", "Realism & Reliablity...", NULL};
+    "Preferences", "Realism & Reliablity...", NULL
+};
 puCallback optionsSubmenuCb     [] = {
-    notCb, notCb, NULL};
+    notCb, notCb, NULL
+};
 
 char *helpSubmenu               [] = {
-    "About...", "Help", NULL };
+    "About...", "Help", NULL
+};
 puCallback helpSubmenuCb        [] = {
-    notCb, helpCb, NULL };
+    notCb, helpCb, NULL
+};
 
 
 /* -------------------------------------------------------------------------
-   init the gui
-   _____________________________________________________________________*/
-
+init the gui
+_____________________________________________________________________*/
 
 
 void guiInit()
 {
     char *mesa_win_state;
+    string fntpath;
 
     // Initialize PUI
     puInit();
-    puSetDefaultStyle         ( PUSTYLE_DEFAULT );
+    puSetDefaultStyle         ( PUSTYLE_SMALL_BEVELLED ); //PUSTYLE_DEFAULT
     puSetDefaultColourScheme  (0.8, 0.8, 0.8, 0.4);
 
+    // Initialize our GLOBAL GUI STRINGS
+    gui_msg_OK     = msg_OK;     // "OK"
+    gui_msg_NO     = msg_NO;     // "NO"
+    gui_msg_YES    = msg_YES;    // "YES"
+    gui_msg_CANCEL = msg_CANCEL; // "CANCEL"
+    gui_msg_RESET  = msg_RESET;  // "RESET"
+
+    // Next check home directory
+    char* envp = ::getenv( "FG_FONTS" );
+    if ( envp != NULL ) {
+        fntpath = envp;
+    } else {
+        fntpath = current_options.get_fg_root() + "/Fonts";
+    }
+
     // Install our fast fonts
-    string fntpath = current_options.get_fg_root() + "/Fonts/" + 
-       "typewriter" + ".txf";
+    fntpath += "/typewriter.txf";
     guiFntHandle = new fntTexFont ;
     guiFntHandle -> load ( fntpath.c_str() ) ;
     puFont GuiFont ( guiFntHandle, 15 ) ;
@@ -550,26 +599,26 @@ void guiInit()
     guiFnt = puGetDefaultLabelFont();
   
     if ( current_options.get_mouse_pointer() == 0 ) {
-       // 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.
-       if ( strstr ( general.get_glRenderer(), "Glide" ) ) {
-           // 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') ||
-                    (mesa_win_state[0] == 'F') ) {
-                   puShowCursor ();
-               }
-           }
-       }
-       mouse_active = ~mouse_active;
+        // 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.
+        if ( strstr ( general.get_glRenderer(), "Glide" ) ) {
+            // 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') ||
+                     (mesa_win_state[0] == 'F') ) {
+                    puShowCursor ();
+                }
+            }
+        }
+        mouse_active = ~mouse_active;
     } else if ( current_options.get_mouse_pointer() == 1 ) {
-       // don't show pointer
+        // don't show pointer
     } else if ( current_options.get_mouse_pointer() == 2 ) {
-       // force showing pointer
-       puShowCursor();
-       mouse_active = ~mouse_active;
+        // force showing pointer
+        puShowCursor();
+        mouse_active = ~mouse_active;
     }
 
     // Set up our Dialog Boxes
index 75d20f80eeb06178a96250c35a78e5189bfbf6bd..44366a13981be06084af91f2a658692dea59ff0f 100644 (file)
@@ -34,13 +34,19 @@ extern void maybeToggleMouse( void );
 extern void BusyCursor( int restore );
 
 extern void guiToggleMenu(void);
-extern void mkDialog(char *txt);
+extern void mkDialog(const char *txt);
 extern void ConfirmExitDialog(void);
 extern void guiFixPanel( void );
 
 extern puFont guiFnt;
 extern fntTexFont *guiFntHandle;
 
+// GLOBAL COMMON DIALOG BOX TEXT STRINGS
+extern char *gui_msg_OK;     // "OK"
+extern char *gui_msg_NO;     // "NO"
+extern char *gui_msg_YES;    // "YES"
+extern char *gui_msg_CANCEL; // "CANCEL"
+extern char *gui_msg_RESET;  // "RESET"
 
 // MACROS TO HELP KEEP PUI LIVE INTERFACE STACK IN SYNC
 // These insure that the mouse is active when dialog is shown
index afda345830f760f0b78dbd15b0ab56f43fea3be6..a3c35bd79b5ab19d38c000f129691c84996d87e9 100644 (file)
 #include <Cockpit/hud.hxx>
 #include <GUI/gui.h>
 #include <Include/fg_constants.h>
+#include <Scenery/tilemgr.hxx>
 #include <Objects/materialmgr.hxx>
 #include <plib/pu.h>
+#include <Time/fg_time.hxx>
 #include <Time/light.hxx>
 #include <Weather/weather.hxx>
 
@@ -56,8 +58,8 @@
 #include "options.hxx"
 #include "views.hxx"
 
-// extern void NewAltitude( puObject *cb );
-// extern void NewHeading( puObject *cb );
+extern void NewAltitude( puObject *cb );
+extern void NewHeading( puObject *cb );
 
 // Force an update of the sky and lighting parameters
 static void local_update_sky_and_lighting_params( void ) {
@@ -344,7 +346,22 @@ void GLUTspecialkey(int k, int x, int y) {
     } else {
         FG_LOG( FG_INPUT, FG_DEBUG, "" );
        switch (k) {
-       case GLUT_KEY_F8: // F8 toggles fog ... off fastest nicest...
+       case GLUT_KEY_F2: // F2 Reload Tile Cache...
+           {
+               int toggle_pause;
+               FG_LOG(FG_INPUT, FG_INFO, "ReIniting TileCache");
+               FGTime *t = FGTime::cur_time_params;
+               if( (toggle_pause = !t->getPause()) )
+                   t->togglePauseMode();
+               BusyCursor(0);
+               fgTileMgrInit();
+               fgTileMgrUpdate();
+               BusyCursor(1);
+               if(toggle_pause)
+                   t->togglePauseMode();
+               return;
+           }
+       case GLUT_KEY_F8: // F8 toggles fog ... off fastest nicest...
            current_options.cycle_fog();
        
            if ( current_options.get_fog() == fgOPTIONS::FG_FOG_DISABLED ) {
@@ -379,12 +396,11 @@ void GLUTspecialkey(int k, int x, int y) {
            return;
        case GLUT_KEY_F11: // F11 Altitude Dialog.
            FG_LOG(FG_INPUT, FG_INFO, "Invoking Altitude call back function");
-           // NewAltitude( NULL );
-           //exit(1);
+           NewAltitude( NULL );
            return;
        case GLUT_KEY_F12: // F12 Heading Dialog...
            FG_LOG(FG_INPUT, FG_INFO, "Invoking Heading call back function");
-           // NewHeading( NULL );
+           NewHeading( NULL );
            return;
        case GLUT_KEY_UP:
            if( fgAPAltitudeEnabled() || fgAPTerrainFollowEnabled() ) {