2000-09-13 21:51:07 +00:00
|
|
|
|
// panel.hxx - generic support classes for a 2D panel.
|
2000-02-15 03:30:01 +00:00
|
|
|
|
//
|
|
|
|
|
// Written by David Megginson, started January 2000.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
//
|
1999-01-07 19:25:53 +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.
|
|
|
|
|
//
|
|
|
|
|
// 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.
|
2006-02-21 01:16:04 +00:00
|
|
|
|
//
|
1999-01-07 19:25:53 +00:00
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
// along with this program; if not, write to the Free Software
|
2006-02-21 01:16:04 +00:00
|
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
1998-11-11 00:19:27 +00:00
|
|
|
|
//
|
1999-01-07 19:25:53 +00:00
|
|
|
|
// $Id$
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
#ifndef __PANEL_HXX
|
|
|
|
|
#define __PANEL_HXX
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
2006-06-14 10:30:10 +00:00
|
|
|
|
#ifndef __cplusplus
|
1998-06-27 16:47:53 +00:00
|
|
|
|
# error This library requires C++
|
2006-06-14 10:30:10 +00:00
|
|
|
|
#endif
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
|
|
|
|
|
1998-11-09 23:38:50 +00:00
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
# include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
#include <osg/ref_ptr>
|
|
|
|
|
#include <osg/StateSet>
|
|
|
|
|
#include <osg/Texture2D>
|
|
|
|
|
|
2003-09-24 17:20:55 +00:00
|
|
|
|
#include <plib/fnt.h>
|
1998-11-09 23:38:50 +00:00
|
|
|
|
|
2003-09-24 17:20:55 +00:00
|
|
|
|
#include <simgear/compiler.h>
|
2003-05-06 23:46:24 +00:00
|
|
|
|
#include <simgear/props/props.hxx>
|
2003-09-24 17:20:55 +00:00
|
|
|
|
#include <simgear/structure/subsystem_mgr.hxx>
|
2009-08-05 14:20:04 +00:00
|
|
|
|
#include <simgear/structure/SGBinding.hxx>
|
2003-09-24 17:20:55 +00:00
|
|
|
|
#include <simgear/math/interpolater.hxx>
|
2000-11-30 18:43:31 +00:00
|
|
|
|
#include <simgear/timing/timestamp.hxx>
|
2000-09-06 00:07:48 +00:00
|
|
|
|
|
2003-03-02 14:19:24 +00:00
|
|
|
|
#include <cmath>
|
2000-02-21 22:00:24 +00:00
|
|
|
|
#include <vector>
|
2000-03-21 22:06:05 +00:00
|
|
|
|
#include <map>
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
#include <Main/fg_props.hxx>
|
2006-01-13 22:07:50 +00:00
|
|
|
|
#include <Instrumentation/dclgps.hxx>
|
2001-07-27 21:59:53 +00:00
|
|
|
|
|
2008-07-27 16:25:13 +00:00
|
|
|
|
using std::vector;
|
|
|
|
|
using std::map;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
2004-09-19 16:33:38 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
class FGPanelInstrument;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2001-08-03 00:18:21 +00:00
|
|
|
|
// Texture management.
|
2000-04-27 22:45:48 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Texture manager (should migrate out into FGFS).
|
|
|
|
|
*
|
|
|
|
|
* This class ensures that no texture is loaded more than once.
|
|
|
|
|
*/
|
2000-04-27 22:45:48 +00:00
|
|
|
|
class FGTextureManager
|
|
|
|
|
{
|
|
|
|
|
public:
|
2007-12-07 09:14:16 +00:00
|
|
|
|
static osg::Texture2D* createTexture(const string &relativePath,
|
|
|
|
|
bool staticTexture = true);
|
2007-06-24 07:57:45 +00:00
|
|
|
|
static void addTexture(const string &relativePath, osg::Texture2D* texture);
|
2000-04-27 22:45:48 +00:00
|
|
|
|
private:
|
2006-10-29 19:30:21 +00:00
|
|
|
|
static map<string,osg::ref_ptr<osg::Texture2D> > _textureMap;
|
2000-04-27 22:45:48 +00:00
|
|
|
|
};
|
|
|
|
|
|
2000-06-14 20:59:51 +00:00
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
|
|
|
|
* Cropped texture (should migrate out into FGFS).
|
|
|
|
|
*
|
|
|
|
|
* This structure wraps an SSG texture with cropping information.
|
|
|
|
|
*/
|
2000-09-22 17:20:56 +00:00
|
|
|
|
class FGCroppedTexture
|
2000-06-14 20:59:51 +00:00
|
|
|
|
{
|
2000-09-22 17:20:56 +00:00
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
FGCroppedTexture ();
|
|
|
|
|
FGCroppedTexture (const string &path,
|
2000-06-14 20:59:51 +00:00
|
|
|
|
float _minX = 0.0, float _minY = 0.0,
|
2000-09-22 17:20:56 +00:00
|
|
|
|
float _maxX = 1.0, float _maxY = 1.0);
|
|
|
|
|
virtual ~FGCroppedTexture ();
|
|
|
|
|
|
|
|
|
|
virtual void setPath (const string &path) { _path = path; }
|
|
|
|
|
|
|
|
|
|
virtual const string &getPath () const { return _path; }
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual osg::StateSet* getTexture ();
|
2000-06-14 20:59:51 +00:00
|
|
|
|
|
2000-09-22 17:20:56 +00:00
|
|
|
|
virtual void setCrop (float minX, float minY, float maxX, float maxY) {
|
|
|
|
|
_minX = minX; _minY = minY; _maxX = maxX; _maxY = maxY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual float getMinX () const { return _minX; }
|
|
|
|
|
virtual float getMinY () const { return _minY; }
|
|
|
|
|
virtual float getMaxX () const { return _maxX; }
|
|
|
|
|
virtual float getMaxY () const { return _maxY; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
string _path;
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::ref_ptr<osg::StateSet> _texture;
|
2000-09-22 17:20:56 +00:00
|
|
|
|
float _minX, _minY, _maxX, _maxY;
|
2000-06-14 20:59:51 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2001-08-03 00:18:21 +00:00
|
|
|
|
// Top-level panel.
|
2000-02-15 03:30:01 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Instrument panel class.
|
|
|
|
|
*
|
|
|
|
|
* The panel is a container that has a background texture and holds
|
|
|
|
|
* zero or more instruments. The panel will order the instruments to
|
|
|
|
|
* redraw themselves when necessary, and will pass mouse clicks on to
|
|
|
|
|
* the appropriate instruments for processing.
|
|
|
|
|
*/
|
2003-09-24 17:20:55 +00:00
|
|
|
|
class FGPanel : public SGSubsystem
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
2001-06-20 20:51:34 +00:00
|
|
|
|
FGPanel ();
|
1999-12-23 17:37:18 +00:00
|
|
|
|
virtual ~FGPanel ();
|
|
|
|
|
|
2001-01-11 22:44:18 +00:00
|
|
|
|
// Update the panel (every frame).
|
|
|
|
|
virtual void init ();
|
|
|
|
|
virtual void bind ();
|
|
|
|
|
virtual void unbind ();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
|
|
|
|
virtual void update (double);
|
|
|
|
|
void update (osg::State& state);
|
|
|
|
|
virtual void update (osg::State& state, GLfloat winx, GLfloat winw, GLfloat winy, GLfloat winh);
|
2001-01-11 22:44:18 +00:00
|
|
|
|
|
Andy Ross:
The biggest and coolest patch adds mouse sensitivity to the 3D
cockpits, so we can finally work the radios. This ended up requiring
significant modifications outside of the 3D cockpit code. Stuff folks
will want to look at:
+ The list of all "3D" cockpits is stored statically in the
panelnode.cxx file. This is clumsy, and won't migrate well to a
multiple-aircraft feature. Really, there should be a per-model list
of 3D panels, but I couldn't find a clean place to put this. The
only handle you get back after parsing a model is a generic ssg
node, to which I obviously can't add panel-specific methods.
+ The aircraft model is parsed *very* early in the initialization
order. Earlier, in fact, than the static list of allowable command
bindings is built in fgInitCommands(). This is bad, as it means
that mouse bindings on the instruments can't work yet. I moved the
call to fgInitCommands, but someone should look carefully to see
that I picked the right place. There's a lot of initialization
code, and I got a little lost in there... :)
+ I added yet another "update" hook to the fgRenderFrame routine to
hook the updates for the 3D panels. This is only required for
"mouse press delay", and it's a fairly clumsy mechanism based on
frame rate instead of real time. There appears to be delay handling
already in place in the Input stuff, and there's a discussion going
on about different mouse behavior right now. Maybe this is a good
time to unify these two (now three) approaches?
2002-10-29 19:44:03 +00:00
|
|
|
|
virtual void updateMouseDelay();
|
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
// transfer pointer ownership!!!
|
|
|
|
|
virtual void addInstrument (FGPanelInstrument * instrument);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
|
|
|
|
|
// Background texture.
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void setBackground (osg::Texture2D* texture);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
// Background multiple textures.
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void setMultiBackground (osg::Texture2D* texture, int idx);
|
2002-02-19 21:57:09 +00:00
|
|
|
|
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
// Make the panel visible or invisible.
|
2000-04-27 22:45:48 +00:00
|
|
|
|
virtual bool getVisibility () const;
|
|
|
|
|
virtual void setVisibility (bool visibility);
|
2000-02-26 18:01:13 +00:00
|
|
|
|
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
|
// Full width of panel.
|
|
|
|
|
virtual void setWidth (int width) { _width = width; }
|
|
|
|
|
virtual int getWidth () const { return _width; }
|
|
|
|
|
|
|
|
|
|
// Full height of panel.
|
|
|
|
|
virtual void setHeight (int height) { _height = height; }
|
|
|
|
|
virtual int getHeight () const { return _height; }
|
|
|
|
|
|
|
|
|
|
// X-offset
|
|
|
|
|
virtual void setXOffset (int offset);
|
2003-03-30 16:49:48 +00:00
|
|
|
|
virtual int getXOffset () const { return _x_offset->getIntValue(); }
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
|
|
|
|
|
|
// Y-offset.
|
|
|
|
|
virtual void setYOffset (int offset);
|
2003-03-30 16:49:48 +00:00
|
|
|
|
virtual int getYOffset () const { return _y_offset->getIntValue(); }
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
|
|
|
|
|
|
// View height.
|
|
|
|
|
virtual void setViewHeight (int height) { _view_height = height; }
|
|
|
|
|
virtual int getViewHeight () const { return _view_height; }
|
|
|
|
|
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
// Handle a mouse click.
|
2000-04-27 22:45:48 +00:00
|
|
|
|
virtual bool doMouseAction (int button, int updown, int x, int y);
|
Andy Ross:
The biggest and coolest patch adds mouse sensitivity to the 3D
cockpits, so we can finally work the radios. This ended up requiring
significant modifications outside of the 3D cockpit code. Stuff folks
will want to look at:
+ The list of all "3D" cockpits is stored statically in the
panelnode.cxx file. This is clumsy, and won't migrate well to a
multiple-aircraft feature. Really, there should be a per-model list
of 3D panels, but I couldn't find a clean place to put this. The
only handle you get back after parsing a model is a generic ssg
node, to which I obviously can't add panel-specific methods.
+ The aircraft model is parsed *very* early in the initialization
order. Earlier, in fact, than the static list of allowable command
bindings is built in fgInitCommands(). This is bad, as it means
that mouse bindings on the instruments can't work yet. I moved the
call to fgInitCommands, but someone should look carefully to see
that I picked the right place. There's a lot of initialization
code, and I got a little lost in there... :)
+ I added yet another "update" hook to the fgRenderFrame routine to
hook the updates for the 3D panels. This is only required for
"mouse press delay", and it's a fairly clumsy mechanism based on
frame rate instead of real time. There appears to be delay handling
already in place in the Input stuff, and there's a discussion going
on about different mouse behavior right now. Maybe this is a good
time to unify these two (now three) approaches?
2002-10-29 19:44:03 +00:00
|
|
|
|
virtual bool doLocalMouseAction(int button, int updown, int x, int y);
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2005-08-22 17:49:50 +00:00
|
|
|
|
virtual void setDepthTest (bool enable);
|
|
|
|
|
|
2007-09-09 23:21:20 +00:00
|
|
|
|
bool getAutohide(void) const { return _autohide; };
|
|
|
|
|
void setAutohide(bool enable) { _autohide = enable; };
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
private:
|
Virtual cockpit patches from Andy Ross:
What the attached patch does is map your panel definition onto a (non
z-buffered) quad in front of your face. You can twist the view around
and see it move in the appropriate ways.
Apply the patch (let me know if folks need help with that step), and
then set the /sim/virtual-cockpit property to true. You can do this
on the command line with --prop:/sim/virtual-cockpit=1, or via the
property picker. Bind it to a key for fast toggling if you like.
The default bindings don't allow for "panning" the view, so you'll
have to modify yours. These are the mappings to my joystick's hat
switch, for those who need hints:
<axis n="6">
<desc>View Direction</desc>
<low>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-offset-deg</property>
<step type="double">1.0</step>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-offset-deg</property>
<step type="double">-1.0</step>
</binding>
</high>
</axis>
<axis n="7">
<desc>View Elevation</desc>
<low>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-tilt-deg</property>
<step type="double">1.0</step>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-tilt-deg</property>
<step type="double">-1.0</step>
</binding>
</high>
</axis>
While the current implementation is happy with just plastering the
panel's notion of "screen" into the 3D world, this is actually more
general. Each panel can, in principle, have it's own coordinate
system, and you could build a cockpit out of a bunch of them. The
mapping is specified by providing a 3D coordinate for three corners of
the quad the panel should be mapped to; this should be pretty simple
to work with.
All that's needed for a perfectly general solution is a convention on
where to store the information (a cockpit xml file, or put it in the
aircraft -set file, or...), and some work on the panel's coordinate
system conventions (some of which don't coexist very nicely with a
generalized 3D environment). Combine that with a plib model for the
non-panel interior of the cockpit, and we're golden.
I'm actually really pleased with this. It worked better and more
quickly than I could have imagined, and impact on the surrounding code
is quite light -- a few property tests only. But some stuff is still
missing:
+ No equivalent work was done to the HUD, so it still displays
incorrect headings when the view changes. The use of pixel
coordinates deep in the HUD code is going to give me fits doing the
port, I sure. It's not nearly so well put together as the panel
(where I just changed the setup code -- none of the rendering code
changed at all).
+ I forgot that the panel was clickable. :) Input events still have
the screen coordinates, which essentially kills the interactivity
when in virtual cockpit mode. This won't be hard to fix; it's only
broken because I forgot the feature existed.
And one note about the implementation choice: to get away from the
inevitable near clip plane issue, the virtual cockpit renderer simply
disables the z buffer. This means that cockpits built using these
panels need to be z-sorted, which isn't too hard since they are static
geometry. It also means that no two "virtual panels" can ever be
allowed to interpenetrate. No biggie.
2002-03-03 00:06:24 +00:00
|
|
|
|
void setupVirtualCockpit();
|
|
|
|
|
void cleanupVirtualCockpit();
|
|
|
|
|
|
2000-09-08 20:47:18 +00:00
|
|
|
|
mutable bool _mouseDown;
|
|
|
|
|
mutable int _mouseButton, _mouseX, _mouseY;
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
mutable int _mouseDelay;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
mutable FGPanelInstrument * _mouseInstrument;
|
2000-02-26 18:01:13 +00:00
|
|
|
|
typedef vector<FGPanelInstrument *> instrument_list_type;
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
|
int _width;
|
|
|
|
|
int _height;
|
|
|
|
|
int _view_height;
|
2003-03-30 16:49:48 +00:00
|
|
|
|
|
2006-03-23 15:13:19 +00:00
|
|
|
|
SGPropertyNode_ptr _visibility;
|
|
|
|
|
SGPropertyNode_ptr _x_offset;
|
|
|
|
|
SGPropertyNode_ptr _y_offset;
|
|
|
|
|
SGPropertyNode_ptr _jitter;
|
|
|
|
|
SGPropertyNode_ptr _flipx;
|
|
|
|
|
|
|
|
|
|
SGConstPropertyNode_ptr _xsize_node;
|
|
|
|
|
SGConstPropertyNode_ptr _ysize_node;
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::ref_ptr<osg::StateSet> _bg;
|
|
|
|
|
osg::ref_ptr<osg::StateSet> _mbg[8];
|
2000-02-26 18:01:13 +00:00
|
|
|
|
// List of instruments in panel.
|
2000-02-21 22:00:24 +00:00
|
|
|
|
instrument_list_type _instruments;
|
2005-08-22 17:49:50 +00:00
|
|
|
|
bool _enable_depth_test;
|
2007-09-09 23:21:20 +00:00
|
|
|
|
bool _autohide;
|
1999-03-08 21:56:08 +00:00
|
|
|
|
};
|
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2001-08-03 00:18:21 +00:00
|
|
|
|
// Actions
|
2000-04-27 22:45:48 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Class for user actions.
|
|
|
|
|
*
|
|
|
|
|
* The actions are command bindings, like bindings for the keyboard
|
|
|
|
|
* or joystick, but they are tied to specific mouse actions in
|
|
|
|
|
* rectangular areas of the panel.
|
|
|
|
|
*/
|
2003-05-13 03:18:42 +00:00
|
|
|
|
class FGPanelAction : public SGConditional
|
2000-04-27 22:45:48 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2000-09-08 20:47:18 +00:00
|
|
|
|
FGPanelAction ();
|
2002-12-28 19:05:45 +00:00
|
|
|
|
FGPanelAction (int button, int x, int y, int w, int h, bool repeatable);
|
2000-09-08 20:47:18 +00:00
|
|
|
|
virtual ~FGPanelAction ();
|
|
|
|
|
|
2000-09-13 21:51:07 +00:00
|
|
|
|
// Getters.
|
2000-09-08 20:47:18 +00:00
|
|
|
|
virtual int getButton () const { return _button; }
|
|
|
|
|
virtual int getX () const { return _x; }
|
|
|
|
|
virtual int getY () const { return _y; }
|
|
|
|
|
virtual int getWidth () const { return _w; }
|
|
|
|
|
virtual int getHeight () const { return _h; }
|
|
|
|
|
|
2000-09-13 21:51:07 +00:00
|
|
|
|
// Setters.
|
2001-08-10 05:16:41 +00:00
|
|
|
|
|
|
|
|
|
// transfer pointer ownership
|
2007-01-04 13:22:27 +00:00
|
|
|
|
virtual void addBinding (SGBinding * binding, int updown);
|
2000-09-08 20:47:18 +00:00
|
|
|
|
virtual void setButton (int button) { _button = button; }
|
|
|
|
|
virtual void setX (int x) { _x = x; }
|
|
|
|
|
virtual void setY (int y) { _y = y; }
|
|
|
|
|
virtual void setWidth (int w) { _w = w; }
|
|
|
|
|
virtual void setHeight (int h) { _h = h; }
|
|
|
|
|
|
2000-09-13 21:51:07 +00:00
|
|
|
|
// Check whether we're in the area.
|
2000-09-08 20:47:18 +00:00
|
|
|
|
virtual bool inArea (int button, int x, int y)
|
|
|
|
|
{
|
|
|
|
|
return (button == _button &&
|
|
|
|
|
x >= _x &&
|
|
|
|
|
x < _x + _w &&
|
|
|
|
|
y >= _y &&
|
|
|
|
|
y < _y + _h);
|
|
|
|
|
}
|
|
|
|
|
|
2000-09-13 21:51:07 +00:00
|
|
|
|
// Perform the action.
|
2002-12-28 19:05:45 +00:00
|
|
|
|
virtual bool doAction (int updown);
|
2000-09-08 20:47:18 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2007-01-04 13:22:27 +00:00
|
|
|
|
typedef vector<SGBinding *> binding_list_t;
|
2001-07-27 21:59:53 +00:00
|
|
|
|
|
2000-09-08 20:47:18 +00:00
|
|
|
|
int _button;
|
|
|
|
|
int _x;
|
|
|
|
|
int _y;
|
|
|
|
|
int _w;
|
|
|
|
|
int _h;
|
2002-12-28 19:05:45 +00:00
|
|
|
|
bool _repeatable;
|
|
|
|
|
int _last_state;
|
|
|
|
|
binding_list_t _bindings[2];
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2001-08-03 00:18:21 +00:00
|
|
|
|
// Transformations.
|
2000-02-15 03:30:01 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-09-08 20:47:18 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* A transformation for a layer.
|
|
|
|
|
*/
|
2003-05-13 03:18:42 +00:00
|
|
|
|
class FGPanelTransformation : public SGConditional
|
2001-08-03 00:18:21 +00:00
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
enum Type {
|
|
|
|
|
XSHIFT,
|
|
|
|
|
YSHIFT,
|
|
|
|
|
ROTATION
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
FGPanelTransformation ();
|
|
|
|
|
virtual ~FGPanelTransformation ();
|
|
|
|
|
|
|
|
|
|
Type type;
|
2006-03-23 15:13:19 +00:00
|
|
|
|
SGConstPropertyNode_ptr node;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
float min;
|
|
|
|
|
float max;
|
2003-03-02 14:19:24 +00:00
|
|
|
|
bool has_mod;
|
|
|
|
|
float mod;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
float factor;
|
|
|
|
|
float offset;
|
2001-05-15 23:08:25 +00:00
|
|
|
|
SGInterpTable * table;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Layers
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
/**
|
|
|
|
|
* A single layer of a multi-layered instrument.
|
|
|
|
|
*
|
|
|
|
|
* Each layer can be subject to a series of transformations based
|
|
|
|
|
* on current FGFS instrument readings: for example, a texture
|
|
|
|
|
* representing a needle can rotate to show the airspeed.
|
|
|
|
|
*/
|
2003-05-13 03:18:42 +00:00
|
|
|
|
class FGInstrumentLayer : public SGConditional
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2000-06-14 20:59:51 +00:00
|
|
|
|
FGInstrumentLayer (int w = -1, int h = -1);
|
2000-02-21 22:00:24 +00:00
|
|
|
|
virtual ~FGInstrumentLayer ();
|
1999-03-08 21:56:08 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state) = 0;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
virtual void transform () const;
|
1999-03-08 21:56:08 +00:00
|
|
|
|
|
2000-06-14 20:59:51 +00:00
|
|
|
|
virtual int getWidth () const { return _w; }
|
|
|
|
|
virtual int getHeight () const { return _h; }
|
|
|
|
|
virtual void setWidth (int w) { _w = w; }
|
|
|
|
|
virtual void setHeight (int h) { _h = h; }
|
|
|
|
|
|
2000-09-08 20:47:18 +00:00
|
|
|
|
// Transfer pointer ownership!!
|
|
|
|
|
// DEPRECATED
|
|
|
|
|
virtual void addTransformation (FGPanelTransformation * transformation);
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
protected:
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
int _w, _h;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
2000-09-08 20:47:18 +00:00
|
|
|
|
typedef vector<FGPanelTransformation *> transformation_list;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
transformation_list _transformations;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2001-08-03 00:18:21 +00:00
|
|
|
|
// Instruments.
|
2000-02-15 03:30:01 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
|
|
|
|
* Abstract base class for a panel instrument.
|
|
|
|
|
*
|
|
|
|
|
* A panel instrument consists of zero or more actions, associated
|
|
|
|
|
* with mouse clicks in rectangular areas. Currently, the only
|
|
|
|
|
* concrete class derived from this is FGLayeredInstrument, but others
|
|
|
|
|
* may show up in the future (some complex instruments could be
|
|
|
|
|
* entirely hand-coded, for example).
|
|
|
|
|
*/
|
2003-05-13 03:18:42 +00:00
|
|
|
|
class FGPanelInstrument : public SGConditional
|
2001-08-03 00:18:21 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FGPanelInstrument ();
|
|
|
|
|
FGPanelInstrument (int x, int y, int w, int h);
|
|
|
|
|
virtual ~FGPanelInstrument ();
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state) = 0;
|
|
|
|
|
virtual void drawHotspots(osg::State& state);
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
|
|
|
|
virtual void setPosition(int x, int y);
|
|
|
|
|
virtual void setSize(int w, int h);
|
|
|
|
|
|
|
|
|
|
virtual int getXPos () const;
|
|
|
|
|
virtual int getYPos () const;
|
|
|
|
|
virtual int getWidth () const;
|
|
|
|
|
virtual int getHeight () const;
|
|
|
|
|
|
|
|
|
|
// Coordinates relative to centre.
|
|
|
|
|
// Transfer pointer ownership!!
|
|
|
|
|
virtual void addAction (FGPanelAction * action);
|
|
|
|
|
|
|
|
|
|
// Coordinates relative to centre.
|
2002-12-28 19:05:45 +00:00
|
|
|
|
virtual bool doMouseAction (int button, int updown, int x, int y);
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
int _x, _y, _w, _h;
|
|
|
|
|
typedef vector<FGPanelAction *> action_list_type;
|
|
|
|
|
action_list_type _actions;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
/**
|
|
|
|
|
* An instrument constructed of multiple layers.
|
|
|
|
|
*
|
|
|
|
|
* Each individual layer can be rotated or shifted to correspond
|
|
|
|
|
* to internal FGFS instrument readings.
|
|
|
|
|
*/
|
|
|
|
|
class FGLayeredInstrument : public FGPanelInstrument
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument (int x, int y, int w, int h);
|
|
|
|
|
virtual ~FGLayeredInstrument ();
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
// Transfer pointer ownership!!
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
virtual int addLayer (FGInstrumentLayer *layer);
|
2005-10-25 13:49:55 +00:00
|
|
|
|
virtual int addLayer (const FGCroppedTexture &texture, int w = -1, int h = -1);
|
2000-09-08 20:47:18 +00:00
|
|
|
|
|
|
|
|
|
// Transfer pointer ownership!!
|
|
|
|
|
virtual void addTransformation (FGPanelTransformation * transformation);
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
protected:
|
2000-09-30 03:35:38 +00:00
|
|
|
|
typedef vector<FGInstrumentLayer *> layer_list;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
layer_list _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
|
|
|
|
|
2006-01-13 22:07:50 +00:00
|
|
|
|
/**
|
|
|
|
|
* An empty-shell instrument that exists soley in
|
|
|
|
|
* order to redirect commands from the panel to a
|
|
|
|
|
* complex instrument inherited from SGSubsystem.
|
|
|
|
|
*
|
|
|
|
|
* Currently the only complex instrument is the KLN89,
|
|
|
|
|
* which we've hardwired this to for now.
|
|
|
|
|
*/
|
|
|
|
|
class FGSpecialInstrument : public FGPanelInstrument
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FGSpecialInstrument(DCLGPS* sb);
|
|
|
|
|
//FGSpecialInstrument (int x, int y, int w, int h);
|
|
|
|
|
virtual ~FGSpecialInstrument ();
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
2006-01-13 22:07:50 +00:00
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
DCLGPS* complex;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
|
|
|
|
* An instrument layer containing a group of sublayers.
|
|
|
|
|
*
|
|
|
|
|
* This class is useful for gathering together a group of related
|
|
|
|
|
* layers, either to hold in an external file or to work under
|
|
|
|
|
* the same condition.
|
|
|
|
|
*/
|
|
|
|
|
class FGGroupLayer : public FGInstrumentLayer
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FGGroupLayer ();
|
|
|
|
|
virtual ~FGGroupLayer ();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
2001-08-03 00:18:21 +00:00
|
|
|
|
// transfer pointer ownership
|
|
|
|
|
virtual void addLayer (FGInstrumentLayer * layer);
|
2003-03-09 03:34:29 +00:00
|
|
|
|
protected:
|
2001-08-03 00:18:21 +00:00
|
|
|
|
vector<FGInstrumentLayer *> _layers;
|
|
|
|
|
};
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
|
|
|
|
* A textured layer of an instrument.
|
|
|
|
|
*
|
|
|
|
|
* This is a layer holding a single texture. Normally, the texture's
|
|
|
|
|
* backgound should be transparent so that lower layers and the panel
|
|
|
|
|
* background can show through.
|
|
|
|
|
*/
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
class FGTexturedLayer : public FGInstrumentLayer
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2000-06-14 20:59:51 +00:00
|
|
|
|
FGTexturedLayer (int w = -1, int h = -1) : FGInstrumentLayer(w, h) {}
|
2000-09-22 17:20:56 +00:00
|
|
|
|
FGTexturedLayer (const FGCroppedTexture &texture, int w = -1, int h = -1);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
virtual ~FGTexturedLayer ();
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
2000-05-15 16:33:42 +00:00
|
|
|
|
|
2000-09-22 17:20:56 +00:00
|
|
|
|
virtual void setTexture (const FGCroppedTexture &texture) {
|
2000-09-13 21:51:07 +00:00
|
|
|
|
_texture = texture;
|
|
|
|
|
}
|
2000-09-22 17:20:56 +00:00
|
|
|
|
virtual const FGCroppedTexture &getTexture () const { return _texture; }
|
2006-02-01 20:54:17 +00:00
|
|
|
|
virtual FGCroppedTexture *getTexture() { return &_texture; }
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2006-02-16 18:59:48 +00:00
|
|
|
|
void setEmissive(bool e) { _emissive = e; }
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
private:
|
2005-10-25 13:49:55 +00:00
|
|
|
|
FGCroppedTexture _texture;
|
2006-02-16 18:59:48 +00:00
|
|
|
|
bool _emissive;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
};
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
|
|
|
|
* A text layer of an instrument.
|
|
|
|
|
*
|
|
|
|
|
* This is a layer holding a string of static and/or generated text.
|
|
|
|
|
* It is useful for instruments that have text displays, such as
|
|
|
|
|
* a chronometer, GPS, or NavCom radio.
|
|
|
|
|
*/
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
class FGTextLayer : public FGInstrumentLayer
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2002-03-12 20:01:54 +00:00
|
|
|
|
enum ChunkType {
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
TEXT,
|
2000-09-06 00:07:48 +00:00
|
|
|
|
TEXT_VALUE,
|
|
|
|
|
DOUBLE_VALUE
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
};
|
|
|
|
|
|
2003-05-13 03:18:42 +00:00
|
|
|
|
class Chunk : public SGConditional
|
2001-08-03 00:18:21 +00:00
|
|
|
|
{
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
public:
|
2000-09-13 21:51:07 +00:00
|
|
|
|
Chunk (const string &text, const string &fmt = "%s");
|
2001-06-12 05:15:48 +00:00
|
|
|
|
Chunk (ChunkType type, const SGPropertyNode * node,
|
2004-01-22 18:42:42 +00:00
|
|
|
|
const string &fmt = "", float mult = 1.0, float offs = 0.0,
|
|
|
|
|
bool truncation = false);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
|
2000-09-13 21:51:07 +00:00
|
|
|
|
const char * getValue () const;
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
private:
|
|
|
|
|
ChunkType _type;
|
2000-09-13 21:51:07 +00:00
|
|
|
|
string _text;
|
2006-03-23 15:13:19 +00:00
|
|
|
|
SGConstPropertyNode_ptr _node;
|
2000-09-13 21:51:07 +00:00
|
|
|
|
string _fmt;
|
2000-05-15 16:33:42 +00:00
|
|
|
|
float _mult;
|
2004-01-13 18:28:46 +00:00
|
|
|
|
float _offs;
|
2004-01-22 18:42:42 +00:00
|
|
|
|
bool _trunc;
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
mutable char _buf[1024];
|
|
|
|
|
};
|
|
|
|
|
|
2000-09-30 03:35:38 +00:00
|
|
|
|
FGTextLayer (int w = -1, int h = -1);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
virtual ~FGTextLayer ();
|
2000-02-21 22:00:24 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
|
|
|
|
|
// Transfer pointer!!
|
|
|
|
|
virtual void addChunk (Chunk * chunk);
|
2000-02-21 22:00:24 +00:00
|
|
|
|
virtual void setColor (float r, float g, float b);
|
|
|
|
|
virtual void setPointSize (float size);
|
2002-02-19 23:54:17 +00:00
|
|
|
|
virtual void setFontName ( const string &name );
|
2000-02-21 22:00:24 +00:00
|
|
|
|
virtual void setFont (fntFont * font);
|
|
|
|
|
|
|
|
|
|
private:
|
2000-09-30 03:35:38 +00:00
|
|
|
|
|
|
|
|
|
void recalc_value () const;
|
|
|
|
|
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
typedef vector<Chunk *> chunk_list;
|
|
|
|
|
chunk_list _chunks;
|
2000-03-17 06:16:15 +00:00
|
|
|
|
float _color[4];
|
2000-09-13 21:51:07 +00:00
|
|
|
|
|
|
|
|
|
float _pointSize;
|
2002-02-19 23:54:17 +00:00
|
|
|
|
mutable string _font_name;
|
2000-09-30 03:35:38 +00:00
|
|
|
|
mutable string _value;
|
2000-11-30 18:43:31 +00:00
|
|
|
|
mutable SGTimeStamp _then;
|
|
|
|
|
mutable SGTimeStamp _now;
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
2003-03-09 03:34:29 +00:00
|
|
|
|
* A group layer that switches among its children.
|
2001-08-03 00:18:21 +00:00
|
|
|
|
*
|
2003-03-09 03:34:29 +00:00
|
|
|
|
* The first layer that passes its condition will be drawn, and
|
|
|
|
|
* any following layers will be ignored.
|
2001-08-03 00:18:21 +00:00
|
|
|
|
*/
|
2003-03-09 03:34:29 +00:00
|
|
|
|
class FGSwitchLayer : public FGGroupLayer
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
// Transfer pointers!!
|
2003-03-09 03:34:29 +00:00
|
|
|
|
FGSwitchLayer ();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
virtual void draw (osg::State& state);
|
User-visible
- knobs now continue to rotate when you hold down the mouse
- the middle mouse button makes knobs rotate much faster
- there are NAV1, NAV2, and ADF radios that can be tuned using the mouse
- there are standby frequencies for NAV1 and NAV2, and buttons to swap
- there is a crude, rather silly-looking DME, hard-wired to NAV1
- there is a crude, rather silly-looking autopilot that can lock
the heading (to the bug on the gyro), can lock to NAV1, and can lock
the current altitude
- the knobs for changing the radials on NAV1 and NAV2 look much better
and are in the right place
- tuning into an ILS frequency doesn't change the displayed radial for
NAV1
Code
- I've created a new module, sp_panel.[ch]xx, that constructs the
default single-prop panel; this works entirely outside of FGPanel,
so it is possible to construct similar modules for other sorts of
panels; all code specific to the default panel has been removed from
panel.cxx
- current_panel is now a pointer
- radiostack.[ch]xx keeps track both of the actual radial and of the
selected radial (they will differ with ILS); the NAV gauges should
not spin around automatically to show the actual radial (we need to
do something similar with the autopilot)
- the panel is initialized fairly early
- make sure that standby frequencies also get initialized
- I've started combining and clipping small textures to save texture
memory; there's a lot more to do, but at least I've made a start
2000-05-02 18:26:00 +00:00
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
|
2000-10-18 21:19:30 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Functions.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2001-08-03 00:18:21 +00:00
|
|
|
|
/**
|
|
|
|
|
* Test whether the panel should be visible.
|
|
|
|
|
*/
|
2000-10-18 21:19:30 +00:00
|
|
|
|
bool fgPanelVisible ();
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
#endif // __PANEL_HXX
|
|
|
|
|
|
|
|
|
|
// end of panel.hxx
|
|
|
|
|
|
1998-11-09 23:38:50 +00:00
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
|