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:
authorCampbell Barton <ideasman42@gmail.com>2009-04-05 18:01:49 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-04-05 18:01:49 +0400
commit033a63f8580227582a9695ebdd78ac0b4322e867 (patch)
tree61517f343a2908f894d54c46269baa5c54338135 /source/gameengine/Ketsji/KX_MeshProxy.cpp
parent7d4dc4f0f5d34d91703b2219323ef4a3db28a572 (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.cpp51
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;
}