#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_VALUES_H
-# include <values.h> // for MAXINT
-#endif
+#include <simgear/constants.h>
+#include <simgear/debug/logstream.hxx>
+//#include <simgear/math/fg_random.h>
+//#include <simgear/math/polar3d.hxx>
#include <Aircraft/aircraft.hxx>
-#include <Debug/logstream.hxx>
+#include <Autopilot/newauto.hxx>
#include <GUI/gui.h>
-#include <Include/fg_constants.h>
#include <Main/options.hxx>
-#include <Math/fg_random.h>
-#include <Math/mat3.h>
-#include <Math/polar3d.hxx>
+#ifdef FG_NETWORK_OLK
+#include <NetworkOLK/network.h>
+#endif
#include <Scenery/scenery.hxx>
-#include <Time/fg_timer.hxx>
+//#include <Time/fg_timer.hxx>
#if defined ( __sun__ ) || defined ( __sgi )
extern "C" {
fgLineList HUD_LineList;
fgLineList HUD_StippleLineList;
+fntRenderer *HUDtext = 0;
+float HUD_TextSize = 0;
+int HUD_style = 0;
+
+float HUD_matrix[16];
+static float hud_trans_alpha = 0.67f;
+
+void fgHUDalphaInit( void );
+
class locRECT {
public:
RECT rect;
}
// #define DEBUG
+#ifdef OLD_CODE
void drawOneLine( UINT x1, UINT y1, UINT x2, UINT y2)
{
glBegin(GL_LINES);
if(*msg)
{
// puDrawString ( NULL, msg, x, y );
-
glRasterPos2f(x, y);
while (*msg) {
glutBitmapCharacter(font, *msg);
}
return 0 ;
}
+#endif // OLD_CODE
//========================= End of Class Implementations===================
// fgHUDInit
{
instr_item *HIptr;
// int index;
- int font_size;
- int off = 50;
+// int off = 50;
int min_x = 25; //off/2;
int max_x = 615; //640-(off/2);
// int min_y = off;
int compass_w = 200;
int gap = 10;
- font_size = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
+// int font_size = current_options.get_xsize() / 60;
+ int font_size = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
HUD_style = 1;
// fgHUDSetBrightness( hud, BRT_LIGHT );
// case 0: // TBI
- int x = 290; /*cen_x-30*/
- int y = 45; /*off-5*/
+// int x = 290; /*cen_x-30*/
+// int y = 45; /*off-5*/
// HIptr = (instr_item *) new fgTBI_instr( x, y, ladr_w2, text_h );
HIptr = (instr_item *) new fgTBI_instr( 290, 45, 60, 10 );
HUD_deque.insert( HUD_deque.begin(), HIptr);
50.0,
true);
+
+
+ HUD_deque.insert( HUD_deque.begin(), HIptr);
+
+
+// case 10: // Digital Mach number
+ HIptr = (instr_item *) new instr_label ( min_x , //same as speed tape
+ cen_y-(compass_w/2) -10, //below speed tape
+ 40,
+ 30,
+ get_mach,
+ "%4.2f",
+ "",
+ NULL,
+ 1.0,
+ HUDS_TOP,
+ RIGHT_JUST,
+ font_size,
+ 0,
+ TRUE );
HUD_deque.insert( HUD_deque.begin(), HIptr);
// case 9:
// }
// while( HIptr );
- return 0; // For now. Later we may use this for an error code.
+ fgHUDalphaInit();
+ fgHUDReshape();
+ return 0; // For now. Later we may use this for an error code.
}
{
// instr_item *HIptr;
// int index;
- int font_size;
int off = 50;
// int min_x = off;
// int min_y = off;
int max_y = 480-off;
int cen_x = 640 / 2;
-// int cen_y = 480 / 2;
+ int cen_y = 480 / 2;
int text_h = 10;
int ladr_w2 = 60;
-// int ladr_h2 = 90;
+ int ladr_h2 = 90;
// int ladr_t = 35;
int compass_w = 200;
// int gap = 10;
- font_size = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
+// int font_size = current_options.get_xsize() / 60;
+ int font_size = (current_options.get_xsize() > 1000) ? LARGE : SMALL;
HUD_style = 2;
instr_item* p;
+ p = new HudLadder( cen_x-ladr_w2, cen_y-ladr_h2, 2*ladr_w2, 2*ladr_h2, 1 );
+ HUD_deque.push_front( p );
+
// case 4: // GYRO COMPASS
p =new hud_card( cen_x-(compass_w/2),
max_y,
0,
TRUE );
HUD_deque.push_front( p );
-
+#if 0
p = new instr_label( x_pos, 40, 120, 10,
get_vfc_tris_culled,
"%7.0f",
0,
TRUE );
HUD_deque.push_front( p );
-
- p = new instr_label( x_pos, 70, 90, 10,
+#endif // 0
+
+// p = new instr_label( x_pos, 70, 90, 10,
+ p = new instr_label( x_pos, 40, 90, 10,
get_fov,
"%7.1f",
"FOV = ",
int global_day_night_switch = DAY;
+void HUD_masterswitch( bool incr )
+{
+ if ( current_options.get_hud_status() ) {
+ if ( global_day_night_switch == DAY ) {
+ global_day_night_switch = NIGHT;
+ } else {
+ current_options.set_hud_status( false );
+ }
+ } else {
+ current_options.set_hud_status( true );
+ global_day_night_switch = DAY;
+ }
+}
+
void HUD_brightkey( bool incr_bright )
{
-instr_item *pHUDInstr = HUD_deque[0];
-int brightness = pHUDInstr->get_brightness();
-
- if( current_options.get_hud_status() ) {
- if( incr_bright ) {
- switch (brightness) {
- case BRT_LIGHT:
- current_options.set_hud_status(0);
- break;
+ instr_item *pHUDInstr = HUD_deque[0];
+ int brightness = pHUDInstr->get_brightness();
+
+ if( current_options.get_hud_status() ) {
+ if( incr_bright ) {
+ switch (brightness)
+ {
+ case BRT_LIGHT:
+ brightness = BRT_BLACK;
+ break;
+
+ case BRT_MEDIUM:
+ brightness = BRT_LIGHT;
+ break;
+
+ case BRT_DARK:
+ brightness = BRT_MEDIUM;
+ break;
+
+ case BRT_BLACK:
+ brightness = BRT_DARK;
+ break;
+
+ default:
+ brightness = BRT_BLACK;
+ }
+ } else {
+ switch (brightness)
+ {
+ case BRT_LIGHT:
+ brightness = BRT_MEDIUM;
+ break;
+
+ case BRT_MEDIUM:
+ brightness = BRT_DARK;
+ break;
+
+ case BRT_DARK:
+ brightness = BRT_BLACK;
+ break;
+
+ case BRT_BLACK:
+ brightness = BRT_LIGHT;
+ break;
+
+ default:
+ current_options.set_hud_status(0);
+ }
+ }
+ } else {
+ current_options.set_hud_status(true);
+ }
- case BRT_MEDIUM:
- brightness = BRT_LIGHT;
- break;
+ pHUDInstr->SetBrightness( brightness );
+}
- case BRT_DARK:
- brightness = BRT_MEDIUM;
- break;
- case BRT_BLACK:
- brightness = BRT_DARK;
- break;
+#define fgAP_CLAMP(val,min,max) ( (val) = (val) > (max) ? (max) : (val) < (min) ? (min) : (val) )
- default:
- brightness = BRT_BLACK;
- }
- }
- else {
- switch (brightness) {
- case BRT_LIGHT:
- brightness = BRT_MEDIUM;
- break;
+static puDialogBox *HUDalphaDialog;
+static puText *HUDalphaText;
+static puSlider *HUDalphaHS0;
+//static puText *HUDtextText;
+//static puSlider *HUDalphaHS1;
+static char SliderText[2][ 8 ];
- case BRT_MEDIUM:
- brightness = BRT_DARK;
- break;
+static void alpha_adj( puObject *hs ) {
+ float val ;
- case BRT_DARK:
- brightness = BRT_BLACK;
- break;
+ hs-> getValue ( &val ) ;
+ fgAP_CLAMP ( val, 0.1, 1.0 ) ;
+ // printf ( "maxroll_adj( %p ) %f %f\n", hs, val, MaxRollAdjust * val ) ;
+ hud_trans_alpha = val;
+ sprintf( SliderText[ 0 ], "%05.2f", hud_trans_alpha );
+ HUDalphaText -> setLabel ( SliderText[ 0 ] ) ;
+}
- case BRT_BLACK:
- default:
- current_options.set_hud_status(0);
- }
- }
- }
- else {
- current_options.set_hud_status(1);
- if( incr_bright ) {
- if( DAY == global_day_night_switch ) {
- brightness = BRT_BLACK;
- }
- else {
- brightness = BRT_DARK;
- global_day_night_switch = DAY;
- }
- }
- else {
- if( NIGHT == global_day_night_switch ) {
- brightness = BRT_DARK;
- }
- else {
- brightness = BRT_MEDIUM;
- global_day_night_switch = NIGHT;
- }
- }
- }
- pHUDInstr->SetBrightness( brightness );
+void fgHUDalphaAdjust( puObject * ) {
+ current_options.set_anti_alias_hud(1);
+ FG_PUSH_PUI_DIALOG( HUDalphaDialog );
+}
+
+static void goAwayHUDalphaAdjust (puObject *)
+{
+ FG_POP_PUI_DIALOG( HUDalphaDialog );
+}
+
+static void cancelHUDalphaAdjust (puObject *)
+{
+ current_options.set_anti_alias_hud(0);
+ FG_POP_PUI_DIALOG( HUDalphaDialog );
+}
+
+// Done once at system initialization
+void fgHUDalphaInit( void ) {
+
+ // printf("fgHUDalphaInit\n");
+#define HORIZONTAL FALSE
+
+ int DialogX = 40;
+ int DialogY = 100;
+ int DialogWidth = 240;
+
+ char Label[] = "HUD Adjuster";
+ char *s;
+
+ int labelX = (DialogWidth / 2) -
+ (puGetStringWidth( puGetDefaultLabelFont(), Label ) / 2);
+
+ int nSliders = 1;
+ int slider_x = 10;
+ int slider_y = 55;
+ int slider_width = 220;
+ int slider_title_x = 15;
+ int slider_value_x = 160;
+ float slider_delta = 0.05f;
+
+ puFont HUDalphaLegendFont;
+ puFont HUDalphaLabelFont;
+ puGetDefaultFonts ( &HUDalphaLegendFont, &HUDalphaLabelFont );
+
+ HUDalphaDialog = new puDialogBox ( DialogX, DialogY ); {
+ int horiz_slider_height = puGetStringHeight (HUDalphaLabelFont) +
+ puGetStringDescender (HUDalphaLabelFont) +
+ PUSTR_TGAP + PUSTR_BGAP + 5;
+
+ puFrame *
+ HUDalphaFrame = new puFrame ( 0, 0,
+ DialogWidth,
+ 85 + nSliders * horiz_slider_height );
+
+ puText *
+ HUDalphaDialogMessage = new puText ( labelX,
+ 52 + nSliders
+ * horiz_slider_height );
+ HUDalphaDialogMessage -> setDefaultValue ( Label );
+ HUDalphaDialogMessage -> getDefaultValue ( &s );
+ HUDalphaDialogMessage -> setLabel ( s );
+
+ HUDalphaHS0 = new puSlider ( slider_x, slider_y,
+ slider_width, HORIZONTAL ) ;
+ HUDalphaHS0-> setDelta ( slider_delta ) ;
+ HUDalphaHS0-> setValue ( hud_trans_alpha ) ;
+ HUDalphaHS0-> setCBMode ( PUSLIDER_DELTA ) ;
+ HUDalphaHS0-> setCallback ( alpha_adj ) ;
+
+ puText *
+ HUDalphaTitle = new puText ( slider_title_x, slider_y ) ;
+ HUDalphaTitle-> setDefaultValue ( "Alpha" ) ;
+ HUDalphaTitle-> getDefaultValue ( &s ) ;
+ HUDalphaTitle-> setLabel ( s ) ;
+
+ HUDalphaText = new puText ( slider_value_x, slider_y ) ;
+ sprintf( SliderText[ 0 ], "%05.2f", hud_trans_alpha );
+ HUDalphaText-> setLabel ( SliderText[ 0 ] ) ;
+
+
+ puOneShot *
+ HUDalphaOkButton = new puOneShot ( 10, 10, 60, 45 );
+ HUDalphaOkButton-> setLegend ( gui_msg_OK );
+ HUDalphaOkButton-> makeReturnDefault ( TRUE );
+ HUDalphaOkButton-> setCallback ( goAwayHUDalphaAdjust );
+
+ puOneShot *
+ HUDalphaNoButton = new puOneShot ( 160, 10, 230, 45 );
+ HUDalphaNoButton-> setLegend ( gui_msg_CANCEL );
+ HUDalphaNoButton-> setCallback ( cancelHUDalphaAdjust );
+ }
+ FG_FINALIZE_PUI_DIALOG( HUDalphaDialog );
+
+#undef HORIZONTAL
+}
+
+void fgHUDReshape(void) {
+ if ( HUDtext )
+ delete HUDtext;
+
+ HUD_TextSize = current_options.get_xsize() / 60;
+ HUD_TextSize = 10;
+ HUDtext = new fntRenderer();
+ HUDtext -> setFont ( guiFntHandle ) ;
+ HUDtext -> setPointSize ( HUD_TextSize ) ;
+ HUD_TextList.setFont( HUDtext );
+}
+
+
+static void set_hud_color(float r, float g, float b) {
+ current_options.get_anti_alias_hud() ?
+ glColor4f(r,g,b,hud_trans_alpha) :
+ glColor3f(r,g,b);
}
// fgUpdateHUD
glPushMatrix();
glLoadIdentity();
- glColor3f(1.0, 1.0, 1.0);
- glIndexi(7);
-
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
- // We can do translucency, so why not. :-)
-// glEnable ( GL_BLEND ) ;
-// glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
-
+ if( current_options.get_anti_alias_hud() ) {
+ glEnable(GL_LINE_SMOOTH);
+// glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);
+ glLineWidth(1.5);
+ } else {
+ glLineWidth(1.0);
+ }
+
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;
+ switch (brightness)
+ {
+ case BRT_LIGHT:
+ set_hud_color (0.1f, 0.9f, 0.1f);
+ break;
case BRT_MEDIUM:
-// glColor4f (0.1, 0.7, 0.0, 0.75);
- glColor3f (0.1, 0.7, 0.0);
- break;
+ set_hud_color (0.1f, 0.7f, 0.0f);
+ break;
case BRT_DARK:
-// glColor4f (0.0, 0.6, 0.0, 0.75);
- glColor3f(0.0, 0.6, 0.0);
- break;
+ set_hud_color (0.0f, 0.6f, 0.0f);
+ break;
case BRT_BLACK:
-// glColor4f( 0.0, 0.0, 0.0, 0.75);
- glColor3f( 0.0, 0.0, 0.0);
- break;
+ set_hud_color( 0.0f, 0.0f, 0.0f);
+ break;
- default:;
- }
- }
- else {
+ default:
+ set_hud_color (0.1f, 0.9f, 0.1f);
+ }
+ } else {
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;
+ switch (brightness)
+ {
+ case BRT_LIGHT:
+ set_hud_color (0.9f, 0.1f, 0.1f);
+ 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:
-// glColor4f (0.6, 0.0, 0.0, 0.75);
- glColor3f (0.6, 0.0, 0.0);
- }
+ set_hud_color (0.7f, 0.0f, 0.1f);
+ break;
+
+ case BRT_DARK:
+ set_hud_color (0.6f, 0.0f, 0.0f);
+ break;
+
+ case BRT_BLACK:
+ set_hud_color( 0.0f, 0.0f, 0.0f);
+ break;
+
+ default:
+ set_hud_color (0.6f, 0.0f, 0.0f);
+ }
+ } else { // Just in case default
+ set_hud_color (0.1f, 0.9f, 0.1f);
}
- 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;
-
- if( pHUDInstr->enabled()) {
- // fgPrintf( FG_COCKPIT, FG_DEBUG, "HUD Code %d Status %d\n",
- // hud->code, hud->status );
- pHUDInstr->draw();
-// HUD_deque.at(i)->draw(); // Responsible for broken or fixed variants.
- // No broken displays honored just now.
- }
+ pHUDInstr = *current;
+
+ if( pHUDInstr->enabled()) {
+ // fgPrintf( FG_COCKPIT, FG_DEBUG, "HUD Code %d Status %d\n",
+ // hud->code, hud->status );
+ pHUDInstr->draw();
+ }
}
char *gmt_str = get_formated_gmt_time();
- HUD_TextList.add( fgText( 40, 10, gmt_str ) );
+ HUD_TextList.add( fgText(40, 10, gmt_str) );
+
+#ifdef FG_NETWORK_OLK
+ if ( net_hud_display ) {
+ net_hud_update();
+ }
+#endif
+
+
+ // temporary
+ // extern bool fgAPAltitudeEnabled( void );
+ // extern bool fgAPHeadingEnabled( void );
+ // extern bool fgAPWayPointEnabled( void );
+ // extern char *fgAPget_TargetDistanceStr( void );
+ // extern char *fgAPget_TargetHeadingStr( void );
+ // extern char *fgAPget_TargetAltitudeStr( void );
+ // extern char *fgAPget_TargetLatLonStr( void );
+
+ int apY = 480 - 80;
+// char scratch[128];
+// HUD_TextList.add( fgText( "AUTOPILOT", 20, apY) );
+// apY -= 15;
+ if( current_autopilot->get_HeadingEnabled() ) {
+ HUD_TextList.add( fgText( 40, apY,
+ current_autopilot->get_TargetHeadingStr()) );
+ apY -= 15;
+ }
+ if( current_autopilot->get_AltitudeEnabled() ) {
+ HUD_TextList.add( fgText( 40, apY,
+ current_autopilot->get_TargetAltitudeStr()) );
+ apY -= 15;
+ }
+ if( current_autopilot->get_HeadingMode() ==
+ FGAutopilot::FG_HEADING_WAYPOINT ) {
+ HUD_TextList.add( fgText( 40, apY,
+ current_autopilot->get_TargetLatLonStr()) );
+ apY -= 15;
+ HUD_TextList.add( fgText( 40, apY,
+ current_autopilot->get_TargetDistanceStr() ) );
+ apY -= 15;
+ }
HUD_TextList.draw();
- line_width = (current_options.get_xsize() > 1000) ? 1.0 : 0.5;
- glLineWidth(line_width);
HUD_LineList.draw();
// glEnable(GL_LINE_STIPPLE);
// HUD_StippleLineList.draw();
// glDisable(GL_LINE_STIPPLE);
-// glDisable( GL_BLEND );
-
+ if( current_options.get_anti_alias_hud() ) {
+// glDisable(GL_BLEND);
+ glDisable(GL_LINE_SMOOTH);
+ glLineWidth(1.0);
+ }
+
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
+