From ddda2c68d5000377c7f76193f27ef78645fe316e Mon Sep 17 00:00:00 2001 From: mfranz Date: Wed, 14 Jun 2006 16:23:44 +0000 Subject: [PATCH] - remove hud.cxx/readLabel and let the instr_label read its properties - remove unused copy constructor - fix potential crash bug --- src/Cockpit/hud.cxx | 202 ++--------------------------- src/Cockpit/hud.hxx | 45 ++----- src/Cockpit/hud_labl.cxx | 268 ++++++++++++++++++++++++--------------- src/Cockpit/hud_ladr.cxx | 5 +- 4 files changed, 190 insertions(+), 330 deletions(-) diff --git a/src/Cockpit/hud.cxx b/src/Cockpit/hud.cxx index 45a25f0cd..a8b7f5dd6 100644 --- a/src/Cockpit/hud.cxx +++ b/src/Cockpit/hud.cxx @@ -84,8 +84,6 @@ int HUD_style = 0; float HUD_matrix[16]; -//$$$ begin - added, Neetha, 28 Nov 2k - static string name; static int x; static int y; @@ -105,13 +103,9 @@ 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; @@ -126,8 +120,6 @@ static bool enable_pointer; static string type_pointer; static string type_tick; static string length_tick; -static bool label_box; -static int digits; static float radius; static int divisions; static int zoom; @@ -136,16 +128,11 @@ static float rad; 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); 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(); @@ -303,165 +290,6 @@ readCard(const SGPropertyNode * node) return p; }// 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); - working = node->getBoolValue("working"); - digits = node->getIntValue("digits"); - - - 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(); - } - } - } - -#ifdef ENABLE_SP_FMDS - 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 -#endif - 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, - working, - digits); - - return p; -} // end readLabel - static instr_item * readTBI(const SGPropertyNode * node) { @@ -541,56 +369,46 @@ int readInstrument(const SGPropertyNode * node) if (ladder_group != 0) { int nLadders = ladder_group->nChildren(); for (int j = 0; j < nLadders; j++) { - HIptr = static_cast(new HudLadder(ladder_group->getChild(j))); - HUD_deque.insert( HUD_deque.begin(), HIptr); - - }// for - ladders + 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" ); + SG_LOG(SG_COCKPIT, SG_DEBUG, "*** Reading runway properties ***"); HIptr = readRunway(rwy_group->getChild(j)); HUD_deque.insert( HUD_deque.begin(), HIptr); - - }//for - runways + } } return 0; }//end readinstrument diff --git a/src/Cockpit/hud.hxx b/src/Cockpit/hud.hxx index 1d7a333be..8591bb9b2 100644 --- a/src/Cockpit/hud.hxx +++ b/src/Cockpit/hud.hxx @@ -443,6 +443,7 @@ public: virtual ~instr_item (); + void set_data_source ( FLTFNPTR fn ) { load_value_fn = fn; } int get_brightness ( void ) { return brightness;} RECT get_location ( void ) { return scrn_pos; } bool is_broken ( void ) { return broken; } @@ -521,9 +522,6 @@ class HUDdraw { } }; -//typedef deque < instr_item * > hud_deque_type; -//typedef hud_deque_type::iterator hud_deque_iterator; -//typedef hud_deque_type::const_iterator hud_deque_const_iterator; extern deque< instr_item *> HUD_deque; extern int HUD_style; @@ -536,45 +534,25 @@ extern int HUD_style; class instr_label : public instr_item { private: - const char *pformat; - const char *pre_str; - const char *post_str; + const char *pformat; + const char *pre_str; + const char *post_str; fgLabelJust justify; int fontSize; int blink; - char format_buffer[80]; + char format_buffer[80]; bool lat; bool lon; bool lbox; public: - instr_label( int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string, - const char *post_label_string, - float scale_data, - UINT options, - fgLabelJust justification, - int font_size, - int blinking, - bool latitude, - bool longitude, - bool label_box, - bool working, - int digit ); - + instr_label(const SGPropertyNode *); ~instr_label(); - instr_label( const instr_label & image); - virtual void draw( void ); // Required method in base class + instr_label(const instr_label& image); + virtual void draw(void); }; -typedef instr_label * pInstlabel; - class lat_label : public instr_item { private: @@ -609,7 +587,6 @@ public: virtual void draw( void ); // Required method in base class }; -typedef lat_label * pLatlabel; class lon_label : public instr_item { private: @@ -645,7 +622,6 @@ public: virtual void draw( void ); // Required method in base class }; -typedef lon_label * pLonlabel; // // fgRunway_instr This class is responsible for rendering the active runway @@ -815,7 +791,6 @@ public: void zoomed_scale(int,int); }; -typedef hud_card * pCardScale; class gauge_instr : public instr_scale { public: @@ -839,7 +814,7 @@ public: virtual void draw( void ); // Required method in base class }; -typedef gauge_instr * pGaugeInst; + // // dual_instr_item This class was created to form the base class // for both panel and HUD Turn Bank Indicators. @@ -899,8 +874,6 @@ public: virtual void draw( void ); // Required method in base class }; -typedef fgTBI_instr * pTBI; - class HudLadder : public dual_instr_item { private: diff --git a/src/Cockpit/hud_labl.cxx b/src/Cockpit/hud_labl.cxx index ecb693e57..70145003f 100644 --- a/src/Cockpit/hud_labl.cxx +++ b/src/Cockpit/hud_labl.cxx @@ -1,55 +1,154 @@ +#include
#include "hud.hxx" - #ifdef USE_HUD_TextList #define textString(x, y, text, digit) TextString(text, x , y ,digit) #else #define textString(x, y, text, digit) puDrawString(guiFnt, text, x, y) #endif -//======================= Top of instr_label class ========================= -instr_label::instr_label( - int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string, - const char *post_label_string, - float scale_data, - UINT options, - fgLabelJust justification, - int font_size, - int blinking, - bool latitude, - bool longitude, - bool label_box, - bool working, - int digit) : - instr_item( x, y, width, height, - data_source,scale_data,options, working, digit), - pformat ( label_format ), - pre_str ( pre_label_string ), - post_str ( post_label_string ), - justify ( justification ), - fontSize ( font_size ), - blink ( blinking ), - lat ( latitude ), - lon ( longitude ), - lbox ( label_box ) +// FIXME +extern float get_aux1(), get_aux2(), get_aux3(), get_aux4(), get_aux5(), get_aux6(); +extern float get_aux7(), get_aux8(), get_aux9(), get_aux10(), get_aux11(), get_aux12(); +extern float get_aux13(), get_aux14(), get_aux15(), get_aux16(), get_aux17(), get_aux18(); +extern float get_Ax(), get_speed(), get_mach(), get_altitude(), get_agl(), get_frame_rate(); +extern float get_heading(), get_fov(), get_vfc_tris_culled(), get_vfc_tris_drawn(), get_aoa(); +extern float get_latitude(), get_anzg(), get_longitude(), get_throttleval(); + +instr_label::instr_label(const SGPropertyNode *node) : + instr_item( + node->getIntValue("x"), + node->getIntValue("y"), + node->getIntValue("width"), + node->getIntValue("height"), + NULL /* node->getStringValue("data_source") */, // FIXME + node->getFloatValue("scale_data"), + node->getIntValue("options"), + node->getBoolValue("working"), + node->getIntValue("digits")), + pformat(node->getStringValue("label_format")), + pre_str(node->getStringValue("pre_label_string")), + post_str(node->getStringValue("post_label_string")), + fontSize(fgGetInt("/sim/startup/xsize") > 1000 ? HUD_FONT_LARGE : HUD_FONT_SMALL), // FIXME + blink(node->getIntValue("blinking")), + lat(node->getBoolValue("latitude", false)), + lon(node->getBoolValue("longitude", false)), + lbox(node->getBoolValue("label_box", false)) { + SG_LOG(SG_INPUT, SG_INFO, "Done reading instr_label instrument " + << node->getStringValue("name", "[none]")); + + string loadfn = node->getStringValue("data_source"); // FIXME + float (*load_fn)(void); +#ifdef ENABLE_SP_FMDS + 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 +#endif + 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; + else + load_fn = 0; + + set_data_source(load_fn); + + int just = node->getIntValue("justification"); + if (just == 0) + justify = LEFT_JUST; + else if (just == 1) + justify = CENTER_JUST; + else if (just == 2) + justify = RIGHT_JUST; + + if (!strcmp(pre_str, "NULL")) + pre_str = NULL; + else if (!strcmp(pre_str, "blank")) + pre_str = " "; + + const char *units = strcmp(fgGetString("/sim/startup/units"), "feet") ? " m" : " ft"; // FIXME + + if (!strcmp(post_str, "blank")) + post_str = " "; + else if (!strcmp(post_str, "NULL")) + post_str = NULL; + else if (!strcmp(post_str, "units")) + post_str = units; + + if (pre_str != NULL) { - if (post_str != NULL ) - sprintf( format_buffer, "%s%s%s", pre_str, pformat, post_str ); + if (post_str != NULL) + sprintf(format_buffer, "%s%s%s", pre_str, pformat, post_str); else - sprintf( format_buffer, "%s%s", pre_str, pformat ); + 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. - + sprintf(format_buffer, "%s%s", pformat, post_str); + } else { + strcpy(format_buffer, pformat); // FIXME + } } @@ -58,47 +157,18 @@ instr_label::~instr_label() } -// Copy constructor -instr_label::instr_label(const instr_label & image) : - instr_item((const instr_item &)image), - pformat ( image.pformat ), - pre_str ( image.pre_str ), - post_str ( image.post_str ), - blink ( image.blink ), - lat ( image.lat ), - lon ( image.lon ), - lbox ( image.lbox ) - -{ - 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. - -} - - -// -// draw Draws a label anywhere in the HUD -// -// -void instr_label::draw( void ) +void instr_label::draw(void) { char label_buffer[80]; int posincr; int lenstr; - RECT scrn_rect = get_location(); + RECT scrn_rect = get_location(); if (data_available()) { if (lat) - sprintf( label_buffer, format_buffer, coord_format_lat(get_value()) ); + sprintf(label_buffer, format_buffer, coord_format_lat(get_value())); else if (lon) - sprintf( label_buffer, format_buffer, coord_format_lon(get_value()) ); + sprintf(label_buffer, format_buffer, coord_format_lon(get_value())); else { if (lbox) {// Box for label float x = scrn_rect.left; @@ -110,59 +180,57 @@ void instr_label::draw( void ) glLoadIdentity(); glBegin(GL_LINES); - glVertex2f( x - 2.0, y - 2.0); - glVertex2f( x + w + 2.0, y - 2.0); - glVertex2f( x + w + 2.0, y + h + 2.0); - glVertex2f( x - 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y + h + 2.0); glEnd(); glEnable(GL_LINE_STIPPLE); - glLineStipple( 1, 0xAAAA ); + glLineStipple(1, 0xAAAA); glBegin(GL_LINES); - glVertex2f( x + w + 2.0, y - 2.0); - glVertex2f( x + w + 2.0, y + h + 2.0); - glVertex2f( x - 2.0, y + h + 2.0); - glVertex2f( x - 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y - 2.0); glEnd(); glDisable(GL_LINE_STIPPLE); glPopMatrix(); } - sprintf( label_buffer, format_buffer, get_value()*data_scaling() ); + sprintf(label_buffer, format_buffer, get_value() * data_scaling()); } } else { -// sprintf( label_buffer, format_buffer ); + sprintf(label_buffer, format_buffer); } - lenstr = getStringWidth( label_buffer ); - + lenstr = getStringWidth(label_buffer); #ifdef DEBUGHUD - fgPrintf( SG_COCKPIT, SG_DEBUG, format_buffer ); - fgPrintf( SG_COCKPIT, SG_DEBUG, "\n" ); - fgPrintf( SG_COCKPIT, SG_DEBUG, label_buffer ); - fgPrintf( SG_COCKPIT, SG_DEBUG, "\n" ); + fgPrintf( SG_COCKPIT, SG_DEBUG, format_buffer); + fgPrintf( SG_COCKPIT, SG_DEBUG, "\n"); + fgPrintf( SG_COCKPIT, SG_DEBUG, label_buffer); + fgPrintf( SG_COCKPIT, SG_DEBUG, "\n"); #endif - lenstr = strlen( label_buffer ); + lenstr = strlen(label_buffer); - if (justify == RIGHT_JUST) { + 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; - } + else if (justify == CENTER_JUST) + posincr = get_span() - (lenstr / 2); // -lenstr*4; + else // justify == LEFT_JUST + posincr = 0; if (fontSize == HUD_FONT_SMALL) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, get_digits()); + textString(scrn_rect.left + posincr, scrn_rect.top, + label_buffer, get_digits()); } else if (fontSize == HUD_FONT_LARGE) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, get_digits()); + textString(scrn_rect.left + posincr, scrn_rect.top, + label_buffer, get_digits()); } } + diff --git a/src/Cockpit/hud_ladr.cxx b/src/Cockpit/hud_ladr.cxx index 4b3a88172..8109429b8 100644 --- a/src/Cockpit/hud_ladr.cxx +++ b/src/Cockpit/hud_ladr.cxx @@ -49,9 +49,10 @@ HudLadder::HudLadder(const SGPropertyNode *node) : // Invert to convert the "compression" factor to a // pixels-per-degree number. if (fgGetBool("/sim/hud/enable3d", true) && HUD_style == 1) - factor = (640./55.); + factor = 640.0 / 55.0; - SG_LOG(SG_INPUT, SG_INFO, "Done reading HudLadder instrument"); // TODO add name + SG_LOG(SG_INPUT, SG_INFO, "Done reading HudLadder instrument" + << node->getStringValue("name", "[NONE]")); if (!width_units) width_units = 45; -- 2.39.5