Tomato: camera sensor changes
[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
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 vertical size of the sensor - for camera matching */
205         float                           GetSensorHeight() const;
206         /** Gets the mode FOV is calculating from sensor dimensions */
207         short                           GetSensorFit() const;
208         /** Gets the near clip distance. */
209         float                           GetCameraNear() const;
210         /** Gets the far clip distance. */
211         float                           GetCameraFar() const;
212         /** Gets the focal length (only used for stereo rendering) */
213         float                           GetFocalLength() const;
214         /** Gets all camera data. */
215         RAS_CameraData*         GetCameraData();
216         
217         /**
218          * Tests if the given sphere is inside this camera's view frustum.
219          *
220          * @param center The center of the sphere, in world coordinates.
221          * @param radius The radius of the sphere.
222          * @return INSIDE, INTERSECT, or OUTSIDE depending on the sphere's relation to the frustum.
223          */
224         int SphereInsideFrustum(const MT_Point3& center, const MT_Scalar &radius);
225         /**
226          * Tests the given eight corners of a box with the view frustum.
227          *
228          * @param box a pointer to eight MT_Point3 representing the world coordinates of the corners of the box.
229          * @return INSIDE, INTERSECT, or OUTSIDE depending on the box's relation to the frustum.
230          */
231         int BoxInsideFrustum(const MT_Point3 *box);
232         /**
233          * Tests the given point against the view frustum.
234          * @return true if the given point is inside or on the view frustum; false if it is outside.
235          */
236         bool PointInsideFrustum(const MT_Point3& x);
237         
238         /**
239          * Gets this camera's culling status.
240          */
241         bool GetFrustumCulling() const;
242         
243         /**
244          * Sets this camera's viewport status.
245          */
246         void EnableViewport(bool viewport);
247         
248         /**
249          * Sets this camera's viewport.
250          */
251         void SetViewport(int left, int bottom, int right, int top);
252         
253         /**
254          * Gets this camera's viewport status.
255          */
256         bool GetViewport() const;
257         
258         /**
259          * Gets this camera's viewport left.
260          */
261         int GetViewportLeft() const;
262         
263         /**
264          * Gets this camera's viewport bottom.
265          */
266         int GetViewportBottom() const;
267         
268         /**
269          * Gets this camera's viewport right.
270          */
271         int GetViewportRight() const;
272         
273         /**
274          * Gets this camera's viewport top.
275          */
276         int GetViewportTop() const;
277
278         virtual int GetGameObjectType() { return OBJ_CAMERA; }
279
280 #ifdef WITH_PYTHON
281         KX_PYMETHOD_DOC_VARARGS(KX_Camera, sphereInsideFrustum);
282         KX_PYMETHOD_DOC_O(KX_Camera, boxInsideFrustum);
283         KX_PYMETHOD_DOC_O(KX_Camera, pointInsideFrustum);
284         
285         KX_PYMETHOD_DOC_NOARGS(KX_Camera, getCameraToWorld);
286         KX_PYMETHOD_DOC_NOARGS(KX_Camera, getWorldToCamera);
287         
288         KX_PYMETHOD_DOC_VARARGS(KX_Camera, setViewport);        
289         KX_PYMETHOD_DOC_NOARGS(KX_Camera, setOnTop);    
290
291         KX_PYMETHOD_DOC_O(KX_Camera, getScreenPosition);
292         KX_PYMETHOD_DOC_VARARGS(KX_Camera, getScreenVect);
293         KX_PYMETHOD_DOC_VARARGS(KX_Camera, getScreenRay);
294         
295         static PyObject*        pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
296         static int                      pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
297
298         static PyObject*        pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
299         static int                      pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
300         static PyObject*        pyattr_get_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
301         static int                      pyattr_set_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
302         static PyObject*        pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
303         static int                      pyattr_set_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
304         static PyObject*        pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
305         static int                      pyattr_set_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
306         
307         static PyObject*        pyattr_get_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
308         static int                      pyattr_set_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
309         
310         static PyObject*        pyattr_get_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
311         static int                      pyattr_set_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
312         
313         static PyObject*        pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
314         static PyObject*        pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
315         static PyObject*        pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
316         
317         static PyObject*        pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
318         static PyObject*        pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
319         static PyObject*        pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
320 #endif
321 };
322
323 #endif //__KX_CAMERA
324