2000-02-15 03:30:01 +00:00
|
|
|
|
// panel.cxx - default, 2D single-engine prop instrument panel
|
1998-11-11 00:19:27 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// Written by David Megginson, started January 2000.
|
1998-11-11 00:19:27 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
|
// License, or (at your option) any later version.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
// General Public License for more details.
|
2006-02-21 01:16:04 +00:00
|
|
|
|
//
|
2000-02-15 03:30:01 +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
|
|
|
|
//
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// $Id$
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
2006-02-16 18:59:48 +00:00
|
|
|
|
//JVK
|
|
|
|
|
// On 2D panels all instruments include light sources were in night displayed
|
|
|
|
|
// with a red mask (instrument light). It is not correct for light sources
|
|
|
|
|
// (bulbs). There is added new layer property "emissive" (boolean) (only for
|
|
|
|
|
// textured layers).
|
|
|
|
|
// If a layer has to shine set it in the "instrument_def_file.xml" inside the
|
|
|
|
|
// <layer> tag by adding <emissive>true</emissive> tag. When omitted the default
|
|
|
|
|
// value is for backward compatibility set to false.
|
|
|
|
|
|
1998-06-27 16:47:53 +00:00
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
# include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2009-09-20 08:21:47 +00:00
|
|
|
|
#include "panel.hxx"
|
|
|
|
|
|
2002-02-05 15:57:46 +00:00
|
|
|
|
#include <stdio.h> // sprintf
|
2000-02-15 03:30:01 +00:00
|
|
|
|
#include <string.h>
|
2008-08-14 18:13:39 +00:00
|
|
|
|
#include <iostream>
|
2012-03-25 18:46:04 +01:00
|
|
|
|
#include <cassert>
|
1999-03-08 21:56:08 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
#include <osg/CullFace>
|
|
|
|
|
#include <osg/Depth>
|
|
|
|
|
#include <osg/Material>
|
2010-10-08 23:46:38 +02:00
|
|
|
|
#include <osg/Matrixf>
|
2006-10-29 19:30:21 +00:00
|
|
|
|
#include <osg/TexEnv>
|
|
|
|
|
#include <osg/PolygonOffset>
|
|
|
|
|
|
2004-11-18 19:53:00 +00:00
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
#include <plib/fnt.h>
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
2012-03-25 18:46:04 +01:00
|
|
|
|
#include <boost/foreach.hpp>
|
2000-02-16 23:01:03 +00:00
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
2001-03-25 14:20:12 +00:00
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
2006-10-29 19:30:21 +00:00
|
|
|
|
#include <simgear/scene/model/model.hxx>
|
2008-07-27 16:25:13 +00:00
|
|
|
|
#include <osg/GLU>
|
2001-01-11 22:44:18 +00:00
|
|
|
|
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
|
#include <Main/globals.hxx>
|
2001-01-11 22:44:18 +00:00
|
|
|
|
#include <Main/fg_props.hxx>
|
2012-04-25 23:28:00 +02:00
|
|
|
|
#include <Viewer/viewmgr.hxx>
|
|
|
|
|
#include <Viewer/viewer.hxx>
|
2000-10-25 22:59:02 +00:00
|
|
|
|
#include <Time/light.hxx>
|
2011-11-19 20:25:51 +00:00
|
|
|
|
#include <GUI/FGFontCache.hxx>
|
2009-09-20 08:21:47 +00:00
|
|
|
|
#include <Instrumentation/dclgps.hxx>
|
1998-06-27 16:47:53 +00:00
|
|
|
|
|
2001-06-20 20:50:49 +00:00
|
|
|
|
#define WIN_X 0
|
|
|
|
|
#define WIN_Y 0
|
|
|
|
|
#define WIN_W 1024
|
|
|
|
|
#define WIN_H 768
|
|
|
|
|
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
// The number of polygon-offset "units" to place between layers. In
|
|
|
|
|
// principle, one is supposed to be enough. In practice, I find that
|
|
|
|
|
// my hardware/driver requires many more.
|
2006-09-05 20:28:48 +00:00
|
|
|
|
#define POFF_UNITS 8
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
|
2012-04-15 13:21:12 +01:00
|
|
|
|
const double MOUSE_ACTION_REPEAT_DELAY = 0.5; // 500msec initial delay
|
|
|
|
|
const double MOUSE_ACTION_REPEAT_INTERVAL = 0.1; // 10Hz repeat rate
|
|
|
|
|
|
2011-10-17 17:41:59 +01:00
|
|
|
|
using std::map;
|
|
|
|
|
|
2001-06-20 20:50:49 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Local functions.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Calculate the aspect adjustment for the panel.
|
|
|
|
|
*/
|
2001-06-26 18:23:07 +00:00
|
|
|
|
static float
|
2001-06-20 20:50:49 +00:00
|
|
|
|
get_aspect_adjust (int xsize, int ysize)
|
|
|
|
|
{
|
|
|
|
|
float ideal_aspect = float(WIN_W) / float(WIN_H);
|
|
|
|
|
float real_aspect = float(xsize) / float(ysize);
|
|
|
|
|
return (real_aspect / ideal_aspect);
|
|
|
|
|
}
|
2000-04-27 22:45:48 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGTextureManager.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
map<string,osg::ref_ptr<osg::Texture2D> > FGTextureManager::_textureMap;
|
2000-04-27 22:45:48 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::Texture2D*
|
2007-12-07 09:14:16 +00:00
|
|
|
|
FGTextureManager::createTexture (const string &relativePath, bool staticTexture)
|
2000-04-27 22:45:48 +00:00
|
|
|
|
{
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::Texture2D* texture = _textureMap[relativePath].get();
|
2000-04-27 22:45:48 +00:00
|
|
|
|
if (texture == 0) {
|
2010-07-29 01:07:32 +01:00
|
|
|
|
SGPath tpath = globals->resolve_aircraft_path(relativePath);
|
2007-12-07 09:14:16 +00:00
|
|
|
|
texture = SGLoadTexture2D(staticTexture, tpath);
|
2006-10-29 19:30:21 +00:00
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
_textureMap[relativePath] = texture;
|
2006-10-29 19:30:21 +00:00
|
|
|
|
if (!_textureMap[relativePath].valid())
|
2001-06-01 17:55:49 +00:00
|
|
|
|
SG_LOG( SG_COCKPIT, SG_ALERT, "Texture *still* doesn't exist" );
|
2006-10-29 19:30:21 +00:00
|
|
|
|
SG_LOG( SG_COCKPIT, SG_DEBUG, "Created texture " << relativePath );
|
2000-04-27 22:45:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return texture;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-06-24 07:57:45 +00:00
|
|
|
|
void FGTextureManager::addTexture(const string &relativePath,
|
|
|
|
|
osg::Texture2D* texture)
|
|
|
|
|
{
|
|
|
|
|
_textureMap[relativePath] = texture;
|
|
|
|
|
}
|
2000-09-22 17:20:56 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGCropped Texture.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FGCroppedTexture::FGCroppedTexture ()
|
|
|
|
|
: _path(""), _texture(0),
|
|
|
|
|
_minX(0.0), _minY(0.0), _maxX(1.0), _maxY(1.0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FGCroppedTexture::FGCroppedTexture (const string &path,
|
|
|
|
|
float minX, float minY,
|
|
|
|
|
float maxX, float maxY)
|
|
|
|
|
: _path(path), _texture(0),
|
|
|
|
|
_minX(minX), _minY(minY), _maxX(maxX), _maxY(maxY)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FGCroppedTexture::~FGCroppedTexture ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::StateSet*
|
2000-09-22 17:20:56 +00:00
|
|
|
|
FGCroppedTexture::getTexture ()
|
|
|
|
|
{
|
|
|
|
|
if (_texture == 0) {
|
2006-10-29 19:30:21 +00:00
|
|
|
|
_texture = new osg::StateSet;
|
|
|
|
|
_texture->setTextureAttribute(0, FGTextureManager::createTexture(_path));
|
|
|
|
|
_texture->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
|
|
|
|
|
_texture->setTextureAttribute(0, new osg::TexEnv(osg::TexEnv::MODULATE));
|
2000-09-22 17:20:56 +00:00
|
|
|
|
}
|
2006-10-29 19:30:21 +00:00
|
|
|
|
return _texture.get();
|
2000-09-22 17:20:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGPanel.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-09-30 03:35:38 +00:00
|
|
|
|
static fntRenderer text_renderer;
|
2005-08-22 17:49:50 +00:00
|
|
|
|
static sgVec4 panel_color;
|
2006-02-16 18:59:48 +00:00
|
|
|
|
static sgVec4 emissive_panel_color = {1,1,1,1};
|
1999-12-23 17:37:18 +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
|
|
|
|
/**
|
|
|
|
|
* Constructor.
|
|
|
|
|
*/
|
2001-06-20 20:50:49 +00:00
|
|
|
|
FGPanel::FGPanel ()
|
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
|
|
|
|
: _mouseDown(false),
|
|
|
|
|
_mouseInstrument(0),
|
2001-06-20 20:50:49 +00:00
|
|
|
|
_width(WIN_W), _height(int(WIN_H * 0.5768 + 1)),
|
2003-03-30 16:49:48 +00:00
|
|
|
|
_x_offset(fgGetNode("/sim/panel/x-offset", true)),
|
|
|
|
|
_y_offset(fgGetNode("/sim/panel/y-offset", true)),
|
|
|
|
|
_jitter(fgGetNode("/sim/panel/jitter", true)),
|
2003-05-09 19:39:48 +00:00
|
|
|
|
_flipx(fgGetNode("/sim/panel/flip-x", true)),
|
|
|
|
|
_xsize_node(fgGetNode("/sim/startup/xsize", true)),
|
2005-08-22 17:49:50 +00:00
|
|
|
|
_ysize_node(fgGetNode("/sim/startup/ysize", true)),
|
2012-01-02 23:16:18 +00:00
|
|
|
|
_enable_depth_test(false),
|
2012-05-16 11:43:09 +01:00
|
|
|
|
_autohide(true),
|
2012-01-02 23:16:18 +00:00
|
|
|
|
_drawPanelHotspots("/sim/panel-hotspots")
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-04-27 22:45:48 +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
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Destructor.
|
|
|
|
|
*/
|
2000-04-27 22:45:48 +00:00
|
|
|
|
FGPanel::~FGPanel ()
|
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
for (instrument_list_type::iterator it = _instruments.begin();
|
|
|
|
|
it != _instruments.end();
|
|
|
|
|
it++) {
|
|
|
|
|
delete *it;
|
|
|
|
|
*it = 0;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
2000-04-27 22:45:48 +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
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add an instrument to the panel.
|
|
|
|
|
*/
|
2000-04-27 22:45:48 +00:00
|
|
|
|
void
|
|
|
|
|
FGPanel::addInstrument (FGPanelInstrument * instrument)
|
|
|
|
|
{
|
|
|
|
|
_instruments.push_back(instrument);
|
|
|
|
|
}
|
|
|
|
|
|
2012-01-02 23:16:18 +00:00
|
|
|
|
double
|
|
|
|
|
FGPanel::getAspectScale() const
|
2006-10-29 19:30:21 +00:00
|
|
|
|
{
|
2012-01-02 23:16:18 +00:00
|
|
|
|
// set corner-coordinates correctly
|
2006-10-29 19:30:21 +00:00
|
|
|
|
|
2012-01-02 23:16:18 +00:00
|
|
|
|
int xsize = _xsize_node->getIntValue();
|
|
|
|
|
int ysize = _ysize_node->getIntValue();
|
|
|
|
|
float aspect_adjust = get_aspect_adjust(xsize, ysize);
|
2006-10-29 19:30:21 +00:00
|
|
|
|
|
2012-01-02 23:16:18 +00:00
|
|
|
|
if (aspect_adjust < 1.0)
|
|
|
|
|
return ysize / (double) WIN_H;
|
|
|
|
|
else
|
|
|
|
|
return xsize /(double) WIN_W;
|
2001-06-26 18:23:07 +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
|
|
|
|
/**
|
|
|
|
|
* Handle repeatable mouse events. Called from update() and from
|
|
|
|
|
* fgUpdate3DPanels(). This functionality needs to move into the
|
|
|
|
|
* input subsystem. Counting a tick every two frames is clumsy...
|
|
|
|
|
*/
|
2012-04-15 13:21:12 +01:00
|
|
|
|
void FGPanel::updateMouseDelay(double dt)
|
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
|
|
|
|
{
|
2012-04-15 13:21:12 +01:00
|
|
|
|
if (!_mouseDown) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_mouseActionRepeat -= dt;
|
|
|
|
|
while (_mouseActionRepeat < 0.0) {
|
|
|
|
|
_mouseActionRepeat += MOUSE_ACTION_REPEAT_INTERVAL;
|
|
|
|
|
_mouseInstrument->doMouseAction(_mouseButton, 0, _mouseX, _mouseY);
|
|
|
|
|
|
|
|
|
|
}
|
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
|
|
|
|
}
|
|
|
|
|
|
2001-06-26 18:23:07 +00:00
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGPanel::draw(osg::State& state)
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
{
|
2012-01-02 23:16:18 +00:00
|
|
|
|
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
// In 3D mode, it's possible that we are being drawn exactly on top
|
|
|
|
|
// of an existing polygon. Use an offset to prevent z-fighting. In
|
|
|
|
|
// 2D mode, this is a no-op.
|
2006-10-29 19:30:21 +00:00
|
|
|
|
static osg::ref_ptr<osg::StateSet> panelStateSet;
|
|
|
|
|
if (!panelStateSet.valid()) {
|
|
|
|
|
panelStateSet = new osg::StateSet;
|
|
|
|
|
panelStateSet->setAttributeAndModes(new osg::PolygonOffset(-1, -POFF_UNITS));
|
|
|
|
|
panelStateSet->setTextureAttribute(0, new osg::TexEnv);
|
|
|
|
|
|
|
|
|
|
// Draw the background
|
|
|
|
|
panelStateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
|
|
|
|
|
panelStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
|
|
|
|
panelStateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
|
|
|
|
|
panelStateSet->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON);
|
2012-01-02 23:16:18 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::Material* material = new osg::Material;
|
|
|
|
|
material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
|
|
|
|
|
material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1, 1, 1, 1));
|
|
|
|
|
material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1, 1, 1, 1));
|
|
|
|
|
material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0, 0, 0, 1));
|
|
|
|
|
material->setEmission(osg::Material::FRONT_AND_BACK, osg::Vec4(0, 0, 0, 1));
|
|
|
|
|
panelStateSet->setAttribute(material);
|
2012-01-02 23:16:18 +00:00
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
panelStateSet->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
|
|
|
|
|
panelStateSet->setAttributeAndModes(new osg::CullFace(osg::CullFace::BACK));
|
2006-11-15 06:07:42 +00:00
|
|
|
|
panelStateSet->setAttributeAndModes(new osg::Depth(osg::Depth::LEQUAL));
|
2006-10-29 19:30:21 +00:00
|
|
|
|
}
|
2006-11-15 06:07:42 +00:00
|
|
|
|
if ( _enable_depth_test )
|
|
|
|
|
panelStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
|
|
|
|
|
else
|
|
|
|
|
panelStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.pushStateSet(panelStateSet.get());
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
2003-09-20 09:38:32 +00:00
|
|
|
|
|
|
|
|
|
FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
|
2006-11-10 05:37:50 +00:00
|
|
|
|
sgCopyVec4( panel_color, l->scene_diffuse().data());
|
2002-09-28 03:57:37 +00:00
|
|
|
|
if ( fgGetDouble("/systems/electrical/outputs/instrument-lights") > 1.0 ) {
|
|
|
|
|
if ( panel_color[0] < 0.7 ) panel_color[0] = 0.7;
|
|
|
|
|
if ( panel_color[1] < 0.2 ) panel_color[1] = 0.2;
|
|
|
|
|
if ( panel_color[2] < 0.2 ) panel_color[2] = 0.2;
|
2000-05-27 06:40:55 +00:00
|
|
|
|
}
|
2002-09-28 03:57:37 +00:00
|
|
|
|
glColor4fv( panel_color );
|
2002-02-19 21:57:09 +00:00
|
|
|
|
if (_bg != 0) {
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.pushStateSet(_bg.get());
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
glBegin(GL_POLYGON);
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
glTexCoord2f(0.0, 0.0); glVertex2f(WIN_X, WIN_Y);
|
|
|
|
|
glTexCoord2f(1.0, 0.0); glVertex2f(WIN_X + _width, WIN_Y);
|
|
|
|
|
glTexCoord2f(1.0, 1.0); glVertex2f(WIN_X + _width, WIN_Y + _height);
|
|
|
|
|
glTexCoord2f(0.0, 1.0); glVertex2f(WIN_X, WIN_Y + _height);
|
2002-02-19 21:57:09 +00:00
|
|
|
|
glEnd();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.popStateSet();
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
} else {
|
|
|
|
|
for (int i = 0; i < 4; i ++) {
|
|
|
|
|
// top row of textures...(1,3,5,7)
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.pushStateSet(_mbg[i*2].get());
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
glBegin(GL_POLYGON);
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
glTexCoord2f(0.0, 0.0); glVertex2f(WIN_X + (_width/4) * i, WIN_Y + (_height/2));
|
|
|
|
|
glTexCoord2f(1.0, 0.0); glVertex2f(WIN_X + (_width/4) * (i+1), WIN_Y + (_height/2));
|
|
|
|
|
glTexCoord2f(1.0, 1.0); glVertex2f(WIN_X + (_width/4) * (i+1), WIN_Y + _height);
|
|
|
|
|
glTexCoord2f(0.0, 1.0); glVertex2f(WIN_X + (_width/4) * i, WIN_Y + _height);
|
2002-02-19 21:57:09 +00:00
|
|
|
|
glEnd();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.popStateSet();
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
// bottom row of textures...(2,4,6,8)
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.pushStateSet(_mbg[i*2+1].get());
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
glBegin(GL_POLYGON);
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
glTexCoord2f(0.0, 0.0); glVertex2f(WIN_X + (_width/4) * i, WIN_Y);
|
|
|
|
|
glTexCoord2f(1.0, 0.0); glVertex2f(WIN_X + (_width/4) * (i+1), WIN_Y);
|
|
|
|
|
glTexCoord2f(1.0, 1.0); glVertex2f(WIN_X + (_width/4) * (i+1), WIN_Y + (_height/2));
|
|
|
|
|
glTexCoord2f(0.0, 1.0); glVertex2f(WIN_X + (_width/4) * i, WIN_Y + (_height/2));
|
2002-02-19 21:57:09 +00:00
|
|
|
|
glEnd();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.popStateSet();
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-02-19 21:57:09 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
// Draw the instruments.
|
2006-09-05 20:28:48 +00:00
|
|
|
|
// Syd Adams: added instrument clipping
|
2000-02-21 22:00:24 +00:00
|
|
|
|
instrument_list_type::const_iterator current = _instruments.begin();
|
|
|
|
|
instrument_list_type::const_iterator end = _instruments.end();
|
|
|
|
|
|
2006-09-05 20:28:48 +00:00
|
|
|
|
GLdouble blx[4]={1.0,0.0,0.0,0.0};
|
|
|
|
|
GLdouble bly[4]={0.0,1.0,0.0,0.0};
|
|
|
|
|
GLdouble urx[4]={-1.0,0.0,0.0,0.0};
|
|
|
|
|
GLdouble ury[4]={0.0,-1.0,0.0,0.0};
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
for ( ; current != end; current++) {
|
|
|
|
|
FGPanelInstrument * instr = *current;
|
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
|
|
|
|
glPushMatrix();
|
2000-02-21 22:00:24 +00:00
|
|
|
|
glTranslated(instr->getXPos(), instr->getYPos(), 0);
|
2006-09-05 20:28:48 +00:00
|
|
|
|
|
|
|
|
|
int ix= instr->getWidth();
|
|
|
|
|
int iy= instr->getHeight();
|
|
|
|
|
glPushMatrix();
|
|
|
|
|
glTranslated(-ix/2,-iy/2,0);
|
|
|
|
|
glClipPlane(GL_CLIP_PLANE0,blx);
|
|
|
|
|
glClipPlane(GL_CLIP_PLANE1,bly);
|
|
|
|
|
glEnable(GL_CLIP_PLANE0);
|
|
|
|
|
glEnable(GL_CLIP_PLANE1);
|
|
|
|
|
|
|
|
|
|
glTranslated(ix,iy,0);
|
|
|
|
|
glClipPlane(GL_CLIP_PLANE2,urx);
|
|
|
|
|
glClipPlane(GL_CLIP_PLANE3,ury);
|
|
|
|
|
glEnable(GL_CLIP_PLANE2);
|
|
|
|
|
glEnable(GL_CLIP_PLANE3);
|
|
|
|
|
glPopMatrix();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
instr->draw(state);
|
2006-09-05 20:28:48 +00:00
|
|
|
|
|
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
|
|
|
|
glPopMatrix();
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-05 20:28:48 +00:00
|
|
|
|
glDisable(GL_CLIP_PLANE0);
|
|
|
|
|
glDisable(GL_CLIP_PLANE1);
|
|
|
|
|
glDisable(GL_CLIP_PLANE2);
|
|
|
|
|
glDisable(GL_CLIP_PLANE3);
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.popStateSet();
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2006-09-05 20:28:48 +00:00
|
|
|
|
|
2002-11-17 00:04:57 +00:00
|
|
|
|
// Draw yellow "hotspots" if directed to. This is a panel authoring
|
|
|
|
|
// feature; not intended to be high performance or to look good.
|
2012-01-02 23:16:18 +00:00
|
|
|
|
if ( _drawPanelHotspots ) {
|
2006-11-15 06:07:42 +00:00
|
|
|
|
static osg::ref_ptr<osg::StateSet> hotspotStateSet;
|
|
|
|
|
if (!hotspotStateSet.valid()) {
|
|
|
|
|
hotspotStateSet = new osg::StateSet;
|
|
|
|
|
hotspotStateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF);
|
|
|
|
|
hotspotStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.pushStateSet(hotspotStateSet.get());
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2006-11-15 06:07:42 +00:00
|
|
|
|
|
|
|
|
|
glPushAttrib(GL_ENABLE_BIT);
|
|
|
|
|
glDisable(GL_COLOR_MATERIAL);
|
2002-11-17 00:04:57 +00:00
|
|
|
|
glColor3f(1, 1, 0);
|
|
|
|
|
|
2003-05-09 19:39:48 +00:00
|
|
|
|
for ( unsigned int i = 0; i < _instruments.size(); i++ )
|
2006-10-29 19:30:21 +00:00
|
|
|
|
_instruments[i]->drawHotspots(state);
|
2006-11-15 06:07:42 +00:00
|
|
|
|
|
2012-03-25 18:46:04 +01:00
|
|
|
|
glColor3f(0, 1, 1);
|
|
|
|
|
|
|
|
|
|
int x0, y0, x1, y1;
|
|
|
|
|
getLogicalExtent(x0, y0, x1, y1);
|
|
|
|
|
|
|
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
|
glVertex2f(x0, y0);
|
|
|
|
|
glVertex2f(x1, y0);
|
|
|
|
|
glVertex2f(x1, y1);
|
|
|
|
|
glVertex2f(x0, y1);
|
|
|
|
|
glEnd();
|
|
|
|
|
|
|
|
|
|
|
2006-11-15 06:07:42 +00:00
|
|
|
|
glPopAttrib();
|
|
|
|
|
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.popStateSet();
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2002-11-17 00:04:57 +00:00
|
|
|
|
}
|
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
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
|
/**
|
|
|
|
|
* Set the panel's background 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
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGPanel::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
|
|
|
|
{
|
2006-10-29 19:30:21 +00:00
|
|
|
|
osg::StateSet* stateSet = new osg::StateSet;
|
|
|
|
|
stateSet->setTextureAttribute(0, texture);
|
|
|
|
|
stateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
|
|
|
|
|
stateSet->setTextureAttribute(0, new osg::TexEnv(osg::TexEnv::MODULATE));
|
|
|
|
|
_bg = stateSet;
|
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
|
|
|
|
/**
|
|
|
|
|
* Set the panel's multiple background textures.
|
|
|
|
|
*/
|
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGPanel::setMultiBackground (osg::Texture2D* texture, int idx)
|
2002-02-19 21:57:09 +00:00
|
|
|
|
{
|
|
|
|
|
_bg = 0;
|
2006-10-29 19:30:21 +00:00
|
|
|
|
|
|
|
|
|
osg::StateSet* stateSet = new osg::StateSet;
|
|
|
|
|
stateSet->setTextureAttribute(0, texture);
|
|
|
|
|
stateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
|
|
|
|
|
stateSet->setTextureAttribute(0, new osg::TexEnv(osg::TexEnv::MODULATE));
|
|
|
|
|
_mbg[idx] = stateSet;
|
2002-02-19 21:57:09 +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
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set the panel's x-offset.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
FGPanel::setXOffset (int offset)
|
|
|
|
|
{
|
2001-06-20 20:50:49 +00:00
|
|
|
|
if (offset <= 0 && offset >= -_width + WIN_W)
|
2003-03-30 16:49:48 +00:00
|
|
|
|
_x_offset->setIntValue( offset );
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set the panel's y-offset.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
FGPanel::setYOffset (int offset)
|
|
|
|
|
{
|
|
|
|
|
if (offset <= 0 && offset >= -_height)
|
2003-03-30 16:49:48 +00:00
|
|
|
|
_y_offset->setIntValue( offset );
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
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
|
|
|
|
* Handle a mouse action in panel-local (not screen) coordinates.
|
|
|
|
|
* Used by the 3D panel code in Model/panelnode.cxx, in situations
|
|
|
|
|
* where the panel doesn't control its own screen location.
|
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
|
|
|
|
*/
|
2000-04-27 22:45:48 +00:00
|
|
|
|
bool
|
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
|
|
|
|
FGPanel::doLocalMouseAction(int button, int updown, int x, int y)
|
2000-04-27 22:45:48 +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
|
|
|
|
// Note a released button and return
|
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
|
|
|
|
if (updown == 1) {
|
2002-12-28 19:05:45 +00:00
|
|
|
|
if (_mouseInstrument != 0)
|
|
|
|
|
_mouseInstrument->doMouseAction(_mouseButton, 1, _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
|
|
|
|
_mouseDown = false;
|
|
|
|
|
_mouseInstrument = 0;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
return 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-04-27 22:45:48 +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
|
|
|
|
// Search for a matching instrument.
|
2000-09-13 21:51:07 +00:00
|
|
|
|
for (int i = 0; i < (int)_instruments.size(); i++) {
|
2000-04-27 22:45:48 +00:00
|
|
|
|
FGPanelInstrument *inst = _instruments[i];
|
|
|
|
|
int ix = inst->getXPos();
|
|
|
|
|
int iy = inst->getYPos();
|
|
|
|
|
int iw = inst->getWidth() / 2;
|
|
|
|
|
int ih = inst->getHeight() / 2;
|
|
|
|
|
if (x >= ix - iw && x < ix + iw && y >= iy - ih && y < iy + ih) {
|
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
|
|
|
|
_mouseDown = true;
|
2012-04-15 13:21:12 +01:00
|
|
|
|
_mouseActionRepeat = MOUSE_ACTION_REPEAT_DELAY;
|
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
|
|
|
|
_mouseInstrument = inst;
|
|
|
|
|
_mouseButton = button;
|
|
|
|
|
_mouseX = x - ix;
|
|
|
|
|
_mouseY = y - iy;
|
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
|
|
|
|
// Always do the action once.
|
2002-12-28 19:05:45 +00:00
|
|
|
|
return _mouseInstrument->doMouseAction(_mouseButton, 0,
|
|
|
|
|
_mouseX, _mouseY);
|
2000-04-27 22:45:48 +00:00
|
|
|
|
}
|
2000-02-26 18:01:13 +00:00
|
|
|
|
}
|
2000-04-27 22:45:48 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2000-02-26 18:01:13 +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
|
|
|
|
/**
|
|
|
|
|
* Perform a mouse action.
|
|
|
|
|
*/
|
|
|
|
|
bool
|
|
|
|
|
FGPanel::doMouseAction (int button, int updown, int x, int y)
|
|
|
|
|
{
|
|
|
|
|
// FIXME: this same code appears in update()
|
|
|
|
|
int xsize = _xsize_node->getIntValue();
|
|
|
|
|
int ysize = _ysize_node->getIntValue();
|
|
|
|
|
float aspect_adjust = get_aspect_adjust(xsize, ysize);
|
|
|
|
|
|
|
|
|
|
// Scale for the real window size.
|
|
|
|
|
if (aspect_adjust < 1.0) {
|
|
|
|
|
x = int(((float)x / xsize) * WIN_W * aspect_adjust);
|
|
|
|
|
y = int(WIN_H - ((float(y) / ysize) * WIN_H));
|
|
|
|
|
} else {
|
|
|
|
|
x = int(((float)x / xsize) * WIN_W);
|
|
|
|
|
y = int((WIN_H - ((float(y) / ysize) * WIN_H)) / aspect_adjust);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Adjust for offsets.
|
2003-03-30 16:49:48 +00:00
|
|
|
|
x -= _x_offset->getIntValue();
|
|
|
|
|
y -= _y_offset->getIntValue();
|
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
|
|
|
|
|
|
|
|
|
// Having fixed up the coordinates, fall through to the local
|
|
|
|
|
// coordinate handler.
|
2003-03-23 09:59:46 +00:00
|
|
|
|
return doLocalMouseAction(button, updown, x, 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
|
|
|
|
}
|
|
|
|
|
|
2005-08-22 17:49:50 +00:00
|
|
|
|
void FGPanel::setDepthTest (bool enable) {
|
|
|
|
|
_enable_depth_test = enable;
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-25 18:46:04 +01:00
|
|
|
|
class IntRect
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
IntRect() :
|
|
|
|
|
x0(std::numeric_limits<int>::max()),
|
|
|
|
|
y0(std::numeric_limits<int>::max()),
|
|
|
|
|
x1(std::numeric_limits<int>::min()),
|
|
|
|
|
y1(std::numeric_limits<int>::min())
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
IntRect(int x, int y, int w, int h) :
|
|
|
|
|
x0(x), y0(y), x1(x + w), y1( y + h)
|
|
|
|
|
{
|
|
|
|
|
if (x1 < x0) {
|
|
|
|
|
std::swap(x0, x1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (y1 < y0) {
|
|
|
|
|
std::swap(y0, y1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(x0 <= x1);
|
|
|
|
|
assert(y0 <= y1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void extend(const IntRect& r)
|
|
|
|
|
{
|
|
|
|
|
x0 = std::min(x0, r.x0);
|
|
|
|
|
y0 = std::min(y0, r.y0);
|
|
|
|
|
x1 = std::max(x1, r.x1);
|
|
|
|
|
y1 = std::max(y1, r.y1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int x0, y0, x1, y1;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void FGPanel::getLogicalExtent(int &x0, int& y0, int& x1, int &y1)
|
|
|
|
|
{
|
|
|
|
|
IntRect result;
|
|
|
|
|
BOOST_FOREACH(FGPanelInstrument *inst, _instruments) {
|
|
|
|
|
inst->extendRect(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
x0 = result.x0;
|
|
|
|
|
y0 = result.y0;
|
|
|
|
|
x1 = result.x1;
|
|
|
|
|
y1 = result.y1;
|
|
|
|
|
}
|
2000-09-08 20:47:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////.
|
|
|
|
|
// Implementation of FGPanelAction.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGPanelAction::FGPanelAction ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-28 19:05:45 +00:00
|
|
|
|
FGPanelAction::FGPanelAction (int button, int x, int y, int w, int h,
|
|
|
|
|
bool repeatable)
|
|
|
|
|
: _button(button), _x(x), _y(y), _w(w), _h(h), _repeatable(repeatable)
|
2000-09-08 20:47:18 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGPanelAction::~FGPanelAction ()
|
|
|
|
|
{
|
2005-06-20 18:52:54 +00:00
|
|
|
|
for (unsigned int i = 0; i < 2; i++) {
|
|
|
|
|
for (unsigned int j = 0; j < _bindings[i].size(); j++)
|
|
|
|
|
delete _bindings[i][j];
|
|
|
|
|
}
|
2000-09-08 20:47:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
void
|
2007-01-04 13:22:27 +00:00
|
|
|
|
FGPanelAction::addBinding (SGBinding * binding, int updown)
|
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-12-28 19:05:45 +00:00
|
|
|
|
_bindings[updown].push_back(binding);
|
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-12-28 19:05:45 +00:00
|
|
|
|
bool
|
|
|
|
|
FGPanelAction::doAction (int updown)
|
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:17:58 +00:00
|
|
|
|
if (test()) {
|
2002-12-28 19:05:45 +00:00
|
|
|
|
if ((updown != _last_state) || (updown == 0 && _repeatable)) {
|
|
|
|
|
int nBindings = _bindings[updown].size();
|
|
|
|
|
for (int i = 0; i < nBindings; i++)
|
|
|
|
|
_bindings[updown][i]->fire();
|
2001-08-03 00:17:58 +00:00
|
|
|
|
}
|
2002-12-28 19:05:45 +00:00
|
|
|
|
_last_state = updown;
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
2001-07-27 21:59:53 +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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-09-08 20:47:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGPanelTransformation.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGPanelTransformation::FGPanelTransformation ()
|
2001-05-15 23:08:25 +00:00
|
|
|
|
: table(0)
|
2000-09-08 20:47:18 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGPanelTransformation::~FGPanelTransformation ()
|
|
|
|
|
{
|
2001-11-30 20:55:14 +00:00
|
|
|
|
delete table;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-15 03:30:01 +00:00
|
|
|
|
// Implementation of FGPanelInstrument.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanelInstrument::FGPanelInstrument ()
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-15 03:30:01 +00:00
|
|
|
|
setPosition(0, 0);
|
|
|
|
|
setSize(0, 0);
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanelInstrument::FGPanelInstrument (int x, int y, int w, int h)
|
|
|
|
|
{
|
|
|
|
|
setPosition(x, y);
|
|
|
|
|
setSize(w, h);
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
FGPanelInstrument::~FGPanelInstrument ()
|
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
for (action_list_type::iterator it = _actions.begin();
|
|
|
|
|
it != _actions.end();
|
|
|
|
|
it++) {
|
|
|
|
|
delete *it;
|
|
|
|
|
*it = 0;
|
2000-04-27 22:45:48 +00:00
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-11-17 00:04:57 +00:00
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGPanelInstrument::drawHotspots(osg::State& state)
|
2002-11-17 00:04:57 +00:00
|
|
|
|
{
|
2003-05-09 19:39:48 +00:00
|
|
|
|
for ( unsigned int i = 0; i < _actions.size(); i++ ) {
|
2002-11-17 00:04:57 +00:00
|
|
|
|
FGPanelAction* a = _actions[i];
|
|
|
|
|
float x1 = getXPos() + a->getX();
|
|
|
|
|
float x2 = x1 + a->getWidth();
|
|
|
|
|
float y1 = getYPos() + a->getY();
|
|
|
|
|
float y2 = y1 + a->getHeight();
|
|
|
|
|
|
|
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
|
glVertex2f(x1, y1);
|
|
|
|
|
glVertex2f(x1, y2);
|
|
|
|
|
glVertex2f(x2, y2);
|
|
|
|
|
glVertex2f(x2, y1);
|
|
|
|
|
glEnd();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
|
|
|
|
FGPanelInstrument::setPosition (int x, int y)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-15 03:30:01 +00:00
|
|
|
|
_x = x;
|
|
|
|
|
_y = y;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
|
|
|
|
FGPanelInstrument::setSize (int w, int h)
|
|
|
|
|
{
|
|
|
|
|
_w = w;
|
|
|
|
|
_h = h;
|
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
int
|
|
|
|
|
FGPanelInstrument::getXPos () const
|
|
|
|
|
{
|
|
|
|
|
return _x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
FGPanelInstrument::getYPos () const
|
|
|
|
|
{
|
|
|
|
|
return _y;
|
1999-01-07 19:25:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
int
|
|
|
|
|
FGPanelInstrument::getWidth () const
|
|
|
|
|
{
|
|
|
|
|
return _w;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
FGPanelInstrument::getHeight () const
|
|
|
|
|
{
|
|
|
|
|
return _h;
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-25 18:46:04 +01:00
|
|
|
|
void
|
|
|
|
|
FGPanelInstrument::extendRect(IntRect& r) const
|
|
|
|
|
{
|
|
|
|
|
IntRect instRect(_x, _y, _w, _h);
|
|
|
|
|
r.extend(instRect);
|
|
|
|
|
|
|
|
|
|
BOOST_FOREACH(FGPanelAction* act, _actions) {
|
|
|
|
|
r.extend(IntRect(getXPos() + act->getX(),
|
|
|
|
|
getYPos() + act->getY(),
|
|
|
|
|
act->getWidth(),
|
|
|
|
|
act->getHeight()
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-27 22:45:48 +00:00
|
|
|
|
void
|
2000-09-08 20:47:18 +00:00
|
|
|
|
FGPanelInstrument::addAction (FGPanelAction * action)
|
2000-04-27 22:45:48 +00:00
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
_actions.push_back(action);
|
2000-04-27 22:45:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Coordinates relative to centre.
|
|
|
|
|
bool
|
2002-12-28 19:05:45 +00:00
|
|
|
|
FGPanelInstrument::doMouseAction (int button, int updown, int x, int y)
|
2000-04-27 22:45:48 +00:00
|
|
|
|
{
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (test()) {
|
|
|
|
|
action_list_type::iterator it = _actions.begin();
|
|
|
|
|
action_list_type::iterator last = _actions.end();
|
|
|
|
|
for ( ; it != last; it++) {
|
2002-12-28 19:05:45 +00:00
|
|
|
|
if ((*it)->inArea(button, x, y) &&
|
|
|
|
|
(*it)->doAction(updown))
|
|
|
|
|
return true;
|
2000-04-27 22:45:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
1998-08-28 18:14:39 +00:00
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Implementation of FGLayeredInstrument.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
1999-01-07 19:25:53 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::FGLayeredInstrument (int x, int y, int w, int h)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
: FGPanelInstrument(x, y, w, h)
|
|
|
|
|
{
|
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::~FGLayeredInstrument ()
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
for (layer_list::iterator it = _layers.begin(); it != _layers.end(); it++) {
|
|
|
|
|
delete *it;
|
|
|
|
|
*it = 0;
|
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGLayeredInstrument::draw (osg::State& state)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
if (!test())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)_layers.size(); i++) {
|
|
|
|
|
glPushMatrix();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
_layers[i]->draw(state);
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
glPopMatrix();
|
2000-02-21 22:00:24 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +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
|
|
|
|
int
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGLayeredInstrument::addLayer (FGInstrumentLayer *layer)
|
1999-12-23 17:37:18 +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
|
|
|
|
int n = _layers.size();
|
2000-06-14 20:59:51 +00:00
|
|
|
|
if (layer->getWidth() == -1) {
|
|
|
|
|
layer->setWidth(getWidth());
|
|
|
|
|
}
|
|
|
|
|
if (layer->getHeight() == -1) {
|
|
|
|
|
layer->setHeight(getHeight());
|
|
|
|
|
}
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_layers.push_back(layer);
|
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
|
|
|
|
return n;
|
1998-08-28 18:14:39 +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
|
|
|
|
int
|
2005-10-25 13:49:55 +00:00
|
|
|
|
FGLayeredInstrument::addLayer (const FGCroppedTexture &texture,
|
2000-09-13 21:51:07 +00:00
|
|
|
|
int w, int h)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-06-14 20:59:51 +00:00
|
|
|
|
return addLayer(new FGTexturedLayer(texture, w, h));
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-01-07 19:25:53 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-09-08 20:47:18 +00:00
|
|
|
|
FGLayeredInstrument::addTransformation (FGPanelTransformation * transformation)
|
2000-02-15 03:30:01 +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
|
|
|
|
int layer = _layers.size() - 1;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
_layers[layer]->addTransformation(transformation);
|
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
|
|
|
|
|
2006-01-13 22:07:50 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGSpecialInstrument.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGSpecialInstrument::FGSpecialInstrument (DCLGPS* sb)
|
|
|
|
|
: FGPanelInstrument()
|
|
|
|
|
{
|
|
|
|
|
complex = sb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGSpecialInstrument::~FGSpecialInstrument ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGSpecialInstrument::draw (osg::State& state)
|
2006-01-13 22:07:50 +00:00
|
|
|
|
{
|
2009-07-22 21:00:43 +00:00
|
|
|
|
complex->draw(state);
|
2006-01-13 22:07:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2000-02-21 22:00:24 +00:00
|
|
|
|
// Implementation of FGInstrumentLayer.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
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
|
|
|
|
FGInstrumentLayer::FGInstrumentLayer (int w, int h)
|
2000-02-21 22:00:24 +00:00
|
|
|
|
: _w(w),
|
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
|
|
|
|
_h(h)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-02-12 01:46:29 +00:00
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGInstrumentLayer::~FGInstrumentLayer ()
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
for (transformation_list::iterator it = _transformations.begin();
|
|
|
|
|
it != _transformations.end();
|
|
|
|
|
it++) {
|
2000-02-21 22:00:24 +00:00
|
|
|
|
delete *it;
|
2000-09-08 20:47:18 +00:00
|
|
|
|
*it = 0;
|
2000-02-21 22:00:24 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-02-21 22:00:24 +00:00
|
|
|
|
FGInstrumentLayer::transform () const
|
|
|
|
|
{
|
|
|
|
|
transformation_list::const_iterator it = _transformations.begin();
|
|
|
|
|
transformation_list::const_iterator last = _transformations.end();
|
|
|
|
|
while (it != last) {
|
2000-09-08 20:47:18 +00:00
|
|
|
|
FGPanelTransformation *t = *it;
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (t->test()) {
|
|
|
|
|
float val = (t->node == 0 ? 0.0 : t->node->getFloatValue());
|
2003-03-02 14:19:24 +00:00
|
|
|
|
|
|
|
|
|
if (t->has_mod)
|
|
|
|
|
val = fmod(val, t->mod);
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (val < t->min) {
|
|
|
|
|
val = t->min;
|
|
|
|
|
} else if (val > t->max) {
|
|
|
|
|
val = t->max;
|
|
|
|
|
}
|
2003-03-02 14:19:24 +00:00
|
|
|
|
|
2006-06-14 10:30:10 +00:00
|
|
|
|
if (t->table==0) {
|
2001-05-15 23:08:25 +00:00
|
|
|
|
val = val * t->factor + t->offset;
|
2001-08-03 00:17:58 +00:00
|
|
|
|
} else {
|
2001-05-15 23:08:25 +00:00
|
|
|
|
val = t->table->interpolate(val) * t->factor + t->offset;
|
2001-08-03 00:17:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (t->type) {
|
|
|
|
|
case FGPanelTransformation::XSHIFT:
|
|
|
|
|
glTranslatef(val, 0.0, 0.0);
|
|
|
|
|
break;
|
|
|
|
|
case FGPanelTransformation::YSHIFT:
|
|
|
|
|
glTranslatef(0.0, val, 0.0);
|
|
|
|
|
break;
|
|
|
|
|
case FGPanelTransformation::ROTATION:
|
|
|
|
|
glRotatef(-val, 0.0, 0.0, 1.0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2000-02-21 22:00:24 +00:00
|
|
|
|
}
|
|
|
|
|
it++;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1998-11-09 23:38:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2000-09-08 20:47:18 +00:00
|
|
|
|
FGInstrumentLayer::addTransformation (FGPanelTransformation * transformation)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-09-08 20:47:18 +00:00
|
|
|
|
_transformations.push_back(transformation);
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2001-08-03 00:17:58 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGGroupLayer.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGGroupLayer::FGGroupLayer ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGGroupLayer::~FGGroupLayer ()
|
|
|
|
|
{
|
2001-08-10 05:16:41 +00:00
|
|
|
|
for (unsigned int i = 0; i < _layers.size(); i++)
|
2001-08-03 00:17:58 +00:00
|
|
|
|
delete _layers[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGGroupLayer::draw (osg::State& state)
|
2001-08-03 00:17:58 +00:00
|
|
|
|
{
|
|
|
|
|
if (test()) {
|
2003-03-09 03:34:29 +00:00
|
|
|
|
transform();
|
2001-08-03 00:17:58 +00:00
|
|
|
|
int nLayers = _layers.size();
|
|
|
|
|
for (int i = 0; i < nLayers; i++)
|
2006-10-29 19:30:21 +00:00
|
|
|
|
_layers[i]->draw(state);
|
2001-08-03 00:17:58 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGGroupLayer::addLayer (FGInstrumentLayer * layer)
|
|
|
|
|
{
|
|
|
|
|
_layers.push_back(layer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1999-12-23 17:37:18 +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
|
|
|
|
// Implementation of FGTexturedLayer.
|
1999-12-23 17:37:18 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-06-14 20:59:51 +00:00
|
|
|
|
|
2000-09-22 17:20:56 +00:00
|
|
|
|
FGTexturedLayer::FGTexturedLayer (const FGCroppedTexture &texture, int w, int h)
|
2006-02-16 18:59:48 +00:00
|
|
|
|
: FGInstrumentLayer(w, h),
|
|
|
|
|
_emissive(false)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-09-06 00:07:48 +00:00
|
|
|
|
setTexture(texture);
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-09-06 00:07:48 +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
|
|
|
|
FGTexturedLayer::~FGTexturedLayer ()
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
1999-05-12 02:04:38 +00:00
|
|
|
|
|
2000-09-06 00:07:48 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGTexturedLayer::draw (osg::State& state)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (test()) {
|
|
|
|
|
int w2 = _w / 2;
|
|
|
|
|
int h2 = _h / 2;
|
|
|
|
|
|
|
|
|
|
transform();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.pushStateSet(_texture.getTexture());
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2001-08-03 00:17:58 +00:00
|
|
|
|
glBegin(GL_POLYGON);
|
2006-02-16 18:59:48 +00:00
|
|
|
|
|
|
|
|
|
if (_emissive) {
|
|
|
|
|
glColor4fv( emissive_panel_color );
|
|
|
|
|
} else {
|
2000-09-22 17:20:56 +00:00
|
|
|
|
// From Curt: turn on the panel
|
|
|
|
|
// lights after sundown.
|
2006-02-16 18:59:48 +00:00
|
|
|
|
glColor4fv( panel_color );
|
|
|
|
|
}
|
2000-09-22 17:20:56 +00:00
|
|
|
|
|
2001-08-03 00:17:58 +00:00
|
|
|
|
glTexCoord2f(_texture.getMinX(), _texture.getMinY()); glVertex2f(-w2, -h2);
|
|
|
|
|
glTexCoord2f(_texture.getMaxX(), _texture.getMinY()); glVertex2f(w2, -h2);
|
|
|
|
|
glTexCoord2f(_texture.getMaxX(), _texture.getMaxY()); glVertex2f(w2, h2);
|
|
|
|
|
glTexCoord2f(_texture.getMinX(), _texture.getMaxY()); glVertex2f(-w2, h2);
|
|
|
|
|
glEnd();
|
2006-10-29 19:30:21 +00:00
|
|
|
|
state.popStateSet();
|
|
|
|
|
state.apply();
|
2007-01-06 13:51:47 +00:00
|
|
|
|
state.setActiveTextureUnit(0);
|
|
|
|
|
state.setClientActiveTextureUnit(0);
|
|
|
|
|
|
2001-08-03 00:17:58 +00:00
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +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
|
|
|
|
// Implementation of FGTextLayer.
|
2000-02-15 03:30:01 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-09-30 03:35:38 +00:00
|
|
|
|
FGTextLayer::FGTextLayer (int w, int h)
|
2006-06-06 18:36:34 +00:00
|
|
|
|
: FGInstrumentLayer(w, h), _pointSize(14.0), _font_name("Helvetica.txf")
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-09-30 03:35:38 +00:00
|
|
|
|
_then.stamp();
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_color[0] = _color[1] = _color[2] = 0.0;
|
2000-03-17 06:16:15 +00:00
|
|
|
|
_color[3] = 1.0;
|
2000-02-15 03:30:01 +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
|
|
|
|
FGTextLayer::~FGTextLayer ()
|
2000-02-15 03:30:01 +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
|
|
|
|
chunk_list::iterator it = _chunks.begin();
|
|
|
|
|
chunk_list::iterator last = _chunks.end();
|
|
|
|
|
for ( ; it != last; it++) {
|
|
|
|
|
delete *it;
|
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGTextLayer::draw (osg::State& state)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (test()) {
|
|
|
|
|
glColor4fv(_color);
|
|
|
|
|
transform();
|
2006-06-06 12:52:45 +00:00
|
|
|
|
|
|
|
|
|
FGFontCache *fc = globals->get_fontcache();
|
2010-02-10 19:28:35 +00:00
|
|
|
|
fntFont* font = fc->getTexFont(_font_name.c_str());
|
|
|
|
|
if (!font) {
|
|
|
|
|
return; // don't crash on missing fonts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
text_renderer.setFont(font);
|
2006-06-06 12:52:45 +00:00
|
|
|
|
|
2001-08-03 00:17:58 +00:00
|
|
|
|
text_renderer.setPointSize(_pointSize);
|
|
|
|
|
text_renderer.begin();
|
|
|
|
|
text_renderer.start3f(0, 0, 0);
|
|
|
|
|
|
|
|
|
|
_now.stamp();
|
2009-03-12 18:34:57 +00:00
|
|
|
|
double diff = (_now - _then).toUSecs();
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
|
2002-04-19 14:05:58 +00:00
|
|
|
|
if (diff > 100000 || diff < 0 ) {
|
|
|
|
|
// ( diff < 0 ) is a sanity check and indicates our time stamp
|
|
|
|
|
// difference math probably overflowed. We can handle a max
|
|
|
|
|
// difference of 35.8 minutes since the returned value is in
|
|
|
|
|
// usec. So if the panel is left off longer than that we can
|
|
|
|
|
// over flow the math with it is turned back on. This (diff <
|
|
|
|
|
// 0) catches that situation, get's us out of trouble, and
|
|
|
|
|
// back on track.
|
2001-08-03 00:17:58 +00:00
|
|
|
|
recalc_value();
|
|
|
|
|
_then = _now;
|
|
|
|
|
}
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
|
|
|
|
|
// Something is goofy. The code in this file renders only CCW
|
|
|
|
|
// polygons, and I have verified that the font code in plib
|
|
|
|
|
// renders only CCW trianbles. Yet they come out backwards.
|
|
|
|
|
// Something around here or in plib is either changing the winding
|
|
|
|
|
// order or (more likely) pushing a left-handed matrix onto the
|
|
|
|
|
// stack. But I can't find it; get out the chainsaw...
|
|
|
|
|
glFrontFace(GL_CW);
|
2001-08-03 00:17:58 +00:00
|
|
|
|
text_renderer.puts((char *)(_value.c_str()));
|
3D panel support from Andy Ross:
+ The panel(s) are now an first-class SSG node inside the aircraft
scene graph. There's a little code added to model.cxx to handle the
parsing, but most of the changes are inside the new FGPanelNode
class (Model/panelnode.[ch]xx).
+ The old FGPanel source changed a lot, but mostly cosmetically. The
virtual-cockpit code moved out into FGPanelNode, and the core
rendering has been abstracted into a draw() method that doesn't try
to set any OpenGL state. I also replaced the old inter-layer offset
code with glPolygonOffset, as calculating the right Z values is hard
across the funky modelview matrix I need to use. The older virtual
panel code got away with it by disabling depth test, thus the "panel
draws on top of yoke" bug. PolygonOffset is really the appropriate
solution for this sort of task anyway.
+ The /sim/virtual-cockpit property is no more. The 2D panels are
still specified in the -set.xml file, but 3D panels are part of the
model file.
+ You can have as many 3D panels as you like.
Problems:
+ The mouse support isn't ready yet, so the 3D panels still aren't
interactive. Soon to come.
+ Being part of the same scene graph as the model, the 3D panels now
"jitter" in exactly the same way. While this makes the jitter of
the attitude gyro less noticeable, it's still *very* noticeable and
annoying. I looked hard for this, and am at this point convinced
that the problem is with the two orientation computations. We have
one in FGLocation that is used by the model code, and one in
FGViewer that is used at the top of the scene graph. My suspicion
is that they don't agree exactly, so the final orientation matrix is
the right answer plus the difference. I did rule out the FDMs
though. None of them show more than about 0.0001 degree of
orientation change between frames for a stopped aircraft. That's
within an order of magnitude of what you'd expect for the
orientation change due to the rotation of the earth (which we don't
model -- I cite it only as evidence of how small this is); far, far
less than one pixel on the screen.
[and later]
OK, this is fixed by the attached panel.cxx file. What's happened is
that the winding order for the text layer's polygons is wrong, so I
reverse it before drawing. That's largely a hatchet job to make
things work for now, though. We should figure out why the winding
order is wrong for only text layers and fix it. I checked the plib
sources -- they're definitely doing things CCW, as is all the rest of
the panel code.
Odd. I'm also not sure why the 2D panel doesn't care (it works in
both winding orders). But this will allow you to check in working
code, anyway. There's a big comment to this effect in there.
2002-06-28 14:17:40 +00:00
|
|
|
|
glFrontFace(GL_CCW);
|
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:17:58 +00:00
|
|
|
|
text_renderer.end();
|
|
|
|
|
glColor4f(1.0, 1.0, 1.0, 1.0); // FIXME
|
|
|
|
|
}
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
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
|
|
|
|
FGTextLayer::addChunk (FGTextLayer::Chunk * chunk)
|
|
|
|
|
{
|
|
|
|
|
_chunks.push_back(chunk);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGTextLayer::setColor (float r, float g, float b)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-02-21 22:00:24 +00:00
|
|
|
|
_color[0] = r;
|
|
|
|
|
_color[1] = g;
|
|
|
|
|
_color[2] = b;
|
2000-03-17 06:16:15 +00:00
|
|
|
|
_color[3] = 1.0;
|
1999-12-23 17:37:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-02-21 22:00:24 +00:00
|
|
|
|
void
|
2000-09-13 21:51:07 +00:00
|
|
|
|
FGTextLayer::setPointSize (float size)
|
2000-02-15 03:30:01 +00:00
|
|
|
|
{
|
2000-09-13 21:51:07 +00:00
|
|
|
|
_pointSize = size;
|
2000-02-15 03:30:01 +00:00
|
|
|
|
}
|
1999-12-23 17:37:18 +00:00
|
|
|
|
|
2002-02-19 23:54:17 +00:00
|
|
|
|
void
|
|
|
|
|
FGTextLayer::setFontName(const string &name)
|
|
|
|
|
{
|
2006-06-06 12:52:45 +00:00
|
|
|
|
_font_name = name + ".txf";
|
2010-02-10 19:28:35 +00:00
|
|
|
|
FGFontCache *fc = globals->get_fontcache();
|
|
|
|
|
fntFont* font = fc->getTexFont(_font_name.c_str());
|
|
|
|
|
if (!font) {
|
2011-12-11 13:55:56 +01:00
|
|
|
|
SG_LOG(SG_COCKPIT, SG_WARN, "unable to find font:" << name);
|
2010-02-10 19:28:35 +00:00
|
|
|
|
}
|
2002-02-19 23:54:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
void
|
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
|
|
|
|
FGTextLayer::setFont(fntFont * font)
|
1999-12-23 17:37:18 +00:00
|
|
|
|
{
|
2000-09-30 03:35:38 +00:00
|
|
|
|
text_renderer.setFont(font);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGTextLayer::recalc_value () const
|
|
|
|
|
{
|
|
|
|
|
_value = "";
|
|
|
|
|
chunk_list::const_iterator it = _chunks.begin();
|
|
|
|
|
chunk_list::const_iterator last = _chunks.end();
|
|
|
|
|
for ( ; it != last; it++) {
|
|
|
|
|
_value += (*it)->getValue();
|
|
|
|
|
}
|
1999-05-06 22:16:12 +00:00
|
|
|
|
}
|
2000-02-15 03:30:01 +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
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGTextLayer::Chunk.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2000-09-13 21:51:07 +00:00
|
|
|
|
FGTextLayer::Chunk::Chunk (const string &text, const string &fmt)
|
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
|
|
|
|
: _type(FGTextLayer::TEXT), _fmt(fmt)
|
|
|
|
|
{
|
2000-09-13 21:51:07 +00:00
|
|
|
|
_text = text;
|
2002-03-20 19:16:13 +00:00
|
|
|
|
if (_fmt.empty())
|
2000-09-13 21:51:07 +00:00
|
|
|
|
_fmt = "%s";
|
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-06-12 05:15:48 +00:00
|
|
|
|
FGTextLayer::Chunk::Chunk (ChunkType type, const SGPropertyNode * node,
|
2004-01-22 18:42:42 +00:00
|
|
|
|
const string &fmt, float mult, float offs,
|
|
|
|
|
bool truncation)
|
|
|
|
|
: _type(type), _fmt(fmt), _mult(mult), _offs(offs), _trunc(truncation)
|
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-03-20 19:16:13 +00:00
|
|
|
|
if (_fmt.empty()) {
|
2000-09-06 00:07:48 +00:00
|
|
|
|
if (type == TEXT_VALUE)
|
|
|
|
|
_fmt = "%s";
|
|
|
|
|
else
|
|
|
|
|
_fmt = "%.2f";
|
|
|
|
|
}
|
2001-06-12 05:15:48 +00:00
|
|
|
|
_node = node;
|
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 *
|
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
|
|
|
|
FGTextLayer::Chunk::getValue () const
|
|
|
|
|
{
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (test()) {
|
2002-03-27 12:59:53 +00:00
|
|
|
|
_buf[0] = '\0';
|
2001-08-03 00:17:58 +00:00
|
|
|
|
switch (_type) {
|
|
|
|
|
case TEXT:
|
|
|
|
|
sprintf(_buf, _fmt.c_str(), _text.c_str());
|
|
|
|
|
return _buf;
|
|
|
|
|
case TEXT_VALUE:
|
2002-03-19 17:12:13 +00:00
|
|
|
|
sprintf(_buf, _fmt.c_str(), _node->getStringValue());
|
2001-08-03 00:17:58 +00:00
|
|
|
|
break;
|
|
|
|
|
case DOUBLE_VALUE:
|
2004-01-22 18:42:42 +00:00
|
|
|
|
double d = _offs + _node->getFloatValue() * _mult;
|
2004-02-23 09:03:41 +00:00
|
|
|
|
if (_trunc) d = (d < 0) ? -floor(-d) : floor(d);
|
2004-01-22 18:42:42 +00:00
|
|
|
|
sprintf(_buf, _fmt.c_str(), d);
|
2001-08-03 00:17:58 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
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
|
|
|
|
return _buf;
|
2001-08-03 00:17:58 +00:00
|
|
|
|
} else {
|
|
|
|
|
return "";
|
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
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGSwitchLayer.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2003-03-09 03:34:29 +00:00
|
|
|
|
FGSwitchLayer::FGSwitchLayer ()
|
|
|
|
|
: 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
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2006-10-29 19:30:21 +00:00
|
|
|
|
FGSwitchLayer::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
|
|
|
|
{
|
2001-08-03 00:17:58 +00:00
|
|
|
|
if (test()) {
|
|
|
|
|
transform();
|
2003-03-09 03:34:29 +00:00
|
|
|
|
int nLayers = _layers.size();
|
|
|
|
|
for (int i = 0; i < nLayers; i++) {
|
|
|
|
|
if (_layers[i]->test()) {
|
2006-10-29 19:30:21 +00:00
|
|
|
|
_layers[i]->draw(state);
|
2003-03-09 03:34:29 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2001-08-03 00:17:58 +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
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
|
|
|
|
|
|
// end of panel.cxx
|