1998-09-29 14:56:30 +00:00
|
|
|
// hud.cxx -- hud defines and prototypes
|
|
|
|
//
|
|
|
|
// Written by Michele America, started September 1997.
|
|
|
|
//
|
|
|
|
// Copyright (C) 1997 Michele F. America - micheleamerica@geocities.com
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//
|
|
|
|
// $Id$
|
1998-05-11 18:13:10 +00:00
|
|
|
|
1997-08-29 18:03:19 +00:00
|
|
|
|
1998-04-24 00:45:53 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
1998-04-03 21:55:27 +00:00
|
|
|
|
|
|
|
#ifdef HAVE_WINDOWS_H
|
1998-02-03 23:20:08 +00:00
|
|
|
# include <windows.h>
|
|
|
|
#endif
|
|
|
|
|
1998-11-23 21:48:09 +00:00
|
|
|
#ifdef __BORLANDC__
|
|
|
|
# define exception c_exception
|
|
|
|
#endif
|
|
|
|
#include <math.h>
|
|
|
|
|
1997-08-29 18:03:19 +00:00
|
|
|
#include <GL/glut.h>
|
|
|
|
#include <stdlib.h>
|
1998-02-03 23:20:08 +00:00
|
|
|
#include <string.h>
|
|
|
|
|
1998-10-16 23:26:44 +00:00
|
|
|
#include <Aircraft/aircraft.hxx>
|
1998-11-06 21:17:31 +00:00
|
|
|
#include <Debug/logstream.hxx>
|
1998-04-18 04:13:51 +00:00
|
|
|
#include <Include/fg_constants.h>
|
1998-07-13 21:00:45 +00:00
|
|
|
#include <Main/options.hxx>
|
1998-02-03 23:20:08 +00:00
|
|
|
#include <Math/fg_random.h>
|
1998-01-27 00:47:41 +00:00
|
|
|
#include <Math/mat3.h>
|
1998-07-08 14:41:08 +00:00
|
|
|
#include <Math/polar3d.hxx>
|
1998-04-30 12:35:59 +00:00
|
|
|
#include <Scenery/scenery.hxx>
|
1998-04-24 00:45:53 +00:00
|
|
|
#include <Time/fg_timer.hxx>
|
1997-08-29 18:03:19 +00:00
|
|
|
|
1998-07-30 23:44:05 +00:00
|
|
|
#if defined ( __sun__ ) || defined ( __sgi )
|
1998-07-03 13:16:27 +00:00
|
|
|
extern "C" {
|
|
|
|
extern void *memmove(void *, const void *, size_t);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1998-07-30 23:44:05 +00:00
|
|
|
#include "hud.hxx"
|
|
|
|
|
|
|
|
|
1998-11-03 12:33:11 +00:00
|
|
|
static char units[5];
|
1998-06-05 18:17:10 +00:00
|
|
|
|
1998-02-07 15:29:31 +00:00
|
|
|
// The following routines obtain information concerntin the aircraft's
|
|
|
|
// current state and return it to calling instrument display routines.
|
|
|
|
// They should eventually be member functions of the aircraft.
|
|
|
|
//
|
|
|
|
|
1999-02-02 20:13:29 +00:00
|
|
|
HudContainerType HUD_deque;
|
1998-02-16 13:38:39 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
class locRECT {
|
|
|
|
public:
|
|
|
|
RECT rect;
|
1998-02-16 13:38:39 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
locRECT( UINT left, UINT top, UINT right, UINT bottom);
|
|
|
|
RECT get_rect(void) { return rect;}
|
|
|
|
};
|
1998-02-16 13:38:39 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
locRECT :: locRECT( UINT left, UINT top, UINT right, UINT bottom)
|
1998-02-16 13:38:39 +00:00
|
|
|
{
|
1998-05-11 18:13:10 +00:00
|
|
|
rect.left = left;
|
|
|
|
rect.top = top;
|
|
|
|
rect.right = right;
|
|
|
|
rect.bottom = bottom;
|
1998-02-16 13:38:39 +00:00
|
|
|
|
|
|
|
}
|
1998-05-11 18:13:10 +00:00
|
|
|
// #define DEBUG
|
1998-02-16 13:38:39 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
void drawOneLine( UINT x1, UINT y1, UINT x2, UINT y2)
|
|
|
|
{
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
glVertex2f(x1, y1);
|
|
|
|
glVertex2f(x2, y2);
|
|
|
|
glEnd();
|
1998-02-16 13:38:39 +00:00
|
|
|
}
|
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
void drawOneLine( RECT &rect)
|
1998-02-07 15:29:31 +00:00
|
|
|
{
|
1998-05-11 18:13:10 +00:00
|
|
|
glBegin(GL_LINES);
|
|
|
|
glVertex2f(rect.left, rect.top);
|
|
|
|
glVertex2f(rect.right, rect.bottom);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// The following code deals with painting the "instrument" on the display
|
|
|
|
//
|
|
|
|
/* textString - Bitmap font string */
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-07-03 13:16:27 +00:00
|
|
|
void textString( int x, int y, char *msg, void *font ){
|
1998-05-11 18:13:10 +00:00
|
|
|
glRasterPos2f(x, y);
|
|
|
|
while (*msg) {
|
|
|
|
glutBitmapCharacter(font, *msg);
|
|
|
|
msg++;
|
|
|
|
}
|
1998-02-07 15:29:31 +00:00
|
|
|
}
|
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
/* strokeString - Stroke font string */
|
1998-07-03 13:16:27 +00:00
|
|
|
|
|
|
|
void strokeString(int x, int y, char *msg, void *font, float theta)
|
1998-02-07 15:29:31 +00:00
|
|
|
{
|
1998-07-03 13:16:27 +00:00
|
|
|
int xx;
|
|
|
|
int yy;
|
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
glPushMatrix();
|
1998-07-03 13:16:27 +00:00
|
|
|
glRotatef(theta * RAD_TO_DEG, 0.0, 0.0, 1.0);
|
1998-08-24 20:05:15 +00:00
|
|
|
xx = (int)(x * cos(theta) + y * sin( theta ));
|
|
|
|
yy = (int)(y * cos(theta) - x * sin( theta ));
|
1998-07-03 13:16:27 +00:00
|
|
|
glTranslatef( xx, yy, 0);
|
|
|
|
glScalef(.1, .1, 0.0);
|
1998-05-11 18:13:10 +00:00
|
|
|
while (*msg) {
|
|
|
|
glutStrokeCharacter(font, *msg);
|
|
|
|
msg++;
|
|
|
|
}
|
|
|
|
glPopMatrix();
|
1998-02-07 15:29:31 +00:00
|
|
|
}
|
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
//========================= End of Class Implementations===================
|
1998-02-07 15:29:31 +00:00
|
|
|
// fgHUDInit
|
|
|
|
//
|
|
|
|
// Constructs a HUD object and then adds in instruments. At the present
|
|
|
|
// the instruments are hard coded into the routine. Ultimately these need
|
|
|
|
// to be defined by the aircraft's instrumentation records so that the
|
|
|
|
// display for a Piper Cub doesn't show the speed range of a North American
|
|
|
|
// mustange and the engine readouts of a B36!
|
|
|
|
//
|
1998-05-11 18:13:10 +00:00
|
|
|
|
1998-07-03 13:16:27 +00:00
|
|
|
#define INSTRDEFS 21
|
1998-05-11 18:13:10 +00:00
|
|
|
|
|
|
|
int fgHUDInit( fgAIRCRAFT * /* current_aircraft */ )
|
1997-08-29 18:03:19 +00:00
|
|
|
{
|
1998-05-11 18:13:10 +00:00
|
|
|
instr_item *HIptr;
|
|
|
|
int index;
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_COCKPIT, FG_INFO, "Initializing current aircraft HUD" );
|
1998-02-09 15:07:47 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
HUD_deque.erase( HUD_deque.begin(), HUD_deque.end()); // empty the HUD deque
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
// hud->code = 1;
|
|
|
|
// hud->status = 0;
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-02-12 21:58:27 +00:00
|
|
|
// For now lets just hardcode the hud here.
|
1998-02-07 15:29:31 +00:00
|
|
|
// In the future, hud information has to come from the same place
|
|
|
|
// aircraft information came from.
|
1998-02-21 14:53:10 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
// fgHUDSetTimeMode( hud, NIGHT );
|
|
|
|
// fgHUDSetBrightness( hud, BRT_LIGHT );
|
|
|
|
|
1998-07-03 13:16:27 +00:00
|
|
|
index = 0;
|
|
|
|
|
|
|
|
do {
|
1998-05-11 18:13:10 +00:00
|
|
|
switch ( index ) {
|
|
|
|
case 0: // TBI
|
1998-07-13 21:00:45 +00:00
|
|
|
HIptr = (instr_item *) new fgTBI_instr( 270, 100, 60, 10 );
|
1998-05-11 18:13:10 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 1: // Artificial Horizon
|
1998-07-13 21:00:45 +00:00
|
|
|
HIptr = (instr_item *) new HudLadder( 240, 195, 120, 180 );
|
1998-05-11 18:13:10 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 2: // KIAS
|
1998-07-13 21:00:45 +00:00
|
|
|
HIptr = (instr_item *) new hud_card( 130,
|
1998-07-03 13:16:27 +00:00
|
|
|
170,
|
1998-07-13 21:00:45 +00:00
|
|
|
28,
|
1998-07-03 13:16:27 +00:00
|
|
|
200,
|
|
|
|
get_speed,
|
|
|
|
HUDS_LEFT | HUDS_VERT,
|
|
|
|
200.0, 0.0,
|
|
|
|
1.0,
|
|
|
|
10, 5,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
50.0,
|
|
|
|
true);
|
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
break;
|
|
|
|
|
1998-07-13 21:28:00 +00:00
|
|
|
case 3: // Radio Altimeter
|
1998-07-13 21:00:45 +00:00
|
|
|
HIptr = (instr_item *) new hud_card( 420,
|
1998-07-03 13:16:27 +00:00
|
|
|
195,
|
1998-07-13 21:00:45 +00:00
|
|
|
25,
|
1998-07-03 13:16:27 +00:00
|
|
|
150,
|
1998-07-13 21:28:00 +00:00
|
|
|
get_agl,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_LEFT | HUDS_VERT,
|
1998-07-13 21:28:00 +00:00
|
|
|
1000, 0,
|
1998-07-03 13:16:27 +00:00
|
|
|
1.0,
|
1998-07-13 21:28:00 +00:00
|
|
|
25, 5,
|
1998-07-03 13:16:27 +00:00
|
|
|
0,
|
1998-07-13 21:28:00 +00:00
|
|
|
0,
|
|
|
|
200.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
true);
|
1998-05-11 18:13:10 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 4: // GYRO COMPASS
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new hud_card( 200,
|
|
|
|
375,
|
1998-07-13 21:00:45 +00:00
|
|
|
200,
|
|
|
|
28,
|
1998-07-03 13:16:27 +00:00
|
|
|
get_heading,
|
|
|
|
HUDS_TOP,
|
|
|
|
360, 0,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
|
|
|
5, 1,
|
1998-07-03 13:16:27 +00:00
|
|
|
360,
|
1998-07-13 21:00:45 +00:00
|
|
|
0,
|
|
|
|
25,
|
1998-07-03 13:16:27 +00:00
|
|
|
true);
|
1998-05-11 18:13:10 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 5: // AMSL
|
1998-07-13 21:00:45 +00:00
|
|
|
HIptr = (instr_item *) new hud_card( 460,
|
1998-07-03 13:16:27 +00:00
|
|
|
170,
|
|
|
|
35,
|
|
|
|
200,
|
|
|
|
get_altitude,
|
|
|
|
HUDS_RIGHT | HUDS_VERT,
|
1999-01-27 04:47:52 +00:00
|
|
|
15000, -500,
|
1998-07-03 13:16:27 +00:00
|
|
|
1.0,
|
|
|
|
100, 25,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
250,
|
|
|
|
true);
|
1998-05-11 18:13:10 +00:00
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 6:
|
|
|
|
HIptr = (instr_item *) new guage_instr( 250, // x
|
|
|
|
350, // y
|
|
|
|
100, // width
|
|
|
|
20, // height
|
|
|
|
get_aileronval, // data source
|
|
|
|
HUDS_BOTTOM | HUDS_NOTEXT,
|
|
|
|
100.0,
|
|
|
|
+1.0,
|
|
|
|
-1.0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 7:
|
|
|
|
HIptr = (instr_item *) new guage_instr( 170, // x
|
|
|
|
225, // y
|
|
|
|
20, // width
|
|
|
|
100, // height
|
|
|
|
get_elevatorval, // data source
|
|
|
|
HUDS_RIGHT | HUDS_VERT | HUDS_NOTEXT,
|
|
|
|
-100.0, // Scale data
|
|
|
|
+1.0, // Data Range
|
|
|
|
-1.0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 8:
|
|
|
|
HIptr = (instr_item *) new guage_instr( 250, // x
|
|
|
|
200, // y
|
|
|
|
100, // width
|
|
|
|
20, // height
|
|
|
|
get_rudderval, // data source
|
|
|
|
HUDS_TOP | HUDS_NOTEXT,
|
|
|
|
100.0,
|
|
|
|
+1.0,
|
|
|
|
-1.0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 9:
|
|
|
|
HIptr = (instr_item *) new guage_instr( 100, // x
|
|
|
|
190,
|
|
|
|
20,
|
|
|
|
160, // height
|
|
|
|
get_throttleval, // data source
|
|
|
|
HUDS_VERT | HUDS_RIGHT | HUDS_NOTEXT,
|
|
|
|
100.0,
|
|
|
|
1.0,
|
|
|
|
0.0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 10: // Digital KIAS
|
|
|
|
HIptr = (instr_item *) new instr_label ( 110,
|
1998-07-03 13:16:27 +00:00
|
|
|
150,
|
|
|
|
40,
|
|
|
|
30,
|
1998-05-11 18:13:10 +00:00
|
|
|
get_speed,
|
|
|
|
"%5.0f",
|
|
|
|
NULL,
|
|
|
|
" Kts",
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-09-29 02:01:06 +00:00
|
|
|
case 11: // Digital Rate of Climb
|
1998-07-13 21:00:45 +00:00
|
|
|
HIptr = (instr_item *) new instr_label ( 110,
|
1998-07-03 13:16:27 +00:00
|
|
|
135,
|
|
|
|
40,
|
|
|
|
10,
|
1998-09-29 02:01:06 +00:00
|
|
|
get_climb_rate,
|
|
|
|
"%5.0f",
|
|
|
|
" Climb",
|
1998-05-11 18:13:10 +00:00
|
|
|
NULL,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-09-29 02:01:06 +00:00
|
|
|
RIGHT_JUST,
|
1998-05-11 18:13:10 +00:00
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 12: // Roll indication diagnostic
|
|
|
|
HIptr = (instr_item *) new instr_label ( 110,
|
1998-07-03 13:16:27 +00:00
|
|
|
120,
|
|
|
|
40,
|
|
|
|
10,
|
1998-05-11 18:13:10 +00:00
|
|
|
get_roll,
|
|
|
|
"%5.2f",
|
|
|
|
" Roll",
|
|
|
|
" Deg",
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 13: // Angle of attack diagnostic
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label ( 440,
|
|
|
|
150,
|
|
|
|
60,
|
|
|
|
10,
|
1998-05-11 18:13:10 +00:00
|
|
|
get_aoa,
|
1998-07-03 13:16:27 +00:00
|
|
|
" %5.2f",
|
|
|
|
"AOA",
|
1998-05-11 18:13:10 +00:00
|
|
|
" Deg",
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 14:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label ( 440,
|
|
|
|
135,
|
|
|
|
60,
|
|
|
|
10,
|
1998-05-11 18:13:10 +00:00
|
|
|
get_heading,
|
1998-07-13 21:00:45 +00:00
|
|
|
" %5.1f",
|
1998-07-03 13:16:27 +00:00
|
|
|
"Heading ",
|
1998-05-11 18:13:10 +00:00
|
|
|
" Deg",
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 15:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label ( 440,
|
|
|
|
120,
|
|
|
|
60,
|
|
|
|
10,
|
1998-05-11 18:13:10 +00:00
|
|
|
get_sideslip,
|
|
|
|
"%5.2f",
|
1998-05-16 13:04:13 +00:00
|
|
|
"Sideslip ",
|
1998-05-11 18:13:10 +00:00
|
|
|
NULL,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 16:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label( 440,
|
|
|
|
100,
|
|
|
|
60,
|
|
|
|
10,
|
|
|
|
get_throttleval,
|
|
|
|
"%5.2f",
|
1998-05-16 13:04:13 +00:00
|
|
|
"Throttle ",
|
1998-05-11 18:13:10 +00:00
|
|
|
NULL,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 17:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label( 440,
|
|
|
|
85,
|
|
|
|
60,
|
|
|
|
10,
|
|
|
|
get_elevatorval,
|
1998-05-11 18:13:10 +00:00
|
|
|
"%5.2f",
|
1998-07-03 13:16:27 +00:00
|
|
|
"Elevator ",
|
1998-05-11 18:13:10 +00:00
|
|
|
NULL,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 18:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label( 440,
|
|
|
|
60,
|
|
|
|
60,
|
|
|
|
10,
|
|
|
|
get_aileronval,
|
1998-05-11 18:13:10 +00:00
|
|
|
"%5.2f",
|
1998-07-03 13:16:27 +00:00
|
|
|
"Aileron ",
|
1998-05-11 18:13:10 +00:00
|
|
|
NULL,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-03 13:16:27 +00:00
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 19:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label( 10,
|
|
|
|
10,
|
|
|
|
60,
|
|
|
|
10,
|
|
|
|
get_frame_rate,
|
1998-12-18 23:35:09 +00:00
|
|
|
"%.0f",
|
1998-05-11 18:13:10 +00:00
|
|
|
"Frame rate = ",
|
|
|
|
NULL,
|
1998-07-13 21:00:45 +00:00
|
|
|
1.0,
|
1998-07-03 13:16:27 +00:00
|
|
|
HUDS_TOP,
|
1998-05-11 18:13:10 +00:00
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
case 20:
|
1998-08-24 20:05:15 +00:00
|
|
|
switch( current_options.get_tris_or_culled() ) {
|
|
|
|
case 0:
|
|
|
|
HIptr = (instr_item *) new instr_label( 10,
|
|
|
|
25,
|
|
|
|
90,
|
|
|
|
10,
|
|
|
|
get_vfc_tris_drawn,
|
|
|
|
"%.0f",
|
|
|
|
"Tris Rendered = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
HIptr = (instr_item *) new instr_label( 10,
|
|
|
|
25,
|
|
|
|
90,
|
|
|
|
10,
|
|
|
|
get_vfc_ratio,
|
|
|
|
"%.2f",
|
|
|
|
"VFC Ratio = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 21:
|
1998-07-03 13:16:27 +00:00
|
|
|
HIptr = (instr_item *) new instr_label( 10,
|
1998-08-24 20:05:15 +00:00
|
|
|
40,
|
1998-07-03 13:16:27 +00:00
|
|
|
90,
|
|
|
|
10,
|
1998-08-24 20:05:15 +00:00
|
|
|
get_fov,
|
|
|
|
"%.1f",
|
|
|
|
"FOV = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
HIptr = 0;;
|
|
|
|
}
|
|
|
|
if( HIptr ) { // Anything to install?
|
|
|
|
HUD_deque.insert( HUD_deque.begin(), HIptr);
|
|
|
|
}
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
while( HIptr );
|
|
|
|
|
|
|
|
return 0; // For now. Later we may use this for an error code.
|
|
|
|
}
|
|
|
|
|
|
|
|
int fgHUDInit2( fgAIRCRAFT * /* current_aircraft */ )
|
|
|
|
{
|
1998-10-16 00:53:00 +00:00
|
|
|
int index;
|
|
|
|
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_COCKPIT, FG_INFO, "Initializing current aircraft HUD" );
|
1998-10-16 00:53:00 +00:00
|
|
|
|
|
|
|
HUD_deque.erase( HUD_deque.begin(), HUD_deque.end());
|
|
|
|
|
|
|
|
// hud->code = 1;
|
|
|
|
// hud->status = 0;
|
|
|
|
|
|
|
|
// For now lets just hardcode the hud here.
|
|
|
|
// In the future, hud information has to come from the same place
|
|
|
|
// aircraft information came from.
|
|
|
|
|
|
|
|
// fgHUDSetTimeMode( hud, NIGHT );
|
|
|
|
// fgHUDSetBrightness( hud, BRT_LIGHT );
|
|
|
|
|
|
|
|
// index = 0;
|
|
|
|
index = 19;
|
|
|
|
|
|
|
|
instr_item* p;
|
|
|
|
|
|
|
|
p = new instr_label( 10, 10, 60, 10,
|
|
|
|
get_frame_rate,
|
1998-12-18 23:35:09 +00:00
|
|
|
"%.0f",
|
1998-10-16 00:53:00 +00:00
|
|
|
"Frame rate = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
HUD_deque.push_front( p );
|
|
|
|
|
|
|
|
if ( current_options.get_tris_or_culled() == 0 )
|
|
|
|
p = new instr_label( 10, 25, 90, 10,
|
|
|
|
get_vfc_tris_drawn,
|
|
|
|
"%.0f",
|
|
|
|
"Tris Rendered = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
else
|
|
|
|
p = new instr_label( 10, 25, 90, 10,
|
|
|
|
get_vfc_ratio,
|
|
|
|
"%.2f",
|
|
|
|
"VFC Ratio = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
HUD_deque.push_front( p );
|
|
|
|
|
|
|
|
p = new instr_label( 10, 40, 90, 10,
|
|
|
|
get_fov,
|
|
|
|
"%.1f",
|
|
|
|
"FOV = ",
|
|
|
|
NULL,
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
HUD_deque.push_front( p );
|
|
|
|
|
|
|
|
const int x_pos = 480;
|
|
|
|
p = new instr_label( x_pos, 40, 40, 30,
|
|
|
|
get_speed,
|
|
|
|
"%5.0f",
|
|
|
|
"Airspeed ",
|
|
|
|
" Kts",
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
HUD_deque.push_front( p );
|
|
|
|
|
1998-11-03 12:33:11 +00:00
|
|
|
if ( current_options.get_units() == fgOPTIONS::FG_UNITS_FEET ) {
|
|
|
|
strcpy(units, " ft");
|
|
|
|
} else {
|
|
|
|
strcpy(units, " m");
|
|
|
|
}
|
1998-10-16 00:53:00 +00:00
|
|
|
p = new instr_label( x_pos, 25, 40, 10,
|
|
|
|
get_altitude,
|
|
|
|
"%5.0f",
|
|
|
|
"Altitude ",
|
1998-11-03 12:33:11 +00:00
|
|
|
units,
|
1998-10-16 00:53:00 +00:00
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
HUD_deque.push_front( p );
|
|
|
|
|
|
|
|
p = new instr_label( x_pos, 10, 60, 10,
|
|
|
|
get_heading,
|
|
|
|
"%5.1f",
|
|
|
|
"Heading ",
|
|
|
|
" Deg",
|
|
|
|
1.0,
|
|
|
|
HUDS_TOP,
|
|
|
|
RIGHT_JUST,
|
|
|
|
SMALL,
|
|
|
|
0,
|
|
|
|
TRUE );
|
|
|
|
HUD_deque.push_front( p );
|
|
|
|
|
|
|
|
return 0; // For now. Later we may use this for an error code.
|
1997-08-29 18:03:19 +00:00
|
|
|
}
|
|
|
|
|
1998-07-13 21:00:45 +00:00
|
|
|
int global_day_night_switch = DAY;
|
|
|
|
|
|
|
|
void HUD_brightkey( bool incr_bright )
|
|
|
|
{
|
|
|
|
instr_item *pHUDInstr = HUD_deque[0];
|
|
|
|
int brightness = pHUDInstr->get_brightness();
|
|
|
|
|
|
|
|
if( current_options.get_hud_status() ) {
|
|
|
|
if( incr_bright ) {
|
|
|
|
switch (brightness) {
|
|
|
|
case BRT_LIGHT:
|
|
|
|
current_options.set_hud_status(0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_MEDIUM:
|
|
|
|
brightness = BRT_LIGHT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_DARK:
|
|
|
|
brightness = BRT_MEDIUM;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_BLACK:
|
|
|
|
brightness = BRT_DARK;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
brightness = BRT_BLACK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
switch (brightness) {
|
|
|
|
case BRT_LIGHT:
|
|
|
|
brightness = BRT_MEDIUM;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_MEDIUM:
|
|
|
|
brightness = BRT_DARK;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_DARK:
|
|
|
|
brightness = BRT_BLACK;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_BLACK:
|
|
|
|
default:
|
|
|
|
current_options.set_hud_status(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
current_options.set_hud_status(1);
|
|
|
|
if( incr_bright ) {
|
|
|
|
if( DAY == global_day_night_switch ) {
|
|
|
|
brightness = BRT_BLACK;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
brightness = BRT_DARK;
|
|
|
|
global_day_night_switch = DAY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if( NIGHT == global_day_night_switch ) {
|
|
|
|
brightness = BRT_DARK;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
brightness = BRT_MEDIUM;
|
|
|
|
global_day_night_switch = NIGHT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pHUDInstr->SetBrightness( brightness );
|
|
|
|
}
|
1997-08-29 18:03:19 +00:00
|
|
|
|
1998-02-07 15:29:31 +00:00
|
|
|
// fgUpdateHUD
|
|
|
|
//
|
|
|
|
// Performs a once around the list of calls to instruments installed in
|
|
|
|
// the HUD object with requests for redraw. Kinda. It will when this is
|
|
|
|
// all C++.
|
|
|
|
//
|
1998-05-11 18:13:10 +00:00
|
|
|
void fgUpdateHUD( void ) {
|
|
|
|
int i;
|
|
|
|
int brightness;
|
|
|
|
// int day_night_sw = current_aircraft.controls->day_night_switch;
|
|
|
|
int day_night_sw = global_day_night_switch;
|
|
|
|
int hud_displays = HUD_deque.size();
|
|
|
|
instr_item *pHUDInstr;
|
1998-02-16 13:38:39 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
if( !hud_displays ) { // Trust everyone, but ALWAYS cut the cards!
|
|
|
|
return;
|
|
|
|
}
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
pHUDInstr = HUD_deque[0];
|
|
|
|
brightness = pHUDInstr->get_brightness();
|
|
|
|
// brightness = HUD_deque.at(0)->get_brightness();
|
1998-02-16 13:38:39 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
glPushMatrix();
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-05-11 18:13:10 +00:00
|
|
|
glLoadIdentity();
|
|
|
|
gluOrtho2D(0, 640, 0, 480);
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glPushMatrix();
|
|
|
|
glLoadIdentity();
|
|
|
|
|
|
|
|
glColor3f(1.0, 1.0, 1.0);
|
|
|
|
glIndexi(7);
|
|
|
|
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
glDisable(GL_LIGHTING);
|
|
|
|
|
|
|
|
glLineWidth(1);
|
|
|
|
|
1999-02-02 20:13:29 +00:00
|
|
|
HudIterator current = HUD_deque.begin();
|
|
|
|
HudIterator last = HUD_deque.end();
|
1998-07-20 12:47:55 +00:00
|
|
|
|
1998-10-16 00:53:00 +00:00
|
|
|
for ( ; current != last; ++current ) {
|
1998-07-20 12:47:55 +00:00
|
|
|
pHUDInstr = *current;
|
|
|
|
|
|
|
|
// for( i = hud_displays; i; --i) { // Draw everything
|
|
|
|
// if( HUD_deque.at(i)->enabled()) {
|
|
|
|
// pHUDInstr = HUD_deque[i - 1];
|
1998-05-11 18:13:10 +00:00
|
|
|
if( pHUDInstr->enabled()) {
|
|
|
|
// We should to respond to a dial instead
|
|
|
|
// or as well to the of time of day. Of
|
|
|
|
// course, we have no dial!
|
|
|
|
if( day_night_sw == DAY) {
|
|
|
|
switch (brightness) {
|
|
|
|
case BRT_LIGHT:
|
|
|
|
glColor3f (0.1, 0.9, 0.1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_MEDIUM:
|
|
|
|
glColor3f (0.1, 0.7, 0.0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_DARK:
|
|
|
|
glColor3f (0.0, 0.5, 0.0);
|
1998-07-13 21:00:45 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_BLACK:
|
|
|
|
glColor3f( 0.0, 0.0, 0.0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:;
|
1998-05-11 18:13:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if( day_night_sw == NIGHT) {
|
|
|
|
switch (brightness) {
|
|
|
|
case BRT_LIGHT:
|
|
|
|
glColor3f (0.9, 0.1, 0.1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_MEDIUM:
|
|
|
|
glColor3f (0.7, 0.0, 0.1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BRT_DARK:
|
|
|
|
default:
|
|
|
|
glColor3f (0.5, 0.0, 0.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else { // Just in case default
|
|
|
|
glColor3f (0.1, 0.9, 0.1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// fgPrintf( FG_COCKPIT, FG_DEBUG, "HUD Code %d Status %d\n",
|
|
|
|
// hud->code, hud->status );
|
|
|
|
pHUDInstr->draw();
|
|
|
|
// HUD_deque.at(i)->draw(); // Responsible for broken or fixed variants.
|
|
|
|
// No broken displays honored just now.
|
|
|
|
}
|
1998-02-09 15:07:47 +00:00
|
|
|
}
|
1998-02-07 15:29:31 +00:00
|
|
|
|
1998-02-16 13:38:39 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glEnable(GL_LIGHTING);
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
glPopMatrix();
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glPopMatrix();
|
1997-08-29 18:03:19 +00:00
|
|
|
}
|
|
|
|
|