]> git.mxchange.org Git - flightgear.git/blob - Simulator/Cockpit/hud.hxx
Initial revision.
[flightgear.git] / Simulator / Cockpit / hud.hxx
1 // hud.hxx -- hud defines and prototypes (initial draft)
2 //
3 // Written by Michele America, started September 1997.
4 //
5 // Copyright (C) 1997  Michele F. America  - nomimarketing@mail.telepac.pt
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 //
21 // $Id$
22
23
24 #ifndef _HUD_HXX
25 #define _HUD_HXX
26
27 #ifndef __cplusplus
28 # error This library requires C++
29 #endif
30
31 #ifdef HAVE_CONFIG_H
32 #  include <config.h>
33 #endif
34
35 #ifdef HAVE_WINDOWS_H
36 #  include <windows.h>
37 #endif
38
39 #include <GL/glut.h>
40 #include <stdlib.h>
41 #include <string.h>
42
43 #ifdef HAVE_VALUES_H
44 #  include <values.h>  // for MAXINT
45 #endif
46
47 #include <deque>        // STL double ended queue
48
49 #include <fg_typedefs.h>
50 #include <fg_constants.h>
51 #include <Aircraft/aircraft.hxx>
52 #include <FDM/flight.hxx>
53 #include <Controls/controls.hxx>
54
55 FG_USING_STD(deque);
56
57 #ifndef WIN32
58   typedef struct {
59       int x, y;
60   } POINT;
61  
62   typedef struct {
63       int top, bottom, left, right;
64   } RECT;
65 #endif
66
67 // View mode definitions
68
69 enum VIEW_MODES{ HUD_VIEW, PANEL_VIEW, CHASE_VIEW, TOWER_VIEW };
70
71 // DAY, NIGHT and brightness levels need to be visible where dialogs and
72 // controls can be used to set intensity and appropriate color. This will
73 // be moved.
74 // Hud general constants
75 #define DAY                1
76 #define NIGHT              2
77 #define BRT_BLACK          3
78 #define BRT_DARK           4
79 #define BRT_MEDIUM         5
80 #define BRT_LIGHT          6
81 #define SIZE_SMALL         7
82 #define SIZE_LARGE         8
83
84 // Label constants
85 #define SMALL              1
86 #define LARGE              2
87
88 #define BLINK              3
89 #define NOBLINK            4
90
91 enum fgLabelJust{ LEFT_JUST, CENTER_JUST, RIGHT_JUST } ;
92
93 // Ladder constants
94 #define NONE               1
95 #define UPPER_LEFT         2
96 #define UPPER_CENTER       3
97 #define UPPER_RIGHT        4
98 #define CENTER_RIGHT       5
99 #define LOWER_RIGHT        6
100 #define LOWER_CENTER       7
101 #define LOWER_LEFT         8
102 #define CENTER_LEFT        9
103 #define SOLID_LINES       10
104 #define DASHED_LINES      11
105 #define DASHED_NEG_LINES  12
106
107
108 #define HORIZON_FIXED   1
109 #define HORIZON_MOVING  2
110 #define LABEL_COUNTER   1
111 #define LABEL_WARNING   2
112
113 #define HUDS_AUTOTICKS           0x0001
114 #define HUDS_VERT                0x0002
115 #define HUDS_HORZ                0x0000
116 #define HUDS_TOP                 0x0004
117 #define HUDS_BOTTOM              0x0008
118 #define HUDS_LEFT     HUDS_TOP
119 #define HUDS_RIGHT    HUDS_BOTTOM
120 #define HUDS_BOTH     (HUDS_LEFT | HUDS_RIGHT)
121 #define HUDS_NOTICKS             0x0010
122 #define HUDS_ARITHTIC            0x0020
123 #define HUDS_DECITICS            0x0040
124 #define HUDS_NOTEXT              0x0080
125
126 // Ladder orientaion
127 // #define HUD_VERTICAL        1
128 // #define HUD_HORIZONTAL               2
129 // #define HUD_FREEFLOAT                3
130
131 // Ladder orientation modes
132 // #define HUD_LEFT             1
133 // #define HUD_RIGHT            2
134 // #define HUD_TOP              1
135 // #define HUD_BOTTOM           2
136 // #define HUD_V_LEFT                   1
137 // #define HUD_V_RIGHT          2
138 // #define HUD_H_TOP            1
139 // #define HUD_H_BOTTOM         2
140
141
142 // Ladder sub-types
143 // #define HUD_LIM                              1
144 // #define HUD_NOLIM                    2
145 // #define HUD_CIRC                     3
146
147 // #define HUD_INSTR_LADDER     1
148 // #define HUD_INSTR_CLADDER    2
149 // #define HUD_INSTR_HORIZON    3
150 // #define HUD_INSTR_LABEL              4
151
152 extern double get_throttleval ( void );
153 extern double get_aileronval  ( void );
154 extern double get_elevatorval ( void );
155 extern double get_elev_trimval( void );
156 extern double get_rudderval   ( void );
157 extern double get_speed       ( void );
158 extern double get_aoa         ( void );
159 extern double get_roll        ( void );
160 extern double get_pitch       ( void );
161 extern double get_heading     ( void );
162 extern double get_altitude    ( void );
163 extern double get_agl         ( void );
164 extern double get_sideslip    ( void );
165 extern double get_frame_rate  ( void );
166 extern double get_latitude    ( void );
167 extern double get_lat_min     ( void );
168 extern double get_longitude   ( void );
169 extern double get_long_min    ( void );
170 extern double get_fov         ( void );
171 extern double get_vfc_ratio   ( void );
172 extern double get_vfc_tris_drawn   ( void );
173 extern double get_climb_rate  ( void );
174
175 enum  hudinstype{ HUDno_instr,
176               HUDscale,
177               HUDlabel,
178               HUDladder,
179               HUDcirc_ladder,
180               HUDhorizon,
181               HUDguage,
182               HUDdual_inst,
183               HUDmoving_scale,
184               HUDtbi
185               };
186
187 typedef struct gltagRGBTRIPLE { // rgbt
188     GLfloat Blue;
189     GLfloat Green;
190     GLfloat Red;
191 } glRGBTRIPLE;
192
193 class instr_item {  // An Abstract Base Class (ABC)
194   private:
195     static UINT        instances;     // More than 64K instruments? Nah!
196     static int         brightness;
197     static glRGBTRIPLE color;
198
199     UINT               handle;
200     RECT               scrn_pos;      // Framing - affects scale dimensions
201                                     // and orientation. Vert vs Horz, etc.
202     DBLFNPTR           load_value_fn;
203     double             disp_factor;   // Multiply by to get numbers shown on scale.
204     UINT               opts;
205     bool               is_enabled;
206     bool               broken;
207     UINT               scr_span;      // Working values for draw;
208     POINT              mid_span;      //
209
210   public:
211     instr_item( int            x,
212                 int            y,
213                 UINT           height,
214                 UINT           width,
215                 DBLFNPTR       data_source,
216                 double         data_scaling,
217                 UINT           options,
218                 bool           working      = true);
219
220     instr_item( const instr_item & image );
221
222     instr_item & operator = ( const instr_item & rhs );
223     virtual ~instr_item ();
224
225     int          get_brightness  ( void ) { return brightness;}
226     RECT         get_location    ( void ) { return scrn_pos;  }
227     bool         is_broken       ( void ) { return broken;    }
228     bool         enabled         ( void ) { return is_enabled;}
229     bool         data_available  ( void ) { return !!load_value_fn; }
230     double       get_value       ( void ) { return load_value_fn(); }
231     double       data_scaling    ( void ) { return disp_factor; }
232     UINT         get_span        ( void ) { return scr_span;  }
233     POINT        get_centroid    ( void ) { return mid_span;  }
234     UINT         get_options     ( void ) { return opts;      }
235
236     virtual void display_enable( bool working ) { is_enabled = !! working;}
237
238
239     virtual void update( void );
240     virtual void break_display ( bool bad );
241     virtual void SetBrightness( int illumination_level ); // fgHUDSetBright...
242     void         SetPosition  ( int x, int y, UINT width, UINT height );
243     UINT    get_Handle( void );
244     virtual void draw( void ) = 0;   // Required method in derived classes
245 };
246
247 typedef deque< instr_item * > HudContainerType;
248 typedef HudContainerType::iterator HudIterator;
249
250 typedef instr_item *HIptr;
251 extern HudContainerType HUD_deque;
252
253 // instr_item           This class has no other purpose than to maintain
254 //                      a linked list of instrument and derived class
255 // object pointers.
256
257
258 class instr_label : public instr_item {
259   private:
260     const char *pformat;
261     const char *pre_str;
262     const char *post_str;
263     fgLabelJust justify;
264     int         fontSize;
265     int         blink;
266
267   public:
268     instr_label( int          x,
269                  int          y,
270                  UINT         width,
271                  UINT         height,
272                  DBLFNPTR     data_source,
273                  const char  *label_format,
274                  const char  *pre_label_string  = 0,
275                  const char  *post_label_string = 0,
276                  double       scale_data        = 1.0,
277                  UINT         options           = HUDS_TOP,
278                  fgLabelJust  justification     = CENTER_JUST,
279                  int          font_size         = SMALL,
280                  int          blinking          = NOBLINK,
281                  bool         working           = true);
282
283     ~instr_label();
284
285     instr_label( const instr_label & image);
286     instr_label & operator = (const instr_label & rhs );
287     virtual void draw( void );       // Required method in base class
288 };
289
290 typedef instr_label * pInstlabel;
291
292 //
293 // instr_scale           This class is an abstract base class for both moving
294 //                       scale and moving needle (fixed scale) indicators. It
295 // does not draw itself, but is not instanciable.
296 //
297
298 class instr_scale : public instr_item {
299   private:
300     double range_shown;   // Width Units.
301     double Maximum_value; //                ceiling.
302     double Minimum_value; // Representation floor.
303     double scale_factor;  // factor => screen units/range values.
304     UINT   Maj_div;       // major division marker units
305     UINT   Min_div;       // minor division marker units
306     UINT   Modulo;        // Roll over point
307     int    signif_digits; // digits to show to the right.
308
309   public:
310     instr_scale( int          x,
311                  int          y,
312                  UINT         width,
313                  UINT         height,
314                  DBLFNPTR     load_fn,
315                  UINT         options,
316                  double       show_range,
317                  double       max_value    = 100.0,
318                  double       min_value    =   0.0,
319                  double       disp_scaling =   1.0,
320                  UINT         major_divs   =    10,
321                  UINT         minor_divs   =     5,
322                  UINT         rollover     =     0,
323                  int          dp_showing   =     2,
324                  bool         working      =  true);
325
326     virtual ~instr_scale();
327     instr_scale( const instr_scale & image);
328     instr_scale & operator = (const instr_scale & rhs);
329
330     virtual void draw   ( void ) {}; // No-op here. Defined in derived classes.
331     UINT   div_min      ( void ) { return Min_div;}
332     UINT   div_max      ( void ) { return Maj_div;}
333     double min_val      ( void ) { return Minimum_value;}
334     double max_val      ( void ) { return Maximum_value;}
335     UINT   modulo       ( void ) { return Modulo; }
336     double factor       ( void ) { return scale_factor;}
337     double range_to_show( void ) { return range_shown;}
338 };
339
340 // hud_card_               This class displays the indicated quantity on
341 //                         a scale that moves past the pointer. It may be
342 // horizontal or vertical, read above(left) or below(right) of the base
343 // line.
344
345 class hud_card : public instr_scale {
346   private:
347     double val_span;
348     double half_width_units;
349
350   public:
351     hud_card( int      x,
352               int      y,
353               UINT     width,
354               UINT     height,
355               DBLFNPTR load_fn,
356               UINT     options,
357               double   maxValue      = 100.0,
358               double   minValue      =   0.0,
359               double   disp_scaling  =   1.0,
360               UINT     major_divs    =  10,
361               UINT     minor_divs    =   5,
362               UINT     modulator     = 100,
363               int      dp_showing    =   2,
364               double   value_span    = 100.0,
365               bool     working       = true);
366
367     ~hud_card();
368     hud_card( const hud_card & image);
369     hud_card & operator = (const hud_card & rhs );
370 //    virtual void display_enable( bool setting );
371     virtual void draw( void );       // Required method in base class
372 };
373
374 typedef hud_card * pCardScale;
375
376 class guage_instr : public instr_scale {
377   private:
378
379   public:
380     guage_instr( int       x,
381                  int       y,
382                  UINT      width,
383                  UINT      height,
384                  DBLFNPTR  load_fn,
385                  UINT      options,
386                  double    disp_scaling = 1.0,
387                  double    maxValue     = 100,
388                  double    minValue     =   0,
389                  UINT      major_divs   =  50,
390                  UINT      minor_divs   =   0,
391                  int       dp_showing   =   2,
392                  UINT      modulus      =   0,
393                  bool      working      = true);
394
395     ~guage_instr();
396     guage_instr( const guage_instr & image);
397     guage_instr & operator = (const guage_instr & rhs );
398     virtual void draw( void );       // Required method in base class
399 };
400
401 typedef guage_instr * pGuageInst;
402 //
403 // dual_instr_item         This class was created to form the base class
404 //                         for both panel and HUD Turn Bank Indicators.
405
406 class dual_instr_item : public instr_item {
407   private:
408     DBLFNPTR alt_data_source;
409
410   public:
411     dual_instr_item ( int       x,
412                       int       y,
413                       UINT      width,
414                       UINT      height,
415                       DBLFNPTR  chn1_source,
416                       DBLFNPTR  chn2_source,
417                       bool      working     = true,
418                       UINT      options  = HUDS_TOP);
419
420     virtual ~dual_instr_item() {};
421     dual_instr_item( const dual_instr_item & image);
422     dual_instr_item & operator = (const dual_instr_item & rhs );
423
424     double current_ch1( void ) { return alt_data_source();}
425     double current_ch2( void ) { return get_value();}
426     virtual void draw ( void ) { }
427 };
428
429 class fgTBI_instr : public dual_instr_item {
430   private:
431     UINT BankLimit;
432     UINT SlewLimit;
433     UINT scr_hole;
434
435   public:
436     fgTBI_instr( int       x,
437                  int       y,
438                  UINT      width,
439                  UINT      height,
440                  DBLFNPTR  chn1_source  = get_roll,
441                  DBLFNPTR  chn2_source  = get_sideslip,
442                  double    maxBankAngle = 45.0,
443                  double    maxSlipAngle =  5.0,
444                  UINT      gap_width    =  5.0,
445                  bool      working      =  true);
446
447     fgTBI_instr( const fgTBI_instr & image);
448     fgTBI_instr & operator = (const fgTBI_instr & rhs );
449
450     ~fgTBI_instr();
451
452     UINT bank_limit( void ) { return BankLimit;}
453     UINT slew_limit( void ) { return SlewLimit;}
454
455     virtual void draw( void );       // Required method in base class
456 };
457
458 typedef fgTBI_instr * pTBI;
459
460 class HudLadder : public dual_instr_item {
461   private:
462     UINT   width_units;
463     int    div_units;
464     UINT   minor_div;
465     UINT   label_pos;
466     UINT   scr_hole;
467     double vmax;
468     double vmin;
469     double factor;
470
471   public:
472     HudLadder( int       x,
473                int       y,
474                UINT      width,
475                UINT      height,
476                DBLFNPTR  ptch_source    = get_roll,
477                DBLFNPTR  roll_source    = get_pitch,
478                double    span_units     = 45.0,
479                double    division_units = 10.0,
480                double    minor_division =  0.0,
481                UINT      screen_hole    =   70,
482                UINT      lbl_pos        =    0,
483                bool      working        = true );
484
485     ~HudLadder();
486
487     HudLadder( const HudLadder & image );
488     HudLadder & operator = ( const HudLadder & rhs );
489     virtual void draw( void );
490 };
491
492
493 //using namespace std;
494 //deque <instr_item>  * Hdeque_ptr;
495
496 extern void HUD_brightkey( bool incr_bright );
497 extern int  fgHUDInit( fgAIRCRAFT * /* current_aircraft */ );
498 extern int  fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ );
499 extern void fgUpdateHUD( void );
500
501 extern void drawOneLine ( UINT x1, UINT y1, UINT x2, UINT y2);
502 extern void drawOneLine ( RECT &rect);
503 extern void textString  ( int x,
504                           int y,
505                           char *msg,
506                           void *font = GLUT_BITMAP_8_BY_13);
507 extern void strokeString( int x,
508                           int y,
509                           char *msg,
510                           void *font = GLUT_STROKE_ROMAN,
511                           float theta = 0);
512 /*
513 bool AddHUDInstrument( instr_item *pBlackBox );
514 void DrawHUD ( void );
515 bool DamageInstrument( INSTR_HANDLE unit );
516 bool RepairInstrument( INSTR_HANDLE unit );
517
518
519 void fgUpdateHUD ( Hptr hud );
520 void fgUpdateHUD2( Hptr hud ); // Future use?
521 void fgHUDSetTimeMode( Hptr hud, int time_of_day );
522 */
523
524 #endif // _HUD_H
525