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