[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19088] trunk/blender/source/gameengine: BGE Python API

Campbell Barton ideasman42 at gmail.com
Mon Feb 23 07:41:15 CET 2009


Revision: 19088
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19088
Author:   campbellbarton
Date:     2009-02-23 07:41:10 +0100 (Mon, 23 Feb 2009)

Log Message:
-----------
BGE Python API
* fixed segfaults in CListValue.index(val) and CListValue.count(val) when the pyTypes could not be converted into a CValue.
* added scene.objects to replace scene.getObjectList()
* added function names to PyArg_ParseTuple() so errors will include the function names 
* removed cases of PyArg_ParseTuple(args,"O",&pyobj) where METH_O ensures a single argument.
* Made PyObjectFrom use ugly python api rather then Py_BuildValue(), approx %40 speedup for functions that return Python vector and matrix types like ob.orientation.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Expressions/ListValue.h
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_PyMath.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PyMath.h
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.h
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.h

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-02-23 06:22:47 UTC (rev 19087)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-02-23 06:41:10 UTC (rev 19088)
@@ -224,10 +224,10 @@
 
 
 PyMethodDef CListValue::Methods[] = {
-	{"append", (PyCFunction)CListValue::sPyappend,METH_VARARGS},
-	{"reverse", (PyCFunction)CListValue::sPyreverse,METH_VARARGS},
-	{"index", (PyCFunction)CListValue::sPyindex,METH_VARARGS},
-	{"count", (PyCFunction)CListValue::sPycount,METH_VARARGS},
+	{"append", (PyCFunction)CListValue::sPyappend,METH_O},
+	{"reverse", (PyCFunction)CListValue::sPyreverse,METH_NOARGS},
+	{"index", (PyCFunction)CListValue::sPyindex,METH_O},
+	{"count", (PyCFunction)CListValue::sPycount,METH_O},
 	
 	{NULL,NULL} //Sentinel
 };
@@ -403,34 +403,17 @@
 
 
 
-PyObject* CListValue::Pyappend(PyObject* self, 
-			       PyObject* args, 
-			       PyObject* kwds)
+PyObject* CListValue::Pyappend(PyObject* self, PyObject* value)
 {
-
-	PyObject* pyobj = NULL;
-	if (PyArg_ParseTuple(args,"O",&pyobj))
-	{
-		return listvalue_buffer_concat(self,pyobj);
-	}
-	else
-	{
-	   return NULL;	     
-	}
-
-	
+	return listvalue_buffer_concat(self, value);
 }
 
 
 
-PyObject* CListValue::Pyreverse(PyObject* self, 
-			       PyObject* args, 
-			       PyObject* kwds)
+PyObject* CListValue::Pyreverse(PyObject* self)
 {
 	std::reverse(m_pValueArray.begin(),m_pValueArray.end());
-
 	Py_RETURN_NONE;
-	
 }
 
 
@@ -452,58 +435,56 @@
 
 
 
-PyObject* CListValue::Pyindex(PyObject* self, 
-			       PyObject* args, 
-			       PyObject* kwds)
+PyObject* CListValue::Pyindex(PyObject* self, PyObject *value)
 {
 	PyObject* result = NULL;
 
-	PyObject* pyobj = NULL;
-	if (PyArg_ParseTuple(args,"O",&pyobj))
+	CValue* checkobj = ConvertPythonToValue(value);
+	if (checkobj==NULL)
+		return NULL; /* ConvertPythonToValue sets the error */
+
+	int numelem = GetCount();
+	for (int i=0;i<numelem;i++)
 	{
-	
-		CValue* checkobj = ConvertPythonToValue(pyobj);
-		int numelem = GetCount();
-		for (int i=0;i<numelem;i++)
+		CValue* elem = 			GetValue(i);
+		if (CheckEqual(checkobj,elem))
 		{
-			CValue* elem = 			GetValue(i);
-			if (CheckEqual(checkobj,elem))
-			{
-				result = PyInt_FromLong(i);
-				break;
-			}
+			result = PyInt_FromLong(i);
+			break;
 		}
-		checkobj->Release();
 	}
+	checkobj->Release();
 
+	if (result==NULL) {
+		PyErr_SetString(PyExc_ValueError, "ValueError: list.index(x): x not in CListValue");
+	}
 	return result;
 	
 }
 
 
 
-PyObject* CListValue::Pycount(PyObject* self, 
-			       PyObject* args, 
-			       PyObject* kwds)
+PyObject* CListValue::Pycount(PyObject* self, PyObject* value)
 {
-	
 	int numfound = 0;
 
-	PyObject* pyobj = NULL;
-	if (PyArg_ParseTuple(args,"O",&pyobj))
+	CValue* checkobj = ConvertPythonToValue(value);
+	
+	if (checkobj==NULL) { /* in this case just return that there are no items in the list */
+		PyErr_Clear();
+		PyInt_FromLong(0);
+	}
+
+	int numelem = GetCount();
+	for (int i=0;i<numelem;i++)
 	{
-		CValue* checkobj = ConvertPythonToValue(pyobj);
-		int numelem = GetCount();
-		for (int i=0;i<numelem;i++)
+		CValue* elem = 			GetValue(i);
+		if (CheckEqual(checkobj,elem))
 		{
-			CValue* elem = 			GetValue(i);
-			if (CheckEqual(checkobj,elem))
-			{
-				numfound ++;
-			}
+			numfound ++;
 		}
-		checkobj->Release();
 	}
+	checkobj->Release();
 
 	return PyInt_FromLong(numfound);
 }

Modified: trunk/blender/source/gameengine/Expressions/ListValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.h	2009-02-23 06:22:47 UTC (rev 19087)
+++ trunk/blender/source/gameengine/Expressions/ListValue.h	2009-02-23 06:41:10 UTC (rev 19088)
@@ -61,10 +61,10 @@
 
 	virtual PyObject* _getattr(const char *attr);
 
-	KX_PYMETHOD(CListValue,append);
-	KX_PYMETHOD(CListValue,reverse);
-	KX_PYMETHOD(CListValue,index);
-	KX_PYMETHOD(CListValue,count);
+	KX_PYMETHOD_O(CListValue,append);
+	KX_PYMETHOD_NOARGS(CListValue,reverse);
+	KX_PYMETHOD_O(CListValue,index);
+	KX_PYMETHOD_O(CListValue,count);
 
 	
 private:

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp	2009-02-23 06:22:47 UTC (rev 19087)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp	2009-02-23 06:41:10 UTC (rev 19088)
@@ -470,15 +470,15 @@
 
 PyMethodDef KX_Camera::Methods[] = {
 	KX_PYMETHODTABLE(KX_Camera, sphereInsideFrustum),
-	KX_PYMETHODTABLE(KX_Camera, boxInsideFrustum),
-	KX_PYMETHODTABLE(KX_Camera, pointInsideFrustum),
-	KX_PYMETHODTABLE(KX_Camera, getCameraToWorld),
-	KX_PYMETHODTABLE(KX_Camera, getWorldToCamera),
-	KX_PYMETHODTABLE(KX_Camera, getProjectionMatrix),
-	KX_PYMETHODTABLE(KX_Camera, setProjectionMatrix),
-	KX_PYMETHODTABLE(KX_Camera, enableViewport),
+	KX_PYMETHODTABLE_O(KX_Camera, boxInsideFrustum),
+	KX_PYMETHODTABLE_O(KX_Camera, pointInsideFrustum),
+	KX_PYMETHODTABLE_NOARGS(KX_Camera, getCameraToWorld),
+	KX_PYMETHODTABLE_NOARGS(KX_Camera, getWorldToCamera),
+	KX_PYMETHODTABLE_NOARGS(KX_Camera, getProjectionMatrix),
+	KX_PYMETHODTABLE_O(KX_Camera, setProjectionMatrix),
+	KX_PYMETHODTABLE_O(KX_Camera, enableViewport),
 	KX_PYMETHODTABLE(KX_Camera, setViewport),
-	KX_PYMETHODTABLE(KX_Camera, setOnTop),
+	KX_PYMETHODTABLE_NOARGS(KX_Camera, setOnTop),
 	
 	{NULL,NULL} //Sentinel
 };
@@ -624,7 +624,7 @@
 	return KX_GameObject::_setattr(attr, pyvalue);
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, sphereInsideFrustum,
+KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, sphereInsideFrustum,
 "sphereInsideFrustum(center, radius) -> Integer\n"
 "\treturns INSIDE, OUTSIDE or INTERSECT if the given sphere is\n"
 "\tinside/outside/intersects this camera's viewing frustum.\n\n"
@@ -658,7 +658,7 @@
 	return NULL;
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, boxInsideFrustum,
+KX_PYMETHODDEF_DOC_O(KX_Camera, boxInsideFrustum,
 "boxInsideFrustum(box) -> Integer\n"
 "\treturns INSIDE, OUTSIDE or INTERSECT if the given box is\n"
 "\tinside/outside/intersects this camera's viewing frustum.\n\n"
@@ -683,34 +683,27 @@
 "\t\t# Box is outside the frustum !\n"
 )
 {
-	PyObject *pybox;
-	if (PyArg_ParseTuple(args, "O", &pybox))
+	unsigned int num_points = PySequence_Size(value);
+	if (num_points != 8)
 	{
-		unsigned int num_points = PySequence_Size(pybox);
-		if (num_points != 8)
-		{
-			PyErr_Format(PyExc_TypeError, "boxInsideFrustum: Expected eight (8) points, got %d", num_points);
+		PyErr_Format(PyExc_TypeError, "boxInsideFrustum: Expected eight (8) points, got %d", num_points);
+		return NULL;
+	}
+	
+	MT_Point3 box[8];
+	for (unsigned int p = 0; p < 8 ; p++)
+	{
+		PyObject *item = PySequence_GetItem(value, p); /* new ref */
+		bool error = !PyVecTo(item, box[p]);
+		Py_DECREF(item);
+		if (error)
 			return NULL;
-		}
-		
-		MT_Point3 box[8];
-		for (unsigned int p = 0; p < 8 ; p++)
-		{
-			PyObject *item = PySequence_GetItem(pybox, p); /* new ref */
-			bool error = !PyVecTo(item, box[p]);
-			Py_DECREF(item);
-			if (error)
-				return NULL;
-		}
-		
-		return PyInt_FromLong(BoxInsideFrustum(box)); /* new ref */
 	}
 	
-	PyErr_SetString(PyExc_TypeError, "boxInsideFrustum: Expected argument: list of points.");
-	return NULL;
+	return PyInt_FromLong(BoxInsideFrustum(box)); /* new ref */
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, pointInsideFrustum,
+KX_PYMETHODDEF_DOC_O(KX_Camera, pointInsideFrustum,
 "pointInsideFrustum(point) -> Bool\n"
 "\treturns 1 if the given point is inside this camera's viewing frustum.\n\n"
 "\tpoint = The point to test (in world coordinates.)\n\n"
@@ -727,7 +720,7 @@
 )
 {
 	MT_Point3 point;
-	if (PyVecArgTo(args, point))
+	if (PyVecTo(value, point))
 	{
 		return PyInt_FromLong(PointInsideFrustum(point)); /* new ref */
 	}
@@ -736,7 +729,7 @@
 	return NULL;
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, getCameraToWorld,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, getCameraToWorld,
 "getCameraToWorld() -> Matrix4x4\n"
 "\treturns the camera to world transformation matrix, as a list of four lists of four values.\n\n"
 "\tie: [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]])\n"
@@ -745,7 +738,7 @@
 	return PyObjectFrom(GetCameraToWorld()); /* new ref */
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, getWorldToCamera,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, getWorldToCamera,
 "getWorldToCamera() -> Matrix4x4\n"
 "\treturns the world to camera transformation matrix, as a list of four lists of four values.\n\n"
 "\tie: [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]])\n"
@@ -754,7 +747,7 @@
 	return PyObjectFrom(GetWorldToCamera()); /* new ref */
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, getProjectionMatrix,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, getProjectionMatrix,
 "getProjectionMatrix() -> Matrix4x4\n"
 "\treturns this camera's projection matrix, as a list of four lists of four values.\n\n"
 "\tie: [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]])\n"
@@ -763,7 +756,7 @@
 	return PyObjectFrom(GetProjectionMatrix()); /* new ref */
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, setProjectionMatrix,
+KX_PYMETHODDEF_DOC_O(KX_Camera, setProjectionMatrix,
 "setProjectionMatrix(MT_Matrix4x4 m) -> None\n"
 "\tSets this camera's projection matrix\n"
 "\n"
@@ -805,56 +798,50 @@
 "\tcam = co.getOwner()\n"
 "\tcam.setProjectionMatrix(Perspective(-1.0, 1.0, -1.0, 1.0, 0.1, 1))\n")
 {
-	PyObject *pymat;
-	if (PyArg_ParseTuple(args, "O", &pymat))
+	MT_Matrix4x4 mat;
+	if (!PyMatTo(value, mat))
 	{
-		MT_Matrix4x4 mat;
-		if (PyMatTo(pymat, mat))
-		{
-			SetProjectionMatrix(mat);
-			Py_RETURN_NONE;
-		}
+		PyErr_SetString(PyExc_TypeError, "setProjectionMatrix: Expected 4x4 list as matrix argument.");
+		return NULL;
 	}
-
-	PyErr_SetString(PyExc_TypeError, "setProjectionMatrix: Expected 4x4 list as matrix argument.");
-	return NULL;
+	
+	SetProjectionMatrix(mat);
+	Py_RETURN_NONE;
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, enableViewport,
+KX_PYMETHODDEF_DOC_O(KX_Camera, enableViewport,
 "enableViewport(viewport)\n"
 "Sets this camera's viewport status\n"
 )
 {
-	int viewport;
-	if (PyArg_ParseTuple(args,"i",&viewport))
-	{
-		if(viewport)
-			EnableViewport(true);
-		else
-			EnableViewport(false);
-	}
-	else {
+	int viewport = PyObject_IsTrue(value);
+	
+	if (viewport == -1) {
+		PyErr_SetString(PyExc_ValueError, "expected True/False or 0/1");
 		return NULL;
 	}
 	
+	if(viewport)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list