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