2000-02-15 03:30:01 +00:00
|
|
|
|
// panel.cxx - default, 2D single-engine prop instrument panel
|
1998-11-11 00:19:27 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// Written by David Megginson, started January 2000.
|
1998-11-11 00:19:27 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// 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.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// 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.
|
1998-11-11 00:19:27 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// $Id$
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
# include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_WINDOWS_H
|
|
|
|
|
# include <windows.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
#include <string.h>
|
1999-03-08 21:56:08 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
#include <plib/ssg.h>
|
2000-02-21 22:00:24 +00:00
|
|
|
|
#include <plib/fnt.h>
|
1998-06-27 16:47:53 +00:00
|
|
|
|
#include <GL/glut.h>
|
|
|
|
|
|
2000-02-16 23:01:03 +00:00
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
|
|
|
|
#include <simgear/misc/fgpath.hxx>
|
1998-06-27 16:47:53 +00:00
|
|
|
|
#include <Main/options.hxx>
|
1999-05-13 02:10:52 +00:00
|
|
|
|
#include <Objects/texload.h>
|
2000-02-15 03:30:01 +00:00
|
|
|
|
#include <Autopilot/autopilot.hxx>
|
2000-02-21 22:00:24 +00:00
|
|
|
|
#include <Time/fg_time.hxx>
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
1998-08-28 18:14:39 +00:00
|
|
|
|
#include "cockpit.hxx"
|
2000-02-15 03:30:01 +00:00
|
|
|
|
#include "panel.hxx"
|
2000-02-21 22:00:24 +00:00
|
|
|
|
#include "hud.hxx"
|
|
|
|
|
|
|
|
|
|
extern fgAPDataPtr APDataGlobal;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
#define SIX_X 200
|
|
|
|
|
#define SIX_Y 345
|
|
|
|
|
#define SIX_W 128
|
|
|
|
|
#define SIX_SPACING (SIX_W + 5)
|
|
|
|
|
#define SMALL_W 112
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
1998-08-28 18:14:39 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Static functions for obtaining settings.
|
|
|
|
|
//
|
|
|
|
|
// These should be replaced with functions from a global facade,
|
|
|
|
|
// or BFI (Big Friendly Interface).
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the indicated airspeed in knots.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetSpeed ()
|
|
|
|
|
{
|
|
|
|
|
return get_speed();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the roll in degrees.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetRoll ()
|
|
|
|
|
{
|
|
|
|
|
return get_roll() * RAD_TO_DEG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the pitch in degrees.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetPitch ()
|
|
|
|
|
{
|
|
|
|
|
return get_pitch() * RAD_TO_DEG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the altitude in feet.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetAltitude ()
|
|
|
|
|
{
|
|
|
|
|
return get_altitude();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the sideslip (units unknown).
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetSideSlip ()
|
|
|
|
|
{
|
|
|
|
|
return get_sideslip();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the heading in degrees.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetHeading ()
|
|
|
|
|
{
|
|
|
|
|
return get_heading();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the current autopilot heading in degrees.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetAPHeading ()
|
|
|
|
|
{
|
|
|
|
|
return fgAPget_TargetHeading();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the climb rate in feet/minute.
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetVerticalVelocity ()
|
|
|
|
|
{
|
|
|
|
|
return get_climb_rate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the throttle setting (0.0 - 1.0).
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetThrottle ()
|
|
|
|
|
{
|
|
|
|
|
return get_throttleval();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return the flaps setting (0.0 - 1.0).
|
|
|
|
|
*/
|
|
|
|
|
static double
|
|
|
|
|
panelGetFlaps ()
|
|
|
|
|
{
|
|
|
|
|
return controls.get_flaps();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static double
|
|
|
|
|
panelGetAileron ()
|
|
|
|
|
{
|
|
|
|
|
return controls.get_aileron();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static double
|
|
|
|
|
panelGetRudder ()
|
|
|
|
|
{
|
|
|
|
|
return controls.get_rudder();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static double
|
|
|
|
|
panelGetElevator ()
|
|
|
|
|
{
|
|
|
|
|
return controls.get_elevator();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static double
|
|
|
|
|
panelGetElevatorTrim ()
|
|
|
|
|
{
|
|
|
|
|
return controls.get_elevator_trim();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static char * panelGetTime (char * buf)
|
|
|
|
|
{
|
|
|
|
|
struct tm * t = FGTime::cur_time_params->getGmt();
|
|
|
|
|
sprintf(buf, " %.2d:%.2d:%.2d",
|
|
|
|
|
t->tm_hour, t->tm_min, t->tm_sec);
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Static factory functions to create textured gauges.
|
|
|
|
|
//
|
|
|
|
|
// These will be replaced first with a giant table, and then with
|
|
|
|
|
// configuration files read from an external source, but for now
|
|
|
|
|
// they're hard-coded.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct an airspeed indicator for a single-engine prop.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeAirspeedIndicator (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background.
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/airspeed.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: needle.
|
|
|
|
|
// Rotates with airspeed.
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/long-needle.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetSpeed,
|
|
|
|
|
30.0, 220.0, 36.0 / 20.0, -54.0);
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct an artificial horizon.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeHorizon (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: coloured background
|
|
|
|
|
// moves with roll only
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/horizon-bg.rgb");
|
|
|
|
|
inst->addTransformation(0, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetRoll,
|
|
|
|
|
-360.0, 360.0, -1.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 1: floating horizon
|
|
|
|
|
// moves with roll and pitch
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/horizon-float.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetRoll,
|
|
|
|
|
-360.0, 360.0, -1.0, 0.0);
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::YSHIFT,
|
|
|
|
|
panelGetPitch,
|
|
|
|
|
-20.0, 20.0, -(1.5 / 160.0) * SIX_W, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 2: rim
|
|
|
|
|
// moves with roll only
|
|
|
|
|
inst->addLayer(2, "Textures/Panel/horizon-rim.rgb");
|
|
|
|
|
inst->addTransformation(2, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetRoll,
|
|
|
|
|
-360.0, 360.0, -1.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 3: glass front of gauge
|
|
|
|
|
// fixed, with markings
|
|
|
|
|
inst->addLayer(3, "Textures/Panel/horizon-fg.rgb");
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct an altimeter.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeAltimeter (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/altimeter.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: hundreds needle (long)
|
|
|
|
|
// moves with altitude
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/long-needle.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetAltitude,
|
|
|
|
|
0.0, 100000.0, 360.0 / 1000.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 2: thousands needle (short)
|
|
|
|
|
// moves with altitude
|
|
|
|
|
inst->addLayer(2, "Textures/Panel/short-needle.rgb");
|
|
|
|
|
inst->addTransformation(2, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetAltitude,
|
|
|
|
|
0.0, 100000.0, 360.0 / 10000.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 3: ten thousands bug (outside)
|
|
|
|
|
// moves with altitude
|
|
|
|
|
inst->addLayer(3, "Textures/Panel/bug.rgb");
|
|
|
|
|
inst->addTransformation(3, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetAltitude,
|
|
|
|
|
0.0, 100000.0, 360.0 / 100000.0, 0.0);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct a turn coordinator.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeTurnCoordinator (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/turn-bg.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: little plane
|
|
|
|
|
// moves with roll
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/turn.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetRoll,
|
|
|
|
|
-30.0, 30.0, 1.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 2: little ball
|
|
|
|
|
// moves with slip/skid
|
|
|
|
|
inst->addLayer(2, "Textures/Panel/ball.rgb");
|
|
|
|
|
inst->addTransformation(2, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetSideSlip,
|
|
|
|
|
-0.1, 0.1, 450.0, 0.0);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct a gyro compass.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeGyroCompass (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: compass background
|
|
|
|
|
// rotates with heading
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/gyro-bg.rgb");
|
|
|
|
|
inst->addTransformation(0, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetHeading,
|
|
|
|
|
-360.0, 360.0, -1.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 1: heading bug
|
|
|
|
|
// rotates with heading and AP heading
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/bug.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetHeading,
|
|
|
|
|
-360.0, 360.0, -1.0, 0.0);
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetAPHeading,
|
|
|
|
|
-360.0, 360.0, 1.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 2: fixed center
|
|
|
|
|
inst->addLayer(2, "Textures/Panel/gyro-fg.rgb");
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct a vertical velocity indicator.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeVerticalVelocity (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/vertical.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: needle
|
|
|
|
|
// moves with vertical velocity
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/long-needle.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetVerticalVelocity,
|
|
|
|
|
-2000.0, 2000.0, 42.0/500.0, 270.0);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct an RPM gauge.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeRPMGauge (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/rpm.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: long needle
|
|
|
|
|
// FIXME: moves with throttle (for now)
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/long-needle.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetThrottle,
|
|
|
|
|
0.0, 100.0, 300.0, -150.0);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct a flap position indicator.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeFlapIndicator (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/flaps.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: long needle
|
|
|
|
|
// shifted over, rotates with flap position
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/long-needle.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::XSHIFT,
|
|
|
|
|
-(SMALL_W / 4) + (SMALL_W / 16));
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::ROTATION,
|
|
|
|
|
panelGetFlaps,
|
|
|
|
|
0.0, 1.0, 120.0, 30.0);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeChronometer (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/clock.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: text
|
|
|
|
|
// displays current GMT
|
|
|
|
|
FGCharInstrumentLayer * text =
|
|
|
|
|
new FGCharInstrumentLayer(panelGetTime,
|
|
|
|
|
SMALL_W, SMALL_W, 1);
|
|
|
|
|
text->setPointSize(14);
|
|
|
|
|
text->setColor(0.2, 0.2, 0.2);
|
|
|
|
|
inst->addLayer(text);
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::XSHIFT, SMALL_W * -0.38);
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::YSHIFT, SMALL_W * -0.06);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct control-position indicators.
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeControls (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: gauge background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/controls.rgb");
|
|
|
|
|
|
|
|
|
|
// Layer 1: bug
|
|
|
|
|
// moves left-right with aileron
|
|
|
|
|
inst->addLayer(1, "Textures/Panel/bug.rgb");
|
|
|
|
|
inst->addTransformation(1, FGInstrumentLayer::XSHIFT, panelGetAileron,
|
|
|
|
|
-1.0, 1.0, SMALL_W * .75 / 2.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 2: bug
|
|
|
|
|
// moves left-right with rudder
|
|
|
|
|
inst->addLayer(2, "Textures/Panel/bug.rgb");
|
|
|
|
|
inst->addTransformation(2, FGInstrumentLayer::ROTATION, 180.0);
|
|
|
|
|
inst->addTransformation(2, FGInstrumentLayer::XSHIFT, panelGetRudder,
|
|
|
|
|
-1.0, 1.0, -SMALL_W * .75 / 2.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 3: bug
|
|
|
|
|
// moves up-down with elevator trim
|
|
|
|
|
inst->addLayer(3, "Textures/Panel/bug.rgb");
|
|
|
|
|
inst->addTransformation(3, FGInstrumentLayer::ROTATION, 270.0);
|
|
|
|
|
inst->addTransformation(3, FGInstrumentLayer::YSHIFT,
|
|
|
|
|
-SMALL_W * (3.0 / 8.0));
|
|
|
|
|
inst->addTransformation(3, FGInstrumentLayer::XSHIFT, panelGetElevatorTrim,
|
|
|
|
|
-1.0, 1.0, SMALL_W * .75 / 2.0, 0.0);
|
|
|
|
|
|
|
|
|
|
// Layer 4: bug
|
|
|
|
|
// moves up-down with elevator
|
|
|
|
|
inst->addLayer(4, "Textures/Panel/bug.rgb");
|
|
|
|
|
inst->addTransformation(4, FGInstrumentLayer::ROTATION, 90.0);
|
|
|
|
|
inst->addTransformation(4, FGInstrumentLayer::YSHIFT,
|
|
|
|
|
-SMALL_W * (3.0 / 8.0));
|
|
|
|
|
inst->addTransformation(4, FGInstrumentLayer::XSHIFT, panelGetElevator,
|
|
|
|
|
-1.0, 1.0, -SMALL_W * .75 / 2.0, 0.0);
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct a NAV1 gauge (dummy for now).
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeNAV1 (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/gyro-bg.rgb");
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct a NAV2 gauge (dummy for now).
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeNAV2 (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/gyro-bg.rgb");
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct an ADF gauge (dummy for now).
|
|
|
|
|
*/
|
|
|
|
|
static FGPanelInstrument *
|
|
|
|
|
makeADF (int x, int y)
|
|
|
|
|
{
|
|
|
|
|
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
|
|
|
|
|
|
|
|
|
// Layer 0: background
|
|
|
|
|
inst->addLayer(0, "Textures/Panel/gyro-bg.rgb");
|
|
|
|
|
|
|
|
|
|
return inst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGPanel.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanel * FGPanel::OurPanel = 0;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanel::FGPanel ()
|
|
|
|
|
{
|
|
|
|
|
if (OurPanel == 0) {
|
|
|
|
|
OurPanel = this;
|
|
|
|
|
} else {
|
|
|
|
|
FG_LOG(FG_GENERAL, FG_ALERT, "Multiple panels");
|
|
|
|
|
exit(-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int x = SIX_X;
|
|
|
|
|
int y = SIX_Y;
|
|
|
|
|
|
|
|
|
|
FGPath tpath(current_options.get_fg_root());
|
|
|
|
|
tpath.append("Textures/Panel/panel-bg.rgb");
|
|
|
|
|
_bg = new ssgTexture((char *)tpath.c_str(), false, false);
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Chronometer alone at side
|
|
|
|
|
x = SIX_X - SIX_SPACING - 8;
|
|
|
|
|
_instruments.push_back(makeChronometer(x, y));
|
|
|
|
|
|
|
|
|
|
// Top row
|
|
|
|
|
x = SIX_X;
|
|
|
|
|
_instruments.push_back(makeAirspeedIndicator(x, y));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
x += SIX_SPACING;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_instruments.push_back(makeHorizon(x, y));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
x += SIX_SPACING;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_instruments.push_back(makeAltimeter(x, y));
|
|
|
|
|
x += SIX_SPACING + 20;
|
|
|
|
|
_instruments.push_back(makeNAV1(x, y));
|
|
|
|
|
|
|
|
|
|
// Middle row
|
2000-02-15 03:30:01 +00:00
|
|
|
|
x = SIX_X;
|
|
|
|
|
y -= SIX_SPACING;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_instruments.push_back(makeTurnCoordinator(x, y));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
x += SIX_SPACING;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_instruments.push_back(makeGyroCompass(x, y));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
x += SIX_SPACING;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_instruments.push_back(makeVerticalVelocity(x, y));
|
|
|
|
|
x += SIX_SPACING + 20;
|
|
|
|
|
_instruments.push_back(makeNAV2(x, y));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Bottom row
|
|
|
|
|
x = SIX_X;
|
|
|
|
|
y -= SIX_SPACING + 10;
|
|
|
|
|
_instruments.push_back(makeControls(x, y));
|
|
|
|
|
x += SIX_SPACING;
|
|
|
|
|
_instruments.push_back(makeFlapIndicator(x, y));
|
|
|
|
|
x += SIX_SPACING;
|
|
|
|
|
_instruments.push_back(makeRPMGauge(x, y));
|
|
|
|
|
x += SIX_SPACING + 20;
|
|
|
|
|
y += 10;
|
|
|
|
|
_instruments.push_back(makeADF(x, y));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanel::~FGPanel ()
|
|
|
|
|
{
|
|
|
|
|
OurPanel = 0;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
|
|
|
|
instrument_list_type::iterator current = _instruments.begin();
|
|
|
|
|
instrument_list_type::iterator last = _instruments.end();
|
|
|
|
|
|
|
|
|
|
for ( ; current != last; ++current) {
|
|
|
|
|
delete *current;
|
|
|
|
|
*current = 0;
|
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float
|
|
|
|
|
FGPanel::get_height () const
|
|
|
|
|
{
|
|
|
|
|
return _panel_h;
|
1998-06-27 16:47:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
|
|
|
|
FGPanel::ReInit (int x, int y, int finx, int finy)
|
|
|
|
|
{
|
|
|
|
|
_x = x;
|
|
|
|
|
_y = y;
|
|
|
|
|
_w = finx - x;
|
|
|
|
|
_h = finy - y;
|
|
|
|
|
_panel_h = (int)((finy - y) * 0.5768 + 1);
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
|
|
|
|
FGPanel::Update () const
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-15 03:30:01 +00:00
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
|
glPushMatrix();
|
|
|
|
|
glLoadIdentity();
|
|
|
|
|
gluOrtho2D(_x, _x + _w, _y, _y + _h);
|
|
|
|
|
|
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
|
glPushMatrix();
|
|
|
|
|
glLoadIdentity();
|
|
|
|
|
|
|
|
|
|
// Draw the background
|
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
2000-02-21 22:00:24 +00:00
|
|
|
|
glDisable(GL_LIGHTING);
|
|
|
|
|
glColor3f(1.0, 1.0, 1.0);
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, _bg->getHandle());
|
2000-02-15 03:30:01 +00:00
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
2000-02-21 22:00:24 +00:00
|
|
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
2000-02-15 03:30:01 +00:00
|
|
|
|
glBegin(GL_POLYGON);
|
|
|
|
|
glTexCoord2f(0.0, 0.0); glVertex3f(_x, _y, 0);
|
|
|
|
|
glTexCoord2f(10.0, 0.0); glVertex3f(_x + _w, _y, 0);
|
|
|
|
|
glTexCoord2f(10.0, 5.0); glVertex3f(_x + _w, _y + _panel_h, 0);
|
|
|
|
|
glTexCoord2f(0.0, 5.0); glVertex3f(_x, _y + _panel_h, 0);
|
|
|
|
|
glEnd();
|
|
|
|
|
|
|
|
|
|
// Draw the instruments.
|
2000-02-21 22:00:24 +00:00
|
|
|
|
instrument_list_type::const_iterator current = _instruments.begin();
|
|
|
|
|
instrument_list_type::const_iterator end = _instruments.end();
|
|
|
|
|
|
|
|
|
|
for ( ; current != end; current++) {
|
|
|
|
|
FGPanelInstrument * instr = *current;
|
|
|
|
|
glLoadIdentity();
|
|
|
|
|
glTranslated(instr->getXPos(), instr->getYPos(), 0);
|
|
|
|
|
instr->draw();
|
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
|
glPopMatrix();
|
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
|
glPopMatrix();
|
2000-02-21 22:00:24 +00:00
|
|
|
|
ssgForceBasicState();
|
|
|
|
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// Implementation of FGPanelInstrument.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanelInstrument::FGPanelInstrument ()
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-15 03:30:01 +00:00
|
|
|
|
setPosition(0, 0);
|
|
|
|
|
setSize(0, 0);
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanelInstrument::FGPanelInstrument (int x, int y, int w, int h)
|
|
|
|
|
{
|
|
|
|
|
setPosition(x, y);
|
|
|
|
|
setSize(w, h);
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanelInstrument::~FGPanelInstrument ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGPanelInstrument::setPosition (int x, int y)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-15 03:30:01 +00:00
|
|
|
|
_x = x;
|
|
|
|
|
_y = y;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
|
|
|
|
FGPanelInstrument::setSize (int w, int h)
|
|
|
|
|
{
|
|
|
|
|
_w = w;
|
|
|
|
|
_h = h;
|
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
int
|
|
|
|
|
FGPanelInstrument::getXPos () const
|
|
|
|
|
{
|
|
|
|
|
return _x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
FGPanelInstrument::getYPos () const
|
|
|
|
|
{
|
|
|
|
|
return _y;
|
1999-01-07 19:25:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
1998-08-28 18:14:39 +00:00
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Implementation of FGLayeredInstrument.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
1999-01-07 19:25:53 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::FGLayeredInstrument (int x, int y, int w, int h)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
: FGPanelInstrument(x, y, w, h)
|
|
|
|
|
{
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::~FGLayeredInstrument ()
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// FIXME: free layers
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::draw () const
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
layer_list::const_iterator it = _layers.begin();
|
|
|
|
|
layer_list::const_iterator last = _layers.end();
|
|
|
|
|
while (it != last) {
|
|
|
|
|
(*it)->draw();
|
|
|
|
|
it++;
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::addLayer (FGInstrumentLayer *layer)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_layers.push_back(layer);
|
1998-08-28 18:14:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::addLayer (int layer, const char *textureName)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
addLayer(new FGTexturedInstrumentLayer(textureName, _w, _h, layer));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-01-07 19:25:53 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::addTransformation (int layer,
|
|
|
|
|
FGInstrumentLayer::transform_type type,
|
|
|
|
|
FGInstrumentLayer::transform_func func,
|
|
|
|
|
double min, double max,
|
|
|
|
|
double factor, double offset)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_layers[layer]->addTransformation(type, func, min, max, factor, offset);
|
1999-01-07 19:25:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Implementation of FGInstrumentLayer.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGInstrumentLayer::FGInstrumentLayer (int w, int h, int z)
|
|
|
|
|
: _w(w),
|
|
|
|
|
_h(h),
|
|
|
|
|
_z(z)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-02-12 01:46:29 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGInstrumentLayer::~FGInstrumentLayer ()
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
transformation_list::iterator it;
|
|
|
|
|
transformation_list::iterator end;
|
|
|
|
|
while (it != end) {
|
|
|
|
|
delete *it;
|
|
|
|
|
it++;
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGInstrumentLayer::transform () const
|
|
|
|
|
{
|
|
|
|
|
glTranslatef(0.0, 0.0, (_z / 100.0) + 0.1);
|
|
|
|
|
|
|
|
|
|
transformation_list::const_iterator it = _transformations.begin();
|
|
|
|
|
transformation_list::const_iterator last = _transformations.end();
|
|
|
|
|
while (it != last) {
|
|
|
|
|
transformation *t = *it;
|
|
|
|
|
double value = (t->func == 0 ? 0.0 : (*(t->func))());
|
|
|
|
|
if (value < t->min) {
|
|
|
|
|
value = t->min;
|
|
|
|
|
} else if (value > t->max) {
|
|
|
|
|
value = t->max;
|
|
|
|
|
}
|
|
|
|
|
value = value * t->factor + t->offset;
|
|
|
|
|
|
|
|
|
|
switch (t->type) {
|
|
|
|
|
case XSHIFT:
|
|
|
|
|
glTranslatef(value, 0.0, 0.0);
|
|
|
|
|
break;
|
|
|
|
|
case YSHIFT:
|
|
|
|
|
glTranslatef(0.0, value, 0.0);
|
|
|
|
|
break;
|
|
|
|
|
case ROTATION:
|
|
|
|
|
glRotatef(-value, 0.0, 0.0, 1.0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
it++;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1998-11-09 23:38:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGInstrumentLayer::addTransformation (transform_type type,
|
|
|
|
|
transform_func func,
|
|
|
|
|
double min, double max,
|
|
|
|
|
double factor, double offset)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
transformation *t = new transformation;
|
|
|
|
|
t->type = type;
|
|
|
|
|
t->func = func;
|
|
|
|
|
t->min = min;
|
|
|
|
|
t->max = max;
|
|
|
|
|
t->factor = factor;
|
|
|
|
|
t->offset = offset;
|
|
|
|
|
_transformations.push_back(t);
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Implementation of FGTexturedInstrumentLayer.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGTexturedInstrumentLayer::FGTexturedInstrumentLayer (const char *tname,
|
|
|
|
|
int w, int h, int z)
|
|
|
|
|
: FGInstrumentLayer(w, h, z)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
setTexture(tname);
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGTexturedInstrumentLayer::FGTexturedInstrumentLayer (ssgTexture * texture,
|
|
|
|
|
int w, int h, int z)
|
|
|
|
|
: FGInstrumentLayer(w, h, z)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
setTexture(texture);
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGTexturedInstrumentLayer::~FGTexturedInstrumentLayer ()
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGTexturedInstrumentLayer::draw () const
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
int w2 = _w / 2;
|
|
|
|
|
int h2 = _h / 2;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
glPushMatrix();
|
|
|
|
|
transform();
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, _texture->getHandle());
|
|
|
|
|
glBegin(GL_POLYGON);
|
|
|
|
|
// FIXME: is this really correct
|
|
|
|
|
// for layering?
|
|
|
|
|
glTexCoord2f(0.0, 0.0); glVertex2f(-w2, -h2);
|
|
|
|
|
glTexCoord2f(1.0, 0.0); glVertex2f(w2, -h2);
|
|
|
|
|
glTexCoord2f(1.0, 1.0); glVertex2f(w2, h2);
|
|
|
|
|
glTexCoord2f(0.0, 1.0); glVertex2f(-w2, h2);
|
|
|
|
|
glEnd();
|
|
|
|
|
glPopMatrix();
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGTexturedInstrumentLayer::setTexture (const char *textureName)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGPath tpath(current_options.get_fg_root());
|
|
|
|
|
tpath.append(textureName);
|
|
|
|
|
ssgTexture * texture = new ssgTexture((char *)tpath.c_str(), false, false);
|
|
|
|
|
cerr << "Loaded texture " << textureName << endl;
|
|
|
|
|
setTexture(texture);
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Implementation of FGCharInstrumentLayer.
|
2000-02-15 03:30:01 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGCharInstrumentLayer::FGCharInstrumentLayer (text_func func,
|
|
|
|
|
int w, int h, int z)
|
|
|
|
|
: FGInstrumentLayer(w, h, z),
|
|
|
|
|
_func(func)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_renderer.setFont(guiFntHandle);
|
|
|
|
|
_renderer.setPointSize(14);
|
|
|
|
|
_color[0] = _color[1] = _color[2] = 0.0;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGCharInstrumentLayer::~FGCharInstrumentLayer ()
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGCharInstrumentLayer::draw () const
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
glPushMatrix();
|
|
|
|
|
glColor3fv(_color);
|
|
|
|
|
transform();
|
|
|
|
|
_renderer.begin();
|
|
|
|
|
_renderer.start3f(0, 0, 0);
|
|
|
|
|
_renderer.puts((*_func)(_buf));
|
|
|
|
|
_renderer.end();
|
|
|
|
|
glColor3f(1.0, 1.0, 1.0); // FIXME
|
|
|
|
|
glPopMatrix();
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGCharInstrumentLayer::setColor (float r, float g, float b)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_color[0] = r;
|
|
|
|
|
_color[1] = g;
|
|
|
|
|
_color[2] = b;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
void
|
|
|
|
|
FGCharInstrumentLayer::setPointSize (const float size)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_renderer.setPointSize(size);
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGCharInstrumentLayer::setFont(fntFont * font)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_renderer.setFont(font);
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// end of panel.cxx
|