bpplayer compiling fixes: ([#19890] Getting the Blenderplayer to build again by Mitch...
[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                 void
129         SetDisplayArea(
130                 RAS_Rect *rect
131         ) {
132                 m_displayarea= *rect;
133         };
134         
135                 RAS_Rect &
136         GetWindowArea(
137         ) {
138                 return m_displayarea;
139         }
140
141                 void 
142         BeginFrame(
143         ) {};
144
145         /**
146          * Draws overlay banners and progress bars.
147          */
148                 void 
149         EndFrame(
150         );
151         
152         void SetViewPort(int x1, int y1, int x2, int y2);
153
154         void ClearColor(float r, float g, float b, float a);
155
156         /**
157          * @section Methods inherited from abstract base class RAS_ICanvas.
158          * Semantics are not yet honoured.
159          */
160         
161         void SetMouseState(RAS_MouseState mousestate)
162         {
163                 // not yet              
164         }
165
166         void SetMousePosition(int x, int y)
167         {
168                 // not yet
169         }
170
171         virtual void MakeScreenShot(const char* filename);
172
173         void ClearBuffer(int type);
174
175         /**
176          * @section Services provided by this class.
177          */
178
179         /**
180          * Enables display of a banner.
181          * The image data is copied inside.
182          * @param bannerWidth           Display width of the banner.
183          * @param bannerHeight          Display height of the banner.
184          * @param imageWidth            Width of the banner image in pixels.
185          * @param imageHeight           Height of the banner image in pixels.
186          * @param imageData                     Pointer to the pixels of the image to display.
187          * @param alignement            Where the banner will be positioned on the canvas.
188          * @param enabled                       Whether the banner will be displayed intiallly.
189          * @return A banner id.
190          */
191         TBannerId AddBanner(
192                 unsigned int bannerWidth, unsigned int bannerHeight,
193                 unsigned int imageWidth, unsigned int imageHeight,
194                 unsigned char* imageData, TBannerAlignment alignment = alignTopLeft, 
195                 bool enabled = true);
196
197         /**
198          * Disposes a banner.
199          * @param id Bannner to be disposed.
200          */
201         void DisposeBanner(TBannerId id);
202
203         /**
204          * Disposes all the banners.
205          */
206         void DisposeAllBanners();
207
208         /**
209          * Enables or disables display of a banner.
210          * @param id            Banner id of the banner to be enabled/disabled.
211          * @param enabled       New state of the banner.
212          */
213         void SetBannerEnabled(TBannerId id, bool enabled = true);
214
215         /**
216          * Enables or disables display of all banners.
217          * @param enabled       New state of the banners.
218          */
219         void SetBannerDisplayEnabled(bool enabled = true);
220
221 protected:
222         /**
223          * Disposes a banner.
224          * @param it Bannner to be disposed.
225          */
226         void DisposeBanner(TBannerData& banner);
227
228         /**
229          * Draws all the banners enabled.
230          */
231         void DrawAllBanners(void);
232
233         /**
234          * Draws a banner.
235          */
236         void DrawBanner(TBannerData& banner);
237
238         struct CanvasRenderState {
239                 int oldLighting;
240                 int oldDepthTest;
241                 int oldFog;
242                 int oldTexture2D;
243                 int oldBlend;
244                 int oldBlendSrc;
245                 int oldBlendDst;
246                 float oldColor[4];
247                 int oldWriteMask;
248         };
249
250                 void                    
251         PushRenderState(
252                 CanvasRenderState & render_state
253         );
254                 void
255         PopRenderState(
256                 const CanvasRenderState & render_state
257         );
258
259         /** 
260          * Set up an orthogonal viewing,model and texture matrix
261          * for banners and progress bars.
262          */
263                 void
264         SetOrthoProjection(
265         );
266         
267         static TBannerId s_bannerId;
268 };
269
270 #endif // _GPC_CANVAS_H_
271