diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-04-05 18:01:49 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-04-05 18:01:49 +0400 |
commit | 033a63f8580227582a9695ebdd78ac0b4322e867 (patch) | |
tree | 61517f343a2908f894d54c46269baa5c54338135 /source/gameengine/Ketsji/KX_MeshProxy.cpp | |
parent | 7d4dc4f0f5d34d91703b2219323ef4a3db28a572 (diff) |
BGE Bugfixes (mostly in the py api)
KX_PolygonMaterial and KX_BlenderMaterial - Added a print function (would raise a python error on printing)
* Crashes *
KX_GameObject SetParent - Disallowed setting a parent to its self, caused a recursion crash.
KX_MeshProxy "materials" attribute was segfaulting because of my recent change - I was wrong, you do need to check material types (no idea why since they are both PyObject * at the base)
KX_VisibilityActuator - Wasn't initialized with PyType_Ready() making it crash on access (own fault)
* Crashes because of missing NULL checks *
KX_PolygonMaterial's "gl_texture" attribute wasnt checking for a valid m_tface
KX_GameObject - added checks for GetPhysicsController()
KX_RayCast::RayTest - didnt check for a valid physics_environment
KX_SceneActuator's getCamera python function wasnt checking if there was a camera.
Diffstat (limited to 'source/gameengine/Ketsji/KX_MeshProxy.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_MeshProxy.cpp | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp index 4a4c98603e3..d9b1cc6df23 100644 --- a/source/gameengine/Ketsji/KX_MeshProxy.cpp +++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp @@ -190,24 +190,24 @@ PyObject* KX_MeshProxy::PyGetVertexArrayLength(PyObject* self, PyObject* args, PyObject* kwds) { - int matid= -1; - int length = -1; + int matid= 0; + int length = 0; - if (PyArg_ParseTuple(args,"i",&matid)) + if (!PyArg_ParseTuple(args,"i",&matid)) + return NULL; + + + RAS_MeshMaterial *mmat = m_meshobj->GetMeshMaterial(matid); /* can be NULL*/ + + if (mmat) { - RAS_MeshMaterial *mmat = m_meshobj->GetMeshMaterial(matid); RAS_IPolyMaterial* mat = mmat->m_bucket->GetPolyMaterial(); - if (mat) length = m_meshobj->NumVertices(mat); } - else { - return NULL; - } - + return PyInt_FromLong(length); - } @@ -244,15 +244,21 @@ PyObject* KX_MeshProxy::PyGetPolygon(PyObject* self, if (!PyArg_ParseTuple(args,"i",&polyindex)) return NULL; + + if (polyindex<0 || polyindex >= m_meshobj->NumPolygons()) + { + PyErr_SetString(PyExc_AttributeError, "Invalid polygon index"); + return NULL; + } + RAS_Polygon* polygon = m_meshobj->GetPolygon(polyindex); if (polygon) { polyob = new KX_PolyProxy(m_meshobj, polygon); } - else - { - PyErr_SetString(PyExc_AttributeError, "Invalid polygon index"); + else { + PyErr_SetString(PyExc_AttributeError, "polygon is NULL, unknown reason"); } return polyob; } @@ -275,11 +281,22 @@ PyObject* KX_MeshProxy::pyattr_get_materials(void *self_v, const KX_PYATTRIBUTE_ list<RAS_MeshMaterial>::iterator mit= self->m_meshobj->GetFirstMaterial(); - /* Can be a KX_PolygonMaterial or KX_BlenderMaterial, since both are cast to a PyObject * we dont need to care */ + for(i=0; i<tot; mit++, i++) { - PyObject *py_mat = (PyObject *)mit->m_bucket->GetPolyMaterial(); - PyList_SET_ITEM(materials, i, py_mat); - Py_INCREF(py_mat); + RAS_IPolyMaterial *polymat = mit->m_bucket->GetPolyMaterial(); + + /* Why do we need to check for RAS_BLENDERMAT if both are cast to a (PyObject*)? - Campbell */ + if(polymat->GetFlag() & RAS_BLENDERMAT) + { + KX_BlenderMaterial *mat = static_cast<KX_BlenderMaterial*>(polymat); + PyList_SET_ITEM(materials, i, mat); + Py_INCREF(mat); + } + else { + KX_PolygonMaterial *mat = static_cast<KX_PolygonMaterial*>(polymat); + PyList_SET_ITEM(materials, i, mat); + Py_INCREF(mat); + } } return materials; } |