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