Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-05-16 16:53:22 +0400
committerKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-05-16 16:53:22 +0400
commitd162882e3af5fbf53ef90138d2c3521fa0d1a140 (patch)
treed6c77fbca53b6bde439b93913d43d8f01741a34c /source/gameengine/Ketsji/KX_Camera.h
parent3b63bbe90c289d139ae8bfddb8f09cf24c5869e4 (diff)
Frustum culling
New Python Hooks for cameras.
Diffstat (limited to 'source/gameengine/Ketsji/KX_Camera.h')
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h102
1 files changed, 91 insertions, 11 deletions
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index 0185a0ba9d5..29bb35183f0 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -46,9 +46,10 @@
class KX_Camera : public KX_GameObject
{
-
+ Py_Header;
+protected:
/** Camera parameters (clips distances, focal lenght). These
- * params are closely tied to BLender. In the gameengine, only the
+ * params are closely tied to Blender. In the gameengine, only the
* projection and modelview matrices are relevant. There's a
* conversion being done in the engine class. Why is it stored
* here? It doesn't really have a function here. */
@@ -74,20 +75,57 @@ class KX_Camera : public KX_GameObject
* Storage for the modelview matrix that is passed to the
* rasterizer. */
MT_Matrix4x4 m_modelview_matrix;
+
+ /**
+ * true if the view frustum (modelview/projection matrix)
+ * has changed - the clip planes (m_planes) will have to be
+ * regenerated.
+ */
+ bool m_dirty;
+
+ /**
+ * View Frustum clip planes.
+ */
+ MT_Vector4 m_planes[6];
+
+ /**
+ * This camera is frustum culling.
+ * Some cameras (ie if the game was started from a non camera view should not cull.)
+ */
+ bool m_frustum_culling;
+
+ /**
+ * true if this camera has a valid projection matrix.
+ */
+ bool m_set_projection_matrix;
+ /**
+ * Python module doc string.
+ */
+ static char doc[];
+
+ /**
+ * Extracts the camera clip frames from the projection and world-to-camera matrices.
+ */
+ void ExtractClipPlanes();
public:
- KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata);
+ typedef enum { INSIDE, INTERSECT, OUTSIDE } ;
+
+ KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true);
virtual ~KX_Camera();
MT_Transform GetWorldToCamera() const;
MT_Transform GetCameraToWorld() const;
+ /**
+ * Not implemented.
+ */
void CorrectLookUp(MT_Scalar speed);
- const MT_Point3 GetCameraLocation();
+ const MT_Point3 GetCameraLocation() const;
/* I want the camera orientation as well. */
- const MT_Quaternion GetCameraOrientation();
+ const MT_Quaternion GetCameraOrientation() const;
/** Sets the projection matrix that is used by the rasterizer. */
void SetProjectionMatrix(const MT_Matrix4x4 & mat);
@@ -96,21 +134,63 @@ public:
void SetModelviewMatrix(const MT_Matrix4x4 & mat);
/** Gets the projection matrix that is used by the rasterizer. */
- const MT_Matrix4x4& GetProjectionMatrix();
+ const MT_Matrix4x4& GetProjectionMatrix() const;
+
+ /** returns true if this camera has been set a projection matrix. */
+ bool hasValidProjectionMatrix() const;
/** Gets the modelview matrix that is used by the rasterizer.
* @warning If the Camera is a dynamic object then this method may return garbage. Use GetCameraToWorld() instead.
*/
- const MT_Matrix4x4& GetModelviewMatrix();
+ const MT_Matrix4x4& GetModelviewMatrix() const;
- /** Gets the focal lenght. */
- float GetLens();
+ /** Gets the focal length. */
+ float GetLens() const;
/** Gets the near clip distance. */
- float GetCameraNear();
+ float GetCameraNear() const;
/** Gets the far clip distance. */
- float GetCameraFar();
+ float GetCameraFar() const;
/** Gets all camera data. */
RAS_CameraData* GetCameraData();
+
+ /**
+ * Tests if the given sphere is inside this camera's view frustum.
+ *
+ * @param centre The centre of the sphere, in world coordinates.
+ * @param radius The radius of the sphere.
+ * @return INSIDE, INTERSECT, or OUTSIDE depending on the sphere's relation to the frustum.
+ */
+ int SphereInsideFrustum(const MT_Point3& centre, const MT_Scalar &radius);
+ /**
+ * Tests the given eight corners of a box with the view frustum.
+ *
+ * @param box a pointer to eight MT_Point3 representing the world coordinates of the corners of the box.
+ * @return INSIDE, INTERSECT, or OUTSIDE depending on the box's relation to the frustum.
+ */
+ int BoxInsideFrustum(const MT_Point3 *box);
+ /**
+ * Tests the given point against the view frustum.
+ * @return true if the given point is inside or on the view frustum; false if it is outside.
+ */
+ bool PointInsideFrustum(const MT_Point3& x);
+
+ /**
+ * Gets this camera's culling status.
+ */
+ bool GetFrustumCulling() const;
+
+ KX_PYMETHOD_DOC(KX_Camera, sphereInsideFrustum);
+ KX_PYMETHOD_DOC(KX_Camera, boxInsideFrustum);
+ KX_PYMETHOD_DOC(KX_Camera, pointInsideFrustum);
+
+ KX_PYMETHOD_DOC(KX_Camera, getCameraToWorld);
+ KX_PYMETHOD_DOC(KX_Camera, getWorldToCamera);
+ KX_PYMETHOD_DOC(KX_Camera, getProjectionMatrix);
+ KX_PYMETHOD_DOC(KX_Camera, setProjectionMatrix);
+
+ virtual PyObject* _getattr(const STR_String& attr); /* lens, near, far, projection_matrix */
+ virtual int _setattr(const STR_String& attr, PyObject *pyvalue);
+
};
#endif //__KX_CAMERA