1
0
Fork 0

Added Charlie's HUD changes.

This commit is contained in:
curt 1998-02-21 14:53:10 +00:00
parent 2805fb7cb2
commit 1f0a7128bd
4 changed files with 359 additions and 280 deletions

View file

@ -3,7 +3,7 @@
*
* Written by Michele America, started September 1997.
*
* Copyright (C) 1997 Michele F. America - nomimarketing@mail.telepac.pt
* 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
@ -136,7 +136,7 @@ double get_heading( void )
fgFLIGHT *f;
f = current_aircraft.flight;
return( FG_Psi*RAD_TO_DEG );
return( FG_Psi * RAD_TO_DEG );
}
double get_altitude( void )
@ -202,84 +202,67 @@ static void drawscale( HUD_scale * pscale )
double vmin, vmax;
int marker_x;
int marker_y;
int scr_span;
int mid_scr;
register i;
double factor;
char TextScale[80];
int condition;
double cur_value = (*(pscale->load_value))();
int disp_val;
vmin = cur_value - pscale->width_units / 2.0; // width units == needle travel
vmax = cur_value + pscale->width_units / 2.0; // or picture unit span.
vmin = cur_value - pscale->half_width_units; // width units == needle travel
vmax = cur_value + pscale->half_width_units; // or picture unit span.
scr_span = pscale->scr_max - pscale->scr_min; // Run of scan in pix coord
scr_span |= 1; // If span is odd number of units, mid will be correct.
// If not it will be high by one coordinate unit. This is
// an artifact of integer division needed for screen loc's.
mid_scr = (scr_span >> 1) + pscale->scr_min; // Middle is half that +
// starting point.
// Calculate the number of screen units per indicator unit
// We must force floating point calculation or the factor
// will be low and miss locate tics by several units.
factor = (double)scr_span / (double)pscale->width_units;
// Separate calculations for location of markings by scale
// type V vs H.
if( pscale->type == VERTICAL ) // Vertical scale
{
drawOneLine( pscale->scrn_pos.right, // Vertical scale bar
pscale->scrn_pos.bottom,
pscale->scrn_pos.right,
pscale->scrn_pos.top );
if( pscale->orientation == LEFT ) // Calculate x marker offset
marker_x = pscale->scr_pos-6;
marker_x = pscale->scrn_pos.left - 6;
else
if( pscale->orientation == RIGHT )
marker_x = pscale->scr_pos;
marker_x = pscale->scrn_pos.right;
// Draw the basic markings for the scale...
drawOneLine( pscale->scr_pos, // Vertical bar
pscale->scr_min,
pscale->scr_pos,
pscale->scr_max );
if( pscale->orientation == LEFT )
{
drawOneLine( pscale->scr_pos-3, // Bottom tick bar
pscale->scr_min,
pscale->scr_pos,
pscale->scr_min );
drawOneLine( pscale->scr_pos-3, // Top tick bar
pscale->scr_max,
pscale->scr_pos,
pscale->scr_max );
drawOneLine( pscale->scrn_pos.right - 3, // Bottom tick bar
pscale->scrn_pos.bottom,
pscale->scrn_pos.right,
pscale->scrn_pos.bottom );
drawOneLine( pscale->scr_pos, // Middle tick bar /Index
mid_scr,
pscale->scr_pos+6,
mid_scr );
drawOneLine( pscale->scrn_pos.right - 3, // Top tick bar
pscale->scrn_pos.top,
pscale->scrn_pos.right,
pscale->scrn_pos.top );
drawOneLine( pscale->scrn_pos.right, // Middle tick bar /Index
pscale->mid_scr,
pscale->scrn_pos.right + 6,
pscale->mid_scr );
}
else
if( pscale->orientation == RIGHT )
{
drawOneLine( pscale->scr_pos,
pscale->scr_min,
pscale->scr_pos+3,
pscale->scr_min );
drawOneLine( pscale->scrn_pos.right,
pscale->scrn_pos.bottom,
pscale->scrn_pos.right+3,
pscale->scrn_pos.bottom );
drawOneLine( pscale->scr_pos,
pscale->scr_max,
pscale->scr_pos+3,
pscale->scr_max );
drawOneLine( pscale->scrn_pos.right,
pscale->scrn_pos.top,
pscale->scrn_pos.right+3,
pscale->scrn_pos.top );
drawOneLine( pscale->scr_pos,
mid_scr,
pscale->scr_pos-6,
mid_scr );
drawOneLine( pscale->scrn_pos.right,
pscale->mid_scr,
pscale->scrn_pos.right-6,
pscale->mid_scr );
}
// Work through from bottom to top of scale. Calculating where to put
@ -298,12 +281,12 @@ static void drawscale( HUD_scale * pscale )
if( condition ) // Show a tick if necessary
{
// Calculate the location of this tick
marker_y = pscale->scr_min + (i - vmin) * factor;
marker_y = pscale->scrn_pos.bottom + (i - vmin) * pscale->factor;
// Block calculation artifact from drawing ticks below min coordinate.
// Calculation here accounts for text height.
if( marker_y < (pscale->scr_min + 4)) { // Magic number!!!
if( marker_y < (pscale->scrn_pos.bottom + 4)) { // Magic number!!!
continue;
}
if( (i%pscale->div_min) == 0) {
@ -321,7 +304,19 @@ static void drawscale( HUD_scale * pscale )
if( (i%pscale->div_max) == 0 ) {
drawOneLine( marker_x, marker_y,
marker_x + 6, marker_y );
sprintf( TextScale, "%d", i );
if(pscale->modulo) {
disp_val = i % pscale->modulo;
if( !disp_val ) {
disp_val = pscale->modulo;
}
if( disp_val < 0) {
disp_val += pscale->modulo;
}
}
else {
disp_val = i;
}
sprintf( TextScale, "%d", disp_val );
if( pscale->orientation == LEFT ) {
textString( marker_x - 8 * strlen(TextScale) - 2, marker_y - 4,
TextScale, GLUT_BITMAP_8_BY_13 );
@ -339,52 +334,53 @@ static void drawscale( HUD_scale * pscale )
if( pscale->type == HORIZONTAL ) // Horizontal scale
{
if( pscale->orientation == TOP ) {
marker_y = pscale->scr_pos;
marker_y = pscale->scrn_pos.bottom;
}
else {
if( pscale->orientation == BOTTOM ) {
marker_y = pscale->scr_pos - 6;
marker_y = pscale->scrn_pos.bottom - 6;
}
}
drawOneLine( pscale->scr_min,
pscale->scr_pos,
pscale->scr_max,
pscale->scr_pos );
drawOneLine( pscale->scrn_pos.left,
pscale->scrn_pos.bottom,
pscale->scrn_pos.right,
pscale->scrn_pos.bottom );
if( pscale->orientation == TOP )
{
drawOneLine( pscale->scr_min,
pscale->scr_pos,
pscale->scr_min,
pscale->scr_pos-3 );
drawOneLine( pscale->scrn_pos.left,
pscale->scrn_pos.bottom,
pscale->scrn_pos.left,
pscale->scrn_pos.bottom + 3 );
drawOneLine( pscale->scr_max,
pscale->scr_pos,
pscale->scr_max,
pscale->scr_pos-3 );
drawOneLine( pscale->scrn_pos.right,
pscale->scrn_pos.bottom,
pscale->scrn_pos.right,
pscale->scrn_pos.bottom + 6 );
drawOneLine( mid_scr,
pscale->scr_pos,
mid_scr,
pscale->scr_pos-6 );
drawOneLine( pscale->mid_scr,
pscale->scrn_pos.bottom,
pscale->mid_scr,
pscale->scrn_pos.bottom - 6 );
}
else {
if( pscale->orientation == BOTTOM )
{
drawOneLine( pscale->scr_min,
pscale->scr_pos,
pscale->scr_min,
pscale->scr_pos+3 );
drawOneLine( pscale->scrn_pos.left,
pscale->scrn_pos.bottom,
pscale->scrn_pos.left,
pscale->scrn_pos.bottom - 6 );
drawOneLine( pscale->scr_max,
pscale->scr_pos,
pscale->scr_max,
pscale->scr_pos+3 );
drawOneLine( pscale->scrn_pos.right,
pscale->scrn_pos.bottom,
pscale->scrn_pos.right,
pscale->scrn_pos.bottom - 6 );
drawOneLine( mid_scr,
pscale->scr_pos,
mid_scr,
pscale->scr_pos+6 );
drawOneLine( pscale->mid_scr,
pscale->scrn_pos.bottom,
pscale->mid_scr,
pscale->scrn_pos.bottom + 6 );
}
}
@ -399,33 +395,45 @@ static void drawscale( HUD_scale * pscale )
}
}
if( condition ) {
marker_x = pscale->scr_min+(i-vmin)*factor;
if( i%pscale->div_min==0 ) {
marker_x = pscale->scrn_pos.left + (i - vmin) * pscale->factor;
if( (i%pscale->div_min) == 0 ) {
if( pscale->orientation == TOP )
{
drawOneLine( marker_x, marker_y, marker_x, marker_y+3 );
drawOneLine( marker_x, marker_y, marker_x, marker_y + 3 );
}
else {
if( pscale->orientation == BOTTOM )
{
drawOneLine( marker_x, marker_y+3, marker_x, marker_y+6 );
drawOneLine( marker_x, marker_y + 3, marker_x, marker_y + 6 );
}
}
}
if( i%pscale->div_max==0 )
if( (i%pscale->div_max)==0 )
{
sprintf( TextScale, "%d", i );
if(pscale->modulo) {
disp_val = i % pscale->modulo;
if( !disp_val ) {
disp_val = pscale->modulo;
}
if( disp_val < 0) {
disp_val += pscale->modulo;
}
}
else {
disp_val = i;
}
sprintf( TextScale, "%d", disp_val );
if( pscale->orientation == TOP )
{
drawOneLine( marker_x, marker_y, marker_x, marker_y+6 );
textString ( marker_x-4*strlen(TextScale), marker_y+14,
textString ( marker_x - 4 * strlen(TextScale), marker_y + 14,
TextScale, GLUT_BITMAP_8_BY_13 );
}
else {
if( pscale->orientation == BOTTOM )
{
drawOneLine( marker_x, marker_y, marker_x, marker_y+6 );
textString ( marker_x+10, marker_y-4,
textString ( marker_x - 4 * strlen(TextScale), marker_y - 14,
TextScale, GLUT_BITMAP_8_BY_13 );
}
}
@ -464,14 +472,14 @@ static void drawladder( HUD_ladder *ladder )
vmin = pitch_value - ladder->width_units/2;
vmax = pitch_value + ladder->width_units/2;
scr_min = ladder->y_pos - (ladder->scr_height/2);
scr_min = ladder->scrn_pos.y - (ladder->scr_height/2);
scr_max = scr_min + ladder->scr_height;
#ifdef DEBUGHUD
mid_scr = scr_min + (scr_max-scr_min)/2;
#endif
marker_x = ladder->x_pos - ladder->scr_width/2;
marker_x = ladder->scrn_pos.x - ladder->scr_width/2;
factor = (scr_max-scr_min)/ladder->width_units;
@ -487,26 +495,26 @@ static void drawladder( HUD_ladder *ladder )
if( ladder->scr_hole == 0 )
{
if( i ) {
x_ini = ladder->x_pos - ladder->scr_width/2;
x_ini = ladder->scrn_pos.x - ladder->scr_width/2;
}
else {
x_ini = ladder->x_pos - ladder->scr_width/2 - 10;
x_ini = ladder->scrn_pos.x - ladder->scr_width/2 - 10;
}
y_ini = marker_y;
x_end = ladder->x_pos + ladder->scr_width/2;
x_end = ladder->scrn_pos.x + ladder->scr_width/2;
y_end = marker_y;
new_x_ini = ladder->x_pos + \
(x_ini - ladder->x_pos) * cos(roll_value) - \
(y_ini - ladder->y_pos) * sin(roll_value);
new_y_ini = ladder->y_pos + \
(x_ini - ladder->x_pos) * sin(roll_value) + \
(y_ini - ladder->y_pos) * cos(roll_value);
new_x_end = ladder->x_pos + \
(x_end - ladder->x_pos) * cos(roll_value) - \
(y_end - ladder->y_pos) * sin(roll_value);
new_y_end = ladder->y_pos + \
(x_end - ladder->x_pos) * sin(roll_value) + \
(y_end - ladder->y_pos) * cos(roll_value);
new_x_ini = ladder->scrn_pos.x + \
(x_ini - ladder->scrn_pos.x) * cos(roll_value) - \
(y_ini - ladder->scrn_pos.y) * sin(roll_value);
new_y_ini = ladder->scrn_pos.y + \
(x_ini - ladder->scrn_pos.x) * sin(roll_value) + \
(y_ini - ladder->scrn_pos.y) * cos(roll_value);
new_x_end = ladder->scrn_pos.x + \
(x_end - ladder->scrn_pos.x) * cos(roll_value) - \
(y_end - ladder->scrn_pos.y) * sin(roll_value);
new_y_end = ladder->scrn_pos.y + \
(x_end - ladder->scrn_pos.x) * sin(roll_value) + \
(y_end - ladder->scrn_pos.y) * cos(roll_value);
if( i >= 0 )
{
@ -529,26 +537,26 @@ static void drawladder( HUD_ladder *ladder )
else
{
if( i != 0 ) {
x_ini = ladder->x_pos - ladder->scr_width/2;
x_ini = ladder->scrn_pos.x - ladder->scr_width/2;
}
else {
x_ini = ladder->x_pos - ladder->scr_width/2 - 10;
x_ini = ladder->scrn_pos.x - ladder->scr_width/2 - 10;
}
y_ini = marker_y;
x_end = ladder->x_pos - ladder->scr_width/2 + ladder->scr_hole/2;
x_end = ladder->scrn_pos.x - ladder->scr_width/2 + ladder->scr_hole/2;
y_end = marker_y;
new_x_ini = ladder->x_pos+ \
(x_ini - ladder->x_pos) * cos(roll_value) -\
(y_ini - ladder->y_pos) * sin(roll_value);
new_y_ini = ladder->y_pos+ \
(x_ini - ladder->x_pos) * sin(roll_value) +\
(y_ini - ladder->y_pos) * cos(roll_value);
new_x_end = ladder->x_pos+ \
(x_end - ladder->x_pos) * cos(roll_value) -\
(y_end - ladder->y_pos) * sin(roll_value);
new_y_end = ladder->y_pos+ \
(x_end - ladder->x_pos) * sin(roll_value) +\
(y_end - ladder->y_pos) * cos(roll_value);
new_x_ini = ladder->scrn_pos.x+ \
(x_ini - ladder->scrn_pos.x) * cos(roll_value) -\
(y_ini - ladder->scrn_pos.y) * sin(roll_value);
new_y_ini = ladder->scrn_pos.y+ \
(x_ini - ladder->scrn_pos.x) * sin(roll_value) +\
(y_ini - ladder->scrn_pos.y) * cos(roll_value);
new_x_end = ladder->scrn_pos.x+ \
(x_end - ladder->scrn_pos.x) * cos(roll_value) -\
(y_end - ladder->scrn_pos.y) * sin(roll_value);
new_y_end = ladder->scrn_pos.y+ \
(x_end - ladder->scrn_pos.x) * sin(roll_value) +\
(y_end - ladder->scrn_pos.y) * cos(roll_value);
if( i >= 0 )
{
@ -565,27 +573,27 @@ static void drawladder( HUD_ladder *ladder )
new_y_ini - 4,
TextLadder, GLUT_BITMAP_8_BY_13 );
x_ini = ladder->x_pos + ladder->scr_width/2 - ladder->scr_hole/2;
x_ini = ladder->scrn_pos.x + ladder->scr_width/2 - ladder->scr_hole/2;
y_ini = marker_y;
if( i != 0 ) {
x_end = ladder->x_pos + ladder->scr_width/2;
x_end = ladder->scrn_pos.x + ladder->scr_width/2;
}
else {
x_end = ladder->x_pos + ladder->scr_width/2 + 10;
x_end = ladder->scrn_pos.x + ladder->scr_width/2 + 10;
}
y_end = marker_y;
new_x_ini = ladder->x_pos + \
(x_ini-ladder->x_pos)*cos(roll_value) -\
(y_ini-ladder->y_pos)*sin(roll_value);
new_y_ini = ladder->y_pos + \
(x_ini-ladder->x_pos)*sin(roll_value) +\
(y_ini-ladder->y_pos)*cos(roll_value);
new_x_end = ladder->x_pos + \
(x_end-ladder->x_pos)*cos(roll_value) -\
(y_end-ladder->y_pos)*sin(roll_value);
new_y_end = ladder->y_pos + \
(x_end-ladder->x_pos)*sin(roll_value) +\
(y_end-ladder->y_pos)*cos(roll_value);
new_x_ini = ladder->scrn_pos.x + \
(x_ini-ladder->scrn_pos.x)*cos(roll_value) -\
(y_ini-ladder->scrn_pos.y)*sin(roll_value);
new_y_ini = ladder->scrn_pos.y + \
(x_ini-ladder->scrn_pos.x)*sin(roll_value) +\
(y_ini-ladder->scrn_pos.y)*cos(roll_value);
new_x_end = ladder->scrn_pos.x + \
(x_end-ladder->scrn_pos.x)*cos(roll_value) -\
(y_end-ladder->scrn_pos.y)*sin(roll_value);
new_y_end = ladder->scrn_pos.y + \
(x_end-ladder->scrn_pos.x)*sin(roll_value) +\
(y_end-ladder->scrn_pos.y)*cos(roll_value);
if( i >= 0 )
{
@ -646,7 +654,7 @@ static void drawhorizon( HUD_horizon *horizon )
double sin_sideslip, cos_sideslip;
double ss_const; // sideslip angle pixels per rad
bank_angle = (*horizon->load_roll)();
bank_angle = (*horizon->load_roll)(); // Need roll limit!
sideslip_angle = (*horizon->load_sideslip)();
// sin_bank = sin( FG_2PI-FG_Phi );
@ -660,18 +668,18 @@ static void drawhorizon( HUD_horizon *horizon )
y_inc1 = (int)(horizon->scr_width * sin_bank);
x_inc2 = (int)(horizon->scr_hole * cos_bank);
y_inc2 = (int)(horizon->scr_hole * sin_bank);
x_t_inc1 = (int)(horizon->tee_height * sin_bank);
y_t_inc1 = (int)(horizon->tee_height * cos_bank);
d_bottom_x = horizon->x_pos;
d_bottom_y = horizon->y_pos-horizon->scr_hole;
d_right_x = horizon->x_pos+horizon->scr_hole;
d_right_y = horizon->y_pos;
d_top_x = horizon->x_pos;
d_top_y = horizon->y_pos+horizon->scr_hole;
d_left_x = horizon->x_pos-horizon->scr_hole;
d_left_y = horizon->y_pos;
d_bottom_x = horizon->scrn_pos.x;
d_bottom_y = horizon->scrn_pos.y-horizon->scr_hole;
d_right_x = horizon->scrn_pos.x+horizon->scr_hole;
d_right_y = horizon->scrn_pos.y;
d_top_x = horizon->scrn_pos.x;
d_top_y = horizon->scrn_pos.y+horizon->scr_hole;
d_left_x = horizon->scrn_pos.x-horizon->scr_hole;
d_left_y = horizon->scrn_pos.y;
ss_const = (FG_PI_2/2)/(2*horizon->scr_width-2*horizon->scr_hole);
@ -682,22 +690,22 @@ static void drawhorizon( HUD_horizon *horizon )
if( horizon->scr_hole == 0 )
{
drawOneLine( horizon->x_pos - x_inc1, horizon->y_pos - y_inc1, \
horizon->x_pos + x_inc1, horizon->y_pos + y_inc1 );
drawOneLine( horizon->scrn_pos.x - x_inc1, horizon->scrn_pos.y - y_inc1, \
horizon->scrn_pos.x + x_inc1, horizon->scrn_pos.y + y_inc1 );
}
else
{
drawOneLine( horizon->x_pos - x_inc1, horizon->y_pos - y_inc1, \
horizon->x_pos - x_inc2, horizon->y_pos - y_inc2 );
drawOneLine( horizon->x_pos + x_inc2, horizon->y_pos + y_inc2, \
horizon->x_pos + x_inc1, horizon->y_pos + y_inc1 );
drawOneLine( horizon->scrn_pos.x - x_inc1, horizon->scrn_pos.y - y_inc1, \
horizon->scrn_pos.x - x_inc2, horizon->scrn_pos.y - y_inc2 );
drawOneLine( horizon->scrn_pos.x + x_inc2, horizon->scrn_pos.y + y_inc2, \
horizon->scrn_pos.x + x_inc1, horizon->scrn_pos.y + y_inc1 );
}
// draw teemarks (?)
drawOneLine( horizon->x_pos + x_inc2, horizon->y_pos + y_inc2, \
horizon->x_pos + x_inc2 + x_t_inc1, horizon->y_pos + y_inc2 - y_t_inc1 );
drawOneLine( horizon->x_pos - x_inc2, horizon->y_pos - y_inc2, \
horizon->x_pos - x_inc2 + x_t_inc1, horizon->y_pos - y_inc2 - y_t_inc1 );
// draw teemarks (?)
drawOneLine( horizon->scrn_pos.x + x_inc2, horizon->scrn_pos.y + y_inc2, \
horizon->scrn_pos.x + x_inc2 + x_t_inc1, horizon->scrn_pos.y + y_inc2 - y_t_inc1 );
drawOneLine( horizon->scrn_pos.x - x_inc2, horizon->scrn_pos.y - y_inc2, \
horizon->scrn_pos.x - x_inc2 + x_t_inc1, horizon->scrn_pos.y - y_inc2 - y_t_inc1 );
// draw sideslip diamond (it is not yet positioned correctly )
drawOneLine( d_bottom_x, d_bottom_y, d_right_x, d_right_y )
@ -719,8 +727,8 @@ static void drawControlSurfaces( HUD_control_surfaces *ctrl_surf )
/* int x_2, y_2; */
fgCONTROLS *pCtls;
x_ini = ctrl_surf->x_pos;
y_ini = ctrl_surf->y_pos;
x_ini = ctrl_surf->scrn_pos.x;
y_ini = ctrl_surf->scrn_pos.y;
x_end = x_ini + 150;
y_end = y_ini + 60;
@ -872,12 +880,12 @@ static void drawlabel( HUD_label *label )
}
if( label->size == SMALL ) {
textString( label->x_pos + posincr, label->y_pos,
textString( label->scrn_pos.x + posincr, label->scrn_pos.y,
string, GLUT_BITMAP_8_BY_13);
}
else {
if( label->size == LARGE ) {
textString( label->x_pos + posincr, label->y_pos,
textString( label->scrn_pos.x + posincr, label->scrn_pos.y,
string, GLUT_BITMAP_9_BY_15);
}
}
@ -909,40 +917,41 @@ Hptr fgHUDInit( fgAIRCRAFT *current_aircraft )
// 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 );
// Small, original HUD configuration
// fgHUDAddHorizon( hud, 590, 50, 40, 5, 10, get_roll, get_sideslip );
// fgHUDAddLadder ( hud, 330, 190, 90, 180, 70, 10,
// NONE, 45, get_roll, get_pitch );
// fgHUDAddScale ( hud, VERTICAL, LIMIT, 220, 100, 280, 5, 10,
// LEFT, 0, 100, 50, get_speed );
// fgHUDAddScale ( hud, VERTICAL, NOLIMIT, 440, 100, 280, 1, 5, RIGHT,
// -40, 50, 25, get_aoa );
// fgHUDAddScale ( hud, HORIZONTAL, NOLIMIT, 280, 220, 440, 5, 10,
// TOP, 0, 50, 50, get_heading );
// fgHUDAddLabel ( hud, 180, 85, SMALL, NOBLINK,
// RIGHT_JUST, NULL, " Kts", "%5.0f", get_speed );
// fgHUDAddLabel ( hud, 180, 73, SMALL, NOBLINK,
// RIGHT_JUST, NULL, " m", "%5.0f", get_altitude );
// fgHUDAddControlSurfaces( hud, 10, 10, NULL );
// Bigger and placed a bit higher HUD configuration
fgHUDAddHorizon( hud, 590, 50, 40, 5, 10, get_roll, get_sideslip );
fgHUDAddLadder ( hud, 330, 270, 120, 180, 70, 10,
fgHUDSetTimeMode( hud, NIGHT );
fgHUDSetBrightness( hud, BRT_LIGHT );
// TBI
fgHUDAddHorizon( hud, 330, 100, 40, 5, 10, get_roll, get_sideslip );
fgHUDAddLadder ( hud, 330, 285, 120, 180, 70, 10,
NONE, 45, get_roll, get_pitch );
fgHUDAddScale ( hud, VERTICAL, LIMIT, 200, 180, 380, 5, 10,
LEFT, 0, 100, 50, get_speed );
fgHUDAddScale ( hud, VERTICAL, NOLIMIT, 460, 180, 380, 1, 5,
RIGHT, -40, 50, 25, get_aoa );
fgHUDAddScale ( hud, HORIZONTAL, NOLIMIT, 380, 200, 460, 5, 10,
TOP, 0, 50, 50, get_heading );
fgHUDAddLabel ( hud, 160, 165, SMALL, NOBLINK,
RIGHT_JUST, NULL, " Kts", "%5.0f", get_speed );
fgHUDAddLabel ( hud, 160, 153, SMALL, NOBLINK,
RIGHT_JUST, NULL, " m", "%5.0f", get_altitude );
// KIAS
fgHUDAddScale ( hud, VERTICAL, LIMIT, 200, 180, 380, 5, 10,
LEFT, 0, 100, 50, 0, get_speed );
// Angle of Attack
fgHUDAddScale ( hud, HORIZONTAL, NOLIMIT, 180, 250, 410, 1, 5,
BOTTOM, -40, 50, 21, 0, get_aoa );
// GYRO COMPASS
fgHUDAddScale ( hud, HORIZONTAL, NOLIMIT, 380, 200, 460, 5, 10,
TOP, 0, 50, 50, 360, get_heading );
// AMSL
fgHUDAddScale ( hud, VERTICAL, LIMIT, 460, 180, 380, 25, 100,
RIGHT, 0, 15000, 250, 0, get_altitude);
fgHUDAddLabel ( hud, 160, 150, SMALL, NOBLINK,
RIGHT_JUST, NULL, " Kts", "%5.0f", get_speed );
fgHUDAddLabel ( hud, 160, 135, SMALL, NOBLINK,
RIGHT_JUST, NULL, " m", "%5.0f", get_altitude );
fgHUDAddLabel ( hud, 160, 120, SMALL, NOBLINK,
RIGHT_JUST, NULL, " Roll", "%5.2f", get_roll );
fgHUDAddLabel ( hud, 440, 150, SMALL, NOBLINK,
RIGHT_JUST, NULL, " AOA", "%5.2f", get_aoa );
fgHUDAddLabel ( hud, 440, 135, SMALL, NOBLINK,
RIGHT_JUST, NULL, " Heading", "%5.0f", get_heading );
fgHUDAddLabel ( hud, 440, 120, SMALL, NOBLINK,
RIGHT_JUST, NULL, " Sideslip", "%5.2f", get_sideslip );
fgHUDAddControlSurfaces( hud, 10, 10, NULL );
// fgHUDAddControl( hud, HORIZONTAL, 50, 25, get_aileronval ); // was 10, 10
@ -952,6 +961,7 @@ Hptr fgHUDInit( fgAIRCRAFT *current_aircraft )
return( hud );
}
// add_instrument
//
// This is a stand in for linked list code that will get replaced later
@ -973,13 +983,13 @@ void add_instrument( Hptr hud, HIptr pinstrument )
// Constructs a HUD_horizon "object" and installs it into the hud instrument
// list.
Hptr fgHUDAddHorizon( Hptr hud, \
int x_pos, \
int y_pos, \
int length, \
int hole_len, \
Hptr fgHUDAddHorizon( Hptr hud, \
int x_pos, \
int y_pos, \
int length, \
int hole_len, \
int tee_height,\
double (*load_roll)(),\
double (*load_roll)(),
double (*load_sideslip)() )
{
HUD_horizon *phorizon;
@ -1001,15 +1011,15 @@ Hptr fgHUDAddHorizon( Hptr hud, \
return( NULL );
}
phorizon->x_pos = x_pos;
phorizon->y_pos = y_pos;
phorizon->scr_width = length;
phorizon->scrn_pos.x = x_pos;
phorizon->scrn_pos.y = y_pos;
phorizon->scr_width = length | 1;
phorizon->scr_hole = hole_len;
phorizon->tee_height = tee_height;
phorizon->load_roll = load_roll;
phorizon->load_sideslip = load_sideslip;
// Install the horizon in the parent.
pinstrument->instr = phorizon;
pinstrument->instr = phorizon;
// Install the instrument into hud.
add_instrument( hud, pinstrument);
@ -1033,6 +1043,7 @@ Hptr fgHUDAddScale( Hptr hud, \
int min_value, \
int max_value, \
int width_units, \
int modulus, \
double (*load_value)() )
{
HUD_scale *pscale;
@ -1053,18 +1064,48 @@ Hptr fgHUDAddScale( Hptr hud, \
if( pscale == NULL ) {
return( NULL );
}
pscale->type = type;
pscale->sub_type = sub_type;
pscale->scr_pos = scr_pos;
pscale->scr_min = scr_min;
pscale->scr_max = scr_max;
pscale->div_min = div_min;
pscale->div_max = div_max;
pscale->orientation = orientation;
pscale->minimum_value = min_value;
pscale->maximum_value = max_value;
pscale->width_units = width_units;
pscale->load_value = load_value;
pscale->type = type;
pscale->sub_type = sub_type;
pscale->div_min = div_min;
pscale->div_max = div_max;
pscale->orientation = orientation;
pscale->minimum_value = min_value;
pscale->maximum_value = max_value;
pscale->modulo = modulus;
pscale->load_value = load_value;
pscale->half_width_units = width_units / 2.0;
pscale->scr_span = scr_max - scr_min; // Run of scan in pix coord
pscale->scr_span |= 1; // Force odd span of units.
// If span is odd number of units, mid will be correct.
// If not it will be high by one coordinate unit. This is
// an artifact of integer division needed for screen loc's.
pscale->mid_scr = (pscale->scr_span >> 1) + scr_min;
// Calculate the number of screen units per indicator unit
// We must force floating point calculation or the factor
// will be low and miss locate tics by several units.
pscale->factor = (double)pscale->scr_span / (double)width_units;
switch( type ) {
case HORIZONTAL:
pscale->scrn_pos.left = scr_min;
pscale->scrn_pos.top = scr_pos;
pscale->scrn_pos.right = scr_max;
pscale->scrn_pos.bottom = scr_pos;
break;
case VERTICAL:
default:
pscale->scrn_pos.left = scr_pos;
pscale->scrn_pos.top = scr_max;
pscale->scrn_pos.right = scr_pos;
pscale->scrn_pos.bottom = scr_min;
}
// Install the scale
pinstrument->instr = pscale;
// Install the instrument into hud.
@ -1106,8 +1147,8 @@ Hptr fgHUDAddLabel( Hptr hud, \
return NULL;
}
plabel->x_pos = x_pos;
plabel->y_pos = y_pos;
plabel->scrn_pos.x = x_pos;
plabel->scrn_pos.y = y_pos;
plabel->size = size;
plabel->blink = blink;
plabel->justify = justify;
@ -1158,8 +1199,8 @@ Hptr fgHUDAddLadder( Hptr hud, \
return( NULL );
pladder->type = 0; // Not used.
pladder->x_pos = x_pos;
pladder->y_pos = y_pos;
pladder->scrn_pos.x = x_pos;
pladder->scrn_pos.y = y_pos;
pladder->scr_width = scr_width;
pladder->scr_height = scr_height;
pladder->scr_hole = hole_len;
@ -1208,8 +1249,8 @@ Hptr fgHUDAddControlSurfaces( Hptr hud,
return( NULL );
}
pcontrol_surfaces->x_pos = x_pos;
pcontrol_surfaces->y_pos = y_pos;
pcontrol_surfaces->scrn_pos.x = x_pos;
pcontrol_surfaces->scrn_pos.y = y_pos;
pcontrol_surfaces->load_value = load_value;
pinstrument->instr = pcontrol_surfaces;
@ -1253,8 +1294,8 @@ Hptr fgHUDAddControl( Hptr hud, \
if( !(pcontrol == NULL) ) {
return( NULL );
}
pcontrol->ctrl_x = ctrl_x;
pcontrol->ctrl_y = ctrl_y;
pcontrol->scrn_pos.x = ctrl_x;
pcontrol->scrn_pos.y = ctrl_y;
pcontrol->ctrl_length = ctrl_length;
pcontrol->orientation = orientation;
pcontrol->alignment = alignment;
@ -1330,7 +1371,9 @@ void fgUpdateHUD( Hptr hud ) {
glDisable(GL_LIGHTING);
glLineWidth(1);
// This is a good improvement, but needs
// to respond to a dial instead of time
// of day. Of course, we have no dial!
if( hud->time_of_day==DAY) {
switch (hud->brightness) {
case BRT_LIGHT:
@ -1355,6 +1398,9 @@ void fgUpdateHUD( Hptr hud ) {
glColor3f (0.5, 0.0, 0.0);
}
}
else {
glColor3f (0.1, 0.9, 0.1);
}
fgPrintf( FG_COCKPIT, FG_DEBUG, "HUD Code %d Status %d\n",
hud->code, hud->status );
@ -1417,9 +1463,12 @@ void fgHUDSetBrightness( Hptr hud, int brightness )
}
/* $Log$
/* Revision 1.17 1998/02/20 00:16:21 curt
/* Thursday's tweaks.
/* Revision 1.18 1998/02/21 14:53:10 curt
/* Added Charlie's HUD changes.
/*
* Revision 1.17 1998/02/20 00:16:21 curt
* Thursday's tweaks.
*
* Revision 1.16 1998/02/19 13:05:49 curt
* Incorporated some HUD tweaks from Michelle America.
* Tweaked the sky's sunset/rise colors.

View file

@ -27,7 +27,6 @@
#ifndef _HUD_H
#define _HUD_H
#include <Aircraft/aircraft.h>
#include <Flight/flight.h>
#include <Controls/controls.h>
@ -125,38 +124,61 @@ enum VIEW_MODES { HUD_VIEW, PANEL_VIEW, CHASE_VIEW, TOWER_VIEW };
// Night_Day(); // Illumination changes appearance/bitmaps.
//
// CLO 2/21/98 - added to fix compile error
typedef struct {
int type;
int sub_type;
int scr_pos;
int scr_min;
int scr_max;
int div_min;
int div_max;
int orientation;
int minimum_value;
int maximum_value;
int width_units;
int x;
int y;
} POINT;
// CLO 2/21/98 - added to fix compile error
typedef struct {
int left;
int right;
int top;
int bottom;
} RECT;
typedef struct {
// Parametric defined members
int type;
int sub_type;
int div_min;
int div_max;
int orientation;
int minimum_value;
int maximum_value;
int width_units;
int modulo; // for compass, etc. Set to 0 for non_modulo scales.
double (*load_value)( void );
// Pre-calculated members.
int scr_span;
int mid_scr;
RECT scrn_pos; // Screen rectangle for inicator
// Replaces previous parameters as:
// scr_pos -> left,bottom
// scr_max -> top, right
// scr_min -> left,bottom
double factor;
double half_width_units;
}HUD_scale, *pHUDscale;
typedef struct {
int type;
int scr_pos;
int scr_min;
int scr_max;
RECT position;
int div_min;
int div_max;
int orientation;
int label_position;
int width_units;
int modulo; // for compass, etc. Set to 0 for non_modulo scales.
double (*load_value)( void );
}HUD_circular_scale, *pHUD_circscale;
typedef struct {
int type;
int x_pos;
int y_pos;
POINT scrn_pos;
int scr_width;
int scr_height;
int scr_hole;
@ -183,8 +205,7 @@ typedef struct {
typedef struct{
int type;
int x_pos;
int y_pos;
POINT scrn_pos;
int scr_width;
int scr_hole;
int tee_height;
@ -193,14 +214,12 @@ typedef struct{
} HUD_horizon, *pHUDhorizon;
typedef struct {
int x_pos;
int y_pos;
POINT scrn_pos;
double(*load_value)(void);
} HUD_control_surfaces, *pHUDControlSurfaces;
typedef struct {
int ctrl_x;
int ctrl_y;
POINT scrn_pos; // ctrl_x, ctrl_y
int ctrl_length;
int orientation;
int alignment;
@ -214,8 +233,7 @@ typedef struct {
typedef struct {
int type;
int x_pos;
int y_pos;
POINT scrn_pos;
int size;
int blink;
int justify;
@ -228,15 +246,15 @@ typedef struct {
// Removed union HUD_instr_data to evolve this to oop code.
typedef enum{ HUDno_instr,
HUDscale,
HUDcirc_scale,
HUDladder,
HUDcirc_ladder,
HUDhorizon,
HUDlabel,
HUDcontrol_surfaces,
HUDcontrol
} hudinstype;
HUDscale,
HUDcirc_scale,
HUDladder,
HUDcirc_ladder,
HUDhorizon,
HUDlabel,
HUDcontrol_surfaces,
HUDcontrol
} hudinstype;
typedef struct HUD_INSTR_STRUCT{
hudinstype type;
@ -282,6 +300,7 @@ Hptr fgHUDAddScale ( Hptr hud, \
int min_value, \
int max_value, \
int width_units, \
int modulus, \
double (*load_value)( void ) );
Hptr fgHUDAddLabel ( Hptr hud, \
@ -354,12 +373,16 @@ Hptr fgHUDAddNumDisp( Hptr hud,
void fgUpdateHUD ( Hptr hud );
void fgUpdateHUD2( Hptr hud ); // Future use?
#endif // _HUD_H
/* $Log$
/* Revision 1.13 1998/02/20 00:16:22 curt
/* Thursday's tweaks.
/* Revision 1.14 1998/02/21 14:53:14 curt
/* Added Charlie's HUD changes.
/*
* Revision 1.13 1998/02/20 00:16:22 curt
* Thursday's tweaks.
*
* Revision 1.12 1998/02/19 13:05:52 curt
* Incorporated some HUD tweaks from Michelle America.
* Tweaked the sky's sunset/rise colors.

View file

@ -187,16 +187,17 @@ int fgInitSubsystems( void ) {
/* FG_Runway_altitude = 5000.0; */
/* FG_Altitude = FG_Runway_altitude + 3.758099; */
/* Initial Position: 10125 Jewell St. NE */
/* FG_Longitude = ( -93.15 ) * DEG_TO_RAD; */
/* FG_Latitude = ( 45.15 ) * DEG_TO_RAD; */
/* FG_Altitude = FG_Runway_altitude + 3.758099; */
// Initial Position: 10125 Jewell St. NE
// FG_Longitude = ( -93.15 ) * DEG_TO_RAD;
// FG_Latitude = ( 45.15 ) * DEG_TO_RAD;
// FG_Runway_altitude = 950.0;
// FG_Altitude = FG_Runway_altitude + 3.758099;
// Initial Position: Somewhere near the Grand Canyon
FG_Longitude = ( -112.5 ) * DEG_TO_RAD;
FG_Latitude = ( 36.5 ) * DEG_TO_RAD;
FG_Runway_altitude = 5000.0;
FG_Altitude = FG_Runway_altitude + 3.758099;
// FG_Longitude = ( -112.5 ) * DEG_TO_RAD;
// FG_Latitude = ( 36.5 ) * DEG_TO_RAD;
// FG_Runway_altitude = 5000.0;
// FG_Altitude = FG_Runway_altitude + 3.758099;
// Initial Position: (GCN) Grand Canyon Airport, AZ
// FG_Longitude = ( -112.1469647 ) * DEG_TO_RAD;
@ -380,11 +381,14 @@ int fgInitSubsystems( void ) {
/* $Log$
/* Revision 1.47 1998/02/19 13:05:53 curt
/* Incorporated some HUD tweaks from Michelle America.
/* Tweaked the sky's sunset/rise colors.
/* Other misc. tweaks.
/* Revision 1.48 1998/02/21 14:53:15 curt
/* Added Charlie's HUD changes.
/*
* Revision 1.47 1998/02/19 13:05:53 curt
* Incorporated some HUD tweaks from Michelle America.
* Tweaked the sky's sunset/rise colors.
* Other misc. tweaks.
*
* Revision 1.46 1998/02/18 15:07:06 curt
* Tweaks to build with SGI OpenGL (and therefor hopefully other accelerated
* drivers will work.)

3
Simulator/setup_env Normal file
View file

@ -0,0 +1,3 @@
export FG_ROOT=~/projects/FlightGear
export FG_ROOT_SRC=${FG_ROOT}/Src
export FG_ROOT_LIB=${FG_ROOT}/Lib