0638a7677bc64a049774598cf7e2ede283e7a2c6
[blender-staging.git] / source / gameengine / Ketsji / KX_Camera.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 KX_Camera.h
29  *  \ingroup ketsji
30  *  \brief Camera in the gameengine. Cameras are also used for views.
31  */
32
33 #ifndef __KX_CAMERA
34 #define __KX_CAMERA
35
36
37 #include "MT_Transform.h"
38 #include "MT_Matrix3x3.h"
39 #include "MT_Matrix4x4.h"
40 #include "MT_Vector3.h"
41 #include "MT_Point3.h"
42 #include "KX_GameObject.h"
43 #include "IntValue.h"
44 #include "RAS_CameraData.h"
45
46 #ifdef WITH_PYTHON
47 /* utility conversion function */
48 bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix);
49 #endif
50
51 class KX_Camera : public KX_GameObject
52 {
53         Py_Header;
54 protected:
55         friend class KX_Scene;
56         /** Camera parameters (clips distances, focal length). These
57          * params are closely tied to Blender. In the gameengine, only the
58          * projection and modelview matrices are relevant. There's a
59          * conversion being done in the engine class. Why is it stored
60          * here? It doesn't really have a function here. */
61         RAS_CameraData  m_camdata;
62
63         // Never used, I think...
64 //      void MoveTo(const MT_Point3& movevec)
65 //      {
66                 /*MT_Transform camtrans;
67                 camtrans.invert(m_trans1);
68                 MT_Matrix3x3 camorient = camtrans.getBasis();
69                 camtrans.translate(camorient.inverse()*movevec);
70                 m_trans1.invert(camtrans);
71                 */
72 //      }
73
74         /**
75          * Storage for the projection matrix that is passed to the
76          * rasterizer. */
77         MT_Matrix4x4 m_projection_matrix;
78         //MT_Matrix4x4 m_projection_matrix1;
79
80         /**
81          * Storage for the modelview matrix that is passed to the
82          * rasterizer. */
83         MT_Matrix4x4 m_modelview_matrix;
84         
85         /**
86          * true if the view frustum (modelview/projection matrix)
87          * has changed - the clip planes (m_planes) will have to be
88          * regenerated.
89          */
90         bool         m_dirty;
91         /**
92          * true if the frustum planes have been normalized.
93          */
94         bool         m_normalized;
95         
96         /**
97          * View Frustum clip planes.
98          */
99         MT_Vector4   m_planes[6];
100         
101         /**
102          * This camera is frustum culling.
103          * Some cameras (ie if the game was started from a non camera view should not cull.)
104          */
105         bool         m_frustum_culling;
106         
107         /**
108          * true if this camera has a valid projection matrix.
109          */
110         bool         m_set_projection_matrix;
111         
112         /**
113          * The center point of the frustum.
114          */
115         MT_Point3    m_frustum_center;
116         MT_Scalar    m_frustum_radius;
117         bool         m_set_frustum_center;
118
119         /**
120          * whether the camera should delete the node itself (only for shadow camera)
121          */
122         bool             m_delete_node;
123
124         /**
125          * Extracts the camera clip frames from the projection and world-to-camera matrices.
126          */
127         void ExtractClipPlanes();
128         /**
129          * Normalize the camera clip frames.
130          */
131         void NormalizeClipPlanes();
132         /**
133          * Extracts the bound sphere of the view frustum.
134          */
135         void ExtractFrustumSphere();
136         /**
137          * return the clip plane
138          */
139         MT_Vector4 *GetNormalizedClipPlanes()
140         {
141                 ExtractClipPlanes();
142                 NormalizeClipPlanes();
143                 return m_planes;
144         }
145
146 public:
147
148         enum { INSIDE, INTERSECT, OUTSIDE } ;
149
150         KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, bool delete_node = false);
151         virtual ~KX_Camera();
152         
153         /** 
154          * Inherited from CValue -- return a new copy of this
155          * instance allocated on the heap. Ownership of the new 
156          * object belongs with the caller.
157          */
158         virtual CValue*                         
159         GetReplica(
160         );
161         virtual void ProcessReplica();
162
163         MT_Transform            GetWorldToCamera() const;
164         MT_Transform            GetCameraToWorld() const;
165
166         /**
167          * Not implemented.
168          */
169         void                            CorrectLookUp(MT_Scalar speed);
170         const MT_Point3         GetCameraLocation() const;
171
172         /* I want the camera orientation as well. */
173         const MT_Quaternion GetCameraOrientation() const;
174                 
175         /** Sets the projection matrix that is used by the rasterizer. */
176         void                            SetProjectionMatrix(const MT_Matrix4x4 & mat);
177
178         /** Sets the modelview matrix that is used by the rasterizer. */
179         void                            SetModelviewMatrix(const MT_Matrix4x4 & mat);
180                 
181         /** Gets the projection matrix that is used by the rasterizer. */
182         const MT_Matrix4x4&             GetProjectionMatrix() const;
183         
184         /** returns true if this camera has been set a projection matrix. */
185         bool                            hasValidProjectionMatrix() const;
186         
187         /** Sets the validity of the projection matrix.  Call this if you change camera
188             data (eg lens, near plane, far plane) and require the projection matrix to be
189             recalculated.
190          */
191         void                            InvalidateProjectionMatrix(bool valid = false);
192         
193         /** Gets the modelview matrix that is used by the rasterizer. 
194          *  @warning If the Camera is a dynamic object then this method may return garbage.  Use GetCameraToWorld() instead.
195          */
196         const MT_Matrix4x4&             GetModelviewMatrix() const;
197
198         /** Gets the aperture. */
199         float                           GetLens() const;
200         /** Gets the ortho scale. */
201         float                           GetScale() const;
202         /** Gets the horizontal size of the sensor - for camera matching */
203         float                           GetSensorWidth() 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