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