#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
// 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
void fgAPAltitudeAdjust( double inc )
{
// Remove at a later date
- fgAPDataPtr APData;
- APData = APDataGlobal;
+ fgAPDataPtr APData = APDataGlobal;
// end section
double target_alt, target_agl;
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;
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;
void fgAPReset(void)
{
+ fgAPDataPtr APData = APDataGlobal;
+
if( fgAPTerrainFollowEnabled() )
fgAPToggleTerrainFollow( );
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
static puFont APAdjustLegendFont;
static puFont APAdjustLabelFont;
-static int DialogX = 40;
-static int DialogY = 100;
-
static puOneShot *APAdjustOkButton;
static puOneShot *APAdjustResetButton;
static puOneShot *APAdjustCancelButton;
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) )
static void goAwayAPAdjust (puObject *)
{
- FGView *v = ¤t_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;
APData->RollOut = TmpRollOutValue;
APData->MaxAileron = TmpMaxAileronValue;
APData->RollOutSmooth = TmpRollOutSmoothValue;
-
- puPopLiveInterface ( ) ;
- // puPopInterface ( ) ;
- puPopGroup ( ) ;
-
-
- APAdjustDialog -> hide();
+
+ goAwayAPAdjust(self);
}
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 * )
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
}
#endif // !defined( USING_SLIDER_CLASS )
fgAPAdjustInit( ) ;
+ NewHeadingInit();
+ NewAltitudeInit();
};
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);
+
}
*/
// 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;
};
#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>
#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.
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;
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) );
}
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;
float get_agl( void )
{
-// FGState *f;
-
-// f = current_aircraft.fdm_state;
-
float agl;
if ( current_options.get_units() == fgOPTIONS::FG_UNITS_FEET ) {
float get_sideslip( void )
{
-// FGState *f;
-
-// f = current_aircraft.fdm_state;
float sideslip = current_aircraft.fdm_state->get_Beta();
-
return( sideslip );
}
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;
float get_view_direction( void )
{
-// FGState *f;
-
-
-// FGView *pview;
double view;
-// pview = ¤t_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 );
}
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;
}
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;
}
}
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)
}
#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 )
{
// 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();
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);
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();
}
}
//
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:
}
}
+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
//
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" );
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,
// 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,
HUDS_LEFT | HUDS_VERT,
1000, 0,
1.0,
- 25, 5,
+ 25, 5,
0,
0,
200.0,
// 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,
// Remove this when below uncommented
// case 10:
HIptr = (instr_item *) new instr_label( 10,
- 10,
+ 25,
60,
10,
get_frame_rate,
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",
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);
/*
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();
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,
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 ",
// 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 ",
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,
10,
get_aoa,
"%7.2f",
- "AOA ",
+ "AOA ",
" Deg",
1.0,
HUDS_TOP,
- RIGHT_JUST,
+ LEFT_JUST,
font_size,
0,
TRUE );
" Kts",
1.0,
HUDS_TOP,
- RIGHT_JUST,
+ LEFT_JUST,
font_size,
0,
TRUE );
units,
1.0,
HUDS_TOP,
- RIGHT_JUST,
+ LEFT_JUST,
font_size,
0,
TRUE );
units,
1.0,
HUDS_TOP,
- RIGHT_JUST,
+ LEFT_JUST,
font_size,
0,
TRUE );
" Deg",
1.0,
HUDS_TOP,
- RIGHT_JUST,
+ LEFT_JUST,
font_size,
0,
TRUE );
// 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();
glLoadIdentity();
gluOrtho2D(0, 640, 0, 480);
-// gluOrtho2D(0, 1024, 0, 768);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
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 ) ;
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;
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 );
}
}
- 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);
#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);
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 )
};
#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:
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 ); }
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;
//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
float vmin;
float factor;
+ fgTextList TextList;
+ fgLineList LineList;
+ fgLineList StippleLineList;
+
public:
HudLadder( int x,
int y,
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 );
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));
+ }
};
#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 =============
#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
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 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
}
#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 =========================
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;
}
//
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);
#include <Math/polar3d.hxx>
#include <Scenery/scenery.hxx>
#include <Time/fg_timer.hxx>
-
+#include <GUI/gui.h>
#include "hud.hxx"
//====================== Top of HudLadder Class =======================
//
// 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();
}
#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 =========================
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,
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;
}
//
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);
#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 =========================
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,
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;
}
//
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 {
}
#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);
#include "gui.h"
-FG_USING_STD(cout);
FG_USING_STD(string);
puFont guiFnt = 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 *);
glutPostRedisplay () ;
}
-
void guiMouseFunc(int button, int updown, int x, int y)
{
_mX = x;
last_buttons |= ( 1 << button ) ;
else
last_buttons &= ~( 1 << button ) ;
-
puMouse (button, updown, x,y);
glutPostRedisplay ();
}
#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;
}
}
first_time = ~first_time;
+#endif // #ifdef WIN32
}
// Call with FALSE to init and TRUE to restore
glutSetCursor(cursor);
} else {
cursor = glutGet( GLUT_WINDOW_CURSOR );
+#ifdef WIN32
TurnCursorOn();
+#endif
glutSetCursor( GLUT_CURSOR_WAIT );
}
}
// 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 );
}
void guiFixPanel( void )
{
int toggle_pause;
-
+
if ( current_options.get_panel_status() ) {
-
- FGView *v = ¤t_view;
- FGTime *t = FGTime::cur_time_params;
+ FGView *v = ¤t_view;
+ FGTime *t = FGTime::cur_time_params;
- if( (toggle_pause = !t->getPause()) )
- t->togglePauseMode();
-
- // this seems to be the only way to do this :-(
- // problem is the viewport has been mucked with
- xglViewport(0, 0 , (GLint)(v->winWidth), (GLint)(v->winHeight) );
- FGPanel::OurPanel->ReInit(0, 0, 1024, 768);
-
- if(toggle_pause)
- t->togglePauseMode();
+ 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();
}
}
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;
}
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);
}
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 );
}
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 );
}
#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
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 :-)
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 );
}
FGTime *t = FGTime::cur_time_params;
int PauseMode = t->getPause();
if(!PauseMode)
- t->togglePauseMode();
+ t->togglePauseMode();
char *s;
AptDialogInput->getValue(&s);
AptDialog_Cancel( NULL );
if ( AptId.length() ) {
- // set initial position from airport id
-
- fgAIRPORTS airports;
- fgAIRPORT a;
-
- FG_LOG( FG_GENERAL, FG_INFO,
- "Attempting to set starting position from airport code "
- << s );
-
- airports.load("apt_simple");
- if ( airports.search( AptId, &a ) )
- {
- current_options.set_airport_id( AptId.c_str() );
- BusyCursor(0);
- fgReInitSubsystems();
- BusyCursor(1);
- } else {
- AptId += " not in database.";
- mkDialog(AptId.c_str());
- }
+ // 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 );
}
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 ) ;
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
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
#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>
#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 ) {
} 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 ) {
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() ) {