X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FCockpit%2Fhud.cxx;h=a8b7f5dd6ffd58611ef08da794846310f0bf3b92;hb=ddda2c68d5000377c7f76193f27ef78645fe316e;hp=18e0ef636308373a45f1d7501301c80cf3577744;hpb=e322c70f529eacbfa0460f8f10419657eee00675;p=flightgear.git diff --git a/src/Cockpit/hud.cxx b/src/Cockpit/hud.cxx index 18e0ef636..a8b7f5dd6 100644 --- a/src/Cockpit/hud.cxx +++ b/src/Cockpit/hud.cxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -41,8 +41,10 @@ #include #include -#include // char related functions -#include // strcmp() +#include // char related functions +#include // strcmp() + +#include SG_GLU_H #include #include @@ -50,20 +52,17 @@ #include #include -#include -#include +#include +#include #include
#include
#include -#if defined ( __sun__ ) || defined ( __sgi ) -extern "C" { - extern void *memmove(void *, const void *, size_t); -} -#endif - #include "hud.hxx" + +static HUD_Properties *HUD = 0; + static char units[5]; // The following routines obtain information concerning the aircraft's @@ -78,29 +77,22 @@ fgLineList HUD_LineList; fgLineList HUD_StippleLineList; fntRenderer *HUDtext = 0; -float HUD_TextSize = 0; +fntTexFont *HUD_Font = 0; +float HUD_TextSize = 0; int HUD_style = 0; float HUD_matrix[16]; -static float hud_trans_alpha = 0.67f; -//$$$ begin - added, Neetha, 28 Nov 2k - -static string name; -static int x; -static int y; +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 UINT options; static float maxValue; static float minValue; static float scaling; @@ -111,74 +103,46 @@ 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 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 string type_tick;//hud -static string length_tick;//hud -static bool label_box;//hud -static int digits; //suma -static float radius; //suma -static int divisions; //suma -static int zoom; //suma -static int zenith; //suma -static int nadir ; //suma -static int hat; //suma -static bool tsi; //suma -static float rad; //suma - - -static FLTFNPTR load_fn; -static fgLabelJust justification; -static const char *pre_label_string = 0; -static const char *post_label_string = 0; +static string type_tick; +static string length_tick; +static float radius; +static int divisions; +static int zoom; +static bool tsi; +static float rad; + + +static FLTFNPTR load_fn; int readHud( istream &input ); int readInstrument ( const SGPropertyNode * node); -static instr_item * readLadder ( const SGPropertyNode * node); static instr_item * readCard ( const SGPropertyNode * node); -static instr_item * readLabel( const SGPropertyNode * node); static instr_item * readTBI( const SGPropertyNode * node); -//$$$ end - added, Neetha, 28 Nov 2k static void drawHUD(); static void fgUpdateHUDVirtual(); -void fgHUDalphaInit( void ); - class locRECT { public: RECT rect; locRECT( UINT left, UINT top, UINT right, UINT bottom); - RECT get_rect(void) { return rect;} + RECT get_rect(void) { return rect; } }; locRECT :: locRECT( UINT left, UINT top, UINT right, UINT bottom) @@ -201,110 +165,49 @@ locRECT :: locRECT( UINT left, UINT top, UINT right, UINT bottom) // mustange and the engine readouts of a B36! // -#define INSTRDEFS 21 - -//$$$ begin - added, Neetha, 28 Nov 2k -static instr_item * -readLadder(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"); - factor = node->getFloatValue("compression_factor"); - span_units = node->getFloatValue("span_units"); - division_units = node->getFloatValue("division_units"); - screen_hole = node->getIntValue("screen_hole"); - lbl_pos = node->getIntValue("lbl_pos"); - frl_spot = node->getBoolValue("enable_frl",false); - target = node->getBoolValue("enable_target_spot",false); - vel_vector = node->getBoolValue("enable_velocity_vector",false); - drift = node->getBoolValue("enable_drift_marker",false); - alpha = node->getBoolValue("enable_alpha_bracket",false); - energy = node->getBoolValue("enable_energy_marker",false); - climb_dive = node->getBoolValue("enable_climb_dive_marker",false); - glide = node->getBoolValue("enable_glide_slope_marker",false); - glide_slope_val = node->getFloatValue("glide_slope",-4.0); - worm_energy = node->getBoolValue("enable_energy_marker",false); - waypoint = node->getBoolValue("enable_waypoint_marker",false); - working = node->getBoolValue("working"); - zenith = node->getIntValue("zenith"); //suma - nadir = node->getIntValue("nadir"); //suma - hat = node->getIntValue("hat"); - // The factor assumes a base of 55 degrees per 640 pixels. - // Invert to convert the "compression" factor to a - // pixels-per-degree number. - if(fgGetBool("/sim/hud/enable3d", true)) - { - if (HUD_style == 1) - { - factor = 1; - factor = (640./55.) / factor; - } - } - - SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); - - p = (instr_item *) new HudLadder( name, x, y, - width, height, factor, - get_roll, get_pitch, - span_units, division_units, minor_division, - screen_hole, lbl_pos, frl_spot, target, vel_vector, - drift, alpha, energy, climb_dive, - glide, glide_slope_val, worm_energy, - waypoint, working, zenith, nadir, hat); - - return p; - -} //end readLadder - -static instr_item * +static instr_item * readCard(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"); - loadfn = node->getStringValue("loadfn"); - options = node->getIntValue("options"); - maxValue = node->getFloatValue("maxValue"); - minValue = node->getFloatValue("minValue"); - scaling = node->getFloatValue("disp_scaling"); - major_divs = node->getIntValue("major_divs"); - minor_divs = node->getIntValue("minor_divs"); - modulator = node->getIntValue("modulator"); - span_units = node->getFloatValue("value_span"); - type = node->getStringValue("type"); - tick_bottom = node->getBoolValue("tick_bottom",false); - tick_top = node->getBoolValue("tick_top",false); - tick_right = node->getBoolValue("tick_right",false); - tick_left = node->getBoolValue("tick_left",false); - cap_bottom = node->getBoolValue("cap_bottom",false); - cap_top = node->getBoolValue("cap_top",false); - cap_right = node->getBoolValue("cap_right",false); - cap_left = node->getBoolValue("cap_left",false); - marker_off = node->getFloatValue("marker_offset",0.0); - enable_pointer = node->getBoolValue("enable_pointer",true); - type_pointer = node->getStringValue("pointer_type"); - type_tick = node->getStringValue("tick_type");//hud Can be 'circle' or 'line' - length_tick = node->getStringValue("tick_length");//hud For variable length - working = node->getBoolValue("working"); - radius = node->getFloatValue("radius"); //suma - divisions = node->getIntValue("divisions"); //suma - zoom = node->getIntValue("zoom"); //suma + name = node->getStringValue("name"); + x = node->getIntValue("x"); + y = node->getIntValue("y"); + width = node->getIntValue("width"); + height = node->getIntValue("height"); + loadfn = node->getStringValue("loadfn"); + options = node->getIntValue("options"); + maxValue = node->getFloatValue("maxValue"); + minValue = node->getFloatValue("minValue"); + scaling = node->getFloatValue("disp_scaling"); + major_divs = node->getIntValue("major_divs"); + minor_divs = node->getIntValue("minor_divs"); + modulator = node->getIntValue("modulator"); + span_units = node->getFloatValue("value_span"); + type = node->getStringValue("type"); + tick_bottom = node->getBoolValue("tick_bottom",false); + tick_top = node->getBoolValue("tick_top",false); + tick_right = node->getBoolValue("tick_right",false); + tick_left = node->getBoolValue("tick_left",false); + cap_bottom = node->getBoolValue("cap_bottom",false); + cap_top = node->getBoolValue("cap_top",false); + cap_right = node->getBoolValue("cap_right",false); + cap_left = node->getBoolValue("cap_left",false); + marker_off = node->getFloatValue("marker_offset",0.0); + enable_pointer = node->getBoolValue("enable_pointer",true); + type_pointer = node->getStringValue("pointer_type"); + type_tick = node->getStringValue("tick_type"); // 'circle' or 'line' + length_tick = node->getStringValue("tick_length"); // for variable length + working = node->getBoolValue("working"); + radius = node->getFloatValue("radius"); + divisions = node->getIntValue("divisions"); + zoom = node->getIntValue("zoom"); SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); - if(type=="gauge") { + if (type=="gauge") { span_units = maxValue - minValue; } @@ -339,7 +242,7 @@ readCard(const SGPropertyNode * node) if ( (type == "dial") | (type == "tape") ) { p = (instr_item *) new hud_card( x, - y, + y, width, height, load_fn, @@ -362,18 +265,18 @@ readCard(const SGPropertyNode * node) marker_off, enable_pointer, type_pointer, - type_tick,//hud - length_tick,//hud + type_tick, + length_tick, working, - radius, //suma - divisions, //suma - zoom //suma + radius, + divisions, + zoom ); } else { - p = (instr_item *) new gauge_instr( x, // x - y, // y - width, // width - height, // height + p = (instr_item *) new gauge_instr( x, // x + y, // y + width, // width + height, // height load_fn, // data source options, scaling, @@ -388,162 +291,6 @@ readCard(const SGPropertyNode * node) }// end readCard static instr_item * -readLabel(const SGPropertyNode * node) -{ - instr_item *p; - - int font_size = (fgGetInt("/sim/startup/xsize") > 1000) ? HUD_FONT_LARGE : HUD_FONT_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); - label_box = node->getBoolValue("label_box",false);//hud - working = node->getBoolValue("working"); - digits = node->getIntValue("digits"); //suma - - - 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 ( prelabel == "NULL" ) { - pre_label_string = NULL; - } else { - if ( prelabel == "blank" ) { - pre_label_string = " "; - } else { - pre_label_string = prelabel.c_str(); - } - } - - 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 ( loadfn== "aux1" ) { - load_fn = get_aux1; - } else if ( loadfn == "aux2" ) { - load_fn = get_aux2; - } else if ( loadfn == "aux3" ) { - load_fn = get_aux3; - } else if ( loadfn == "aux4" ) { - load_fn = get_aux4; - } else if ( loadfn == "aux5" ) { - load_fn = get_aux5; - } else if ( loadfn == "aux6" ) { - load_fn = get_aux6; - } else if ( loadfn == "aux7" ) { - load_fn = get_aux7; - } else if ( loadfn == "aux8" ) { - load_fn = get_aux8; - } else if ( loadfn == "aux9" ) { - load_fn = get_aux9; - } else if ( loadfn == "aux10" ) { - load_fn = get_aux10; - } else if ( loadfn == "aux11" ) { - load_fn = get_aux11; - } else if ( loadfn == "aux12" ) { - load_fn = get_aux12; - } 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 == "aux16" ) { - load_fn = get_aux16; - } else if ( loadfn == "aux17" ) { - load_fn = get_aux17; - } else if ( loadfn == "aux18" ) { - load_fn = get_aux18; - } 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 == "anzg" ) { - load_fn = get_anzg; - } else if ( loadfn == "longitude" ) { - load_fn = get_longitude; - } else if (loadfn=="throttleval") { - load_fn = get_throttleval; - } - - 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, - label_box, //hud - working, - digits); //suma - - return p; -} // end readLabel - -static instr_item * readTBI(const SGPropertyNode * node) { @@ -558,28 +305,51 @@ readTBI(const SGPropertyNode * node) maxSlipAngle = node->getFloatValue("maxSlipAngle"); gap_width = node->getIntValue("gap_width"); working = node->getBoolValue("working"); - tsi = node->getBoolValue("tsi"); //suma - rad = node->getFloatValue("rad"); //suma + tsi = node->getBoolValue("tsi"); + rad = node->getFloatValue("rad"); SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); - p = (instr_item *) new fgTBI_instr( x, - y, + p = (instr_item *) new fgTBI_instr( x, + y, width, height, get_roll, get_sideslip, - maxBankAngle, + maxBankAngle, maxSlipAngle, gap_width, working, - tsi, //suma - rad); //suma + tsi, + rad); return p; } //end readTBI +static instr_item * +readRunway(const SGPropertyNode * node) { + name = node->getStringValue("name"); + x = node->getIntValue("x"); + y = node->getIntValue("y"); + width = node->getIntValue("width"); + height = node->getIntValue("height"); + scaling = node->getDoubleValue("scale"); + working = node->getBoolValue("working",true); + runway_instr *ri = new runway_instr(x,y,width,height,scaling,working); + double scale = node->getDoubleValue("arrow_scale",1.0); + ri->setDrawArrow((scale>0)?true:false); + ri->setDrawArrowAlways((scale>0)?node->getBoolValue("arrow_always"):false); + ri->setStippleOutline(node->getIntValue("outer_stipple",0xFFFF)); + ri->setStippleCenterline(node->getIntValue("center_stipple",0xFFFF)); + ri->setArrowRotationRadius(node->getDoubleValue("arrow_radius")); + ri->setArrowScale(scale); + ri->setLineScale(node->getDoubleValue("line_scale",1.0)); + ri->setScaleDist(node->getDoubleValue("scale_dist_nm")); + SG_LOG(SG_INPUT, SG_INFO, "Done reading instrument " << name); + return (instr_item *) ri; +} + int readInstrument(const SGPropertyNode * node) { @@ -587,7 +357,7 @@ int readInstrument(const SGPropertyNode * node) = fgGetNode("/sim/startup/units"); instr_item *HIptr; - + if ( !strcmp(startup_units_node->getStringValue(), "feet") ) { strcpy(units, " ft"); } else { @@ -599,50 +369,52 @@ int readInstrument(const SGPropertyNode * node) 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 + HIptr = static_cast(new HudLadder(ladder_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 + HUD_deque.insert(HUD_deque.begin(), HIptr); + } } 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); - - }//for - labels + HIptr = static_cast(new instr_label(label_group->getChild(j))); + HUD_deque.insert(HUD_deque.begin(), HIptr); + } } 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); + } + } - }//for - tbis + const SGPropertyNode * rwy_group = node->getNode("runways"); + if (rwy_group != 0) { + int nRwy = rwy_group->nChildren(); + for (int j = 0; j < nRwy; j++) { + SG_LOG(SG_COCKPIT, SG_DEBUG, "*** Reading runway properties ***"); + HIptr = readRunway(rwy_group->getChild(j)); + HUD_deque.insert( HUD_deque.begin(), HIptr); + } } return 0; }//end readinstrument -int readHud( istream &input ) +int readHud( istream &input ) { SGPropertyNode root; @@ -653,13 +425,13 @@ int readHud( istream &input ) guiErrorMessage("Error reading HUD: ", e); return 0; } - - + + 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()); SG_LOG(SG_INPUT, SG_INFO, "Reading Hud instruments"); @@ -668,7 +440,7 @@ int readHud( istream &input ) int nInstruments = instrument_group->nChildren(); for (int i = 0; i < nInstruments; i++) { - + const SGPropertyNode * node = instrument_group->getChild(i); SGPath path( globals->get_fg_root() ); @@ -685,7 +457,7 @@ int readHud( istream &input ) } catch (const sg_exception &e) { guiErrorMessage("Error reading HUD instrument: ", e); continue; - } + } readInstrument(&root2); }//for loop(i) @@ -701,10 +473,10 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ ) SG_LOG( SG_COCKPIT, SG_INFO, "Initializing current aircraft HUD" ); string hud_path = - fgGetString("/sim/hud/path", "Huds/Default/default.xml"); + 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()) { SG_LOG(SG_INPUT, SG_ALERT, @@ -714,7 +486,6 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ ) input.close(); } - fgHUDalphaInit(); fgHUDReshape(); if ( HUDtext ) { @@ -727,13 +498,20 @@ int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ ) delete tmp; } -// HUD_TextSize = fgGetInt("/sim/startup/xsize") / 60; - HUD_TextSize = 10; + FGFontCache *fc = globals->get_fontcache(); + HUD_Font = fc->getTexFont(fgGetString("/sim/hud/font/name", "Helvetica.txf")); + if (!HUD_Font) + throw sg_throwable(string("/sim/hud/font/name is not a texture font")); + + HUD_TextSize = fgGetFloat("/sim/hud/font/size", 10); + HUDtext = new fntRenderer(); - HUDtext -> setFont ( guiFntHandle ) ; - HUDtext -> setPointSize ( HUD_TextSize ) ; + HUDtext->setFont(HUD_Font); + HUDtext->setPointSize(HUD_TextSize); HUD_TextList.setFont( HUDtext ); - + + if (!HUD) + HUD = new HUD_Properties; return 0; // For now. Later we may use this for an error code. } @@ -758,200 +536,12 @@ int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ ) input.close(); } + if (!HUD) + HUD = new HUD_Properties; return 0; // For now. Later we may use this for an error code. } -//$$$ End - added, Neetha, 28 Nov 2k - -static int global_day_night_switch = HUD_DAY; - -void HUD_masterswitch( bool incr ) -{ - if ( fgGetBool("/sim/hud/visibility") ) { - if ( global_day_night_switch == HUD_DAY ) { - global_day_night_switch = HUD_NIGHT; - } else { - fgSetBool("/sim/hud/visibility", false); - } - } else { - fgSetBool("/sim/hud/visibility", true); - global_day_night_switch = HUD_DAY; - } -} - -void HUD_brightkey( bool incr_bright ) -{ - instr_item *pHUDInstr = HUD_deque[0]; - int brightness = pHUDInstr->get_brightness(); - - if( fgGetBool("/sim/hud/visibility") ) { - if( incr_bright ) { - switch (brightness) - { - case HUD_BRT_LIGHT: - brightness = HUD_BRT_BLACK; - break; - - case HUD_BRT_MEDIUM: - brightness = HUD_BRT_LIGHT; - break; - - case HUD_BRT_DARK: - brightness = HUD_BRT_MEDIUM; - break; - - case HUD_BRT_BLACK: - brightness = HUD_BRT_DARK; - break; - - default: - brightness = HUD_BRT_BLACK; - } - } else { - switch (brightness) - { - case HUD_BRT_LIGHT: - brightness = HUD_BRT_MEDIUM; - break; - - case HUD_BRT_MEDIUM: - brightness = HUD_BRT_DARK; - break; - - case HUD_BRT_DARK: - brightness = HUD_BRT_BLACK; - break; - - case HUD_BRT_BLACK: - brightness = HUD_BRT_LIGHT; - break; - - default: - fgSetBool("/sim/hud/visibility", false); - } - } - } else { - fgSetBool("/sim/hud/visibility", true); - } - - pHUDInstr->SetBrightness( brightness ); -} - - -#define fgAP_CLAMP(val,min,max) ( (val) = (val) > (max) ? (max) : (val) < (min) ? (min) : (val) ) - -static puDialogBox *HUDalphaDialog; -static puText *HUDalphaText; -static puSlider *HUDalphaHS0; -//static puText *HUDtextText; -//static puSlider *HUDalphaHS1; -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 ] ) ; -} - -void fgHUDalphaAdjust( puObject * ) { - fgSetBool("/sim/hud/antialiased", true); - FG_PUSH_PUI_DIALOG( HUDalphaDialog ); -} - -static void goAwayHUDalphaAdjust (puObject *) -{ - FG_POP_PUI_DIALOG( HUDalphaDialog ); -} - -static void cancelHUDalphaAdjust (puObject *) -{ - fgSetBool("/sim/hud/antialiased", false); - 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) - - ( puGetDefaultLabelFont().getStringWidth( 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 = HUDalphaLabelFont.getStringHeight() + - HUDalphaLabelFont.getStringDescender() + - 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 -} +//$$$ End - added, Neetha, 28 Nov 2k void fgHUDReshape(void) { @@ -976,13 +566,6 @@ void fgHUDReshape(void) { } -static void set_hud_color(float r, float g, float 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 @@ -990,18 +573,17 @@ static void set_hud_color(float r, float g, float b) { // all C++. // void fgUpdateHUD( void ) { - + static const SGPropertyNode *enable3d_node = fgGetNode("/sim/hud/enable3d"); - if( HUD_style == 1 && enable3d_node->getBoolValue() ) - { + if ( HUD_style == 1 && enable3d_node->getBoolValue() ) { fgUpdateHUDVirtual(); return; } - + static const float normal_aspect = float(640) / float(480); // note: aspect_ratio is Y/X float current_aspect = 1.0f/globals->get_current_view()->get_aspect_ratio(); - if( current_aspect > normal_aspect ) { + 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 ); @@ -1026,13 +608,14 @@ void fgUpdateHUDVirtual() glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); - + // Standard fgfs view direction computation float lookat[3]; lookat[0] = -sin(SG_DEGREES_TO_RADIANS * view->getHeadingOffset_deg()); lookat[1] = tan(SG_DEGREES_TO_RADIANS * view->getPitchOffset_deg()); lookat[2] = -cos(SG_DEGREES_TO_RADIANS * view->getHeadingOffset_deg()); - if(fabs(lookat[1]) > 9999) lookat[1] = 9999; // FPU sanity + if (fabs(lookat[1]) > 9999) + lookat[1] = 9999; // FPU sanity gluLookAt(0, 0, 0, lookat[0], lookat[1], lookat[2], 0, 1, 0); // Map the -1:1 square to a 55.0x41.25 degree wide patch at z=1. @@ -1084,117 +667,101 @@ void fgUpdateHUD( GLfloat x_start, GLfloat y_start, void drawHUD() { - if( !HUD_deque.size() ) { // Trust everyone, but ALWAYS cut the cards! + if ( !HUD_deque.size() ) // Trust everyone, but ALWAYS cut the cards! return; - } HUD_TextList.erase(); HUD_LineList.erase(); // HUD_StippleLineList.erase(); - + glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); - 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); - glLineWidth(2.0); - } else { - glLineWidth(1.0); - } - - if( global_day_night_switch == HUD_DAY) { - switch (HUD_deque[0]->get_brightness()) - { - case HUD_BRT_LIGHT: - set_hud_color (0.1f, 0.9f, 0.1f); - break; - - case HUD_BRT_MEDIUM: - set_hud_color (0.1f, 0.7f, 0.0f); - break; + static const SGPropertyNode *heading_enabled + = fgGetNode("/autopilot/locks/heading", true); + static const SGPropertyNode *altitude_enabled + = fgGetNode("/autopilot/locks/altitude", true); - case HUD_BRT_DARK: - set_hud_color (0.0f, 0.6f, 0.0f); - break; + static char hud_hdg_text[256]; + static char hud_wp0_text[256]; + static char hud_wp1_text[256]; + static char hud_wp2_text[256]; + static char hud_alt_text[256]; - case HUD_BRT_BLACK: - set_hud_color( 0.0f, 0.0f, 0.0f); - break; + glEnable(GL_BLEND); + if (HUD->isTransparent()) + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + else + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - default: - set_hud_color (0.1f, 0.9f, 0.1f); - } + if (HUD->isAntialiased()) { + glEnable(GL_LINE_SMOOTH); + glAlphaFunc(GL_GREATER, HUD->alphaClamp()); + glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); + //glLineWidth(1.5); } else { - if( global_day_night_switch == HUD_NIGHT) { - switch (HUD_deque[0]->get_brightness()) - { - case HUD_BRT_LIGHT: - set_hud_color (0.9f, 0.1f, 0.1f); - break; - - case HUD_BRT_MEDIUM: - set_hud_color (0.7f, 0.0f, 0.1f); - break; - - case HUD_BRT_DARK: - set_hud_color (0.6f, 0.0f, 0.0f); - break; - - case HUD_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); - } + //glLineWidth(1.0); } + HUD->setColor(); for_each(HUD_deque.begin(), HUD_deque.end(), HUDdraw()); - HUD_TextList.add( fgText(40, 10, get_formated_gmt_time(), 0) ); + //HUD_TextList.add( fgText(40, 10, get_formated_gmt_time(), 0) ); int apY = 480 - 80; - // char scratch[128]; - // HUD_TextList.add( fgText( "AUTOPILOT", 20, apY) ); - // apY -= 15; - FGAutopilot *AP = globals->get_autopilot(); - - if( AP->get_HeadingEnabled() ) { - HUD_TextList.add( fgText( 40, apY, AP->get_TargetHeadingStr()) ); + + + if (strcmp( heading_enabled->getStringValue(), "dg-heading-hold") == 0 ) { + snprintf( hud_hdg_text, 256, "hdg = %.1f\n", + fgGetDouble("/autopilot/settings/heading-bug-deg") ); + HUD_TextList.add( fgText( 40, apY, hud_hdg_text ) ); apY -= 15; - } - if( AP->get_AltitudeEnabled() ) { - HUD_TextList.add( fgText( 40, apY, AP->get_TargetAltitudeStr()) ); + } else if ( strcmp(heading_enabled->getStringValue(), "true-heading-hold") == 0 ) { + snprintf( hud_hdg_text, 256, "hdg = %.1f\n", + fgGetDouble("/autopilot/settings/true-heading-deg") ); + HUD_TextList.add( fgText( 40, apY, hud_hdg_text ) ); apY -= 15; - } - if( AP->get_HeadingMode() == FGAutopilot::FG_HEADING_WAYPOINT ) - { - if ( strlen( AP->get_TargetWP1Str() ) ) { - HUD_TextList.add( fgText( 40, apY, AP->get_TargetWP1Str() ) ); + + string wp0_id = fgGetString( "/autopilot/route-manager/wp[0]/id" ); + if ( wp0_id.length() > 0 ) { + snprintf( hud_wp0_text, 256, "%5s %6.1fnm %s", wp0_id.c_str(), + fgGetDouble( "/autopilot/route-manager/wp[0]/dist" ), + fgGetString( "/autopilot/route-manager/wp[0]/eta" ) ); + HUD_TextList.add( fgText( 40, apY, hud_wp0_text ) ); apY -= 15; } - if ( strlen( AP->get_TargetWP2Str() ) ) { - HUD_TextList.add( fgText( 40, apY, AP->get_TargetWP2Str() ) ); + string wp1_id = fgGetString( "/autopilot/route-manager/wp[1]/id" ); + if ( wp1_id.length() > 0 ) { + snprintf( hud_wp1_text, 256, "%5s %6.1fnm %s", wp1_id.c_str(), + fgGetDouble( "/autopilot/route-manager/wp[1]/dist" ), + fgGetString( "/autopilot/route-manager/wp[1]/eta" ) ); + HUD_TextList.add( fgText( 40, apY, hud_wp1_text ) ); apY -= 15; } - if ( strlen( AP->get_TargetWP3Str() ) ) { - HUD_TextList.add( fgText( 40, apY, AP->get_TargetWP3Str() ) ); - apY -= 15; + string wp2_id = fgGetString( "/autopilot/route-manager/wp-last/id" ); + if ( wp2_id.length() > 0 ) { + snprintf( hud_wp2_text, 256, "%5s %6.1fnm %s", wp2_id.c_str(), + fgGetDouble( "/autopilot/route-manager/wp-last/dist" ), + fgGetString( "/autopilot/route-manager/wp-last/eta" ) ); + HUD_TextList.add( fgText( 40, apY, hud_wp2_text ) ); + apY -= 15; } } - - HUD_TextList.draw(); + if ( strcmp( altitude_enabled->getStringValue(), "altitude-hold" ) == 0 ) { + snprintf( hud_alt_text, 256, "alt = %.0f\n", + fgGetDouble("/autopilot/settings/target-altitude-ft") ); + HUD_TextList.add( fgText( 40, apY, hud_alt_text ) ); + apY -= 15; + } else if ( strcmp( altitude_enabled->getStringValue(), "agl-hold" ) == 0 ){ + snprintf( hud_alt_text, 256, "agl = %.0f\n", + fgGetDouble("/autopilot/settings/target-agl-ft") ); + HUD_TextList.add( fgText( 40, apY, hud_alt_text ) ); + apY -= 15; + } + + HUD_TextList.draw(); HUD_LineList.draw(); // glEnable(GL_LINE_STIPPLE); @@ -1202,13 +769,124 @@ void drawHUD() // HUD_StippleLineList.draw(); // glDisable(GL_LINE_STIPPLE); - if( antialiased_node->getBoolValue() ) { - // glDisable(GL_BLEND); + if (HUD->isAntialiased()) { + glDisable(GL_ALPHA_TEST); glDisable(GL_LINE_SMOOTH); - glLineWidth(1.0); + //glLineWidth(1.0); } glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); } + + +void fgTextList::draw() +{ + if (!Font) + return; + + vector::iterator curString = List.begin(); + vector::iterator lastString = List.end(); + + glPushAttrib(GL_COLOR_BUFFER_BIT); + glEnable(GL_BLEND); + if (HUD->isTransparent()) + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + else + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if (HUD->isAntialiased()) { + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, HUD->alphaClamp()); + } + + Font->begin(); + for (; curString != lastString; curString++) + curString->Draw(Font,curString->digit); + Font->end(); + + glDisable(GL_TEXTURE_2D); + glPopAttrib(); +} + + + +// HUD property listener class +// +HUD_Properties::HUD_Properties() : + _current(fgGetNode("/sim/hud/current-color", true)), + _visibility(fgGetNode("/sim/hud/visibility", true)), + _antialiasing(fgGetNode("/sim/hud/color/antialiased", true)), + _transparency(fgGetNode("/sim/hud/color/transparent", true)), + _red(fgGetNode("/sim/hud/color/red", true)), + _green(fgGetNode("/sim/hud/color/green", true)), + _blue(fgGetNode("/sim/hud/color/blue", true)), + _alpha(fgGetNode("/sim/hud/color/alpha", true)), + _alpha_clamp(fgGetNode("/sim/hud/color/alpha-clamp", true)), + _brightness(fgGetNode("/sim/hud/color/brightness", true)), + _visible(false), + _antialiased(false), + _transparent(false), + _a(0.67), + _cl(0.01) +{ + _visibility->addChangeListener(this); + _antialiasing->addChangeListener(this); + _transparency->addChangeListener(this); + _red->addChangeListener(this); + _green->addChangeListener(this); + _blue->addChangeListener(this); + _alpha->addChangeListener(this); + _alpha_clamp->addChangeListener(this); + _brightness->addChangeListener(this); + _current->addChangeListener(this, true); +} + + +void HUD_Properties::valueChanged(SGPropertyNode *node) +{ + if (!strcmp(node->getName(), "current-color")) { + int i = node->getIntValue(); + if (i < 0) + i = 0; + SGPropertyNode *n = fgGetNode("/sim/hud/palette", true); + if ((n = n->getChild("color", i, false))) { + if (n->hasValue("red")) + _red->setFloatValue(n->getFloatValue("red", 1.0)); + if (n->hasValue("green")) + _green->setFloatValue(n->getFloatValue("green", 1.0)); + if (n->hasValue("blue")) + _blue->setFloatValue(n->getFloatValue("blue", 1.0)); + if (n->hasValue("alpha")) + _alpha->setFloatValue(n->getFloatValue("alpha", 0.67)); + if (n->hasValue("alpha-clamp")) + _alpha_clamp->setFloatValue(n->getFloatValue("alpha-clamp", 0.01)); + if (n->hasValue("brightness")) + _brightness->setFloatValue(n->getFloatValue("brightness", 0.75)); + if (n->hasValue("antialiased")) + _antialiasing->setBoolValue(n->getBoolValue("antialiased", false)); + if (n->hasValue("transparent")) + _transparency->setBoolValue(n->getBoolValue("transparent", false)); + } + } + _visible = _visibility->getBoolValue(); + _transparent = _transparency->getBoolValue(); + _antialiased = _antialiasing->getBoolValue(); + float brt = _brightness->getFloatValue(); + _r = clamp(brt * _red->getFloatValue()); + _g = clamp(brt * _green->getFloatValue()); + _b = clamp(brt * _blue->getFloatValue()); + _a = clamp(_alpha->getFloatValue()); + _cl = clamp(_alpha_clamp->getFloatValue()); +} + + +void HUD_Properties::setColor() const +{ + if (_antialiased) + glColor4f(_r, _g, _b, _a); + else + glColor3f(_r, _g, _b); +} +