Instrument panel updates from David Megginson.
- the panel uses much, much less texture memory, and draws much faster, at least on my hardware - there is a wet (magnetic) compass at the top of the panel - the gyro compass shows true heading again, but don't get used to it: we're going to set it up to drift soon - there are TO/FROM flags on NAV1 and NAV2 (but no GS flag yet) - the ADF looks a little more realistic (if you can forgive the ugly needle) - when the HUD is not open, the framerate is moved to the right side of the screen so that it won't be obscured by the mag compass
This commit is contained in:
parent
7863c607bf
commit
9dc5c9ca22
7 changed files with 531 additions and 161 deletions
|
@ -505,7 +505,8 @@ void fgCockpitUpdate( void ) {
|
|||
glColor3f (0.9, 0.4, 0.2);
|
||||
|
||||
guiFnt.drawString( buf,
|
||||
width/2 - guiFnt.getStringWidth(buf)/2,
|
||||
// width/2 - guiFnt.getStringWidth(buf)/2,
|
||||
int(width - guiFnt.getStringWidth(buf) - 10),
|
||||
10 );
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_LIGHTING);
|
||||
|
|
|
@ -201,7 +201,7 @@ FGPanel::doMouseAction (int button, int updown, int x, int y)
|
|||
int iw = inst->getWidth() / 2;
|
||||
int ih = inst->getHeight() / 2;
|
||||
if (x >= ix - iw && x < ix + iw && y >= iy - ih && y < iy + ih) {
|
||||
cout << "Do mouse action for component " << i << '\n';
|
||||
// cout << "Do mouse action for component " << i << '\n';
|
||||
_mouseDown = true;
|
||||
_mouseDelay = 20;
|
||||
_mouseInstrument = inst;
|
||||
|
@ -213,7 +213,7 @@ FGPanel::doMouseAction (int button, int updown, int x, int y)
|
|||
return true;
|
||||
}
|
||||
}
|
||||
cout << "Did not click on an instrument\n";
|
||||
// cout << "Did not click on an instrument\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -224,7 +224,7 @@ FGPanel::doMouseAction (int button, int updown, int x, int y)
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
FGAdjustAction::FGAdjustAction (getter_type getter, setter_type setter,
|
||||
double increment, double min, double max,
|
||||
float increment, float min, float max,
|
||||
bool wrap=false)
|
||||
: _getter(getter), _setter(setter), _increment(increment),
|
||||
_min(min), _max(max), _wrap(wrap)
|
||||
|
@ -238,15 +238,15 @@ FGAdjustAction::~FGAdjustAction ()
|
|||
void
|
||||
FGAdjustAction::doAction ()
|
||||
{
|
||||
double value = (*_getter)();
|
||||
cout << "Do action; value=" << value << '\n';
|
||||
float value = (*_getter)();
|
||||
// cout << "Do action; value=" << value << '\n';
|
||||
value += _increment;
|
||||
if (value < _min) {
|
||||
value = (_wrap ? _max : _min);
|
||||
} else if (value > _max) {
|
||||
value = (_wrap ? _min : _max);
|
||||
}
|
||||
cout << "New value is " << value << '\n';
|
||||
// cout << "New value is " << value << '\n';
|
||||
(*_setter)(value);
|
||||
}
|
||||
|
||||
|
@ -270,7 +270,7 @@ FGSwapAction::~FGSwapAction ()
|
|||
void
|
||||
FGSwapAction::doAction ()
|
||||
{
|
||||
double value = (*_getter1)();
|
||||
float value = (*_getter1)();
|
||||
(*_setter1)((*_getter2)());
|
||||
(*_setter2)(value);
|
||||
}
|
||||
|
@ -382,10 +382,10 @@ FGPanelInstrument::doMouseAction (int button, int x, int y)
|
|||
{
|
||||
action_list_type::iterator it = _actions.begin();
|
||||
action_list_type::iterator last = _actions.end();
|
||||
cout << "Mouse action at " << x << ',' << y << '\n';
|
||||
// cout << "Mouse action at " << x << ',' << y << '\n';
|
||||
for ( ; it != last; it++) {
|
||||
cout << "Trying action at " << it->x << ',' << it->y << ','
|
||||
<< it->w <<',' << it->h << '\n';
|
||||
// cout << "Trying action at " << it->x << ',' << it->y << ','
|
||||
// << it->w <<',' << it->h << '\n';
|
||||
if (button == it->button &&
|
||||
x >= it->x && x < it->x + it->w && y >= it->y && y < it->y + it->h) {
|
||||
it->action->doAction();
|
||||
|
@ -431,16 +431,25 @@ FGLayeredInstrument::addLayer (FGInstrumentLayer *layer)
|
|||
}
|
||||
|
||||
int
|
||||
FGLayeredInstrument::addLayer (ssgTexture * texture)
|
||||
FGLayeredInstrument::addLayer (ssgTexture * texture,
|
||||
int w = -1, int h = -1,
|
||||
float texX1 = 0.0, float texY1 = 0.0,
|
||||
float texX2 = 1.0, float texY2 = 1.0)
|
||||
{
|
||||
return addLayer(new FGTexturedLayer(texture, _w, _h));
|
||||
if (w == -1)
|
||||
w = _w;
|
||||
if (h == -1)
|
||||
h = _h;
|
||||
FGTexturedLayer * layer = new FGTexturedLayer(texture, w, h);
|
||||
layer->setTextureCoords(texX1, texY1, texX2, texY2);
|
||||
return addLayer(layer);
|
||||
}
|
||||
|
||||
void
|
||||
FGLayeredInstrument::addTransformation (FGInstrumentLayer::transform_type type,
|
||||
FGInstrumentLayer::transform_func func,
|
||||
double min, double max,
|
||||
double factor, double offset)
|
||||
float min, float max,
|
||||
float factor, float offset)
|
||||
{
|
||||
int layer = _layers.size() - 1;
|
||||
_layers[layer]->addTransformation(type, func, min, max, factor, offset);
|
||||
|
@ -448,7 +457,7 @@ FGLayeredInstrument::addTransformation (FGInstrumentLayer::transform_type type,
|
|||
|
||||
void
|
||||
FGLayeredInstrument::addTransformation (FGInstrumentLayer::transform_type type,
|
||||
double offset)
|
||||
float offset)
|
||||
{
|
||||
addTransformation(type, 0, 0.0, 0.0, 1.0, offset);
|
||||
}
|
||||
|
@ -482,7 +491,7 @@ FGInstrumentLayer::transform () const
|
|||
transformation_list::const_iterator last = _transformations.end();
|
||||
while (it != last) {
|
||||
transformation *t = *it;
|
||||
double value = (t->func == 0 ? 0.0 : (*(t->func))());
|
||||
float value = (t->func == 0 ? 0.0 : (*(t->func))());
|
||||
if (value < t->min) {
|
||||
value = t->min;
|
||||
} else if (value > t->max) {
|
||||
|
@ -508,8 +517,8 @@ FGInstrumentLayer::transform () const
|
|||
void
|
||||
FGInstrumentLayer::addTransformation (transform_type type,
|
||||
transform_func func,
|
||||
double min, double max,
|
||||
double factor, double offset)
|
||||
float min, float max,
|
||||
float factor, float offset)
|
||||
{
|
||||
transformation *t = new transformation;
|
||||
t->type = type;
|
||||
|
@ -528,8 +537,8 @@ FGInstrumentLayer::addTransformation (transform_type type,
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
FGTexturedLayer::FGTexturedLayer (ssgTexture * texture, int w, int h,
|
||||
double texX1 = 0.0, double texY1 = 0.0,
|
||||
double texX2 = 1.0, double texY2 = 1.0)
|
||||
float texX1 = 0.0, float texY1 = 0.0,
|
||||
float texX2 = 1.0, float texY2 = 1.0)
|
||||
: FGInstrumentLayer(w, h),
|
||||
_texX1(texX1), _texY1(texY1), _texX2(texX2), _texY2(texY2)
|
||||
{
|
||||
|
@ -648,7 +657,7 @@ FGTextLayer::Chunk::Chunk (text_func func, char * fmt = "%s")
|
|||
}
|
||||
|
||||
FGTextLayer::Chunk::Chunk (double_func func, char * fmt = "%.2f",
|
||||
double mult = 1.0)
|
||||
float mult = 1.0)
|
||||
: _type(FGTextLayer::DOUBLE_FUNC), _fmt(fmt), _mult(mult)
|
||||
{
|
||||
_value._dfunc = func;
|
||||
|
|
|
@ -142,17 +142,17 @@ public:
|
|||
typedef double (*getter_type)();
|
||||
typedef void (*setter_type)(double);
|
||||
|
||||
FGAdjustAction (getter_type getter, setter_type setter, double increment,
|
||||
double min, double max, bool wrap=false);
|
||||
FGAdjustAction (getter_type getter, setter_type setter, float increment,
|
||||
float min, float max, bool wrap=false);
|
||||
virtual ~FGAdjustAction ();
|
||||
virtual void doAction ();
|
||||
|
||||
private:
|
||||
getter_type _getter;
|
||||
setter_type _setter;
|
||||
double _increment;
|
||||
double _min;
|
||||
double _max;
|
||||
float _increment;
|
||||
float _min;
|
||||
float _max;
|
||||
bool _wrap;
|
||||
};
|
||||
|
||||
|
@ -293,8 +293,8 @@ public:
|
|||
virtual void transform () const;
|
||||
|
||||
virtual void addTransformation (transform_type type, transform_func func,
|
||||
double min, double max,
|
||||
double factor = 1.0, double offset = 0.0);
|
||||
float min, float max,
|
||||
float factor = 1.0, float offset = 0.0);
|
||||
|
||||
protected:
|
||||
int _w, _h;
|
||||
|
@ -302,10 +302,10 @@ protected:
|
|||
typedef struct {
|
||||
transform_type type;
|
||||
transform_func func;
|
||||
double min;
|
||||
double max;
|
||||
double factor;
|
||||
double offset;
|
||||
float min;
|
||||
float max;
|
||||
float factor;
|
||||
float offset;
|
||||
} transformation;
|
||||
typedef vector<transformation *> transformation_list;
|
||||
transformation_list _transformations;
|
||||
|
@ -341,13 +341,16 @@ public:
|
|||
|
||||
// Transfer pointer ownership!!
|
||||
virtual int addLayer (FGInstrumentLayer *layer);
|
||||
virtual int addLayer (ssgTexture * texture);
|
||||
virtual int addLayer (ssgTexture * texture,
|
||||
int w = -1, int h = -1,
|
||||
float texX1 = 0.0, float texY1 = 0.0,
|
||||
float texX2 = 1.0, float texY2 = 1.0);
|
||||
virtual void addTransformation (FGInstrumentLayer::transform_type type,
|
||||
FGInstrumentLayer::transform_func func,
|
||||
double min, double max,
|
||||
double factor = 1.0, double offset = 0.0);
|
||||
float min, float max,
|
||||
float factor = 1.0, float offset = 0.0);
|
||||
virtual void addTransformation (FGInstrumentLayer::transform_type type,
|
||||
double offset);
|
||||
float offset);
|
||||
|
||||
protected:
|
||||
layer_list _layers;
|
||||
|
@ -367,17 +370,28 @@ class FGTexturedLayer : public FGInstrumentLayer
|
|||
{
|
||||
public:
|
||||
FGTexturedLayer (ssgTexture * texture, int w, int h,
|
||||
double texX1 = 0.0, double texY1 = 0.0,
|
||||
double texX2 = 1.0, double texY2 = 1.0);
|
||||
float texX1 = 0.0, float texY1 = 0.0,
|
||||
float texX2 = 1.0, float texY2 = 1.0);
|
||||
virtual ~FGTexturedLayer ();
|
||||
|
||||
virtual void draw () const;
|
||||
|
||||
virtual void setTexture (ssgTexture * texture) { _texture = texture; }
|
||||
virtual void setTextureCoords (float x1, float y1, float x2, float y2) {
|
||||
_texX1 = x1; _texY1 = y1; _texX2 = x2; _texY2 = y2;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
virtual void setTextureCoords (float x1, float y1,
|
||||
float x2, float y2) const {
|
||||
_texX1 = x1; _texY1 = y1; _texX2 = x2; _texY2 = y2;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
ssgTexture * _texture;
|
||||
double _texX1, _texY1, _texX2, _texY2;
|
||||
mutable float _texX1, _texY1, _texX2, _texY2;
|
||||
};
|
||||
|
||||
|
||||
|
@ -405,7 +419,7 @@ public:
|
|||
public:
|
||||
Chunk (char * text, char * fmt = "%s");
|
||||
Chunk (text_func func, char * fmt = "%s");
|
||||
Chunk (double_func func, char * fmt = "%.2f", double mult = 1.0);
|
||||
Chunk (double_func func, char * fmt = "%.2f", float mult = 1.0);
|
||||
|
||||
char * getValue () const;
|
||||
private:
|
||||
|
@ -416,7 +430,7 @@ public:
|
|||
double_func _dfunc;
|
||||
} _value;
|
||||
char * _fmt;
|
||||
double _mult;
|
||||
float _mult;
|
||||
mutable char _buf[1024];
|
||||
};
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ void FGRadioStack::update( double lon, double lat, double elev ) {
|
|||
nav1_gs_dist = 0.0;
|
||||
}
|
||||
|
||||
if ( nav1_dme_dist < nav1_effective_range * NM_TO_METER ) {
|
||||
if ( nav1_loc_dist < nav1_effective_range * NM_TO_METER ) {
|
||||
nav1_inrange = true;
|
||||
|
||||
// wgs84 heading
|
||||
|
@ -113,7 +113,7 @@ void FGRadioStack::update( double lon, double lat, double elev ) {
|
|||
nav2_gs_dist = 0.0;
|
||||
}
|
||||
|
||||
if ( nav2_dme_dist < nav2_effective_range * NM_TO_METER ) {
|
||||
if ( nav2_loc_dist < nav2_effective_range * NM_TO_METER ) {
|
||||
nav2_inrange = true;
|
||||
|
||||
// wgs84 heading
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
#include "panel.hxx"
|
||||
#include "steam.hxx"
|
||||
#include "radiostack.hxx"
|
||||
|
||||
// Macros for instrument sizes
|
||||
// (these aren't used consistently
|
||||
|
@ -43,10 +44,15 @@
|
|||
#define SIX_SPACING (SIX_W + 5)
|
||||
#define SMALL_W 112
|
||||
|
||||
#define createTexture(a) FGTextureManager::createTexture(a)
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Static functions for obtaining settings.
|
||||
//
|
||||
// These are all temporary, and should be moved somewhere else
|
||||
// as soon as convenient.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static char * panelGetTime ()
|
||||
|
@ -58,6 +64,138 @@ static char * panelGetTime ()
|
|||
return buf;
|
||||
}
|
||||
|
||||
static bool panelGetNAV1TO ()
|
||||
{
|
||||
if (current_radiostack->get_nav1_inrange()) {
|
||||
double heading = current_radiostack->get_nav1_heading();
|
||||
double radial = current_radiostack->get_nav1_radial();
|
||||
double var = FGBFI::getMagVar();
|
||||
if (current_radiostack->get_nav1_loc()) {
|
||||
double offset = fabs(heading - radial);
|
||||
return (offset<= 8.0 || offset >= 352.0);
|
||||
} else {
|
||||
double offset =
|
||||
fabs(heading - var - radial);
|
||||
return (offset <= 20.0 || offset >= 340.0);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool panelGetNAV1FROM ()
|
||||
{
|
||||
if (current_radiostack->get_nav1_inrange()) {
|
||||
double heading = current_radiostack->get_nav1_heading();
|
||||
double radial = current_radiostack->get_nav1_radial();
|
||||
double var = FGBFI::getMagVar();
|
||||
if (current_radiostack->get_nav1_loc()) {
|
||||
double offset = fabs(heading - radial);
|
||||
return (offset >= 172.0 && offset<= 188.0);
|
||||
} else {
|
||||
double offset =
|
||||
fabs(heading - var - radial);
|
||||
return (offset >= 160.0 && offset <= 200.0);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool panelGetNAV2TO ()
|
||||
{
|
||||
if (current_radiostack->get_nav2_inrange()) {
|
||||
double heading = current_radiostack->get_nav2_heading();
|
||||
double radial = current_radiostack->get_nav2_radial();
|
||||
double var = FGBFI::getMagVar();
|
||||
if (current_radiostack->get_nav2_loc()) {
|
||||
double offset = fabs(heading - radial);
|
||||
return (offset<= 8.0 || offset >= 352.0);
|
||||
} else {
|
||||
double offset =
|
||||
fabs(heading - var - radial);
|
||||
return (offset <= 20.0 || offset >= 340.0);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool panelGetNAV2FROM ()
|
||||
{
|
||||
if (current_radiostack->get_nav2_inrange()) {
|
||||
double heading = current_radiostack->get_nav2_heading();
|
||||
double radial = current_radiostack->get_nav2_radial();
|
||||
double var = FGBFI::getMagVar();
|
||||
if (current_radiostack->get_nav2_loc()) {
|
||||
double offset = fabs(heading - radial);
|
||||
return (offset >= 172.0 && offset<= 188.0);
|
||||
} else {
|
||||
double offset =
|
||||
fabs(heading - var - radial);
|
||||
return (offset >= 160.0 && offset <= 200.0);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Special class for magnetic compass ribbon layer.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class MagRibbon : public FGTexturedLayer
|
||||
{
|
||||
public:
|
||||
MagRibbon (int w, int h);
|
||||
virtual ~MagRibbon () {}
|
||||
|
||||
virtual void draw () const;
|
||||
};
|
||||
|
||||
MagRibbon::MagRibbon (int w, int h)
|
||||
: FGTexturedLayer(createTexture("Textures/Panel/compass-ribbon.rgb"), w, h)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
MagRibbon::draw () const
|
||||
{
|
||||
double heading = FGSteam::get_MH_deg();
|
||||
double xoffset, yoffset;
|
||||
|
||||
while (heading >= 360.0) {
|
||||
heading -= 360.0;
|
||||
}
|
||||
while (heading < 0.0) {
|
||||
heading += 360.0;
|
||||
}
|
||||
|
||||
if (heading >= 60.0 && heading <= 180.0) {
|
||||
xoffset = heading / 240.0;
|
||||
yoffset = 0.75;
|
||||
} else if (heading >= 150.0 && heading <= 270.0) {
|
||||
xoffset = (heading - 90.0) / 240.0;
|
||||
yoffset = 0.50;
|
||||
} else if (heading >= 240.0 && heading <= 360.0) {
|
||||
xoffset = (heading - 180.0) / 240.0;
|
||||
yoffset = 0.25;
|
||||
} else {
|
||||
if (heading < 270.0)
|
||||
heading += 360.0;
|
||||
xoffset = (heading - 270.0) / 240.0;
|
||||
yoffset = 0.0;
|
||||
}
|
||||
|
||||
// Adjust to put the number in the centre
|
||||
xoffset -= 0.25;
|
||||
|
||||
setTextureCoords(xoffset, yoffset, xoffset + 0.5, yoffset + 0.25);
|
||||
FGTexturedLayer::draw();
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
@ -69,7 +207,22 @@ static char * panelGetTime ()
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#define createTexture(a) FGTextureManager::createTexture(a)
|
||||
/**
|
||||
* Construct a magnetic (wet) compass.
|
||||
*/
|
||||
static FGPanelInstrument *
|
||||
createMagneticCompass (int x, int y)
|
||||
{
|
||||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W/2);
|
||||
|
||||
inst->addLayer(new MagRibbon(int(SIX_W*0.8), int(SIX_W*0.2)));
|
||||
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (80.0/80.0)), int(SIX_W * (24.0/80.0)),
|
||||
48.0/128.0, 0.0, 1.0, 24.0/128.0);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an airspeed indicator for a single-engine prop.
|
||||
|
@ -80,14 +233,18 @@ createAirspeedIndicator (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
||||
|
||||
// Layer 0: gauge background.
|
||||
inst->addLayer(createTexture("Textures/Panel/airspeed.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-2.rgb"), -1, -1,
|
||||
0, 0.5, 0.5, 1.0);
|
||||
|
||||
// Layer 1: needle.
|
||||
// Rotates with airspeed.
|
||||
inst->addLayer(createTexture("Textures/Panel/long-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W*(5.0/64.0)), int(SIX_W*(7.0/16.0)),
|
||||
102.0/128.0, 100.0/128.0, 107.0/128.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_ASI_kias,
|
||||
30.0, 220.0, 36.0 / 20.0, -54.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, SIX_W * 12.0/64.0);
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
@ -102,14 +259,17 @@ createHorizon (int x, int y)
|
|||
|
||||
// Layer 0: coloured background
|
||||
// moves with roll only
|
||||
inst->addLayer(createTexture("Textures/Panel/horizon-bg.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-2.rgb"), -1, -1,
|
||||
0.5, 0.5, 1.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getRoll,
|
||||
-360.0, 360.0, -1.0, 0.0);
|
||||
|
||||
// Layer 1: floating horizon
|
||||
// moves with roll and pitch
|
||||
inst->addLayer(createTexture("Textures/Panel/horizon-float.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (13.0/16.0)), int(SIX_W * (33.0/64.0)),
|
||||
15.0/32.0, 54.0/128.0, 28.0/32.0, 87.0/128.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getRoll,
|
||||
-360.0, 360.0, -1.0, 0.0);
|
||||
|
@ -119,14 +279,16 @@ createHorizon (int x, int y)
|
|||
|
||||
// Layer 2: rim
|
||||
// moves with roll only
|
||||
inst->addLayer(createTexture("Textures/Panel/horizon-rim.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-2.rgb"), -1, -1,
|
||||
0, 0, 0.5, 0.5);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getRoll,
|
||||
-360.0, 360.0, -1.0, 0.0);
|
||||
|
||||
// Layer 3: glass front of gauge
|
||||
// fixed, with markings
|
||||
inst->addLayer(createTexture("Textures/Panel/horizon-fg.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-2.rgb"), -1, -1,
|
||||
0.5, 0, 1.0, 0.5);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
@ -141,28 +303,38 @@ createAltimeter (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
||||
|
||||
// Layer 0: gauge background
|
||||
inst->addLayer(createTexture("Textures/Panel/altimeter.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0.5, 0.5, 1.0, 1.0);
|
||||
|
||||
// Layer 1: hundreds needle (long)
|
||||
// moves with altitude
|
||||
inst->addLayer(createTexture("Textures/Panel/long-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W*(5.0/64.0)), int(SIX_W*(7.0/16.0)),
|
||||
102.0/128.0, 100.0/128.0, 107.0/128.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_ALT_ft,
|
||||
0.0, 100000.0, 360.0 / 1000.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, SIX_W * 12.0/64.0);
|
||||
|
||||
// Layer 2: thousands needle (short)
|
||||
// moves with altitude
|
||||
inst->addLayer(createTexture("Textures/Panel/short-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (6.0/64.0)), int(SIX_W * (18.0/64.0)),
|
||||
(107.0/128.0), (110.0/128.0), (113.0/128.0), 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_ALT_ft,
|
||||
0.0, 100000.0, 360.0 / 10000.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, SIX_W/8.0);
|
||||
|
||||
// Layer 3: ten thousands bug (outside)
|
||||
// moves with altitude
|
||||
inst->addLayer(createTexture("Textures/Panel/bug.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (104.0/128.0), (112.0/128.0), (108.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_ALT_ft,
|
||||
0.0, 100000.0, 360.0 / 100000.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, (SIX_W/2.0) - 4);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
@ -177,21 +349,28 @@ createTurnCoordinator (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
||||
|
||||
// Layer 0: background
|
||||
inst->addLayer(createTexture("Textures/Panel/turn-bg.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0.5, 0, 1.0, 0.5);
|
||||
|
||||
// Layer 1: little plane
|
||||
// moves with roll
|
||||
inst->addLayer(createTexture("Textures/Panel/turn.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * 0.75), int(SIX_W * 0.25),
|
||||
0.0, 3.0/8.0, 3.0/8.0, 0.5);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_TC_std,
|
||||
-2.5, 2.5, 20.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, int(SIX_W * 0.0625));
|
||||
|
||||
// Layer 2: little ball
|
||||
// moves with slip/skid
|
||||
inst->addLayer(createTexture("Textures/Panel/ball.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (100.0/128.0), (112.0/128.0), (104.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_TC_rad,
|
||||
-0.1, 0.1, -450.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -(SIX_W/4) + 4);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
@ -225,28 +404,35 @@ createGyroCompass (int x, int y)
|
|||
|
||||
// Layer 0: compass background
|
||||
// rotates with heading
|
||||
inst->addLayer(createTexture("Textures/Panel/gyro-bg.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0, 0.5, 0.5, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_MH_deg,
|
||||
FGBFI::getHeadingMag,
|
||||
-720.0, 720.0, -1.0, 0.0);
|
||||
|
||||
// Layer 1: heading bug
|
||||
// rotates with heading and AP heading
|
||||
inst->addLayer(createTexture("Textures/Panel/bug.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (104.0/128.0), (112.0/128.0), (108.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_MH_deg,
|
||||
FGBFI::getHeadingMag,
|
||||
-720.0, 720.0, -1.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getAPHeadingMag,
|
||||
-720.0, 720.0, 1.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, (SIX_W/2.0) - 4);
|
||||
|
||||
// Layer 2: fixed center
|
||||
inst->addLayer(createTexture("Textures/Panel/gyro-fg.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * 0.625), int(SIX_W * 0.625),
|
||||
15.0/32.0, 11.0/16.0, 25.0/32.0, 1.0);
|
||||
|
||||
// Layer 3: heading knob
|
||||
// rotates with AP heading
|
||||
inst->addLayer(new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
SIX_W/4, SIX_W/4, 0.0, 0.25, 0.25, 0.5));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (21.0/112.0)), int(SIX_W * (21.0/112.0)),
|
||||
0, (64.0/128.0), (21.0/128.0), (85.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, SIX_W/2 - 10);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
|
@ -266,14 +452,18 @@ createVerticalVelocity (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W, SIX_W);
|
||||
|
||||
// Layer 0: gauge background
|
||||
inst->addLayer(createTexture("Textures/Panel/vertical.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0, 0, 0.5, 0.5);
|
||||
|
||||
// Layer 1: needle
|
||||
// moves with vertical velocity
|
||||
inst->addLayer(createTexture("Textures/Panel/long-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W*(5.0/64.0)), int(SIX_W*(7.0/16.0)),
|
||||
102.0/128.0, 100.0/128.0, 107.0/128.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_VSI_fps,
|
||||
-2000.0, 2000.0, 42.0/500.0, 270.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, SIX_W * 12.0/64.0);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
@ -288,14 +478,18 @@ createRPMGauge (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
||||
|
||||
// Layer 0: gauge background
|
||||
inst->addLayer(createTexture("Textures/Panel/rpm.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-3.rgb"), -1, -1,
|
||||
0, 0.5, 0.5, 1.0);
|
||||
|
||||
// Layer 1: long needle
|
||||
// FIXME: moves with throttle (for now)
|
||||
inst->addLayer(createTexture("Textures/Panel/long-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W*(5.0/64.0)), int(SIX_W*(7.0/16.0)),
|
||||
102.0/128.0, 100.0/128.0, 107.0/128.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getThrottle,
|
||||
0.0, 100.0, 300.0, -150.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, SIX_W * 12.0/64.0);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
@ -310,27 +504,36 @@ createFlapIndicator (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
||||
|
||||
// Layer 0: gauge background
|
||||
inst->addLayer(createTexture("Textures/Panel/flaps.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-3.rgb"), -1, -1,
|
||||
0.5, 0.5, 1.0, 1.0);
|
||||
|
||||
// Layer 1: long needle
|
||||
// shifted over, rotates with flap position
|
||||
inst->addLayer(createTexture("Textures/Panel/long-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W*(5.0/64.0)), int(SIX_W*(7.0/16.0)),
|
||||
102.0/128.0, 100.0/128.0, 107.0/128.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT,
|
||||
-(SMALL_W / 4) + (SMALL_W / 16));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getFlaps,
|
||||
0.0, 1.0, 120.0, 30.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, SIX_W * 12.0/64.0);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct a digital chronometer.
|
||||
*/
|
||||
static FGPanelInstrument *
|
||||
createChronometer (int x, int y)
|
||||
{
|
||||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
||||
|
||||
// Layer 0: gauge background
|
||||
inst->addLayer(createTexture("Textures/Panel/clock.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-3.rgb"), -1, -1,
|
||||
0.5, 0, 1.0, 0.5);
|
||||
|
||||
// Layer 1: text
|
||||
// displays current GMT
|
||||
|
@ -355,38 +558,51 @@ createControls (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SMALL_W, SMALL_W);
|
||||
|
||||
// Layer 0: gauge background
|
||||
inst->addLayer(createTexture("Textures/Panel/controls.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-3.rgb"), -1, -1,
|
||||
0, 0, 0.5, 0.5);
|
||||
|
||||
// Layer 1: bug
|
||||
// moves left-right with aileron
|
||||
inst->addLayer(createTexture("Textures/Panel/bug.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (104.0/128.0), (112.0/128.0), (108.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, FGBFI::getAileron,
|
||||
-1.0, 1.0, SMALL_W * .75 / 2.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, (SIX_W/2.0) - 12);
|
||||
|
||||
// Layer 2: bug
|
||||
// moves left-right with rudder
|
||||
inst->addLayer(createTexture("Textures/Panel/bug.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (104.0/128.0), (112.0/128.0), (108.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION, 180.0);
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, FGBFI::getRudder,
|
||||
-1.0, 1.0, -SMALL_W * .75 / 2.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, (SIX_W/2.0) - 12);
|
||||
|
||||
// Layer 3: bug
|
||||
// moves up-down with elevator trim
|
||||
inst->addLayer(createTexture("Textures/Panel/bug.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (104.0/128.0), (112.0/128.0), (108.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION, 270.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT,
|
||||
-SMALL_W * (3.0 / 8.0));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, FGBFI::getElevatorTrim,
|
||||
-1.0, 1.0, SMALL_W * .75 / 2.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, (SIX_W/2.0) - 12);
|
||||
|
||||
// Layer 4: bug
|
||||
// moves up-down with elevator
|
||||
inst->addLayer(createTexture("Textures/Panel/bug.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (4.0/64.0)), int(SIX_W * (4.0/64.0)),
|
||||
(108.0/128.0), (104.0/128.0), (112.0/128.0), (108.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION, 90.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT,
|
||||
-SMALL_W * (3.0 / 8.0));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, FGBFI::getElevator,
|
||||
-1.0, 1.0, -SMALL_W * .75 / 2.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, (SIX_W/2.0) - 12);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
@ -418,41 +634,70 @@ createNAV1 (int x, int y)
|
|||
FGBFI::setNAV1SelRadial,
|
||||
-5.0, 0.0, 360.0, true));
|
||||
|
||||
// Layer 0: background
|
||||
inst->addLayer(createTexture("Textures/Panel/gyro-bg.rgb"));
|
||||
// Layer: background
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0, 0.5, 0.5, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getNAV1SelRadial,
|
||||
-360.0, 360.0, -1.0, 0.0);
|
||||
|
||||
// Layer 1: left-right needle.
|
||||
inst->addLayer(createTexture("Textures/Panel/nav-needle.rgb"));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT,
|
||||
FGSteam::get_HackVOR1_deg,
|
||||
-10.0, 10.0, SIX_W / 40.0, 0.0);
|
||||
|
||||
// Layer 2: glidescope needle
|
||||
inst->addLayer(createTexture("Textures/Panel/nav-needle.rgb"));
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT,
|
||||
FGSteam::get_HackGS_deg,
|
||||
-1.0, 1.0, SIX_W / 5.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
90 );
|
||||
|
||||
// Layer 3: face with markings
|
||||
inst->addLayer(createTexture("Textures/Panel/nav-face.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/2, int(SIX_W * (5.0 / 8.0)),
|
||||
0, 0, 0.25, (5.0 / 16.0));
|
||||
|
||||
// Layer 4: heading knob
|
||||
// Layer: OBS knob
|
||||
// rotates with selected radial
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
SIX_W/4, SIX_W/4, 0.0, 0.5, 0.25, 0.75);
|
||||
inst->addLayer(layer);
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (21.0/112.0)), int(SIX_W * (21.0/112.0)),
|
||||
0.0, (86.0/128.0), (21.0/128.0), (107.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getNAV1SelRadial,
|
||||
-360.0, 360.0, 1.0, 0.0);
|
||||
|
||||
// Layer: TO/FROM flag
|
||||
int flag_w = int(SIX_W * (8.0/64.0));
|
||||
int flag_h = int(SIX_W * (6.0/64.0));
|
||||
|
||||
FGTexturedLayer * off =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
flag_w, flag_h,
|
||||
120.0/128.0, 0.5, 1.0, 70.0/128.0);
|
||||
FGTexturedLayer * from =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
flag_w, flag_h,
|
||||
120.0/128.0, 80.0/128.0, 1.0, 86.0/128.0);
|
||||
FGTexturedLayer * to =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
flag_w, flag_h,
|
||||
120.0/128.0, 74.0/128.0, 1.0, 80.0/128.0);
|
||||
FGSwitchLayer * sw1 =
|
||||
new FGSwitchLayer(flag_w, flag_h, panelGetNAV1FROM, from, off);
|
||||
FGSwitchLayer * sw2 =
|
||||
new FGSwitchLayer(flag_w, flag_h, panelGetNAV1TO, to, sw1);
|
||||
inst->addLayer(sw2);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -int(SIX_W*0.1875));
|
||||
|
||||
// Layer: left-right needle.
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W * (2.0/64.0), SIX_W/2,
|
||||
(56.0/128.0), 0.5, (58.0/128.0), 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT,
|
||||
FGSteam::get_HackVOR1_deg,
|
||||
-10.0, 10.0, SIX_W / 40.0, 0.0);
|
||||
|
||||
// Layer: glidescope needle
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W * (2.0/64.0), SIX_W/2,
|
||||
(56.0/128.0), 0.5, (58.0/128.0), 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT,
|
||||
FGSteam::get_HackGS_deg,
|
||||
-1.0, 1.0, SIX_W / 5.0, 0.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
90 );
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
@ -483,35 +728,60 @@ createNAV2 (int x, int y)
|
|||
FGBFI::setNAV2SelRadial,
|
||||
-5.0, 0.0, 360.0, true));
|
||||
|
||||
// Layer 0: background
|
||||
inst->addLayer(createTexture("Textures/Panel/gyro-bg.rgb"));
|
||||
// Layer: background
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0, 0.5, 0.5, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getNAV2SelRadial,
|
||||
-360.0, 360.0, -1.0, 0.0);
|
||||
|
||||
// Layer 1: left-right needle.
|
||||
inst->addLayer(createTexture("Textures/Panel/nav-needle.rgb"));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT,
|
||||
FGSteam::get_HackVOR2_deg,
|
||||
-10.0, 10.0, SIX_W / 40.0, 0.0);
|
||||
// inst->addTransformation(FGInstrumentLayer::YSHIFT,
|
||||
// -SIX_W / 4.4 );
|
||||
// Layer: face with markings.
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/2, int(SIX_W * (5.0 / 8.0)),
|
||||
0, 0, 0.25, (5.0 / 16.0));
|
||||
|
||||
// Layer 2: face with markings.
|
||||
inst->addLayer(createTexture("Textures/Panel/nav-face.rgb"));
|
||||
|
||||
// Layer 3: heading knob
|
||||
// Layer: OBS knob
|
||||
// rotates with selected radial
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
SIX_W/4, SIX_W/4, 0.0, 0.5, 0.25, 0.75);
|
||||
inst->addLayer(layer);
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (21.0/112.0)), int(SIX_W * (21.0/112.0)),
|
||||
0.0, (86.0/128.0), (21.0/128.0), (107.0/128.0));
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getNAV2SelRadial,
|
||||
-360.0, 360.0, 1.0, 0.0);
|
||||
|
||||
// Layer: TO/FROM flag
|
||||
int flag_w = int(SIX_W * (8.0/64.0));
|
||||
int flag_h = int(SIX_W * (6.0/64.0));
|
||||
|
||||
FGTexturedLayer * off =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
flag_w, flag_h,
|
||||
120.0/128.0, 0.5, 1.0, 70.0/128.0);
|
||||
FGTexturedLayer * from =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
flag_w, flag_h,
|
||||
120.0/128.0, 80.0/128.0, 1.0, 86.0/128.0);
|
||||
FGTexturedLayer * to =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
flag_w, flag_h,
|
||||
120.0/128.0, 74.0/128.0, 1.0, 80.0/128.0);
|
||||
FGSwitchLayer * sw1 =
|
||||
new FGSwitchLayer(flag_w, flag_h, panelGetNAV2FROM, from, off);
|
||||
FGSwitchLayer * sw2 =
|
||||
new FGSwitchLayer(flag_w, flag_h, panelGetNAV2TO, to, sw1);
|
||||
inst->addLayer(sw2);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -int(SIX_W*0.1875));
|
||||
|
||||
// Layer: left-right needle.
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W * (2.0/64.0), SIX_W/2,
|
||||
(56.0/128.0), 0.5, (58.0/128.0), 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT,
|
||||
FGSteam::get_HackVOR2_deg,
|
||||
-10.0, 10.0, SIX_W / 40.0, 0.0);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
@ -543,28 +813,36 @@ createADF (int x, int y)
|
|||
5.0, 0.0, 360.0, true));
|
||||
|
||||
// Layer 0: background
|
||||
inst->addLayer(createTexture("Textures/Panel/gyro-bg.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/faces-1.rgb"), -1, -1,
|
||||
0, 0.5, 0.5, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getADFRotation,
|
||||
0.0, 360.0, 1.0, 0.0);
|
||||
|
||||
// Layer 1: Direction needle.
|
||||
inst->addLayer(createTexture("Textures/Panel/long-needle.rgb"));
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W * (6.0/64.0), SIX_W * (40.0/64.0),
|
||||
(120.0/128.0), (88.0/128.0), 1.0, 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGSteam::get_HackADF_deg,
|
||||
-720.0, 720.0, 1.0, 0.0);
|
||||
|
||||
// Layer 2: heading knob
|
||||
// rotates with selected radial
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
SIX_W/4, SIX_W/4, 0.0, 0.75, 0.25, 1.0);
|
||||
inst->addLayer(layer);
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (21.0/112.0)), int(SIX_W * (21.0/112.0)),
|
||||
0.0, (107.0/128.0), (21.0/128.0), 1.0);
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -SIX_W/2 + 10);
|
||||
inst->addTransformation(FGInstrumentLayer::ROTATION,
|
||||
FGBFI::getADFRotation,
|
||||
-360.0, 360.0, -1.0, 0.0);
|
||||
|
||||
// Layer 3: airplace at centre
|
||||
inst->addLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
int(SIX_W * (20.0/64.0)), int(SIX_W * (16.0/64.0)),
|
||||
102.0/128.0, 32.0/128.0, 1.0, 48.0/128.0);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
@ -579,7 +857,7 @@ createNavCom1 (int x, int y)
|
|||
|
||||
// Use the button to swap standby and active
|
||||
// NAV frequencies
|
||||
inst->addAction(0, SIX_W * .375, -SIX_W/4, SIX_W/4, SIX_W/4,
|
||||
inst->addAction(0, int(SIX_W * .375), -SIX_W/4, SIX_W/4, SIX_W/4,
|
||||
new FGSwapAction(FGBFI::getNAV1Freq,
|
||||
FGBFI::setNAV1Freq,
|
||||
FGBFI::getNAV1AltFreq,
|
||||
|
@ -605,7 +883,7 @@ createNavCom1 (int x, int y)
|
|||
|
||||
// Layer 0: background
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios-1.rgb"),
|
||||
SIX_W*2, SIX_W/2, 0.0, 0.75, 1.0, 1.0);
|
||||
inst->addLayer(layer);
|
||||
|
||||
|
@ -633,7 +911,7 @@ createNavCom2 (int x, int y)
|
|||
|
||||
// Use the button to swap standby and active
|
||||
// NAV frequencies
|
||||
inst->addAction(0, SIX_W * .375, -SIX_W/4, SIX_W/4, SIX_W/4,
|
||||
inst->addAction(0, int(SIX_W * .375), -SIX_W/4, SIX_W/4, SIX_W/4,
|
||||
new FGSwapAction(FGBFI::getNAV2Freq,
|
||||
FGBFI::setNAV2Freq,
|
||||
FGBFI::getNAV2AltFreq,
|
||||
|
@ -659,7 +937,7 @@ createNavCom2 (int x, int y)
|
|||
|
||||
// Layer 0: background
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios-1.rgb"),
|
||||
SIX_W*2, SIX_W/2, 0.0, 0.75, 1.0, 1.0);
|
||||
inst->addLayer(layer);
|
||||
|
||||
|
@ -686,26 +964,30 @@ createADFRadio (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W*2, SIX_W/2);
|
||||
|
||||
// Use the knob to tune the standby NAV
|
||||
inst->addAction(0, SIX_W * 0.7, -SIX_W * 0.07, SIX_W * 0.09, SIX_W * 0.14,
|
||||
inst->addAction(0, int(SIX_W * 0.7), int(-SIX_W * 0.07),
|
||||
int(SIX_W * 0.09), int(SIX_W * 0.14),
|
||||
new FGAdjustAction(FGBFI::getADFFreq,
|
||||
FGBFI::setADFFreq,
|
||||
-1.0, 100.0, 1299, true));
|
||||
inst->addAction(0, SIX_W * 0.79, -SIX_W * 0.07, SIX_W * 0.09, SIX_W * 0.14,
|
||||
inst->addAction(0, int(SIX_W * 0.79), int(-SIX_W * 0.07),
|
||||
int(SIX_W * 0.09), int(SIX_W * 0.14),
|
||||
new FGAdjustAction(FGBFI::getADFFreq,
|
||||
FGBFI::setADFFreq,
|
||||
1.0, 100.0, 1299, true));
|
||||
inst->addAction(1, SIX_W * 0.7, -SIX_W * 0.07, SIX_W * 0.09, SIX_W * 0.14,
|
||||
inst->addAction(1, int(SIX_W * 0.7), int(-SIX_W * 0.07),
|
||||
int(SIX_W * 0.09), int(SIX_W * 0.14),
|
||||
new FGAdjustAction(FGBFI::getADFFreq,
|
||||
FGBFI::setADFFreq,
|
||||
-25.0, 100.0, 1299, true));
|
||||
inst->addAction(1, SIX_W * 0.79, -SIX_W * 0.07, SIX_W * 0.09, SIX_W * 0.14,
|
||||
inst->addAction(1, int(SIX_W * 0.79), int(-SIX_W * 0.07),
|
||||
int(SIX_W * 0.09), int(SIX_W * 0.14),
|
||||
new FGAdjustAction(FGBFI::getADFFreq,
|
||||
FGBFI::setADFFreq,
|
||||
25.0, 100.0, 1299, true));
|
||||
|
||||
// Layer 0: background
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios-1.rgb"),
|
||||
SIX_W*2, SIX_W/2, 0.0, 0.5, 1.0, 0.75);
|
||||
inst->addLayer(layer);
|
||||
|
||||
|
@ -731,36 +1013,36 @@ createAP (int x, int y)
|
|||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y, SIX_W*2, SIX_W/4);
|
||||
|
||||
// Action: select HDG button
|
||||
inst->addAction(0, -SIX_W*0.6125, -SIX_W/16, SIX_W/4, SIX_W/8,
|
||||
inst->addAction(0, int(-SIX_W*0.6125), -SIX_W/16, SIX_W/4, SIX_W/8,
|
||||
new FGToggleAction(FGBFI::getAPHeadingLock,
|
||||
FGBFI::setAPHeadingLock));
|
||||
|
||||
// Action: select NAV button
|
||||
inst->addAction(0, -SIX_W*0.3625, -SIX_W/16, SIX_W/4, SIX_W/8,
|
||||
inst->addAction(0, int(-SIX_W*0.3625), -SIX_W/16, SIX_W/4, SIX_W/8,
|
||||
new FGToggleAction(FGBFI::getAPNAV1Lock,
|
||||
FGBFI::setAPNAV1Lock));
|
||||
|
||||
// Action: select ALT button
|
||||
inst->addAction(0, -SIX_W*0.1125, -SIX_W/16, SIX_W/4, SIX_W/8,
|
||||
inst->addAction(0, int(-SIX_W*0.1125), -SIX_W/16, SIX_W/4, SIX_W/8,
|
||||
new FGToggleAction(FGBFI::getAPAltitudeLock,
|
||||
FGBFI::setAPAltitudeLock));
|
||||
|
||||
// Layer: AP background
|
||||
FGTexturedLayer * layer;
|
||||
layer = new FGTexturedLayer(createTexture("Textures/Panel/radios.rgb"),
|
||||
layer = new FGTexturedLayer(createTexture("Textures/Panel/radios-1.rgb"),
|
||||
SIX_W*2, SIX_W/4,
|
||||
0.0, 0.375, 1.0, 0.5);
|
||||
inst->addLayer(layer);
|
||||
|
||||
// Display HDG button
|
||||
FGTexturedLayer *l1 =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/4, SIX_W/8,
|
||||
7.0/16.0, 27.0/32.0, 9.0/16.0, 15.0/16.0);
|
||||
39.0/128.0, 118.0/128.0, 54.0/128.0, 1.0);
|
||||
FGTexturedLayer *l2 =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/4, SIX_W/8,
|
||||
1.0/4.0, 27.0/32.0, 3.0/8.0, 15.0/16.0);
|
||||
22.0/128.0, 118.0/128.0, 37.0/128.0, 1.0);
|
||||
FGSwitchLayer * sw =
|
||||
new FGSwitchLayer(SIX_W/4, SIX_W/8, FGBFI::getAPHeadingLock, l1, l2);
|
||||
inst->addLayer(sw);
|
||||
|
@ -768,13 +1050,13 @@ createAP (int x, int y)
|
|||
|
||||
// Display NAV button
|
||||
l1 =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/4, SIX_W/8,
|
||||
7.0/16.0, 3.0/4.0, 9.0/16.0, 27.0/32.0);
|
||||
39.0/128.0, 106.0/128.0, 54.0/128.0, 116.0/128.0);
|
||||
l2 =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/4, SIX_W/8,
|
||||
1.0/4.0, 3.0/4.0, 3.0/8.0, 27.0/32.0);
|
||||
22.0/128.0, 106.0/128.0, 37.0/128.0, 116.0/128.0);
|
||||
sw =
|
||||
new FGSwitchLayer(SIX_W/4, SIX_W/8, FGBFI::getAPNAV1Lock, l1, l2);
|
||||
inst->addLayer(sw);
|
||||
|
@ -782,13 +1064,13 @@ createAP (int x, int y)
|
|||
|
||||
// Display ALT button
|
||||
l1 =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/4, SIX_W/8,
|
||||
7.0/16.0, 9.0/16.0, 9.0/16.0, 21.0/32.0);
|
||||
39.0/128.0, 82.0/128.0, 54.0/128.0, 92.0/128.0);
|
||||
l2 =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/knobs.rgb"),
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/misc-1.rgb"),
|
||||
SIX_W/4, SIX_W/8,
|
||||
1.0/4.0, 9.0/16.0, 3.0/8.0, 21.0/32.0);
|
||||
22.0/128.0, 82.0/128.0, 37.0/128.0, 92.0/128.0);
|
||||
sw =
|
||||
new FGSwitchLayer(SIX_W/4, SIX_W/8, FGBFI::getAPAltitudeLock, l1, l2);
|
||||
inst->addLayer(sw);
|
||||
|
@ -799,24 +1081,34 @@ createAP (int x, int y)
|
|||
FGPanelInstrument *
|
||||
createDME (int x, int y)
|
||||
{
|
||||
FGLayeredInstrument * inst = new FGLayeredInstrument(x, y,
|
||||
SIX_W * 0.75,
|
||||
SIX_W * 0.25);
|
||||
FGLayeredInstrument * inst =
|
||||
new FGLayeredInstrument(x, y, int(SIX_W * 0.75), int(SIX_W * 0.25));
|
||||
|
||||
// Layer: background
|
||||
FGTexturedLayer * layer =
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios.rgb"),
|
||||
SIX_W * 0.75, SIX_W * 0.25,
|
||||
new FGTexturedLayer(createTexture("Textures/Panel/radios-1.rgb"),
|
||||
int(SIX_W * 0.75), int(SIX_W * 0.25),
|
||||
0.0, 0.25, 0.375, 0.375);
|
||||
inst->addLayer(layer);
|
||||
|
||||
// Layer: current distance
|
||||
FGTextLayer * text = new FGTextLayer(SIX_W/2, SIX_W/4);
|
||||
text->addChunk(new FGTextLayer::Chunk(FGBFI::getNAV1DistDME, "%05.1f",
|
||||
METER_TO_NM));
|
||||
text->setPointSize(14);
|
||||
text->setColor(1.0, 0.5, 0.0);
|
||||
inst->addLayer(text);
|
||||
|
||||
FGTextLayer * text1 = new FGTextLayer(SIX_W/2, SIX_W/4);
|
||||
text1->addChunk(new FGTextLayer::Chunk(FGBFI::getNAV1DistDME, "%05.1f",
|
||||
METER_TO_NM));
|
||||
text1->setPointSize(12);
|
||||
text1->setColor(1.0, 0.5, 0.0);
|
||||
|
||||
FGTextLayer * text2 = new FGTextLayer(SIX_W/2, SIX_W/4);
|
||||
text2->addChunk(new FGTextLayer::Chunk("---.-"));
|
||||
text2->setPointSize(12);
|
||||
text2->setColor(1.0, 0.5, 0.0);
|
||||
|
||||
FGSwitchLayer * sw =
|
||||
new FGSwitchLayer(SIX_W/2, SIX_W/4, FGBFI::getNAV1DMEInRange,
|
||||
text1, text2);
|
||||
|
||||
inst->addLayer(sw);
|
||||
inst->addTransformation(FGInstrumentLayer::XSHIFT, -20);
|
||||
inst->addTransformation(FGInstrumentLayer::YSHIFT, -6);
|
||||
|
||||
|
@ -830,9 +1122,12 @@ createDME (int x, int y)
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
FGPanel *
|
||||
fgCreateSmallSinglePropPanel (int x, int y, int finx, int finy)
|
||||
fgCreateSmallSinglePropPanel (int xpos, int ypos, int finx, int finy)
|
||||
{
|
||||
FGPanel * panel = new FGPanel(x, y, finx - x, finy - y);
|
||||
int w = finx - xpos;
|
||||
int h = finy - ypos;
|
||||
FGPanel * panel = new FGPanel(xpos, ypos, w, h);
|
||||
int x, y;
|
||||
|
||||
x = SIX_X;
|
||||
y = SIX_Y;
|
||||
|
@ -840,6 +1135,10 @@ fgCreateSmallSinglePropPanel (int x, int y, int finx, int finy)
|
|||
// Set the background texture
|
||||
panel->setBackground(createTexture("Textures/Panel/panel-bg.rgb"));
|
||||
|
||||
// Mag compass at top.
|
||||
panel->addInstrument(createMagneticCompass((w / 2),
|
||||
int(h * 0.5768) + (SIX_W / 8)));
|
||||
|
||||
// Chronometer alone at side
|
||||
x = SIX_X - SIX_SPACING - 8;
|
||||
panel->addInstrument(createChronometer(x, y));
|
||||
|
|
|
@ -395,6 +395,16 @@ FGBFI::getHeading ()
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the current heading in degrees.
|
||||
*/
|
||||
double
|
||||
FGBFI::getHeadingMag ()
|
||||
{
|
||||
return current_aircraft.fdm_state->get_Psi() * RAD_TO_DEG - getMagVar();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the current heading in degrees.
|
||||
*/
|
||||
|
@ -773,8 +783,14 @@ void
|
|||
FGBFI::setAPHeadingLock (bool lock)
|
||||
{
|
||||
if (lock) {
|
||||
// We need to do this so that
|
||||
// it's possible to lock onto a
|
||||
// heading other than the current
|
||||
// heading.
|
||||
double heading = getAPHeadingMag();
|
||||
current_autopilot->set_HeadingMode(FGAutopilot::FG_HEADING_LOCK);
|
||||
current_autopilot->set_HeadingEnabled(true);
|
||||
setAPHeadingMag(heading);
|
||||
} else if (current_autopilot->get_HeadingMode() ==
|
||||
FGAutopilot::FG_HEADING_LOCK) {
|
||||
current_autopilot->set_HeadingEnabled(false);
|
||||
|
@ -865,6 +881,19 @@ FGBFI::getNAV1DistDME ()
|
|||
return current_radiostack->get_nav1_dme_dist();
|
||||
}
|
||||
|
||||
bool
|
||||
FGBFI::getNAV1InRange ()
|
||||
{
|
||||
return current_radiostack->get_nav1_inrange();
|
||||
}
|
||||
|
||||
bool
|
||||
FGBFI::getNAV1DMEInRange ()
|
||||
{
|
||||
return (current_radiostack->get_nav1_inrange() &&
|
||||
current_radiostack->get_nav1_has_dme());
|
||||
}
|
||||
|
||||
double
|
||||
FGBFI::getNAV2Freq ()
|
||||
{
|
||||
|
@ -895,6 +924,19 @@ FGBFI::getNAV2DistDME ()
|
|||
return current_radiostack->get_nav2_dme_dist();
|
||||
}
|
||||
|
||||
bool
|
||||
FGBFI::getNAV2InRange ()
|
||||
{
|
||||
return current_radiostack->get_nav2_inrange();
|
||||
}
|
||||
|
||||
bool
|
||||
FGBFI::getNAV2DMEInRange ()
|
||||
{
|
||||
return (current_radiostack->get_nav2_inrange() &&
|
||||
current_radiostack->get_nav2_has_dme());
|
||||
}
|
||||
|
||||
double
|
||||
FGBFI::getADFFreq ()
|
||||
{
|
||||
|
|
|
@ -77,7 +77,8 @@ public:
|
|||
|
||||
|
||||
// Attitude
|
||||
static double getHeading ();
|
||||
static double getHeading (); // true heading
|
||||
static double getHeadingMag (); // exact magnetic heading
|
||||
static double getPitch ();
|
||||
static double getRoll ();
|
||||
|
||||
|
@ -137,12 +138,16 @@ public:
|
|||
static double getNAV1Radial ();
|
||||
static double getNAV1SelRadial ();
|
||||
static double getNAV1DistDME ();
|
||||
static bool getNAV1InRange ();
|
||||
static bool getNAV1DMEInRange ();
|
||||
|
||||
static double getNAV2Freq ();
|
||||
static double getNAV2AltFreq ();
|
||||
static double getNAV2Radial ();
|
||||
static double getNAV2SelRadial ();
|
||||
static double getNAV2DistDME ();
|
||||
static bool getNAV2InRange ();
|
||||
static bool getNAV2DMEInRange ();
|
||||
|
||||
static double getADFFreq ();
|
||||
static double getADFAltFreq ();
|
||||
|
|
Loading…
Add table
Reference in a new issue