X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel.hxx;h=ab4f5264fabee673544d1a7ba01370b312607c45;hb=fdbfd6fd0b789eecf2c532d048a75d15f8d35ad8;hp=c17b897357dc0ba5c1d97d8f4be0e9c03b96ca1a;hpb=5a849b66e855a643c600ad4cfcce1f82e0fcdeb3;p=flightgear.git diff --git a/src/Cockpit/panel.hxx b/src/Cockpit/panel.hxx index c17b89735..ab4f5264f 100644 --- a/src/Cockpit/panel.hxx +++ b/src/Cockpit/panel.hxx @@ -11,54 +11,37 @@ // 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 -# error This library requires C++ -#endif - - -#ifdef HAVE_CONFIG_H -# include -#endif +#include +#include +#include #include - -#ifdef HAVE_WINDOWS_H -# include -#endif - -#include -#include - +#include +#include +#include #include -#include #include +#include #include #include -#include -#include
#include
-#include - -SG_USING_STD(vector); -SG_USING_STD(map); - class FGPanelInstrument; +class fntFont; +class DCLGPS; - - //////////////////////////////////////////////////////////////////////// // Texture management. //////////////////////////////////////////////////////////////////////// @@ -72,9 +55,11 @@ class FGPanelInstrument; class FGTextureManager { public: - static ssgTexture * createTexture(const string &relativePath); + static osg::Texture2D* createTexture(const std::string &relativePath, + bool staticTexture = true); + static void addTexture(const std::string &relativePath, osg::Texture2D* texture); private: - static map _textureMap; + static std::map > _textureMap; }; @@ -88,16 +73,16 @@ class FGCroppedTexture public: FGCroppedTexture (); - FGCroppedTexture (const string &path, + FGCroppedTexture (const std::string &path, float _minX = 0.0, float _minY = 0.0, float _maxX = 1.0, float _maxY = 1.0); virtual ~FGCroppedTexture (); - virtual void setPath (const string &path) { _path = path; } + virtual void setPath (const std::string &path) { _path = path; } - virtual const string &getPath () const { return _path; } + virtual const std::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; @@ -110,8 +95,8 @@ public: private: - string _path; - ssgTexture * _texture; + std::string _path; + osg::ref_ptr _texture; float _minX, _minY, _maxX, _maxY; }; @@ -130,7 +115,7 @@ private: * redraw themselves when necessary, and will pass mouse clicks on to * the appropriate instruments for processing. */ -class FGPanel : public FGSubsystem +class FGPanel : public SGSubsystem { public: @@ -141,17 +126,21 @@ public: virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (double dt); - 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 (ssgTexture * texture, int idx); + virtual void setMultiBackground (osg::Texture2D* texture, int idx); // Make the panel visible or invisible. virtual bool getVisibility () const; @@ -167,11 +156,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; } @@ -179,31 +168,41 @@ 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: void setupVirtualCockpit(); void cleanupVirtualCockpit(); - mutable bool _visibility; mutable bool _mouseDown; mutable int _mouseButton, _mouseX, _mouseY; mutable int _mouseDelay; mutable FGPanelInstrument * _mouseInstrument; - typedef vector instrument_list_type; + typedef std::vector instrument_list_type; int _width; int _height; - int _x_offset; - int _y_offset; int _view_height; - float _jitter; - 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; - ssgTexture * _mbg[8]; + osg::ref_ptr _bg; + osg::ref_ptr _mbg[8]; // List of instruments in panel. instrument_list_type _instruments; + bool _enable_depth_test; + bool _autohide; }; @@ -220,11 +219,11 @@ private: * or joystick, but they are tied to specific mouse actions in * rectangular areas of the panel. */ -class FGPanelAction : public FGConditional +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. @@ -237,7 +236,7 @@ public: // Setters. // transfer pointer ownership - virtual void addBinding (FGBinding * binding); + 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; } @@ -255,17 +254,19 @@ public: } // Perform the action. - virtual void doAction (); + virtual bool doAction (int updown); private: - typedef vector binding_list_t; + typedef std::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]; }; @@ -278,7 +279,7 @@ private: /** * A transformation for a layer. */ -class FGPanelTransformation : public FGConditional +class FGPanelTransformation : public SGConditional { public: @@ -292,9 +293,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; @@ -315,14 +318,14 @@ public: * on current FGFS instrument readings: for example, a texture * representing a needle can rotate to show the airspeed. */ -class FGInstrumentLayer : public FGConditional +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; } @@ -337,7 +340,7 @@ public: protected: int _w, _h; - typedef vector transformation_list; + typedef std::vector transformation_list; transformation_list _transformations; }; @@ -357,14 +360,15 @@ protected: * may show up in the future (some complex instruments could be * entirely hand-coded, for example). */ -class FGPanelInstrument : public FGConditional +class FGPanelInstrument : public SGConditional { public: FGPanelInstrument (); FGPanelInstrument (int x, int y, int w, int h); virtual ~FGPanelInstrument (); - virtual void draw () = 0; + 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); @@ -379,11 +383,11 @@ public: virtual void addAction (FGPanelAction * action); // Coordinates relative to centre. - virtual bool doMouseAction (int button, int x, int y); + virtual bool doMouseAction (int button, int updown, int x, int y); protected: int _x, _y, _w, _h; - typedef vector action_list_type; + typedef std::vector action_list_type; action_list_type _actions; }; @@ -400,21 +404,43 @@ 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); protected: - typedef vector layer_list; + typedef std::vector layer_list; layer_list _layers; }; +/** + * 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. * @@ -427,11 +453,11 @@ class FGGroupLayer : public FGInstrumentLayer public: FGGroupLayer (); virtual ~FGGroupLayer (); - virtual void draw (); + virtual void draw (osg::State& state); // transfer pointer ownership virtual void addLayer (FGInstrumentLayer * layer); -private: - vector _layers; +protected: + std::vector _layers; }; @@ -449,16 +475,19 @@ 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; }; @@ -478,71 +507,67 @@ public: DOUBLE_VALUE }; - class Chunk : public FGConditional + class Chunk : public SGConditional { public: - Chunk (const string &text, const string &fmt = "%s"); + Chunk (const std::string &text, const std::string &fmt = "%s"); Chunk (ChunkType type, const SGPropertyNode * node, - const string &fmt = "", float mult = 1.0); + const std::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; - string _fmt; + std::string _text; + SGConstPropertyNode_ptr _node; + std::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 setFontName ( const std::string &name ); virtual void setFont (fntFont * font); private: void recalc_value () const; - typedef vector chunk_list; + typedef std::vector chunk_list; chunk_list _chunks; float _color[4]; float _pointSize; - mutable string _font_name; - mutable string _value; + mutable std::string _font_name; + mutable std::string _value; mutable SGTimeStamp _then; mutable SGTimeStamp _now; }; /** - * A layer that switches between two other layers. + * A group layer that switches among its children. * - * The usefulness of this layer is questionable now that all layers - * can have conditions, and it may be deprecated soon. + * The first layer that passes its condition will be drawn, and + * any following layers will be ignored. */ -class FGSwitchLayer : public FGInstrumentLayer +class FGSwitchLayer : public FGGroupLayer { public: // Transfer pointers!! - FGSwitchLayer (int w, int h, const SGPropertyNode * node, - FGInstrumentLayer * layer1, - FGInstrumentLayer * layer2); - virtual ~FGSwitchLayer (); - - virtual void draw (); + FGSwitchLayer (); + virtual void draw (osg::State& state); -private: - const SGPropertyNode * _node; - FGInstrumentLayer * _layer1, * _layer2; }; @@ -558,14 +583,6 @@ private: bool fgPanelVisible (); - -//////////////////////////////////////////////////////////////////////// -// The current panel, if any. -//////////////////////////////////////////////////////////////////////// - -extern FGPanel * current_panel; // TODO: move to globals - - #endif // __PANEL_HXX