]> git.mxchange.org Git - simgear.git/blob - simgear/canvas/ODGauge.hxx
Canvas: proper forwarding of dirty and visible flags within nested canvases.
[simgear.git] / simgear / canvas / ODGauge.hxx
1 // Owner Drawn Gauge helper class
2 //
3 // Written by Harald JOHNSEN, started May 2005.
4 //
5 // Copyright (C) 2005  Harald JOHNSEN - hjohnsen@evc.net
6 //
7 // Ported to OSG by Tim Moore - Jun 2007
8 //
9 // Heavily modified to be usable for the 2d Canvas by Thomas Geymayer - April 2012
10 // Supports now multisampling/mipmapping, usage of the stencil buffer and placing
11 // the texture in the scene by certain filter criteria
12 //
13 // This library is free software; you can redistribute it and/or
14 // modify it under the terms of the GNU Library General Public
15 // License as published by the Free Software Foundation; either
16 // version 2 of the License, or (at your option) any later version.
17 //
18 // This library is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21 // Library General Public License for more details.
22 //
23 // You should have received a copy of the GNU Library General Public
24 // License along with this library; if not, write to the Free Software
25 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
26
27 #ifndef _SG_OD_GAUGE_HXX
28 #define _SG_OD_GAUGE_HXX
29
30 #include "canvas_fwd.hxx"
31
32 #include <osg/NodeCallback>
33 #include <osg/Group>
34
35 namespace osg
36 {
37   class Camera;
38   class Texture2D;
39 }
40
41 namespace simgear
42 {
43 namespace canvas
44 {
45
46   /**
47    * Owner Drawn Gauge (aka render-to-texture) helper class
48    */
49   class ODGauge
50   {
51     public:
52
53       ODGauge();
54       virtual ~ODGauge();
55
56       void setSystemAdapter(const SystemAdapterPtr& system_adapter);
57
58       /**
59        * Set the size of the render target.
60        *
61        * @param size_x    X size
62        * @param size_y    Y size. Defaults to size_x if not specified
63        */
64       void setSize(int size_x, int size_y = -1);
65
66       /**
67        * Set the size of the viewport
68        *
69        * @param width
70        * @param height    Defaults to width if not specified
71        */
72       void setViewSize(int width, int height = -1);
73
74       osg::Vec2s getViewSize() const;
75
76       /**
77        * DEPRECATED
78        *
79        * Get size of squared texture
80        */
81       int size() const { return _size_x; }
82
83       /**
84        * Set whether to use image coordinates or not.
85        *
86        * Default: origin == center of texture
87        * Image Coords: origin == top left corner
88        */
89       void useImageCoords(bool use = true);
90
91       /**
92        * Enable/Disable using a stencil buffer
93        */
94       void useStencil(bool use = true);
95
96       /**
97        * Enable/Disable additive alpha blending (Can improve results with
98        * transparent background)
99        */
100       void useAdditiveBlend(bool use = true);
101
102       /**
103        * Set sampling parameters for mipmapping and coverage sampling
104        * antialiasing.
105        *
106        * @note color_samples is not allowed to be higher than coverage_samples
107        *
108        */
109       void setSampling( bool mipmapping,
110                         int coverage_samples = 0,
111                         int color_samples = 0 );
112
113       /**
114        * Enable/Disable updating the texture (If disabled the contents of the
115        * texture remains with the outcome of the last rendering pass)
116        */
117       void setRender(bool render);
118
119       /**
120        * Say if we can render to a texture.
121        * @return true if rtt is available
122        */
123       bool serviceable(void);
124
125       /**
126        * Get the OSG camera for drawing this gauge.
127        */
128       osg::Camera* getCamera() const { return camera.get(); }
129
130       osg::Texture2D* getTexture() const { return texture.get(); }
131
132       // Real initialization function. Bad name.
133       void allocRT(osg::NodeCallback* camera_cull_callback = 0);
134       void reinit();
135       void clear();
136
137     protected:
138
139       SystemAdapterPtr _system_adapter;
140
141       int _size_x,
142           _size_y,
143           _view_width,
144           _view_height;
145
146       enum Flags
147       {
148         AVAILABLE           = 1,
149         USE_IMAGE_COORDS    = AVAILABLE << 1,
150         USE_STENCIL         = USE_IMAGE_COORDS << 1,
151         USE_MIPMAPPING      = USE_STENCIL << 1,
152         USE_ADDITIVE_BLEND  = USE_MIPMAPPING << 1
153       };
154
155       uint32_t _flags;
156
157       // Multisampling parameters
158       int  _coverage_samples,
159            _color_samples;
160
161       osg::ref_ptr<osg::Camera> camera;
162       osg::ref_ptr<osg::Texture2D> texture;
163
164       bool updateFlag(Flags flag, bool enable);
165
166       void updateCoordinateFrame();
167       void updateStencil();
168       void updateSampling();
169       void updateBlendMode();
170
171   };
172
173 } // namespace canvas
174 } // namespace simgear
175
176 #endif // _SG_OD_GAUGE_HXX