Merged 15170:15635 from trunk (no conflicts or even merges)
[blender.git] / source / gameengine / GamePlayer / common / GPC_Canvas.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef _GPC_CANVAS_H_
31 #define _GPC_CANVAS_H_
32
33 #include "RAS_ICanvas.h"
34 #include "RAS_Rect.h"
35
36 #ifdef WIN32
37         #pragma warning (disable:4786) // suppress stl-MSVC debug info warning
38         #include <windows.h>
39 #endif // WIN32
40
41 #include "GL/glew.h"
42
43 #include <map>
44
45
46 class GPC_Canvas : public RAS_ICanvas
47 {
48 public:
49         /**
50          * Used to position banners in the canvas.
51          */
52         typedef enum {
53                 alignTopLeft,
54                 alignBottomRight
55         } TBannerAlignment;
56
57         typedef int TBannerId;
58
59 protected:
60         /** 
61          * Used to store info for banners drawn on top of the canvas.
62          */
63         typedef struct {
64                 /** Where the banner will be displayed. */
65                 TBannerAlignment alignment;
66                 /** Banner display enabled. */
67                 bool enabled;
68                 /** Banner display width. */
69                 unsigned int displayWidth;
70                 /** Banner display height. */
71                 unsigned int displayHeight;
72                 /** Banner image width. */
73                 unsigned int imageWidth;
74                 /** Banner image height. */
75                 unsigned int imageHeight;
76                 /** Banner image data. */
77                 unsigned char* imageData;
78                 /** Banner OpenGL texture name. */
79                 unsigned int textureName;
80         } TBannerData;
81         typedef std::map<TBannerId, TBannerData> TBannerMap;
82
83         /** Width of the context. */
84         int m_width;
85         /** Height of the context. */
86         int m_height;
87         /** Rect that defines the area used for rendering,
88             relative to the context */
89         RAS_Rect m_displayarea;
90
91         /** Storage for the banners to display. */
92         TBannerMap m_banners;
93         /** State of banner display. */
94         bool m_bannersEnabled;
95
96 public:
97
98         GPC_Canvas(int width, int height);
99
100         virtual ~GPC_Canvas();
101
102         void Resize(int width, int height);
103
104
105         /**
106          * @section Methods inherited from abstract base class RAS_ICanvas.
107          */
108         
109                 int 
110         GetWidth(
111         ) const {
112                 return m_width;
113         }
114         
115                 int 
116         GetHeight(
117         ) const {
118                 return m_height;
119         }
120
121         const 
122                 RAS_Rect &
123         GetDisplayArea(
124         ) const {
125                 return m_displayarea;
126         };
127
128                 RAS_Rect &
129         GetDisplayArea(
130         ) {
131                 return m_displayarea;
132         };
133
134                 void 
135         BeginFrame(
136         ) {};
137
138         /**
139          * Draws overlay banners and progress bars.
140          */
141                 void 
142         EndFrame(
143         );
144         
145         void SetViewPort(int x1, int y1, int x2, int y2);
146
147         void ClearColor(float r, float g, float b, float a);
148
149         /**
150          * @section Methods inherited from abstract base class RAS_ICanvas.
151          * Semantics are not yet honoured.
152          */
153         
154         void SetMouseState(RAS_MouseState mousestate)
155         {
156                 // not yet              
157         }
158
159         void SetMousePosition(int x, int y)
160         {
161                 // not yet
162         }
163
164         virtual void MakeScreenShot(const char* filename);
165
166         void ClearBuffer(int type);
167
168         /**
169          * @section Services provided by this class.
170          */
171
172         /**
173          * Enables display of a banner.
174          * The image data is copied inside.
175          * @param bannerWidth           Display width of the banner.
176          * @param bannerHeight          Display height of the banner.
177          * @param imageWidth            Width of the banner image in pixels.
178          * @param imageHeight           Height of the banner image in pixels.
179          * @param imageData                     Pointer to the pixels of the image to display.
180          * @param alignement            Where the banner will be positioned on the canvas.
181          * @param enabled                       Whether the banner will be displayed intiallly.
182          * @return A banner id.
183          */
184         TBannerId AddBanner(
185                 unsigned int bannerWidth, unsigned int bannerHeight,
186                 unsigned int imageWidth, unsigned int imageHeight,
187                 unsigned char* imageData, TBannerAlignment alignment = alignTopLeft, 
188                 bool enabled = true);
189
190         /**
191          * Disposes a banner.
192          * @param id Bannner to be disposed.
193          */
194         void DisposeBanner(TBannerId id);
195
196         /**
197          * Disposes all the banners.
198          */
199         void DisposeAllBanners();
200
201         /**
202          * Enables or disables display of a banner.
203          * @param id            Banner id of the banner to be enabled/disabled.
204          * @param enabled       New state of the banner.
205          */
206         void SetBannerEnabled(TBannerId id, bool enabled = true);
207
208         /**
209          * Enables or disables display of all banners.
210          * @param enabled       New state of the banners.
211          */
212         void SetBannerDisplayEnabled(bool enabled = true);
213
214 protected:
215         /**
216          * Disposes a banner.
217          * @param it Bannner to be disposed.
218          */
219         void DisposeBanner(TBannerData& banner);
220
221         /**
222          * Draws all the banners enabled.
223          */
224         void DrawAllBanners(void);
225
226         /**
227          * Draws a banner.
228          */
229         void DrawBanner(TBannerData& banner);
230
231         struct CanvasRenderState {
232                 int oldLighting;
233                 int oldDepthTest;
234                 int oldFog;
235                 int oldTexture2D;
236                 int oldBlend;
237                 int oldBlendSrc;
238                 int oldBlendDst;
239                 float oldColor[4];
240                 int oldWriteMask;
241         };
242
243                 void                    
244         PushRenderState(
245                 CanvasRenderState & render_state
246         );
247                 void
248         PopRenderState(
249                 const CanvasRenderState & render_state
250         );
251
252         /** 
253          * Set up an orthogonal viewing,model and texture matrix
254          * for banners and progress bars.
255          */
256                 void
257         SetOrthoProjection(
258         );
259         
260         static TBannerId s_bannerId;
261 };
262
263 #endif // _GPC_CANVAS_H_
264