svn merge -r 30566:30717 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / gameengine / Ketsji / KX_Camera.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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  * Camera in the gameengine. Cameras are also used for views.
29  */
30
31 #ifndef __KX_CAMERA
32 #define __KX_CAMERA
33
34
35 #include "MT_Transform.h"
36 #include "MT_Matrix3x3.h"
37 #include "MT_Matrix4x4.h"
38 #include "MT_Vector3.h"
39 #include "MT_Point3.h"
40 #include "KX_GameObject.h"
41 #include "IntValue.h"
42 #include "RAS_CameraData.h"
43
44 #ifndef DISABLE_PYTHON
45 /* utility conversion function */
46 bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix);
47 #endif
48
49 class KX_Camera : public KX_GameObject
50 {
51         Py_Header;
52 protected:
53         friend class KX_Scene;
54         /** Camera parameters (clips distances, focal length). These
55          * params are closely tied to Blender. In the gameengine, only the
56          * projection and modelview matrices are relevant. There's a
57          * conversion being done in the engine class. Why is it stored
58          * here? It doesn't really have a function here. */
59         RAS_CameraData  m_camdata;
60
61         // Never used, I think...
62 //      void MoveTo(const MT_Point3& movevec)
63 //      {
64                 /*MT_Transform camtrans;
65                 camtrans.invert(m_trans1);
66                 MT_Matrix3x3 camorient = camtrans.getBasis();
67                 camtrans.translate(camorient.inverse()*movevec);
68                 m_trans1.invert(camtrans);
69                 */
70 //      }
71
72         /**
73          * Storage for the projection matrix that is passed to the
74          * rasterizer. */
75         MT_Matrix4x4 m_projection_matrix;
76         //MT_Matrix4x4 m_projection_matrix1;
77
78         /**
79          * Storage for the modelview matrix that is passed to the
80          * rasterizer. */
81         MT_Matrix4x4 m_modelview_matrix;
82         
83         /**
84          * true if the view frustum (modelview/projection matrix)
85          * has changed - the clip planes (m_planes) will have to be
86          * regenerated.
87          */
88         bool         m_dirty;
89         /**
90          * true if the frustum planes have been normalized.
91          */
92         bool         m_normalized;
93         
94         /**
95          * View Frustum clip planes.
96          */
97         MT_Vector4   m_planes[6];
98         
99         /**
100          * This camera is frustum culling.
101          * Some cameras (ie if the game was started from a non camera view should not cull.)
102          */
103         bool         m_frustum_culling;
104         
105         /**
106          * true if this camera has a valid projection matrix.
107          */
108         bool         m_set_projection_matrix;
109         
110         /**
111          * The center point of the frustum.
112          */
113         MT_Point3    m_frustum_center;
114         MT_Scalar    m_frustum_radius;
115         bool         m_set_frustum_center;
116
117         /**
118          * whether the camera should delete the node itself (only for shadow camera)
119          */
120         bool             m_delete_node;
121
122         /**
123          * Extracts the camera clip frames from the projection and world-to-camera matrices.
124          */
125         void ExtractClipPlanes();
126         /**
127          * Normalize the camera clip frames.
128          */
129         void NormalizeClipPlanes();
130         /**
131          * Extracts the bound sphere of the view frustum.
132          */
133         void ExtractFrustumSphere();
134         /**
135          * return the clip plane
136          */
137         MT_Vector4 *GetNormalizedClipPlanes()
138         {
139                 ExtractClipPlanes();
140                 NormalizeClipPlanes();
141                 return m_planes;
142         }
143
144 public:
145
146         enum { INSIDE, INTERSECT, OUTSIDE } ;
147
148         KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, bool delete_node = false);
149         virtual ~KX_Camera();
150         
151         /** 
152          * Inherited from CValue -- return a new copy of this
153          * instance allocated on the heap. Ownership of the new 
154          * object belongs with the caller.
155          */
156         virtual CValue*                         
157         GetReplica(
158         );
159         virtual void ProcessReplica();
160
161         MT_Transform            GetWorldToCamera() const;
162         MT_Transform            GetCameraToWorld() const;
163
164         /**
165          * Not implemented.
166          */
167         void                            CorrectLookUp(MT_Scalar speed);
168         const MT_Point3         GetCameraLocation() const;
169
170         /* I want the camera orientation as well. */
171         const MT_Quaternion GetCameraOrientation() const;
172                 
173         /** Sets the projection matrix that is used by the rasterizer. */
174         void                            SetProjectionMatrix(const MT_Matrix4x4 & mat);
175
176         /** Sets the modelview matrix that is used by the rasterizer. */
177         void                            SetModelviewMatrix(const MT_Matrix4x4 & mat);
178                 
179         /** Gets the projection matrix that is used by the rasterizer. */
180         const MT_Matrix4x4&             GetProjectionMatrix() const;
181         
182         /** returns true if this camera has been set a projection matrix. */
183         bool                            hasValidProjectionMatrix() const;
184         
185         /** Sets the validity of the projection matrix.  Call this if you change camera
186             data (eg lens, near plane, far plane) and require the projection matrix to be
187             recalculated.
188          */
189         void                            InvalidateProjectionMatrix(bool valid = false);
190         
191         /** Gets the modelview matrix that is used by the rasterizer. 
192          *  @warning If the Camera is a dynamic object then this method may return garbage.  Use GetCameraToWorld() instead.
193          */
194         const MT_Matrix4x4&             GetModelviewMatrix() const;
195
196         /** Gets the aperture. */
197         float                           GetLens() const;
198         /** Gets the ortho scale. */
199         float                           GetScale() const;
200         /** Gets the near clip distance. */
201         float                           GetCameraNear() const;
202         /** Gets the far clip distance. */
203         float                           GetCameraFar() const;
204         /** Gets the focal length (only used for stereo rendering) */
205         float                           GetFocalLength() const;
206         /** Gets all camera data. */
207         RAS_CameraData*         GetCameraData();
208         
209         /**
210          * Tests if the given sphere is inside this camera's view frustum.
211          *
212          * @param center The center of the sphere, in world coordinates.
213          * @param radius The radius of the sphere.
214          * @return INSIDE, INTERSECT, or OUTSIDE depending on the sphere's relation to the frustum.
215          */
216         int SphereInsideFrustum(const MT_Point3& center, const MT_Scalar &radius);
217         /**
218          * Tests the given eight corners of a box with the view frustum.
219          *
220          * @param box a pointer to eight MT_Point3 representing the world coordinates of the corners of the box.
221          * @return INSIDE, INTERSECT, or OUTSIDE depending on the box's relation to the frustum.
222          */
223         int BoxInsideFrustum(const MT_Point3 *box);
224         /**
225          * Tests the given point against the view frustum.
226          * @return true if the given point is inside or on the view frustum; false if it is outside.
227          */
228         bool PointInsideFrustum(const MT_Point3& x);
229         
230         /**
231          * Gets this camera's culling status.
232          */
233         bool GetFrustumCulling() const;
234         
235         /**
236          * Sets this camera's viewport status.
237          */
238         void EnableViewport(bool viewport);
239         
240         /**
241          * Sets this camera's viewport.
242          */
243         void SetViewport(int left, int bottom, int right, int top);
244         
245         /**
246          * Gets this camera's viewport status.
247          */
248         bool GetViewport() const;
249         
250         /**
251          * Gets this camera's viewport left.
252          */
253         int GetViewportLeft() const;
254         
255         /**
256          * Gets this camera's viewport bottom.
257          */
258         int GetViewportBottom() const;
259         
260         /**
261          * Gets this camera's viewport right.
262          */
263         int GetViewportRight() const;
264         
265         /**
266          * Gets this camera's viewport top.
267          */
268         int GetViewportTop() const;
269
270         virtual int GetGameObjectType() { return OBJ_CAMERA; }
271
272 #ifndef DISABLE_PYTHON
273         KX_PYMETHOD_DOC_VARARGS(KX_Camera, sphereInsideFrustum);
274         KX_PYMETHOD_DOC_O(KX_Camera, boxInsideFrustum);
275         KX_PYMETHOD_DOC_O(KX_Camera, pointInsideFrustum);
276         
277         KX_PYMETHOD_DOC_NOARGS(KX_Camera, getCameraToWorld);
278         KX_PYMETHOD_DOC_NOARGS(KX_Camera, getWorldToCamera);
279         
280         KX_PYMETHOD_DOC_VARARGS(KX_Camera, setViewport);        
281         KX_PYMETHOD_DOC_NOARGS(KX_Camera, setOnTop);    
282
283         KX_PYMETHOD_DOC_O(KX_Camera, getScreenPosition);
284         KX_PYMETHOD_DOC_VARARGS(KX_Camera, getScreenVect);
285         KX_PYMETHOD_DOC_VARARGS(KX_Camera, getScreenRay);
286         
287         static PyObject*        pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
288         static int                      pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
289
290         static PyObject*        pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
291         static int                      pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
292         static PyObject*        pyattr_get_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
293         static int                      pyattr_set_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
294         static PyObject*        pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
295         static int                      pyattr_set_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
296         static PyObject*        pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
297         static int                      pyattr_set_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
298         
299         static PyObject*        pyattr_get_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
300         static int                      pyattr_set_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
301         
302         static PyObject*        pyattr_get_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
303         static int                      pyattr_set_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
304         
305         static PyObject*        pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
306         static PyObject*        pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
307         static PyObject*        pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
308         
309         static PyObject*        pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
310         static PyObject*        pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
311         static PyObject*        pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
312 #endif
313 };
314
315 #endif //__KX_CAMERA
316