X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FCockpit%2Fhud.cxx;h=c4f8d2c50ec60a34c58ee16b4f62bcfb71b28150;hb=ddbd85aa7b124a96ee6cbc0f4f608e6944724fd5;hp=c4cfa1e1104155c6a91e5cb84fef9cfb9050ae5c;hpb=af80c2080b0049560cd250bef4f093abc200db94;p=flightgear.git diff --git a/src/Cockpit/hud.cxx b/src/Cockpit/hud.cxx index c4cfa1e11..c4f8d2c50 100644 --- a/src/Cockpit/hud.cxx +++ b/src/Cockpit/hud.cxx @@ -20,6 +20,8 @@ // // $Id$ +#include +#include #ifdef HAVE_CONFIG_H # include @@ -36,8 +38,8 @@ #include #include -#include -#include +#include STL_STRING +#include STL_FSTREAM #include #include @@ -49,6 +51,8 @@ #include #include #include
+#include
+#include
#ifdef FG_NETWORK_OLK #include #endif @@ -86,65 +90,65 @@ static float hud_trans_alpha = 0.67f; //$$$ begin - added, Neetha, 28 Nov 2k -string name; -int x; -int y; -UINT width; -UINT height; -float factor; -float span_units; -float division_units; -float minor_division = 0; -UINT screen_hole; -UINT lbl_pos; -bool working; -string loadfn; -UINT options; -float maxValue; -float minValue; -float scaling; -UINT major_divs; -UINT minor_divs; -UINT modulator; -int dp_showing = 0; -string label_format; -string prelabel; -string postlabel; -int justi; -int blinking; -float maxBankAngle; -float maxSlipAngle; -UINT gap_width; -bool latitude; -bool longitude; -bool tick_bottom; -bool tick_top; -bool tick_right; -bool tick_left; -bool cap_bottom; -bool cap_top; -bool cap_right; -bool cap_left; -float marker_off; -string type; -bool enable_pointer; -string type_pointer; -bool frl_spot; -bool target; -bool vel_vector; -bool drift; -bool alpha; -bool energy; -bool climb_dive; -bool glide; -float glide_slope_val; -bool worm_energy; -bool waypoint; - -FLTFNPTR load_fn; -fgLabelJust justification; -const char *pre_label_string = 0; -const char *post_label_string = 0; +static string name; +static int x; +static int y; +static UINT width; +static UINT height; +static float factor; +static float span_units; +static float division_units; +static float minor_division = 0; +static UINT screen_hole; +static UINT lbl_pos; +static bool working; +static string loadfn; +static UINT options; +static float maxValue; +static float minValue; +static float scaling; +static UINT major_divs; +static UINT minor_divs; +static UINT modulator; +static int dp_showing = 0; +static string label_format; +static string prelabel; +static string postlabel; +static int justi; +static int blinking; +static float maxBankAngle; +static float maxSlipAngle; +static UINT gap_width; +static bool latitude; +static bool longitude; +static bool tick_bottom; +static bool tick_top; +static bool tick_right; +static bool tick_left; +static bool cap_bottom; +static bool cap_top; +static bool cap_right; +static bool cap_left; +static float marker_off; +static string type; +static bool enable_pointer; +static string type_pointer; +static bool frl_spot; +static bool target; +static bool vel_vector; +static bool drift; +static bool alpha; +static bool energy; +static bool climb_dive; +static bool glide; +static float glide_slope_val; +static bool worm_energy; +static bool waypoint; + +static FLTFNPTR load_fn; +static fgLabelJust justification; +static const char *pre_label_string = 0; +static const char *post_label_string = 0; int readHud( istream &input ); int readInstrument ( const SGPropertyNode * node); @@ -222,7 +226,7 @@ void strokeString(int x, int y, char *msg, void *font, float theta) if(*msg) { glPushMatrix(); - glRotatef(theta * RAD_TO_DEG, 0.0, 0.0, 1.0); + glRotatef(theta * SGD_RADIANS_TO_DEGREES, 0.0, 0.0, 1.0); sintheta = sin(theta); costheta = cos(theta); xx = (int)(x * costheta + y * sintheta); @@ -290,7 +294,7 @@ readLadder(const SGPropertyNode * node) waypoint = node->getBoolValue("enable_waypoint_marker",false); working = node->getBoolValue("working"); - FG_LOG(FG_INPUT, FG_INFO, "Done reading instrument " << name); + SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); p = (instr_item *) new HudLadder( name, x, y, @@ -341,7 +345,7 @@ readCard(const SGPropertyNode * node) working = node->getBoolValue("working"); - FG_LOG(FG_INPUT, FG_INFO, "Done reading instrument " << name); + SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); if(type=="guage") @@ -417,149 +421,131 @@ readLabel(const SGPropertyNode * node) { instr_item *p; - int font_size = (globals->get_options()->get_xsize() > 1000) ? LARGE : SMALL; - - name = node->getStringValue("name"); - x = node->getIntValue("x"); - y = node->getIntValue("y"); - width = node->getIntValue("width"); - height = node->getIntValue("height"); - loadfn = node->getStringValue("data_source"); - label_format = node->getStringValue("label_format"); - prelabel = node->getStringValue("pre_label_string"); - postlabel = node->getStringValue("post_label_string"); - scaling = node->getFloatValue("scale_data"); - options = node->getIntValue("options"); - justi = node->getIntValue("justification"); - blinking = node->getIntValue("blinking"); - latitude = node->getBoolValue("latitude",false); - longitude = node->getBoolValue("longitude",false); - working = node->getBoolValue("working"); - - - FG_LOG(FG_INPUT, FG_INFO, "Done reading instrument " << name); - - - if(justi==0) - justification = LEFT_JUST; - else - if(justi==1) - justification = CENTER_JUST; - else - if(justi==2) - justification = RIGHT_JUST; - - - if(prelabel=="NULL") - pre_label_string = NULL; - else - if(prelabel=="blank") - pre_label_string = " "; - else - pre_label_string = prelabel.c_str(); - + int font_size = (fgGetInt("/sim/startup/xsize") > 1000) ? LARGE : SMALL; + + name = node->getStringValue("name"); + x = node->getIntValue("x"); + y = node->getIntValue("y"); + width = node->getIntValue("width"); + height = node->getIntValue("height"); + loadfn = node->getStringValue("data_source"); + label_format = node->getStringValue("label_format"); + prelabel = node->getStringValue("pre_label_string"); + postlabel = node->getStringValue("post_label_string"); + scaling = node->getFloatValue("scale_data"); + options = node->getIntValue("options"); + justi = node->getIntValue("justification"); + blinking = node->getIntValue("blinking"); + latitude = node->getBoolValue("latitude",false); + longitude = node->getBoolValue("longitude",false); + working = node->getBoolValue("working"); + + + SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); + + + if ( justi == 0 ) { + justification = LEFT_JUST; + } else { + if ( justi == 1 ) { + justification = CENTER_JUST; + } else { + if ( justi == 2 ) { + justification = RIGHT_JUST; + } + } + } - if(postlabel=="blank") - post_label_string = " "; - else - if(postlabel=="NULL") - post_label_string = NULL; - else - if(postlabel=="units") - post_label_string = units; - else - post_label_string = postlabel.c_str(); - + if ( prelabel == "NULL" ) { + pre_label_string = NULL; + } else { + if ( prelabel == "blank" ) { + pre_label_string = " "; + } else { + pre_label_string = prelabel.c_str(); + } + } - if(loadfn=="aux16") - load_fn = get_aux16; - else - if(loadfn=="aux17") - load_fn = get_aux17; - else - if(loadfn=="aux9") - load_fn = get_aux9; - else - if(loadfn=="aux11") - load_fn = get_aux11; - else - if(loadfn=="aux12") - load_fn = get_aux12; - else - if(loadfn=="aux10") - load_fn = get_aux10; - else - if(loadfn=="aux13") - load_fn = get_aux13; - else - if(loadfn=="aux14") - load_fn = get_aux14; - else - if(loadfn=="aux15") - load_fn = get_aux15; - else - if(loadfn=="aux8") - load_fn = get_aux8; - else - if(loadfn=="ax") - load_fn = get_Ax; - else - if(loadfn=="speed") - load_fn = get_speed; - else - if(loadfn=="mach") - load_fn = get_mach; - else - if(loadfn=="altitude") - load_fn = get_altitude; - else - if(loadfn=="agl") - load_fn = get_agl; - else - if(loadfn=="framerate") - load_fn = get_frame_rate; - else - if(loadfn=="heading") - load_fn = get_heading; - else - if(loadfn=="fov") - load_fn = get_fov; - else - if(loadfn=="vfc_tris_culled") - load_fn = get_vfc_tris_culled; - else - if(loadfn=="vfc_tris_drawn") - load_fn = get_vfc_tris_drawn; - else - if(loadfn=="aoa") - load_fn = get_aoa; - else - if(loadfn=="latitude") - load_fn = get_latitude; - else - if(loadfn=="longitude") - load_fn = get_longitude; - - - p = (instr_item *) new instr_label ( x, - y, - width, - height, - load_fn, - label_format.c_str(), - pre_label_string, - post_label_string, - scaling, - options, - justification, - font_size, - blinking, - latitude, - longitude, - working); + if ( postlabel == "blank" ) { + post_label_string = " "; + } else { + if ( postlabel == "NULL" ) { + post_label_string = NULL; + } else { + if ( postlabel == "units" ) { + post_label_string = units; + } else { + post_label_string = postlabel.c_str(); + } + } + } - return p; + if ( loadfn == "aux16" ) { + load_fn = get_aux16; + } else if ( loadfn == "aux17" ) { + load_fn = get_aux17; + } else if ( loadfn == "aux9" ) { + load_fn = get_aux9; + } else if ( loadfn == "aux11" ) { + load_fn = get_aux11; + } else if ( loadfn == "aux12" ) { + load_fn = get_aux12; + } else if ( loadfn == "aux10" ) { + load_fn = get_aux10; + } else if ( loadfn == "aux13" ) { + load_fn = get_aux13; + } else if ( loadfn == "aux14" ) { + load_fn = get_aux14; + } else if ( loadfn == "aux15" ) { + load_fn = get_aux15; + } else if ( loadfn == "aux8" ) { + load_fn = get_aux8; + } else if ( loadfn == "ax" ) { + load_fn = get_Ax; + } else if ( loadfn == "speed" ) { + load_fn = get_speed; + } else if ( loadfn == "mach" ) { + load_fn = get_mach; + } else if ( loadfn == "altitude" ) { + load_fn = get_altitude; + } else if ( loadfn == "agl" ) { + load_fn = get_agl; + } else if ( loadfn == "framerate" ) { + load_fn = get_frame_rate; + } else if ( loadfn == "heading" ) { + load_fn = get_heading; + } else if ( loadfn == "fov" ) { + load_fn = get_fov; + } else if ( loadfn == "vfc_tris_culled" ) { + load_fn = get_vfc_tris_culled; + } else if ( loadfn == "vfc_tris_drawn" ) { + load_fn = get_vfc_tris_drawn; + } else if ( loadfn == "aoa" ) { + load_fn = get_aoa; + } else if ( loadfn == "latitude" ) { + load_fn = get_latitude; + } else if ( loadfn == "longitude" ) { + load_fn = get_longitude; + } + p = (instr_item *) new instr_label ( x, + y, + width, + height, + load_fn, + label_format.c_str(), + pre_label_string, + post_label_string, + scaling, + options, + justification, + font_size, + blinking, + latitude, + longitude, + working); + + return p; } // end readLabel static instr_item * @@ -568,137 +554,142 @@ readTBI(const SGPropertyNode * node) instr_item *p; - name = node->getStringValue("name"); - x = node->getIntValue("x"); - y = node->getIntValue("y"); - width = node->getIntValue("width"); - height = node->getIntValue("height"); - maxBankAngle = node->getFloatValue("maxBankAngle"); - maxSlipAngle = node->getFloatValue("maxSlipAngle"); - gap_width = node->getIntValue("gap_width"); - working = node->getBoolValue("working"); - - FG_LOG(FG_INPUT, FG_INFO, "Done reading instrument " << name); - - - p = (instr_item *) new fgTBI_instr( x, - y, - width, - height, - get_roll, - get_sideslip, - maxBankAngle, - maxSlipAngle, - gap_width, - working); - - return p; + name = node->getStringValue("name"); + x = node->getIntValue("x"); + y = node->getIntValue("y"); + width = node->getIntValue("width"); + height = node->getIntValue("height"); + maxBankAngle = node->getFloatValue("maxBankAngle"); + maxSlipAngle = node->getFloatValue("maxSlipAngle"); + gap_width = node->getIntValue("gap_width"); + working = node->getBoolValue("working"); + + SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); + + + p = (instr_item *) new fgTBI_instr( x, + y, + width, + height, + get_roll, + get_sideslip, + maxBankAngle, + maxSlipAngle, + gap_width, + working); + + return p; } //end readTBI int readInstrument(const SGPropertyNode * node) { - instr_item *HIptr; + instr_item *HIptr; - if ( globals->get_options()->get_units() == FGOptions::FG_UNITS_FEET ) { - strcpy(units, " ft"); + if ( fgGetString("/sim/startup/units") == "feet" ) { + strcpy(units, " ft"); } else { - strcpy(units, " m"); + strcpy(units, " m"); } - const SGPropertyNode * ladder_group = node->getNode("ladders"); - - if (ladder_group != 0) { - int nLadders = ladder_group->nChildren(); - for (int j = 0; j < nLadders; j++) { + const SGPropertyNode * ladder_group = node->getNode("ladders"); - HIptr = readLadder(ladder_group->getChild(j)); - HUD_deque.insert( HUD_deque.begin(), HIptr); + if (ladder_group != 0) { + int nLadders = ladder_group->nChildren(); + for (int j = 0; j < nLadders; j++) { + + HIptr = readLadder(ladder_group->getChild(j)); + HUD_deque.insert( HUD_deque.begin(), HIptr); - }// for - ladders - } - - const SGPropertyNode * card_group = node->getNode("cards"); - if (card_group != 0) { - int nCards = card_group->nChildren(); - for (int j = 0; j < nCards; j++) { + }// for - ladders + } - HIptr = readCard(card_group->getChild(j)); - HUD_deque.insert( HUD_deque.begin(), HIptr); + const SGPropertyNode * card_group = node->getNode("cards"); + if (card_group != 0) { + int nCards = card_group->nChildren(); + for (int j = 0; j < nCards; j++) { + + HIptr = readCard(card_group->getChild(j)); + HUD_deque.insert( HUD_deque.begin(), HIptr); - }//for - cards - } + }//for - cards + } - const SGPropertyNode * label_group = node->getNode("labels"); - if (label_group != 0) { - int nLabels = label_group->nChildren(); - for (int j = 0; j < nLabels; j++) { + const SGPropertyNode * label_group = node->getNode("labels"); + if (label_group != 0) { + int nLabels = label_group->nChildren(); + for (int j = 0; j < nLabels; j++) { - HIptr = readLabel(label_group->getChild(j)); - HUD_deque.insert( HUD_deque.begin(), HIptr); + HIptr = readLabel(label_group->getChild(j)); + HUD_deque.insert( HUD_deque.begin(), HIptr); - }//for - labels - } + }//for - labels + } - const SGPropertyNode * tbi_group = node->getNode("tbis"); - if (tbi_group != 0) { - int nTbis = tbi_group->nChildren(); - for (int j = 0; j < nTbis; j++) { + const SGPropertyNode * tbi_group = node->getNode("tbis"); + if (tbi_group != 0) { + int nTbis = tbi_group->nChildren(); + for (int j = 0; j < nTbis; j++) { - HIptr = readTBI(tbi_group->getChild(j)); - HUD_deque.insert( HUD_deque.begin(), HIptr); + HIptr = readTBI(tbi_group->getChild(j)); + HUD_deque.insert( HUD_deque.begin(), HIptr); - }//for - tbis - } - return 0; + }//for - tbis + } + return 0; }//end readinstrument + int readHud( istream &input ) { - SGPropertyNode root; + SGPropertyNode root; - - if (!readProperties(input, &root)) { - FG_LOG(FG_INPUT, FG_ALERT, "Malformed property list for hud."); - return 0; - } + try { + readProperties(input, &root); + } catch (const sg_exception &e) { + guiErrorMessage("Error reading HUD: ", e); + return 0; + } - FG_LOG(FG_INPUT, FG_INFO, "Read properties for " << - root.getStringValue("name")); + SG_LOG(SG_INPUT, SG_INFO, "Read properties for " << + root.getStringValue("name")); - HUD_deque.erase( HUD_deque.begin(), HUD_deque.end()); // empty the HUD deque + HUD_deque.erase( HUD_deque.begin(), HUD_deque.end()); // empty the HUD deque - FG_LOG(FG_INPUT, FG_INFO, "Reading Hud instruments"); + SG_LOG(SG_INPUT, SG_INFO, "Reading Hud instruments"); - const SGPropertyNode * instrument_group = root.getChild("instruments"); - int nInstruments = instrument_group->nChildren(); + const SGPropertyNode * instrument_group = root.getChild("instruments"); + int nInstruments = instrument_group->nChildren(); - for (int i = 0; i < nInstruments; i++) { + for (int i = 0; i < nInstruments; i++) { - const SGPropertyNode * node = instrument_group->getChild(i); + const SGPropertyNode * node = instrument_group->getChild(i); - FGPath path( globals->get_options()->get_fg_root() ); - path.append(node->getStringValue("path")); + SGPath path( globals->get_fg_root() ); + path.append(node->getStringValue("path")); - FG_LOG(FG_INPUT, FG_INFO, "Reading Instrument " - << node->getName() - << " from " - << path.str()); + SG_LOG(SG_INPUT, SG_INFO, "Reading Instrument " + << node->getName() + << " from " + << path.str()); - SGPropertyNode root2; - if (readProperties(path.str(), &root2)) { - - readInstrument(&root2); + SGPropertyNode root2; + try { + readProperties(path.str(), &root2); + } catch (const sg_exception &e) { + guiErrorMessage("Error reading HUD instrument: ", e); + continue; + } + readInstrument(&root2); + }//for loop(i) - }//if - }//for loop(i) - return 0; + return 0; } @@ -706,32 +697,31 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ ) { - HUD_style = 1; + HUD_style = 1; - FG_LOG( FG_COCKPIT, FG_INFO, "Initializing current aircraft HUD" ); + SG_LOG( SG_COCKPIT, SG_INFO, "Initializing current aircraft HUD" ); string hud_path = - globals->get_props()->getStringValue("/sim/hud/path", - "Huds/Default/default.xml"); - FGPath path(globals->get_options()->get_fg_root()); - path.append(hud_path); + fgGetString("/sim/hud/path", "Huds/Default/default.xml"); + SGPath path(globals->get_fg_root()); + path.append(hud_path); - ifstream input(path.c_str()); - if (!input.good()) - { - FG_LOG(FG_INPUT, FG_ALERT, - "Cannot read Hud configuration from " << path.str()); - } - else - { - readHud(input); - input.close(); - } + ifstream input(path.c_str()); + if (!input.good()) + { + SG_LOG(SG_INPUT, SG_ALERT, + "Cannot read Hud configuration from " << path.str()); + } + else + { + readHud(input); + input.close(); + } - fgHUDalphaInit(); - fgHUDReshape(); + fgHUDalphaInit(); + fgHUDReshape(); - return 0; // For now. Later we may use this for an error code. + return 0; // For now. Later we may use this for an error code. } @@ -740,39 +730,39 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ ) HUD_style = 2; - FG_LOG( FG_COCKPIT, FG_INFO, "Initializing current aircraft HUD" ); + SG_LOG( SG_COCKPIT, SG_INFO, "Initializing current aircraft HUD" ); - FGPath path(globals->get_options()->get_fg_root()); - path.append("Huds/Minimal/default.xml"); + SGPath path(globals->get_fg_root()); + path.append("Huds/Minimal/default.xml"); - ifstream input(path.c_str()); - if (!input.good()) { - FG_LOG(FG_INPUT, FG_ALERT, - "Cannot read Hud configuration from " << path.str()); - } - else { - readHud(input); - input.close(); - } + ifstream input(path.c_str()); + if (!input.good()) { + SG_LOG(SG_INPUT, SG_ALERT, + "Cannot read Hud configuration from " << path.str()); + } + else { + readHud(input); + input.close(); + } return 0; // For now. Later we may use this for an error code. } //$$$ End - added, Neetha, 28 Nov 2k -int global_day_night_switch = DAY; +static int global_day_night_switch = DAY; void HUD_masterswitch( bool incr ) { - if ( globals->get_options()->get_hud_status() ) { + if ( fgGetBool("/sim/hud/visibility") ) { if ( global_day_night_switch == DAY ) { global_day_night_switch = NIGHT; } else { - globals->get_options()->set_hud_status( false ); + fgSetBool("/sim/hud/visibility", false); } } else { - globals->get_options()->set_hud_status( true ); + fgSetBool("/sim/hud/visibility", true); global_day_night_switch = DAY; } } @@ -782,7 +772,7 @@ void HUD_brightkey( bool incr_bright ) instr_item *pHUDInstr = HUD_deque[0]; int brightness = pHUDInstr->get_brightness(); - if( globals->get_options()->get_hud_status() ) { + if( fgGetBool("/sim/hud/visibility") ) { if( incr_bright ) { switch (brightness) { @@ -825,11 +815,11 @@ void HUD_brightkey( bool incr_bright ) break; default: - globals->get_options()->set_hud_status(0); + fgSetBool("/sim/hud/visibility", false); } } } else { - globals->get_options()->set_hud_status(true); + fgSetBool("/sim/hud/visibility", true); } pHUDInstr->SetBrightness( brightness ); @@ -846,131 +836,139 @@ static puSlider *HUDalphaHS0; static char SliderText[2][ 8 ]; static void alpha_adj( puObject *hs ) { - float val ; - - 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 ] ) ; + float val ; + + 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 ] ) ; } void fgHUDalphaAdjust( puObject * ) { - globals->get_options()->set_anti_alias_hud(1); - FG_PUSH_PUI_DIALOG( HUDalphaDialog ); + fgSetBool("/sim/hud/antialiased", true); + FG_PUSH_PUI_DIALOG( HUDalphaDialog ); } static void goAwayHUDalphaAdjust (puObject *) { - FG_POP_PUI_DIALOG( HUDalphaDialog ); + FG_POP_PUI_DIALOG( HUDalphaDialog ); } static void cancelHUDalphaAdjust (puObject *) { - globals->get_options()->set_anti_alias_hud(0); - FG_POP_PUI_DIALOG( HUDalphaDialog ); + fgSetBool("/sim/hud/antialiased", false); + FG_POP_PUI_DIALOG( HUDalphaDialog ); } // Done once at system initialization void fgHUDalphaInit( void ) { - // printf("fgHUDalphaInit\n"); + // printf("fgHUDalphaInit\n"); #define HORIZONTAL FALSE - int DialogX = 40; - int DialogY = 100; - int DialogWidth = 240; + int DialogX = 40; + int DialogY = 100; + int DialogWidth = 240; - char Label[] = "HUD Adjuster"; - char *s; + char Label[] = "HUD Adjuster"; + char *s; - int labelX = (DialogWidth / 2) - - (puGetStringWidth( puGetDefaultLabelFont(), Label ) / 2); + 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 ); + 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 ); + 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 ) ; - 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 ); + 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 = globals->get_options()->get_xsize() / 60; - HUD_TextSize = 10; - HUDtext = new fntRenderer(); - HUDtext -> setFont ( guiFntHandle ) ; - HUDtext -> setPointSize ( HUD_TextSize ) ; - HUD_TextList.setFont( HUDtext ); + if ( HUDtext ) { + // this chunk of code is not necessarily thread safe if the + // compiler optimizer reorders these statements. Note that + // "delete ptr" does not set "ptr = NULL". We have to do that + // ourselves. + fntRenderer *tmp = HUDtext; + HUDtext = NULL; + delete tmp; + } + + HUD_TextSize = fgGetInt("/sim/startup/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) { - globals->get_options()->get_anti_alias_hud() ? - glColor4f(r,g,b,hud_trans_alpha) : - glColor3f(r,g,b); + fgGetBool("/sim/hud/antialiased") ? + glColor4f(r,g,b,hud_trans_alpha) : + glColor3f(r,g,b); } + // fgUpdateHUD // // Performs a once around the list of calls to instruments installed in @@ -978,12 +976,30 @@ static void set_hud_color(float r, float g, float b) { // all C++. // void fgUpdateHUD( void ) { + + static const float normal_aspect = float(640) / float(480); + // note: win_ratio is Y/X + float current_aspect = 1.0f/globals->get_current_view()->get_win_ratio(); + if( current_aspect > normal_aspect ) { + float aspect_adjust = current_aspect / normal_aspect; + float adjust = 320.0f*aspect_adjust - 320.0f; + fgUpdateHUD( -adjust, 0.0f, 640.0f+adjust, 480.0f ); + } else { + float aspect_adjust = normal_aspect / current_aspect; + float adjust = 240.0f*aspect_adjust - 240.0f; + fgUpdateHUD( 0.0f, -adjust, 640.0f, 480.0f+adjust ); + } +} + +void fgUpdateHUD( GLfloat x_start, GLfloat y_start, + GLfloat x_end, GLfloat y_end ) +{ int brightness; -// int day_night_sw = current_aircraft.controls->day_night_switch; + // 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; - float line_width; + // float line_width; if( !hud_displays ) { // Trust everyone, but ALWAYS cut the cards! return; @@ -991,17 +1007,17 @@ void fgUpdateHUD( void ) { HUD_TextList.erase(); HUD_LineList.erase(); -// HUD_StippleLineList.erase(); + // HUD_StippleLineList.erase(); pHUDInstr = HUD_deque[0]; brightness = pHUDInstr->get_brightness(); -// brightness = HUD_deque.at(0)->get_brightness(); + // brightness = HUD_deque.at(0)->get_brightness(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - gluOrtho2D(0, 640, 0, 480); + gluOrtho2D(x_start, x_end, y_start, y_end); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -1009,11 +1025,15 @@ void fgUpdateHUD( void ) { glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); - if( globals->get_options()->get_anti_alias_hud() ) { + static const SGPropertyNode * antialiased_node + = fgGetNode("/sim/hud/antialiased"); + + if( antialiased_node->getBoolValue() ) { glEnable(GL_LINE_SMOOTH); // glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE); +// glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); glLineWidth(1.5); } else { glLineWidth(1.0); @@ -1076,7 +1096,7 @@ void fgUpdateHUD( void ) { pHUDInstr = *current; if( pHUDInstr->enabled()) { - // fgPrintf( FG_COCKPIT, FG_DEBUG, "HUD Code %d Status %d\n", + // fgPrintf( SG_COCKPIT, SG_DEBUG, "HUD Code %d Status %d\n", // hud->code, hud->status ); pHUDInstr->draw(); @@ -1103,9 +1123,9 @@ void fgUpdateHUD( void ) { // extern char *fgAPget_TargetLatLonStr( void ); int apY = 480 - 80; -// char scratch[128]; -// HUD_TextList.add( fgText( "AUTOPILOT", 20, apY) ); -// apY -= 15; + // 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()) ); @@ -1141,15 +1161,15 @@ void fgUpdateHUD( void ) { HUD_LineList.draw(); -// glEnable(GL_LINE_STIPPLE); -// glLineStipple( 1, 0x00FF ); -// HUD_StippleLineList.draw(); -// glDisable(GL_LINE_STIPPLE); + // glEnable(GL_LINE_STIPPLE); + // glLineStipple( 1, 0x00FF ); + // HUD_StippleLineList.draw(); + // glDisable(GL_LINE_STIPPLE); - if( globals->get_options()->get_anti_alias_hud() ) { -// glDisable(GL_BLEND); - glDisable(GL_LINE_SMOOTH); - glLineWidth(1.0); + if( antialiased_node->getBoolValue() ) { + // glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0); } glEnable(GL_DEPTH_TEST);