1
0
Fork 0

- remove hud.cxx/readLabel and let the instr_label read its properties

- remove unused copy constructor
- fix potential crash bug
This commit is contained in:
mfranz 2006-06-14 16:23:44 +00:00
parent 812275cf15
commit ddda2c68d5
4 changed files with 190 additions and 330 deletions

View file

@ -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<instr_item *>(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<instr_item *>(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

View file

@ -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:

View file

@ -1,55 +1,154 @@
#include <Main/fg_props.hxx>
#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());
}
}

View file

@ -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;