X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fhud.hxx;h=f9243297417809eca59154f97d204f2da8d6f1f0;hb=d13b46b8f1efc36057c98fd396c306cbfd7a3612;hp=c7a7d1f663a892ebef15431d0ba511a5a50fac07;hpb=af80c2080b0049560cd250bef4f093abc200db94;p=flightgear.git diff --git a/src/Cockpit/hud.hxx b/src/Cockpit/hud.hxx index c7a7d1f66..f92432974 100644 --- a/src/Cockpit/hud.hxx +++ b/src/Cockpit/hud.hxx @@ -48,6 +48,7 @@ #include // STL vector #include // STL double ended queue +#include STL_FSTREAM #include @@ -56,24 +57,26 @@ #include #include #include +#include
+#include
#include "hud_opts.hxx" -FG_USING_STD(deque); -FG_USING_STD(vector); -FG_USING_NAMESPACE(std); +SG_USING_STD(deque); +SG_USING_STD(vector); +SG_USING_NAMESPACE(std); // some of Norman's crazy optimizations. :-) #ifndef WIN32 - typedef struct { - int x, y; - } POINT; +typedef struct { + int x, y; +} POINT; - typedef struct { - int top, bottom, left, right; - } RECT; +typedef struct { + int top, bottom, left, right; +} RECT; #endif // View mode definitions @@ -169,6 +172,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 ); @@ -218,6 +222,7 @@ extern float get_aux3(void); extern float get_aux4(void); extern float get_aux5 (void); extern float get_aux6 (void); +extern float get_aux7 (void); extern float get_aux8(void); extern float get_aux9(void); extern float get_aux10(void); @@ -235,16 +240,16 @@ extern char *get_formated_gmt_time( void ); extern void fgHUDReshape(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; @@ -286,23 +291,26 @@ private: float x, y; char msg[64]; public: - fgText( float x = 0, float y = 0, char *c = NULL ) - : x(x), y(y) {strncpy(msg,c,64-1);} - + int digit; //suma + fgText(float x = 0, float y = 0, char *c = NULL,int digits=0): x(x), y(y) //suma + { + strcpy(msg,c); + digit=digits; //suma + } + fgText( const fgText & image ) - : x(image.x), y(image.y) {strcpy(msg,image.msg);} + : x(image.x), y(image.y),digit(image.digit) {strcpy(msg,image.msg);} //suma fgText& operator = ( const fgText & image ) { - strcpy(msg,image.msg); x = image.x; y = image.y; - return *this; + strcpy(msg,image.msg); x = image.x; y = image.y;digit=image.digit; //suma + return *this; } ~fgText() {msg[0]='\0';} 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 ); @@ -312,24 +320,68 @@ public: int StringWidth (void ) { - if ( HUDtext && strlen( msg )) - { + if ( HUDtext && strlen( msg )) { float r, l ; guiFntHandle->getBBox ( msg, HUD_TextSize, 0, &l, &r, NULL, NULL ) ; return FloatToInt( 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. begin suma + + void Draw(fntRenderer *fnt,int digits) { + if(digits==1) { + int c=0,i=0; + char *t=msg; + int p=4; + + if(t[0]=='-') { + //if negative value then increase the c and p values + //for '-' sign. c++; + p++; + } + char *tmp=msg; + while(tmp[i]!='\0') { + if((tmp[i]>='0') && (tmp[i]<='9')) + c++; + i++; + } + if(c>p) { + fnt->setPointSize(8); + int p1=c-3; + char *tmp1=msg+p1; + int p2=p1*8; + + fnt->start2f(x+p2,y); + fnt->puts(tmp1); + + fnt->setPointSize(12); + char tmp2[64]; + strncpy(tmp2,msg,p1); + tmp2[p1]='\0'; + + fnt->start2f(x,y); + fnt->puts(tmp2); + } else { + fnt->setPointSize(12); + fnt->start2f( x, y ); + fnt->puts(tmp); + } + } else { + //if digits not equal to 1 + fnt->setPointSize(8); + fnt->start2f( x, y ); + fnt->puts( msg ) ; + } } + //end suma void Draw() { - puDrawString ( guiFnt, msg, FloatToInt(x), FloatToInt(y) ); + guiFnt.drawString( msg, FloatToInt(x), FloatToInt(y) ); } }; @@ -340,28 +392,28 @@ public: ~fgLineList( void ) {} void add( fgLineSeg2D seg ) { List.push_back(seg); } void erase( void ) { List.erase( List.begin(), List.end() ); } - 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(); - } - glEnd(); - } -/* void draw( void ) { + void draw( void ) { vector < fgLineSeg2D > :: iterator curSeg; vector < fgLineSeg2D > :: iterator lastSeg; - curSeg = List.begin(); + curSeg = List.begin(); lastSeg = List.end(); glBegin(GL_LINES); for ( ; curSeg != lastSeg; curSeg++ ) { curSeg->draw(); } glEnd(); - } */ + } + /* 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(); + } + glEnd(); + } */ }; class fgTextList { @@ -389,7 +441,7 @@ public: Font->begin(); for( ; curString != lastString; curString++ ) { - curString->Draw(Font); + curString->Draw(Font,curString->digit); //suma } Font->end(); @@ -422,14 +474,14 @@ extern fgLineList HUD_StippleLineList; class instr_item { // An Abstract Base Class (ABC) - private: +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; @@ -437,8 +489,9 @@ class instr_item { // An Abstract Base Class (ABC) bool broken; UINT scr_span; // Working values for draw; POINT mid_span; // - - public: + int digits; //suma + +public: instr_item( int x, int y, UINT height, @@ -446,7 +499,9 @@ class instr_item { // An Abstract Base Class (ABC) FLTFNPTR data_source, float data_scaling, UINT options, - bool working = true); + bool working = true, + int digit = 0); //suma + instr_item( const instr_item & image ); @@ -463,11 +518,14 @@ 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; } //suma 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_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 ); } @@ -490,20 +548,31 @@ 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,int digit ) //suma { - HUD_TextList.add(fgText(x, y, msg)); + HUD_TextList.add(fgText(x, y, msg,digit)); //suma } 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 ); } return 0 ; } + + //code to draw ticks as small circles + void drawOneCircle(float x1, float y1, float r) + { + glBegin(GL_LINE_LOOP); // Use polygon to approximate a circle + for(int count=0; count<25; count++) { + float cosine = r * cos(count * 2 * SG_PI/10.0); + float sine = r * sin(count * 2 * SG_PI/10.0); + glVertex2f(cosine+x1, sine+y1); + } + glEnd(); + } }; @@ -522,7 +591,7 @@ extern int HUD_style; class instr_label : public instr_item { - private: +private: const char *pformat; const char *pre_str; const char *post_str; @@ -532,8 +601,9 @@ class instr_label : public instr_item { char format_buffer[80]; bool lat; bool lon; + bool lbox; - public: +public: instr_label( int x, int y, UINT width, @@ -547,9 +617,11 @@ class instr_label : public instr_item { fgLabelJust justification, int font_size, int blinking, - bool latitude, - bool longitude, - bool working); + bool latitude, + bool longitude, + bool label_box, + bool working, + int digit ); //suma); ~instr_label(); @@ -562,7 +634,7 @@ typedef instr_label * pInstlabel; class lat_label : public instr_item { - private: +private: const char *pformat; const char *pre_str; const char *post_str; @@ -571,21 +643,22 @@ class lat_label : public instr_item { int blink; char format_buffer[80]; - public: +public: lat_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 working); + 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 working, + int digits =0 );//suma ~lat_label(); @@ -597,7 +670,7 @@ class lat_label : public instr_item { typedef lat_label * pLatlabel; class lon_label : public instr_item { - private: +private: const char *pformat; const char *pre_str; const char *post_str; @@ -606,21 +679,23 @@ class lon_label : public instr_item { int blink; char format_buffer[80]; - public: +public: lon_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 working); + 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 working, + int digit=0); //suma + ~lon_label(); @@ -638,7 +713,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. @@ -648,7 +723,7 @@ 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, @@ -685,7 +760,7 @@ class instr_scale : public instr_item { // line. class hud_card : public instr_scale { - private: +private: float val_span; string type; float half_width_units; @@ -700,9 +775,18 @@ class hud_card : public instr_scale { float marker_offset; bool pointer; string pointer_type; - + string tick_type; + string tick_length; + float radius; //suma + float maxValue; //suma + float minValue; //suma + int divisions; //suma + int zoom; //suma + UINT Maj_div; //suma + UINT Min_div; //suma + - public: +public: hud_card( int x, int y, UINT width, @@ -729,20 +813,29 @@ class hud_card : public instr_scale { float marker_offset, bool pointer, string pointer_type, - bool working); + string tick_type, + string tick_length, + bool working, + float radius, //suma + int divisions, //suma + int zoom); //suma + ~hud_card(); hud_card( const hud_card & image); hud_card & operator = (const hud_card & rhs ); -// virtual void display_enable( bool setting ); + // virtual void display_enable( bool setting ); virtual void draw( void ); // Required method in base class + void circles(float,float,float); // suma + void fixed(float,float,float,float,float,float); //suma + void zoomed_scale(int,int); //suma }; typedef hud_card * pCardScale; -class guage_instr : public instr_scale { - public: - guage_instr( int x, +class gauge_instr : public instr_scale { +public: + gauge_instr( int x, int y, UINT width, UINT height, @@ -757,22 +850,22 @@ class guage_instr : public instr_scale { UINT modulus, bool working); - ~guage_instr(); - guage_instr( const guage_instr & image); - guage_instr & operator = (const guage_instr & rhs ); + ~gauge_instr(); + gauge_instr( const gauge_instr & image); + gauge_instr & operator = (const gauge_instr & rhs ); virtual void draw( void ); // Required method in base class }; -typedef guage_instr * pGuageInst; +typedef gauge_instr * pGaugeInst; // // 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, @@ -791,13 +884,16 @@ class dual_instr_item : public instr_item { virtual void draw ( void ) { } }; -class fgTBI_instr : public dual_instr_item { - private: +class fgTBI_instr : public dual_instr_item +{ +private: UINT BankLimit; UINT SlewLimit; UINT scr_hole; + bool tsi; //suma + float rad; //suma - public: +public: fgTBI_instr( int x, int y, UINT width, @@ -807,7 +903,9 @@ class fgTBI_instr : public dual_instr_item { float maxBankAngle, float maxSlipAngle, UINT gap_width, - bool working); + bool working, + bool tsi, //suma + float rad); //suma fgTBI_instr( const fgTBI_instr & image); fgTBI_instr & operator = (const fgTBI_instr & rhs ); @@ -823,7 +921,7 @@ class fgTBI_instr : public dual_instr_item { typedef fgTBI_instr * pTBI; class HudLadder : public dual_instr_item { - private: +private: UINT width_units; int div_units; UINT minor_div; @@ -844,12 +942,16 @@ class HudLadder : public dual_instr_item { float glide_slope; bool energy_worm; bool waypoint_marker; + int zenith; //suma + int nadir; //suma + int hat; //suma + fgTextList TextList; fgLineList LineList; fgLineList StippleLineList; - public: +public: HudLadder( string name, int x, int y, @@ -874,14 +976,20 @@ class HudLadder : public dual_instr_item { float glide_slope, bool energy_worm, bool waypoint_marker, - bool working); + bool working, + int zenith, //suma + int nadir, //suma + int hat); //suma + ~HudLadder(); HudLadder( const HudLadder & image ); HudLadder & operator = ( const HudLadder & rhs ); virtual void draw( void ); - + void drawZenith(float,float,float); //suma + void drawNadir(float, float, float); //suma + void Text( float x, float y, char *s) { TextList.add( fgText( x, y, s) ); @@ -907,13 +1015,15 @@ 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 fgUpdateHUD( GLfloat x_start, GLfloat y_start, + GLfloat x_end, GLfloat y_end ); 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); + void *font = GLUT_BITMAP_9_BY_15,int digit=0); //suma extern void strokeString( int x, int y, char *msg,