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