From 53e721305ef76505257bba3c62c24a042a3030a9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 5 Apr 2009 06:08:41 +0000 Subject: BGE Python API - made camera use PyAttributeDef's - removed unneeded duplicate matrix type checks - fixed own bug (added since 2.48a) that broke a converting 4x4 matrix to a PyObject --- source/gameengine/Ketsji/BL_Shader.cpp | 31 ++-- source/gameengine/Ketsji/KX_Camera.cpp | 228 +++++++++++++++++++---------- source/gameengine/Ketsji/KX_Camera.h | 20 +++ source/gameengine/Ketsji/KX_GameObject.cpp | 14 +- source/gameengine/Ketsji/KX_PyMath.cpp | 2 +- 5 files changed, 188 insertions(+), 107 deletions(-) (limited to 'source/gameengine') diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp index 279721b4840..c82a9979fe1 100644 --- a/source/gameengine/Ketsji/BL_Shader.cpp +++ b/source/gameengine/Ketsji/BL_Shader.cpp @@ -1278,19 +1278,16 @@ KX_PYMETHODDEF_DOC( BL_Shader, setUniformMatrix4, int loc = GetUniformLocation(uniform); if(loc != -1) { - if (PyObject_IsMT_Matrix(matrix, 4)) + MT_Matrix4x4 mat; + if (PyMatTo(matrix, mat)) { - MT_Matrix4x4 mat; - if (PyMatTo(matrix, mat)) - { #ifdef SORT_UNIFORMS - mat.getValue(matr); - SetUniformfv(loc, BL_Uniform::UNI_MAT4, matr, (sizeof(float)*16), (transp!=0) ); + mat.getValue(matr); + SetUniformfv(loc, BL_Uniform::UNI_MAT4, matr, (sizeof(float)*16), (transp!=0) ); #else - SetUniform(loc,mat,(transp!=0)); + SetUniform(loc,mat,(transp!=0)); #endif - Py_RETURN_NONE; - } + Py_RETURN_NONE; } } } @@ -1319,20 +1316,16 @@ KX_PYMETHODDEF_DOC( BL_Shader, setUniformMatrix3, int loc = GetUniformLocation(uniform); if(loc != -1) { - if (PyObject_IsMT_Matrix(matrix, 3)) + MT_Matrix3x3 mat; + if (PyMatTo(matrix, mat)) { - MT_Matrix3x3 mat; - if (PyMatTo(matrix, mat)) - { #ifdef SORT_UNIFORMS - mat.getValue(matr); - SetUniformfv(loc, BL_Uniform::UNI_MAT3, matr, (sizeof(float)*9), (transp!=0) ); + mat.getValue(matr); + SetUniformfv(loc, BL_Uniform::UNI_MAT3, matr, (sizeof(float)*9), (transp!=0) ); #else - SetUniform(loc,mat,(transp!=0)); + SetUniform(loc,mat,(transp!=0)); #endif - Py_RETURN_NONE; - - } + Py_RETURN_NONE; } } } diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp index 19370d83322..1540db5c44f 100644 --- a/source/gameengine/Ketsji/KX_Camera.cpp +++ b/source/gameengine/Ketsji/KX_Camera.cpp @@ -484,6 +484,24 @@ PyMethodDef KX_Camera::Methods[] = { }; PyAttributeDef KX_Camera::Attributes[] = { + + KX_PYATTRIBUTE_BOOL_RW("frustum_culling", KX_Camera, m_frustum_culling), + KX_PYATTRIBUTE_RW_FUNCTION("perspective", KX_Camera, pyattr_get_perspective, pyattr_set_perspective), + + KX_PYATTRIBUTE_RW_FUNCTION("lens", KX_Camera, pyattr_get_lens, pyattr_set_lens), + KX_PYATTRIBUTE_RW_FUNCTION("near", KX_Camera, pyattr_get_near, pyattr_set_near), + KX_PYATTRIBUTE_RW_FUNCTION("far", KX_Camera, pyattr_get_far, pyattr_set_far), + + KX_PYATTRIBUTE_RO_FUNCTION("projection_matrix", KX_Camera, pyattr_get_projection_matrix), + KX_PYATTRIBUTE_RO_FUNCTION("modelview_matrix", KX_Camera, pyattr_get_modelview_matrix), + KX_PYATTRIBUTE_RO_FUNCTION("camera_to_world", KX_Camera, pyattr_get_camera_to_world), + KX_PYATTRIBUTE_RO_FUNCTION("world_to_camera", KX_Camera, pyattr_get_world_to_camera), + + /* Grrr, functions for constants? */ + KX_PYATTRIBUTE_RO_FUNCTION("INSIDE", KX_Camera, pyattr_get_INSIDE), + KX_PYATTRIBUTE_RO_FUNCTION("OUTSIDE", KX_Camera, pyattr_get_OUTSIDE), + KX_PYATTRIBUTE_RO_FUNCTION("INTERSECT", KX_Camera, pyattr_get_INTERSECT), + { NULL } //Sentinel }; @@ -516,91 +534,20 @@ PyParentObject KX_Camera::Parents[] = { PyObject* KX_Camera::py_getattro(PyObject *attr) { - char *attr_str= PyString_AsString(attr); - if (!strcmp(attr_str, "INSIDE")) - return PyInt_FromLong(INSIDE); /* new ref */ - if (!strcmp(attr_str, "OUTSIDE")) - return PyInt_FromLong(OUTSIDE); /* new ref */ - if (!strcmp(attr_str, "INTERSECT")) - return PyInt_FromLong(INTERSECT); /* new ref */ - - if (!strcmp(attr_str, "lens")) - return PyFloat_FromDouble(GetLens()); /* new ref */ - if (!strcmp(attr_str, "near")) - return PyFloat_FromDouble(GetCameraNear()); /* new ref */ - if (!strcmp(attr_str, "far")) - return PyFloat_FromDouble(GetCameraFar()); /* new ref */ - if (!strcmp(attr_str, "frustum_culling")) - return PyInt_FromLong(m_frustum_culling); /* new ref */ - if (!strcmp(attr_str, "perspective")) - return PyInt_FromLong(m_camdata.m_perspective); /* new ref */ - if (!strcmp(attr_str, "projection_matrix")) - return PyObjectFrom(GetProjectionMatrix()); /* new ref */ - if (!strcmp(attr_str, "modelview_matrix")) - return PyObjectFrom(GetModelviewMatrix()); /* new ref */ - if (!strcmp(attr_str, "camera_to_world")) - return PyObjectFrom(GetCameraToWorld()); /* new ref */ - if (!strcmp(attr_str, "world_to_camera")) - return PyObjectFrom(GetWorldToCamera()); /* new ref */ + PyObject* object = py_getattro_self(Attributes, this, attr); + if (object != NULL) + return object; py_getattro_up(KX_GameObject); } -int KX_Camera::py_setattro(PyObject *attr, PyObject *pyvalue) +int KX_Camera::py_setattro(PyObject *attr, PyObject *value) { - char *attr_str= PyString_AsString(attr); - - if (PyInt_Check(pyvalue)) - { - if (!strcmp(attr_str, "frustum_culling")) - { - m_frustum_culling = PyInt_AsLong(pyvalue); - return 0; - } - - if (!strcmp(attr_str, "perspective")) - { - m_camdata.m_perspective = PyInt_AsLong(pyvalue); - return 0; - } - } + int ret = py_setattro_self(Attributes, this, attr, value); + if (ret >= 0) + return ret; - if (PyFloat_Check(pyvalue)) - { - if (!strcmp(attr_str, "lens")) - { - m_camdata.m_lens = PyFloat_AsDouble(pyvalue); - m_set_projection_matrix = false; - return 0; - } - if (!strcmp(attr_str, "near")) - { - m_camdata.m_clipstart = PyFloat_AsDouble(pyvalue); - m_set_projection_matrix = false; - return 0; - } - if (!strcmp(attr_str, "far")) - { - m_camdata.m_clipend = PyFloat_AsDouble(pyvalue); - m_set_projection_matrix = false; - return 0; - } - } - - if (PyObject_IsMT_Matrix(pyvalue, 4)) - { - if (!strcmp(attr_str, "projection_matrix")) - { - MT_Matrix4x4 mat; - if (PyMatTo(pyvalue, mat)) - { - SetProjectionMatrix(mat); - return 0; - } - return 1; - } - } - return KX_GameObject::py_setattro(attr, pyvalue); + return KX_GameObject::py_setattro(attr, value); } KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, sphereInsideFrustum, @@ -831,3 +778,126 @@ KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, setOnTop, scene->SetCameraOnTop(this); Py_RETURN_NONE; } + +PyObject* KX_Camera::pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyBool_FromLong(self->m_camdata.m_perspective); +} + +int KX_Camera::pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_Camera* self= static_cast(self_v); + int param = PyObject_IsTrue( value ); + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "expected True or False"); + return -1; + } + + self->m_camdata.m_perspective= param; + return 0; +} + +PyObject* KX_Camera::pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyFloat_FromDouble(self->m_camdata.m_lens); +} + +int KX_Camera::pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_Camera* self= static_cast(self_v); + float param = PyFloat_AsDouble(value); + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "expected a float greater then zero"); + return -1; + } + + self->m_camdata.m_lens= param; + self->m_set_projection_matrix = false; + return 0; +} + +PyObject* KX_Camera::pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyFloat_FromDouble(self->m_camdata.m_clipstart); +} + +int KX_Camera::pyattr_set_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_Camera* self= static_cast(self_v); + float param = PyFloat_AsDouble(value); + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "expected a float greater then zero"); + return -1; + } + + self->m_camdata.m_clipstart= param; + self->m_set_projection_matrix = false; + return 0; +} + +PyObject* KX_Camera::pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyFloat_FromDouble(self->m_camdata.m_clipend); +} + +int KX_Camera::pyattr_set_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_Camera* self= static_cast(self_v); + float param = PyFloat_AsDouble(value); + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "expected a float greater then zero"); + return -1; + } + + self->m_camdata.m_clipend= param; + self->m_set_projection_matrix = false; + return 0; +} + +PyObject* KX_Camera::pyattr_get_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyObjectFrom(self->GetProjectionMatrix()); +} + +int KX_Camera::pyattr_set_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_Camera* self= static_cast(self_v); + MT_Matrix4x4 mat; + if (!PyMatTo(value, mat)) + return -1; + + self->SetProjectionMatrix(mat); + return 0; +} + +PyObject* KX_Camera::pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyObjectFrom(self->GetModelviewMatrix()); +} + +PyObject* KX_Camera::pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyObjectFrom(self->GetCameraToWorld()); +} + +PyObject* KX_Camera::pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyObjectFrom(self->GetWorldToCamera()); +} + + +PyObject* KX_Camera::pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ return PyInt_FromLong(INSIDE); } +PyObject* KX_Camera::pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ return PyInt_FromLong(OUTSIDE); } +PyObject* KX_Camera::pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ return PyInt_FromLong(INTERSECT); } + diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h index 499db66ab14..6ed21506372 100644 --- a/source/gameengine/Ketsji/KX_Camera.h +++ b/source/gameengine/Ketsji/KX_Camera.h @@ -267,7 +267,27 @@ public: virtual PyObject* py_getattro(PyObject *attr); /* lens, near, far, projection_matrix */ virtual int py_setattro(PyObject *attr, PyObject *pyvalue); + + static PyObject* pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + + static PyObject* pyattr_get_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + + static PyObject* pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + + static PyObject* pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); }; #endif //__KX_CAMERA diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index d8fb54086b3..dd38bdfb06f 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -1303,16 +1303,14 @@ int KX_GameObject::pyattr_set_orientation(void *self_v, const KX_PYATTRIBUTE_DEF } MT_Matrix3x3 rot; - if (PyObject_IsMT_Matrix(value, 3)) + + if (PyMatTo(value, rot)) { - if (PyMatTo(value, rot)) - { - self->NodeSetLocalOrientation(rot); - self->NodeUpdateGS(0.f,true); - return 0; - } - return 1; + self->NodeSetLocalOrientation(rot); + self->NodeUpdateGS(0.f,true); + return 0; } + return 1; if (PySequence_Size(value) == 4) { diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp index 92f18590a7e..cceb7a12446 100644 --- a/source/gameengine/Ketsji/KX_PyMath.cpp +++ b/source/gameengine/Ketsji/KX_PyMath.cpp @@ -93,7 +93,7 @@ PyObject* PyObjectFrom(const MT_Matrix4x4 &mat) PyList_SET_ITEM(sublist, 0, PyFloat_FromDouble(mat[i][0])); PyList_SET_ITEM(sublist, 1, PyFloat_FromDouble(mat[i][1])); PyList_SET_ITEM(sublist, 2, PyFloat_FromDouble(mat[i][2])); - PyList_SET_ITEM(sublist, 2, PyFloat_FromDouble(mat[i][3])); + PyList_SET_ITEM(sublist, 3, PyFloat_FromDouble(mat[i][3])); PyList_SET_ITEM(list, i, sublist); } -- cgit v1.2.3