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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to