X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel.hxx;h=58c1eed4a0e5190208af5a3ee2cb2386c839205a;hb=35396de6f87e2a8b8d0c21eb1d0908db586799f8;hp=70a311de68e86501e740f6b0417db2a273360895;hpb=0f156c72809fc76e44ecaf79174c480465058360;p=flightgear.git diff --git a/src/Cockpit/panel.hxx b/src/Cockpit/panel.hxx index 70a311de6..58c1eed4a 100644 --- a/src/Cockpit/panel.hxx +++ b/src/Cockpit/panel.hxx @@ -11,75 +11,79 @@ // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ #ifndef __PANEL_HXX #define __PANEL_HXX -#ifndef __cplusplus +#ifndef __cplusplus # error This library requires C++ -#endif +#endif #ifdef HAVE_CONFIG_H # include #endif -#include - -#ifdef HAVE_WINDOWS_H -# include -#endif +#include +#include +#include -#include -#include +#include +#include +#include +#include #include -#include #include +#include #include #include -#include - -#include
+#include
#include +#include + +using std::vector; +using std::map; -SG_USING_STD(vector); -SG_USING_STD(map); class FGPanelInstrument; //////////////////////////////////////////////////////////////////////// -// Texture manager (should migrate out into FGFS). -// -// This class ensures that no texture is loaded more than once. +// Texture management. //////////////////////////////////////////////////////////////////////// + +/** + * Texture manager (should migrate out into FGFS). + * + * This class ensures that no texture is loaded more than once. + */ class FGTextureManager { public: - static ssgTexture * createTexture(const string &relativePath); + static osg::Texture2D* createTexture(const string &relativePath, + bool staticTexture = true); + static void addTexture(const string &relativePath, osg::Texture2D* texture); private: - static map _textureMap; + static map > _textureMap; }; - -//////////////////////////////////////////////////////////////////////// -// Cropped texture (should migrate out into FGFS). -// -// This structure wraps an SSG texture with cropping information. -//////////////////////////////////////////////////////////////////////// - +/** + * Cropped texture (should migrate out into FGFS). + * + * This structure wraps an SSG texture with cropping information. + */ class FGCroppedTexture { public: @@ -94,7 +98,7 @@ public: virtual const string &getPath () const { return _path; } - virtual ssgTexture * getTexture (); + virtual osg::StateSet* getTexture (); virtual void setCrop (float minX, float minY, float maxX, float maxY) { _minX = minX; _minY = minY; _maxX = maxX; _maxY = maxY; @@ -108,22 +112,26 @@ public: private: string _path; - ssgTexture * _texture; + osg::ref_ptr _texture; float _minX, _minY, _maxX, _maxY; }; //////////////////////////////////////////////////////////////////////// -// Instrument panel class. -// -// The panel is a container that has a background texture and holds -// zero or more instruments. The panel will order the instruments to -// redraw themselves when necessary, and will pass mouse clicks on to -// the appropriate instruments for processing. +// Top-level panel. //////////////////////////////////////////////////////////////////////// -class FGPanel : public FGSubsystem + +/** + * Instrument panel class. + * + * The panel is a container that has a background texture and holds + * zero or more instruments. The panel will order the instruments to + * redraw themselves when necessary, and will pass mouse clicks on to + * the appropriate instruments for processing. + */ +class FGPanel : public SGSubsystem { public: @@ -134,14 +142,21 @@ public: virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (); - virtual void update (GLfloat winx, GLfloat winw, GLfloat winy, GLfloat winh); + virtual void draw (osg::State& state); + virtual void update (double); + void update (osg::State& state); + virtual void update (osg::State& state, GLfloat winx, GLfloat winw, GLfloat winy, GLfloat winh); + + virtual void updateMouseDelay(); // transfer pointer ownership!!! virtual void addInstrument (FGPanelInstrument * instrument); // Background texture. - virtual void setBackground (ssgTexture * texture); + virtual void setBackground (osg::Texture2D* texture); + + // Background multiple textures. + virtual void setMultiBackground (osg::Texture2D* texture, int idx); // Make the panel visible or invisible. virtual bool getVisibility () const; @@ -157,11 +172,11 @@ public: // X-offset virtual void setXOffset (int offset); - virtual int getXOffset () const { return _x_offset; } + virtual int getXOffset () const { return _x_offset->getIntValue(); } // Y-offset. virtual void setYOffset (int offset); - virtual int getYOffset () const { return _y_offset; } + virtual int getYOffset () const { return _y_offset->getIntValue(); } // View height. virtual void setViewHeight (int height) { _view_height = height; } @@ -169,9 +184,17 @@ public: // Handle a mouse click. virtual bool doMouseAction (int button, int updown, int x, int y); + virtual bool doLocalMouseAction(int button, int updown, int x, int y); + + virtual void setDepthTest (bool enable); + + bool getAutohide(void) const { return _autohide; }; + void setAutohide(bool enable) { _autohide = enable; }; private: - mutable bool _visibility; + void setupVirtualCockpit(); + void cleanupVirtualCockpit(); + mutable bool _mouseDown; mutable int _mouseButton, _mouseX, _mouseY; mutable int _mouseDelay; @@ -179,34 +202,44 @@ private: typedef vector instrument_list_type; int _width; int _height; - int _x_offset; - int _y_offset; int _view_height; - bool _bound; - const SGPropertyNode * _xsize_node; - const SGPropertyNode * _ysize_node; + SGPropertyNode_ptr _visibility; + SGPropertyNode_ptr _x_offset; + SGPropertyNode_ptr _y_offset; + SGPropertyNode_ptr _jitter; + SGPropertyNode_ptr _flipx; + + SGConstPropertyNode_ptr _xsize_node; + SGConstPropertyNode_ptr _ysize_node; - ssgTexture * _bg; + osg::ref_ptr _bg; + osg::ref_ptr _mbg[8]; // List of instruments in panel. instrument_list_type _instruments; + bool _enable_depth_test; + bool _autohide; }; //////////////////////////////////////////////////////////////////////// -// Base class for user action types. -// -// Individual instruments can have actions associated with a mouse -// click in a rectangular area. Current concrete classes include -// FGAdjustAction, FGSwapAction, and FGToggleAction. +// Actions //////////////////////////////////////////////////////////////////////// -class FGPanelAction + +/** + * Class for user actions. + * + * The actions are command bindings, like bindings for the keyboard + * or joystick, but they are tied to specific mouse actions in + * rectangular areas of the panel. + */ +class FGPanelAction : public SGConditional { public: FGPanelAction (); - FGPanelAction (int button, int x, int y, int w, int h); + FGPanelAction (int button, int x, int y, int w, int h, bool repeatable); virtual ~FGPanelAction (); // Getters. @@ -217,7 +250,9 @@ public: virtual int getHeight () const { return _h; } // Setters. - virtual void addBinding (const FGBinding &binding); + + // transfer pointer ownership + virtual void addBinding (SGBinding * binding, int updown); virtual void setButton (int button) { _button = button; } virtual void setX (int x) { _x = x; } virtual void setY (int y) { _y = y; } @@ -235,77 +270,33 @@ public: } // Perform the action. - virtual void doAction (); + virtual bool doAction (int updown); private: - typedef vector binding_list_t; + typedef vector binding_list_t; int _button; int _x; int _y; int _w; int _h; - binding_list_t _bindings; + bool _repeatable; + int _last_state; + binding_list_t _bindings[2]; }; //////////////////////////////////////////////////////////////////////// -// Abstract base class for a panel instrument. -// -// A panel instrument consists of zero or more actions, associated -// with mouse clicks in rectangular areas. Currently, the only -// concrete class derived from this is FGLayeredInstrument, but others -// may show up in the future (some complex instruments could be -// entirely hand-coded, for example). -//////////////////////////////////////////////////////////////////////// - -class FGPanelInstrument -{ -public: - FGPanelInstrument (); - FGPanelInstrument (int x, int y, int w, int h); - virtual ~FGPanelInstrument (); - - virtual void draw () = 0; - - virtual void setPosition(int x, int y); - virtual void setSize(int w, int h); - - virtual int getXPos () const; - virtual int getYPos () const; - virtual int getWidth () const; - virtual int getHeight () const; - - // Coordinates relative to centre. - // Transfer pointer ownership!! - virtual void addAction (FGPanelAction * action); - - // Coordinates relative to centre. - virtual bool doMouseAction (int button, int x, int y); - -protected: - int _x, _y, _w, _h; - typedef vector action_list_type; - action_list_type _actions; -}; - - - -//////////////////////////////////////////////////////////////////////// -// Abstract base class for an instrument layer. -// -// The FGLayeredInstrument class builds up instruments by using layers -// of textures or text. Each layer can have zero or more -// transformations applied to it: for example, a needle layer can -// rotate to show the altitude or airspeed. +// Transformations. //////////////////////////////////////////////////////////////////////// /** * A transformation for a layer. */ -class FGPanelTransformation { +class FGPanelTransformation : public SGConditional +{ public: enum Type { @@ -318,9 +309,11 @@ public: virtual ~FGPanelTransformation (); Type type; - const SGPropertyNode * node; + SGConstPropertyNode_ptr node; float min; float max; + bool has_mod; + float mod; float factor; float offset; SGInterpTable * table; @@ -328,6 +321,12 @@ public: + +//////////////////////////////////////////////////////////////////////// +// Layers +//////////////////////////////////////////////////////////////////////// + + /** * A single layer of a multi-layered instrument. * @@ -335,14 +334,14 @@ public: * on current FGFS instrument readings: for example, a texture * representing a needle can rotate to show the airspeed. */ -class FGInstrumentLayer +class FGInstrumentLayer : public SGConditional { public: FGInstrumentLayer (int w = -1, int h = -1); virtual ~FGInstrumentLayer (); - virtual void draw () = 0; + virtual void draw (osg::State& state) = 0; virtual void transform () const; virtual int getWidth () const { return _w; } @@ -364,16 +363,51 @@ protected: //////////////////////////////////////////////////////////////////////// -// An instrument composed of layers. -// -// This class represents an instrument which is simply a series of -// layers piled one on top of the other, each one undergoing its own -// set of transformations. For example, one layer can represent -// the instrument's face (which doesn't move), while the next layer -// can represent a needle that rotates depending on an FGFS variable. +// Instruments. //////////////////////////////////////////////////////////////////////// +/** + * Abstract base class for a panel instrument. + * + * A panel instrument consists of zero or more actions, associated + * with mouse clicks in rectangular areas. Currently, the only + * concrete class derived from this is FGLayeredInstrument, but others + * may show up in the future (some complex instruments could be + * entirely hand-coded, for example). + */ +class FGPanelInstrument : public SGConditional +{ +public: + FGPanelInstrument (); + FGPanelInstrument (int x, int y, int w, int h); + virtual ~FGPanelInstrument (); + + virtual void draw (osg::State& state) = 0; + virtual void drawHotspots(osg::State& state); + + virtual void setPosition(int x, int y); + virtual void setSize(int w, int h); + + virtual int getXPos () const; + virtual int getYPos () const; + virtual int getWidth () const; + virtual int getHeight () const; + + // Coordinates relative to centre. + // Transfer pointer ownership!! + virtual void addAction (FGPanelAction * action); + + // Coordinates relative to centre. + virtual bool doMouseAction (int button, int updown, int x, int y); + +protected: + int _x, _y, _w, _h; + typedef vector action_list_type; + action_list_type _actions; +}; + + /** * An instrument constructed of multiple layers. * @@ -386,11 +420,11 @@ public: FGLayeredInstrument (int x, int y, int w, int h); virtual ~FGLayeredInstrument (); - virtual void draw (); + virtual void draw (osg::State& state); // Transfer pointer ownership!! virtual int addLayer (FGInstrumentLayer *layer); - virtual int addLayer (FGCroppedTexture &texture, int w = -1, int h = -1); + virtual int addLayer (const FGCroppedTexture &texture, int w = -1, int h = -1); // Transfer pointer ownership!! virtual void addTransformation (FGPanelTransformation * transformation); @@ -401,15 +435,55 @@ protected: }; - -//////////////////////////////////////////////////////////////////////// -// A textured layer of an instrument. -// -// This is a layer holding a single texture. Normally, the texture's -// backgound should be transparent so that lower layers and the panel -// background can show through. -//////////////////////////////////////////////////////////////////////// +/** + * An empty-shell instrument that exists soley in + * order to redirect commands from the panel to a + * complex instrument inherited from SGSubsystem. + * + * Currently the only complex instrument is the KLN89, + * which we've hardwired this to for now. + */ +class FGSpecialInstrument : public FGPanelInstrument +{ +public: + FGSpecialInstrument(DCLGPS* sb); + //FGSpecialInstrument (int x, int y, int w, int h); + virtual ~FGSpecialInstrument (); + + virtual void draw (osg::State& state); + +protected: + DCLGPS* complex; +}; + +/** + * An instrument layer containing a group of sublayers. + * + * This class is useful for gathering together a group of related + * layers, either to hold in an external file or to work under + * the same condition. + */ +class FGGroupLayer : public FGInstrumentLayer +{ +public: + FGGroupLayer (); + virtual ~FGGroupLayer (); + virtual void draw (osg::State& state); + // transfer pointer ownership + virtual void addLayer (FGInstrumentLayer * layer); +protected: + vector _layers; +}; + + +/** + * A textured layer of an instrument. + * + * This is a layer holding a single texture. Normally, the texture's + * backgound should be transparent so that lower layers and the panel + * background can show through. + */ class FGTexturedLayer : public FGInstrumentLayer { public: @@ -417,62 +491,68 @@ public: FGTexturedLayer (const FGCroppedTexture &texture, int w = -1, int h = -1); virtual ~FGTexturedLayer (); - virtual void draw (); + virtual void draw (osg::State& state); virtual void setTexture (const FGCroppedTexture &texture) { _texture = texture; } - virtual FGCroppedTexture &getTexture () { return _texture; } virtual const FGCroppedTexture &getTexture () const { return _texture; } + virtual FGCroppedTexture *getTexture() { return &_texture; } + + void setEmissive(bool e) { _emissive = e; } private: - mutable FGCroppedTexture _texture; + FGCroppedTexture _texture; + bool _emissive; }; - -//////////////////////////////////////////////////////////////////////// -// A text layer of an instrument. -// -// This is a layer holding a string of static and/or generated text. -// It is useful for instruments that have text displays, such as -// a chronometer, GPS, or NavCom radio. -//////////////////////////////////////////////////////////////////////// - +/** + * A text layer of an instrument. + * + * This is a layer holding a string of static and/or generated text. + * It is useful for instruments that have text displays, such as + * a chronometer, GPS, or NavCom radio. + */ class FGTextLayer : public FGInstrumentLayer { public: - typedef enum ChunkType { + enum ChunkType { TEXT, TEXT_VALUE, DOUBLE_VALUE }; - class Chunk { + class Chunk : public SGConditional + { public: Chunk (const string &text, const string &fmt = "%s"); Chunk (ChunkType type, const SGPropertyNode * node, - const string &fmt = "", float mult = 1.0); + const string &fmt = "", float mult = 1.0, float offs = 0.0, + bool truncation = false); const char * getValue () const; private: ChunkType _type; string _text; - const SGPropertyNode * _node; + SGConstPropertyNode_ptr _node; string _fmt; float _mult; + float _offs; + bool _trunc; mutable char _buf[1024]; }; FGTextLayer (int w = -1, int h = -1); virtual ~FGTextLayer (); - virtual void draw (); + virtual void draw (osg::State& state); // Transfer pointer!! virtual void addChunk (Chunk * chunk); virtual void setColor (float r, float g, float b); virtual void setPointSize (float size); + virtual void setFontName ( const string &name ); virtual void setFont (fntFont * font); private: @@ -484,54 +564,45 @@ private: float _color[4]; float _pointSize; - + mutable string _font_name; mutable string _value; mutable SGTimeStamp _then; mutable SGTimeStamp _now; }; - -//////////////////////////////////////////////////////////////////////// -// A layer that switches between two other layers. -//////////////////////////////////////////////////////////////////////// - -class FGSwitchLayer : public FGInstrumentLayer +/** + * A group layer that switches among its children. + * + * The first layer that passes its condition will be drawn, and + * any following layers will be ignored. + */ +class FGSwitchLayer : public FGGroupLayer { public: // Transfer pointers!! - FGSwitchLayer (int w, int h, const SGPropertyNode * node, - FGInstrumentLayer * layer1, - FGInstrumentLayer * layer2); - virtual ~FGSwitchLayer (); + FGSwitchLayer (); + virtual void draw (osg::State& state); - virtual void draw (); - -private: - const SGPropertyNode * _node; - FGInstrumentLayer * _layer1, * _layer2; }; + //////////////////////////////////////////////////////////////////////// // Functions. //////////////////////////////////////////////////////////////////////// +/** + * Test whether the panel should be visible. + */ bool fgPanelVisible (); - -//////////////////////////////////////////////////////////////////////// -// The current panel, if any. -//////////////////////////////////////////////////////////////////////// - -extern FGPanel * current_panel; - - #endif // __PANEL_HXX // end of panel.hxx +