X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fhud.hxx;h=bec30f5539a6c570ca185b1c4efc3906bc3e3eb1;hb=8e5f3ac8a333a971d7f8104a387426c3bc47a014;hp=7ea442e15edaa442b1081bd4c9cdd8a9e882769b;hpb=c90db01dc8d5462a3da22771ffa7c96f5ea31217;p=flightgear.git diff --git a/src/Cockpit/hud.hxx b/src/Cockpit/hud.hxx index 7ea442e15..bec30f553 100644 --- a/src/Cockpit/hud.hxx +++ b/src/Cockpit/hud.hxx @@ -16,105 +16,80 @@ // // 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$ -#ifndef _HUD_HXX -#define _HUD_HXX +#ifndef _OLDHUD_HXX +#define _OLDHUD_HXX #ifndef __cplusplus # error This library requires C++ #endif +#include + #ifdef HAVE_CONFIG_H # include #endif -#ifdef HAVE_WINDOWS_H -# include +#ifdef __CYGWIN__ +#include #endif -#include #include #include -#ifdef HAVE_VALUES_H -# include // for MAXINT -#endif - +#include // for_each() #include // STL vector #include // STL double ended queue +#include + +namespace osg { + class State; +} + +#include +#include -#include -#include -#include +#include +#include #include -#include #include -#include +#include
+#include
+#include
+ +class FGRunway; + +using std::deque; +using std::vector; -FG_USING_STD(deque); -FG_USING_STD(vector); -FG_USING_NAMESPACE(std); +#define float_to_int(v) SGMiscf::roundToInt(v) + +// some of Norman's crazy optimizations. :-) #ifndef WIN32 - typedef struct { - int x, y; - } POINT; - - typedef struct { - int top, bottom, left, right; - } RECT; +typedef struct { + int x, y; +} POINT; + +typedef struct { + int top, bottom, left, right; +} RECT; #endif // View mode definitions enum VIEW_MODES{ HUD_VIEW, PANEL_VIEW, CHASE_VIEW, TOWER_VIEW }; -// DAY, NIGHT and brightness levels need to be visible where dialogs and -// controls can be used to set intensity and appropriate color. This will -// be moved. -// Hud general constants -#define DAY 1 -#define NIGHT 2 -#define BRT_BLACK 3 -#define BRT_DARK 4 -#define BRT_MEDIUM 5 -#define BRT_LIGHT 6 -#define SIZE_SMALL 7 -#define SIZE_LARGE 8 - // Label constants -#define SMALL 1 -#define LARGE 2 - -#define BLINK 3 -#define NOBLINK 4 +#define HUD_FONT_SMALL 1 +#define HUD_FONT_LARGE 2 enum fgLabelJust{ LEFT_JUST, CENTER_JUST, RIGHT_JUST } ; -// Ladder constants -#define NONE 1 -#define UPPER_LEFT 2 -#define UPPER_CENTER 3 -#define UPPER_RIGHT 4 -#define CENTER_RIGHT 5 -#define LOWER_RIGHT 6 -#define LOWER_CENTER 7 -#define LOWER_LEFT 8 -#define CENTER_LEFT 9 -#define SOLID_LINES 10 -#define DASHED_LINES 11 -#define DASHED_NEG_LINES 12 - - -#define HORIZON_FIXED 1 -#define HORIZON_MOVING 2 -#define LABEL_COUNTER 1 -#define LABEL_WARNING 2 - #define HUDS_AUTOTICKS 0x0001 #define HUDS_VERT 0x0002 #define HUDS_HORZ 0x0000 @@ -128,32 +103,6 @@ enum fgLabelJust{ LEFT_JUST, CENTER_JUST, RIGHT_JUST } ; #define HUDS_DECITICS 0x0040 #define HUDS_NOTEXT 0x0080 -// Ladder orientaion -// #define HUD_VERTICAL 1 -// #define HUD_HORIZONTAL 2 -// #define HUD_FREEFLOAT 3 - -// Ladder orientation modes -// #define HUD_LEFT 1 -// #define HUD_RIGHT 2 -// #define HUD_TOP 1 -// #define HUD_BOTTOM 2 -// #define HUD_V_LEFT 1 -// #define HUD_V_RIGHT 2 -// #define HUD_H_TOP 1 -// #define HUD_H_BOTTOM 2 - - -// Ladder sub-types -// #define HUD_LIM 1 -// #define HUD_NOLIM 2 -// #define HUD_CIRC 3 - -// #define HUD_INSTR_LADDER 1 -// #define HUD_INSTR_CLADDER 2 -// #define HUD_INSTR_HORIZON 3 -// #define HUD_INSTR_LABEL 4 - // in cockpit.cxx extern float get_throttleval ( void ); extern float get_aileronval ( void ); @@ -162,6 +111,7 @@ extern float get_elev_trimval( void ); extern float get_rudderval ( void ); extern float get_speed ( void ); extern float get_aoa ( void ); +extern float get_nlf ( void ); extern float get_roll ( void ); extern float get_pitch ( void ); extern float get_heading ( void ); @@ -179,23 +129,23 @@ extern float get_vfc_ratio ( void ); extern float get_vfc_tris_drawn ( void ); extern float get_vfc_tris_culled ( void ); extern float get_climb_rate ( void ); +extern float get_mach( void ); extern char *coord_format_lat(float); extern char *coord_format_lon(float); -//extern char *coord_format_latlon(float latitude, float longitude); // cockpit.cxx extern char *get_formated_gmt_time( void ); enum hudinstype{ HUDno_instr, - HUDscale, - HUDlabel, - HUDladder, - HUDcirc_ladder, - HUDhorizon, - HUDguage, - HUDdual_inst, - HUDmoving_scale, - HUDtbi - }; + HUDscale, + HUDlabel, + HUDladder, + HUDcirc_ladder, + HUDhorizon, + HUDgauge, + HUDdual_inst, + HUDmoving_scale, + HUDtbi +}; typedef struct gltagRGBTRIPLE { // rgbt GLfloat Blue; @@ -214,20 +164,27 @@ public: fgLineSeg2D( const fgLineSeg2D & image ) : x0(image.x0), y0(image.y0), x1(image.x1), y1(image.y1) {} - fgLineSeg2D& operator= ( const fgLineSeg2D & image ) { + fgLineSeg2D& operator= ( const fgLineSeg2D & image ) { // seems unused x0 = image.x0; y0 = image.y0; x1 = image.x1; y1 = image.y1; return *this; } - ~fgLineSeg2D() {} - - void draw() + void draw() const { glVertex2f(x0, y0); glVertex2f(x1, y1); } }; +class DrawLineSeg2D { + public: + void operator() (const fgLineSeg2D& elem) const { + elem.draw(); + } +}; + + #define USE_HUD_TextList +extern fntTexFont *HUD_Font; extern float HUD_TextSize; extern fntRenderer *HUDtext; extern float HUD_matrix[16]; @@ -235,52 +192,89 @@ extern float HUD_matrix[16]; class fgText { private: float x, y; - char msg[32]; + string msg; + bool digit; + // seems unused + public: - fgText( float x = 0, float y = 0, char *c = NULL ) - : x(x), y(y) {strncpy(msg,c,32-1);} + fgText(float x, float y, const string& c, bool digits=false): x(x), y(y), msg( c), digit( digits) {}; fgText( const fgText & image ) - : x(image.x), y(image.y) {strcpy(msg,image.msg);} - - fgText& operator = ( const fgText & image ) { - strcpy(msg,image.msg); x = image.x; y = image.y; - return *this; - } - - ~fgText() {msg[0]='\0';} - - int getStringWidth ( char *str ) + : x(image.x), y(image.y), msg(image.msg), digit(image.digit) { } + + fgText& operator = ( const fgText & image ) { + x = image.x; y = image.y; msg= image.msg; digit = image.digit; + return *this; + } + + static int getStringWidth ( const char *str ) { - if ( HUDtext && str ) - { + if ( HUDtext && str ) { float r, l ; - guiFntHandle->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ; - return FloatToInt( r - l ); + HUD_Font->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ; + return float_to_int( r - l ); } return 0 ; } - - int StringWidth (void ) + + int StringWidth () { - if ( HUDtext && strlen( msg )) - { + if ( HUDtext && msg != "") { float r, l ; - guiFntHandle->getBBox ( msg, HUD_TextSize, 0, &l, &r, NULL, NULL ) ; - return FloatToInt( r - l ); + HUD_Font->getBBox ( msg.c_str(), HUD_TextSize, 0, &l, &r, NULL, NULL ) ; + return float_to_int( r - l ); } return 0 ; } - - void Draw(fntRenderer *fnt) - { - fnt->start2f( x, y ); - fnt->puts ( msg ) ; + + // this code is changed to display Numbers with big/small digits + // according to MIL Standards for example Altitude above 10000 ft + // is shown as 10ooo. + + void Draw(fntRenderer *fnt) { + if (digit) { + int c=0; + + int p=4; + + if (msg[0]=='-') { + //if negative value then increase the c and p values + //for '-' sign. c++; + p++; + } + + for (string::size_type i = 0; i < msg.size(); i++) { + if ((msg[i]>='0') && (msg[i]<='9')) + c++; + } + float orig_size = fnt->getPointSize(); + if (c>p) { + fnt->setPointSize(HUD_TextSize * 0.8); + int p2=(c-3)*8; //advance to the last 3 digits + + fnt->start2f(x+p2,y); + fnt->puts(msg.c_str() + c - 3); // display last 3 digits + + fnt->setPointSize(HUD_TextSize * 1.2); + + fnt->start2f(x,y); + fnt->puts(msg.substr(0,c-3).c_str()); + } else { + fnt->setPointSize(HUD_TextSize * 1.2); + fnt->start2f( x, y ); + fnt->puts(msg.c_str()); + } + fnt->setPointSize(orig_size); + } else { + //if digits not true + fnt->start2f( x, y ); + fnt->puts( msg.c_str()) ; + } } void Draw() { - puDrawString ( guiFnt, msg, FloatToInt(x), FloatToInt(y) ); + guiFnt.drawString( msg.c_str(), float_to_int(x), float_to_int(y) ); } }; @@ -288,18 +282,11 @@ class fgLineList { vector < fgLineSeg2D > List; public: fgLineList( void ) {} - ~fgLineList( void ) {} - void add( fgLineSeg2D seg ) { List.push_back(seg); } - void erase( void ) { List.erase( List.begin(), List.end() ); } + void add( const fgLineSeg2D& seg ) { List.push_back(seg); } + void erase( void ) { List.clear();} void draw( void ) { - vector < fgLineSeg2D > :: iterator curSeg; - vector < fgLineSeg2D > :: iterator lastSeg; - curSeg = List.begin(); - lastSeg = List.end(); glBegin(GL_LINES); - for ( ; curSeg != lastSeg; curSeg++ ) { - curSeg->draw(); - } + for_each( List.begin(), List.end(), DrawLineSeg2D()); glEnd(); } }; @@ -309,33 +296,11 @@ class fgTextList { vector< fgText > List; public: fgTextList ( void ) { Font = 0; } - ~fgTextList( void ) {} - - void setFont( fntRenderer *Renderer ) { Font = Renderer; } - void add( fgText String ) { List.push_back(String); } - void erase( void ) { List.erase( List.begin(), List.end() ); } - - void draw( void ) { - vector < fgText > :: iterator curString; - vector < fgText > :: iterator lastString; - if( Font == 0 ) return; - curString = List.begin(); - lastString = List.end(); - glPushAttrib( GL_COLOR_BUFFER_BIT ); - glEnable ( GL_ALPHA_TEST ) ; - glEnable ( GL_BLEND ) ; - glAlphaFunc ( GL_GREATER, 0.1 ) ; - glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ; - - Font->begin(); - for( ; curString != lastString; curString++ ) { - curString->Draw(Font); - } - Font->end(); - glDisable ( GL_TEXTURE_2D ) ; - glPopAttrib(); - } + void setFont( fntRenderer *Renderer ) { Font = Renderer; } + void add( const fgText& String ) { List.push_back(String); } + void erase( void ) { List.clear(); } + void draw( void ); }; @@ -344,7 +309,7 @@ inline void Text( fgTextList &List, float x, float y, char *s) List.add( fgText( x, y, s) ); } -inline void Text( fgTextList &List, fgText &me) +inline void Text( fgTextList &List, const fgText &me) { List.add(me); } @@ -361,15 +326,15 @@ extern fgLineList HUD_LineList; extern fgLineList HUD_StippleLineList; -class instr_item { // An Abstract Base Class (ABC) - private: +class instr_item : public SGReferenced { // An Abstract Base Class (ABC) +private: static UINT instances; // More than 64K instruments? Nah! static int brightness; static glRGBTRIPLE color; UINT handle; RECT scrn_pos; // Framing - affects scale dimensions - // and orientation. Vert vs Horz, etc. + // and orientation. Vert vs Horz, etc. FLTFNPTR load_value_fn; float disp_factor; // Multiply by to get numbers shown on scale. UINT opts; @@ -377,22 +342,22 @@ class instr_item { // An Abstract Base Class (ABC) bool broken; UINT scr_span; // Working values for draw; POINT mid_span; // + int digits; - public: +public: instr_item( int x, int y, UINT height, UINT width, FLTFNPTR data_source, - float data_scaling, + float data_scaling, UINT options, - bool working = true); - - instr_item( const instr_item & image ); + bool working = true, + int digit = 0); - instr_item & operator = ( const instr_item & rhs ); 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; } @@ -403,25 +368,31 @@ class instr_item { // An Abstract Base Class (ABC) UINT get_span ( void ) { return scr_span; } POINT get_centroid ( void ) { return mid_span; } UINT get_options ( void ) { return opts; } + int get_digits ( void ) { return digits; } + inline int get_x() const { return scrn_pos.left; } + inline int get_y() const { return scrn_pos.top; } + inline int get_width() const { return scrn_pos.right; } + inline int get_height() const { return scrn_pos.bottom; } + + UINT huds_vert (UINT options) { return (options & HUDS_VERT); } + UINT huds_left (UINT options) { return (options & HUDS_LEFT); } + UINT huds_right (UINT options) { return (options & HUDS_RIGHT); } + UINT huds_both (UINT options) { + return ((options & HUDS_BOTH) == HUDS_BOTH); + } + UINT huds_noticks (UINT options) { return (options & HUDS_NOTICKS); } + UINT huds_notext (UINT options) { return (options & HUDS_NOTEXT); } + UINT huds_top (UINT options) { return (options & HUDS_TOP); } + UINT huds_bottom (UINT options) { return (options & HUDS_BOTTOM); } + + virtual void display_enable( bool working ) { is_enabled = working;} - UINT huds_vert (UINT options) { return( options & HUDS_VERT ); } - UINT huds_left (UINT options) { return( options & HUDS_LEFT ); } - UINT huds_right (UINT options) { return( options & HUDS_RIGHT ); } - UINT huds_both (UINT options) { return( (options & HUDS_BOTH) == HUDS_BOTH ); } - UINT huds_noticks (UINT options) { return( options & HUDS_NOTICKS ); } - UINT huds_notext (UINT options) { return( options & HUDS_NOTEXT ); } - UINT huds_top (UINT options) { return( options & HUDS_TOP ); } - UINT huds_bottom (UINT options) { return( options & HUDS_BOTTOM ); } - - virtual void display_enable( bool working ) { is_enabled = !! working;} - - virtual void update( void ); virtual void break_display ( bool bad ); virtual void SetBrightness( int illumination_level ); // fgHUDSetBright... void SetPosition ( int x, int y, UINT width, UINT height ); UINT get_Handle( void ); virtual void draw( void ) = 0; // Required method in derived classes - + void drawOneLine( float x1, float y1, float x2, float y2) { HUD_LineList.add(fgLineSeg2D(x1,y1,x2,y2)); @@ -430,31 +401,36 @@ class instr_item { // An Abstract Base Class (ABC) { HUD_StippleLineList.add(fgLineSeg2D(x1,y1,x2,y2)); } - void TextString( char *msg, float x, float y ) + void TextString( char *msg, float x, float y, bool digit ) { - HUD_TextList.add(fgText(x, y, msg)); + HUD_TextList.add(fgText(x, y, msg,digit)); } int getStringWidth ( char *str ) { - if ( HUDtext && str ) - { + if ( HUDtext && str ) { float r, l ; - guiFntHandle->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ; - return FloatToInt( r - l ); + HUD_Font->getBBox ( str, HUD_TextSize, 0, &l, &r, NULL, NULL ) ; + return float_to_int( r - l ); } return 0 ; } - + + + }; typedef instr_item *HIptr; -//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; +class HUDdraw { + public: + void operator() (HIptr elem) const { + if ( elem->enabled()) + elem->draw(); + } +}; + + extern int HUD_style; -//extern hud_deque_type HUD_deque; // instr_item This class has no other purpose than to maintain // a linked list of instrument and derived class @@ -462,110 +438,71 @@ extern int HUD_style; class instr_label : public instr_item { - private: - const char *pformat; - const char *pre_str; - const char *post_str; +private: + const char *pformat; + fgLabelJust justify; int fontSize; int blink; - char format_buffer[80]; + string format_buffer; + bool lat; + bool lon; + bool lbox; + SGPropertyNode_ptr lon_node; + SGPropertyNode_ptr lat_node; - public: - instr_label( int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string = 0, - const char *post_label_string = 0, - float scale_data = 1.0, - UINT options = HUDS_TOP, - fgLabelJust justification = CENTER_JUST, - int font_size = SMALL, - int blinking = NOBLINK, - bool working = true); - - ~instr_label(); - - instr_label( const instr_label & image); - instr_label & operator = (const instr_label & rhs ); - virtual void draw( void ); // Required method in base class +public: + instr_label(const SGPropertyNode *); + virtual void draw(void); }; -typedef instr_label * pInstlabel; - - -class lat_label : public instr_item { - private: - const char *pformat; - const char *pre_str; - const char *post_str; - fgLabelJust justify; - int fontSize; - int blink; - char format_buffer[80]; - - public: - lat_label( int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string = 0, - const char *post_label_string = 0, - float scale_data = 1.0, - UINT options = HUDS_TOP, - fgLabelJust justification = CENTER_JUST, - int font_size = SMALL, - int blinking = NOBLINK, - bool working = true); - - ~lat_label(); - - lat_label( const lat_label & image); - lat_label & operator = (const lat_label & rhs ); - virtual void draw( void ); // Required method in base class -}; -typedef lat_label * pLatlabel; +// +// fgRunway_instr This class is responsible for rendering the active runway +// in the hud (if visible). +class runway_instr : public instr_item { +private: + void boundPoint(const sgdVec3& v, sgdVec3& m); + bool boundOutsidePoints(sgdVec3& v, sgdVec3& m); + bool drawLine(const sgdVec3& a1, const sgdVec3& a2, + const sgdVec3& p1, const sgdVec3& p2); + void drawArrow(); + FGRunway* get_active_runway(); + void get_rwy_points(sgdVec3 *points); + void setLineWidth(void); + + sgdVec3 points3d[6], points2d[6]; + double mm[16],pm[16], arrowScale, arrowRad, lnScale; + double scaleDist, default_pitch, default_heading; + GLint view[4]; + FGRunway* runway; + FGViewer* cockpit_view; + unsigned short stippleOut, stippleCen; + bool drawIA, drawIAAlways; + RECT location; + POINT center; -class lon_label : public instr_item { - private: - const char *pformat; - const char *pre_str; - const char *post_str; - fgLabelJust justify; - int fontSize; - int blink; - char format_buffer[80]; +public: + runway_instr(const SGPropertyNode *); - public: - lon_label( int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string = 0, - const char *post_label_string = 0, - float scale_data = 1.0, - UINT options = HUDS_TOP, - fgLabelJust justification = CENTER_JUST, - int font_size = SMALL, - int blinking = NOBLINK, - bool working = true); - - ~lon_label(); - - lon_label( const lon_label & image); - lon_label & operator = (const lon_label & rhs ); - virtual void draw( void ); // Required method in base class + virtual void draw( void ); + void setArrowRotationRadius(double radius); + // Scales the runway indication arrow + void setArrowScale(double scale); + // Draws arrow when runway is not visible in HUD if draw=true + void setDrawArrow(bool draw); + // Always draws arrow if draw=true; + void setDrawArrowAlways(bool draw); + // Sets the maximum line scale + void setLineScale(double scale); + // Sets the distance where to start scaling the lines + void setScaleDist(double dist_nm); + // Sets the stipple pattern of the outline of the runway + void setStippleOutline(unsigned short stipple); + // Sets the stipple patter of the center line of the runway + void setStippleCenterline(unsigned short stipple); }; -typedef lon_label * pLonlabel; // // instr_scale This class is an abstract base class for both moving @@ -574,7 +511,7 @@ typedef lon_label * pLonlabel; // class instr_scale : public instr_item { - private: +private: float range_shown; // Width Units. float Maximum_value; // ceiling. float Minimum_value; // Representation floor. @@ -584,241 +521,210 @@ class instr_scale : public instr_item { UINT Modulo; // Roll over point int signif_digits; // digits to show to the right. - public: +public: instr_scale( int x, int y, UINT width, UINT height, FLTFNPTR load_fn, UINT options, - float show_range, - float max_value = 100.0, - float min_value = 0.0, - float disp_scaling = 1.0, - UINT major_divs = 10, - UINT minor_divs = 5, - UINT rollover = 0, - int dp_showing = 2, - bool working = true); - - virtual ~instr_scale(); - instr_scale( const instr_scale & image); - instr_scale & operator = (const instr_scale & rhs); - - virtual void draw ( void ) {}; // No-op here. Defined in derived classes. - UINT div_min ( void ) { return Min_div;} - UINT div_max ( void ) { return Maj_div;} - float min_val ( void ) { return Minimum_value;} - float max_val ( void ) { return Maximum_value;} - UINT modulo ( void ) { return Modulo; } - float factor ( void ) { return scale_factor;} - float range_to_show( void ) { return range_shown;} + float show_range, + float max_value, + float min_value, + float disp_scaling, + UINT major_divs, + UINT minor_divs, + UINT rollover, + int dp_showing, + bool working = true); + + virtual void draw ( void ) {}; // No-op here. Defined in derived classes. + UINT div_min ( void ) { return Min_div;} + UINT div_max ( void ) { return Maj_div;} + float min_val ( void ) { return Minimum_value;} + float max_val ( void ) { return Maximum_value;} + UINT modulo ( void ) { return Modulo; } + float factor ( void ) { return scale_factor;} + float range_to_show ( void ) { return range_shown;} }; -// hud_card_ This class displays the indicated quantity on +// hud_card This class displays the indicated quantity on // a scale that moves past the pointer. It may be // horizontal or vertical, read above(left) or below(right) of the base // line. class hud_card : public instr_scale { - private: - float val_span; - float half_width_units; - - public: - hud_card( int x, - int y, - UINT width, - UINT height, - FLTFNPTR load_fn, - UINT options, - float maxValue = 100.0, - float minValue = 0.0, - float disp_scaling = 1.0, - UINT major_divs = 10, - UINT minor_divs = 5, - UINT modulator = 100, - int dp_showing = 2, - float value_span = 100.0, - bool working = true); - - ~hud_card(); - hud_card( const hud_card & image); - hud_card & operator = (const hud_card & rhs ); -// virtual void display_enable( bool setting ); - virtual void draw( void ); // Required method in base class +private: + float val_span; + string type; + float half_width_units; + bool draw_tick_bottom; + bool draw_tick_top; + bool draw_tick_right; + bool draw_tick_left; + bool draw_cap_bottom; + bool draw_cap_top; + bool draw_cap_right; + bool draw_cap_left; + float marker_offset; + bool pointer; + string pointer_type; + string tick_type; + string tick_length; + float radius; + float maxValue; + float minValue; + int divisions; + int zoom; + UINT Maj_div; + UINT Min_div; + +public: + hud_card(const SGPropertyNode *); + // virtual void display_enable( bool setting ); // FIXME + virtual void draw(void); + void circles(float, float, float); + void fixed(float, float, float, float, float, float); + void zoomed_scale(int, int); }; -typedef hud_card * pCardScale; - -class guage_instr : public instr_scale { - public: - guage_instr( int x, - int y, - UINT width, - UINT height, - FLTFNPTR load_fn, - UINT options, - float disp_scaling = 1.0, - float maxValue = 100, - float minValue = 0, - UINT major_divs = 50, - UINT minor_divs = 0, - int dp_showing = 2, - UINT modulus = 0, - bool working = true); - - ~guage_instr(); - guage_instr( const guage_instr & image); - guage_instr & operator = (const guage_instr & rhs ); + +class gauge_instr : public instr_scale { +public: + gauge_instr(const SGPropertyNode *); virtual void draw( void ); // Required method in base class }; -typedef guage_instr * pGuageInst; + // // dual_instr_item This class was created to form the base class // for both panel and HUD Turn Bank Indicators. class dual_instr_item : public instr_item { - private: +private: FLTFNPTR alt_data_source; - public: +public: dual_instr_item ( int x, int y, UINT width, UINT height, FLTFNPTR chn1_source, FLTFNPTR chn2_source, - bool working = true, - UINT options = HUDS_TOP); - - virtual ~dual_instr_item() {}; - dual_instr_item( const dual_instr_item & image); - dual_instr_item & operator = (const dual_instr_item & rhs ); + bool working, + UINT options ); - float current_ch1( void ) { return (float)alt_data_source();} - float current_ch2( void ) { return (float)get_value();} - virtual void draw ( void ) { } + float current_ch1( void ) { return (float)alt_data_source(); } + float current_ch2( void ) { return (float)get_value(); } + virtual void draw( void ) {} }; + class fgTBI_instr : public dual_instr_item { - private: +private: UINT BankLimit; UINT SlewLimit; UINT scr_hole; + bool tsi; + float rad; - public: - fgTBI_instr( int x, - int y, - UINT width, - UINT height, - FLTFNPTR chn1_source = get_roll, - FLTFNPTR chn2_source = get_sideslip, - float maxBankAngle = 45.0, - float maxSlipAngle = 5.0, - UINT gap_width = 5, - bool working = true); - - fgTBI_instr( const fgTBI_instr & image); - fgTBI_instr & operator = (const fgTBI_instr & rhs ); - - ~fgTBI_instr(); +public: + fgTBI_instr(const SGPropertyNode *); - UINT bank_limit( void ) { return BankLimit;} - UINT slew_limit( void ) { return SlewLimit;} + UINT bank_limit(void) { return BankLimit; } + UINT slew_limit(void) { return SlewLimit; } - virtual void draw( void ); // Required method in base class + virtual void draw(void); }; -typedef fgTBI_instr * pTBI; class HudLadder : public dual_instr_item { - private: +private: UINT width_units; int div_units; UINT minor_div; UINT label_pos; UINT scr_hole; - float vmax; - float vmin; - float factor; - + float vmax; + float vmin; + float factor; + string hudladder_type; + bool frl; + bool target_spot; + bool velocity_vector; + bool drift_marker; + bool alpha_bracket; + bool energy_marker; + bool climb_dive_marker; + bool glide_slope_marker; + float glide_slope; + bool energy_worm; + bool waypoint_marker; + int zenith; + int nadir; + int hat; + + // The Ladder has it's own temporary display lists fgTextList TextList; fgLineList LineList; fgLineList StippleLineList; - public: - HudLadder( int x, - int y, - UINT width, - UINT height, - FLTFNPTR ptch_source = get_roll, - FLTFNPTR roll_source = get_pitch, - float span_units = 45.0, - float division_units = 10.0, - float minor_division = 0.0, - UINT screen_hole = 70, - UINT lbl_pos = 0, - bool working = true ); - - ~HudLadder(); - - HudLadder( const HudLadder & image ); - HudLadder & operator = ( const HudLadder & rhs ); - virtual void draw( void ); - - void Text( float x, float y, char *s) +public: + HudLadder(const SGPropertyNode *); + + virtual void draw(void); + void drawZenith(float, float, float); + void drawNadir(float, float, float); + + void Text(float x, float y, char *s) { - TextList.add( fgText( x, y, s) ); + TextList.add(fgText(x, y, s)); } - void Line( float x1, float y1, float x2, float y2) + void Line(float x1, float y1, float x2, float y2) { - LineList.add(fgLineSeg2D(x1,y1,x2,y2)); + LineList.add(fgLineSeg2D(x1, y1, x2, y2)); } - void StippleLine( float x1, float y1, float x2, float y2) + void StippleLine(float x1, float y1, float x2, float y2) { - StippleLineList.add(fgLineSeg2D(x1,y1,x2,y2)); + StippleLineList.add(fgLineSeg2D(x1, y1, x2, y2)); } }; -//using namespace std; -//deque * Hdeque_ptr; - -extern void HUD_brightkey( bool incr_bright ); -extern int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ ); -extern int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ ); -extern void fgUpdateHUD( void ); - -extern void drawOneLine ( UINT x1, UINT y1, UINT x2, UINT y2); -extern void drawOneLine ( RECT &rect); -extern void textString ( int x, - int y, - char *msg, - void *font = GLUT_BITMAP_8_BY_13); -extern void strokeString( int x, - int y, - char *msg, - void *font = GLUT_STROKE_ROMAN, - float theta = 0); -//extern void strokeString(float xx, -// float yy, -// char *msg, -// void *font = GLUT_STROKE_ROMAN) - -/* -bool AddHUDInstrument( instr_item *pBlackBox ); -void DrawHUD ( void ); -bool DamageInstrument( INSTR_HANDLE unit ); -bool RepairInstrument( INSTR_HANDLE unit ); - - -void fgUpdateHUD ( Hptr hud ); -void fgUpdateHUD2( Hptr hud ); // Future use? -void fgHUDSetTimeMode( Hptr hud, int time_of_day ); -*/ - -#endif // _HUD_H +extern int fgHUDInit(); +extern int fgHUDInit2(); +extern void fgUpdateHUD( osg::State* ); +extern void fgUpdateHUD( osg::State*, GLfloat x_start, GLfloat y_start, + GLfloat x_end, GLfloat y_end ); + + + + +class HUD_Properties : public SGPropertyChangeListener { +public: + HUD_Properties(); + void valueChanged(SGPropertyNode *n); + void setColor() const; + bool isVisible() const { return _visible; } + bool isAntialiased() const { return _antialiased; } + bool isTransparent() const { return _transparent; } + float alphaClamp() const { return _cl; } + +private: + float clamp(float f) { return f < 0.0f ? 0.0f : f > 1.0f ? 1.0f : f; } + SGPropertyNode_ptr _current; + SGPropertyNode_ptr _visibility; + SGPropertyNode_ptr _antialiasing; + SGPropertyNode_ptr _transparency; + SGPropertyNode_ptr _red, _green, _blue, _alpha; + SGPropertyNode_ptr _alpha_clamp; + SGPropertyNode_ptr _brightness; + bool _visible; + bool _antialiased; + bool _transparent; + float _r, _g, _b, _a, _cl; +}; + +#endif // _OLDHUD_H