svn merge ^/trunk/blender -r41226:41227 .
[blender.git] / source / gameengine / Ketsji / KX_Dome.h
1 -----------------------------------------------------------------------------
2
3 This program is free software; you can redistribute it and/or modify it under
4 the terms of the GNU Lesser General Public License as published by the Free Software
5 Foundation; either version 2 of the License, or (at your option) any later
6 version.
7
8 This program is distributed in the hope that it will be useful, but WITHOUT
9 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
11
12 You should have received a copy of the GNU Lesser General Public License along with
13 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
14 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
15 http://www.gnu.org/copyleft/lesser.txt.
16
17 Contributor(s): Dalai Felinto
18
19 This source uses some of the ideas and code from Paul Bourke.
20 Developed as part of a Research and Development project for SAT - La Soci�t� des arts technologiques.
21 -----------------------------------------------------------------------------
22 */
23
24 /** \file KX_Dome.h
25  *  \ingroup ketsji
26  */
27
28 #if !defined KX_DOME_H
29 #define KX_DOME_H
30
31 #include "KX_Scene.h"
32 #include "KX_Camera.h"
33 #include "DNA_screen_types.h"
34 #include "RAS_ICanvas.h"
35 #include "RAS_IRasterizer.h"
36 #include "RAS_IRenderTools.h"
37 #include "KX_KetsjiEngine.h"
38
39 #include "GL/glew.h"
40 #include <vector>
41
42 #include "MEM_guardedalloc.h"
43 #include "BKE_text.h"
44
45 //Dome modes: limit hardcoded in buttons_scene.c
46 #define DOME_FISHEYE                    1
47 #define DOME_TRUNCATED_FRONT    2
48 #define DOME_TRUNCATED_REAR             3
49 #define DOME_ENVMAP                             4
50 #define DOME_PANORAM_SPH                5
51 #define DOME_NUM_MODES                  6
52
53
54 /// class for render 3d scene
55 class KX_Dome
56 {
57 public:
58         /// constructor
59         KX_Dome (RAS_ICanvas* m_canvas,
60                  /// rasterizer
61                  RAS_IRasterizer* m_rasterizer,
62                  /// render tools
63                  RAS_IRenderTools* m_rendertools,
64                  /// engine
65                  KX_KetsjiEngine* m_engine,
66
67                  short res,
68                  short mode,
69                  short angle,
70                  float resbuf,
71                  short tilt,
72                  struct Text* warptext
73                  );
74
75         /// destructor
76         virtual ~KX_Dome (void);
77
78         //openGL checks:
79         bool    dlistSupported;
80         bool    fboSupported;
81
82         //openGL names:
83         GLuint domefacesId[7];          // ID of the images -- room for 7 images, using only 4 for 180� x 360� dome, 6 for panoramic and +1 for warp mesh
84         GLuint dlistId;                         // ID of the Display Lists of the images (used as an offset)
85         
86         typedef struct {
87                 double u[3], v[3];
88                 MT_Vector3 verts[3]; //three verts
89         } DomeFace;
90
91         //mesh warp functions
92         typedef struct {
93                 double x, y, u, v, i;
94         } WarpMeshNode;
95
96         struct {
97                 bool usemesh;
98                 int mode;
99                 int n_width, n_height; //nodes width and height
100                 int imagesize;
101                 int bufferwidth, bufferheight;
102                 GLuint fboId;
103                 vector <vector <WarpMeshNode> > nodes;
104         } warp;
105
106         bool ParseWarpMesh(STR_String text);
107
108         vector <DomeFace> cubetop, cubebottom, cuberight, cubeleft, cubefront, cubeback; //for fisheye
109         vector <DomeFace> cubeleftback, cuberightback; //for panorama
110         
111         int nfacestop, nfacesbottom, nfacesleft, nfacesright, nfacesfront, nfacesback;
112         int nfacesleftback, nfacesrightback;
113
114         int GetNumberRenders(){return m_numfaces;};
115
116         void RenderDome(void);
117         void RenderDomeFrame(KX_Scene* scene, KX_Camera* cam, int i);
118         void BindImages(int i);
119
120         void SetViewPort(GLuint viewport[4]);
121         void CalculateFrustum(KX_Camera* cam);
122         void RotateCamera(KX_Camera* cam, int i);
123
124         //Mesh creation Functions
125         void CreateMeshDome180(void);
126         void CreateMeshDome250(void);
127         void CreateMeshPanorama(void);
128
129         void SplitFace(vector <DomeFace>& face, int *nfaces);
130
131         void FlattenDome(MT_Vector3 verts[3]);
132         void FlattenPanorama(MT_Vector3 verts[3]);
133
134         //Draw functions
135         void GLDrawTriangles(vector <DomeFace>& face, int nfaces);
136         void GLDrawWarpQuads(void);
137         void Draw(void);
138         void DrawDomeFisheye(void);
139         void DrawEnvMap(void);
140         void DrawPanorama(void);
141         void DrawDomeWarped(void);
142
143         //setting up openGL
144         void CreateGLImages(void);
145         void ClearGLImages(void);//called on resize
146         bool CreateDL(void); //create Display Lists
147         void ClearDL(void);  //remove Display Lists 
148         bool CreateFBO(void);//create FBO (for warp mesh)
149         void ClearFBO(void); //remove FBO
150
151         void CalculateCameraOrientation();
152         void CalculateImageSize(); //set m_imagesize
153
154         int canvaswidth;
155         int canvasheight;
156
157 protected:
158         int m_drawingmode;
159
160         int m_imagesize;
161         int m_buffersize;       // canvas small dimension
162         int m_numfaces;         // 4 to 6 depending on the kind of dome image
163         int m_numimages;        //numfaces +1 if we have warp mesh
164
165         short m_resolution;     //resolution to tesselate the mesh
166         short m_mode;           // the mode (truncated, warped, panoramic,...)
167         short m_angle;          //the angle of the fisheye
168         float m_radangle;       //the angle of the fisheye in radians
169         float m_resbuffer;      //the resolution of the buffer
170         short m_tilt;           //the dome tilt (camera rotation on horizontal axis)
171         
172         RAS_Rect m_viewport;
173
174         MT_Matrix4x4 m_projmat;
175
176         MT_Matrix3x3 m_locRot [6];// the rotation matrix
177
178         /// rendered scene
179         KX_Scene * m_scene;
180
181         /// canvas
182         RAS_ICanvas* m_canvas;
183         /// rasterizer
184         RAS_IRasterizer* m_rasterizer;
185         /// render tools
186         RAS_IRenderTools* m_rendertools;
187         /// engine
188         KX_KetsjiEngine* m_engine;
189         
190         
191 #ifdef WITH_CXX_GUARDEDALLOC
192 public:
193         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_Dome"); }
194         void operator delete( void *mem ) { MEM_freeN(mem); }
195 #endif
196 };
197
198 #endif
199