BGE Python API
authorCampbell Barton <ideasman42@gmail.com>
Mon, 23 Feb 2009 06:41:10 +0000 (06:41 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 23 Feb 2009 06:41:10 +0000 (06:41 +0000)
* 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.

13 files changed:
source/gameengine/Expressions/ListValue.cpp
source/gameengine/Expressions/ListValue.h
source/gameengine/Ketsji/KX_Camera.cpp
source/gameengine/Ketsji/KX_Camera.h
source/gameengine/Ketsji/KX_GameObject.cpp
source/gameengine/Ketsji/KX_GameObject.h
source/gameengine/Ketsji/KX_PyMath.cpp
source/gameengine/Ketsji/KX_PyMath.h
source/gameengine/Ketsji/KX_PythonInit.cpp
source/gameengine/Ketsji/KX_Scene.cpp
source/gameengine/Ketsji/KX_Scene.h
source/gameengine/Ketsji/KX_VertexProxy.cpp
source/gameengine/Ketsji/KX_VertexProxy.h

index b8a8a1a63b2409c775c5b43facb54897e3672a1a..9acc6ad2cde8fafd972b6fa27e11081461c0b5f2 100644 (file)
@@ -224,10 +224,10 @@ PyParentObject CListValue::Parents[] = {
 
 
 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 @@ void CListValue::MergeList(CListValue *otherlist)
 
 
 
-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 @@ bool CListValue::CheckEqual(CValue* first,CValue* second)
 
 
 
-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);
 }
index 8c0bd7679385d3e5627362d6e4c32009db526d82..104e3e632839a1dd4954ed0e33cf7dbda01539a0 100644 (file)
@@ -61,10 +61,10 @@ public:
 
        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:
index 043070ee207c9a0da768673795c6523a44c1ecd5..99e2d3b7c0643a12b8936cdec6cfe7e434a93be5 100644 (file)
@@ -470,15 +470,15 @@ int KX_Camera::GetViewportTop() const
 
 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 @@ int KX_Camera::_setattr(const char *attr, PyObject *pyvalue)
        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 @@ KX_PYMETHODDEF_DOC(KX_Camera, sphereInsideFrustum,
        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 @@ KX_PYMETHODDEF_DOC(KX_Camera, boxInsideFrustum,
 "\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 @@ KX_PYMETHODDEF_DOC(KX_Camera, pointInsideFrustum,
 )
 {
        MT_Point3 point;
-       if (PyVecArgTo(args, point))
+       if (PyVecTo(value, point))
        {
                return PyInt_FromLong(PointInsideFrustum(point)); /* new ref */
        }
@@ -736,7 +729,7 @@ KX_PYMETHODDEF_DOC(KX_Camera, pointInsideFrustum,
        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 @@ KX_PYMETHODDEF_DOC(KX_Camera, getCameraToWorld,
        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 @@ KX_PYMETHODDEF_DOC(KX_Camera, getWorldToCamera,
        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 @@ KX_PYMETHODDEF_DOC(KX_Camera, getProjectionMatrix,
        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 @@ KX_PYMETHODDEF_DOC(KX_Camera, setProjectionMatrix,
 "\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)
+               EnableViewport(true);
+       else
+               EnableViewport(false);
+       
        Py_RETURN_NONE;
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, setViewport,
+KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, setViewport,
 "setViewport(left, bottom, right, top)\n"
 "Sets this camera's viewport\n")
 {
        int left, bottom, right, top;
-       if (PyArg_ParseTuple(args,"iiii",&left, &bottom, &right, &top))
-       {
-               SetViewport(left, bottom, right, top);
-       } else {
+       if (!PyArg_ParseTuple(args,"iiii:setViewport",&left, &bottom, &right, &top))
                return NULL;
-       }
+       
+       SetViewport(left, bottom, right, top);
        Py_RETURN_NONE;
 }
 
-KX_PYMETHODDEF_DOC(KX_Camera, setOnTop,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, setOnTop,
 "setOnTop()\n"
 "Sets this camera's viewport on top\n")
 {
index 3e93745d888105a7c5ea56854bd7b7e594ecac27..efd18f99390aa493ad6d82f8c0e647b8b1960383 100644 (file)
@@ -257,18 +257,18 @@ public:
        int GetViewportTop() const;
 
 
-       KX_PYMETHOD_DOC(KX_Camera, sphereInsideFrustum);
-       KX_PYMETHOD_DOC(KX_Camera, boxInsideFrustum);
-       KX_PYMETHOD_DOC(KX_Camera, pointInsideFrustum);
+       KX_PYMETHOD_DOC_VARARGS(KX_Camera, sphereInsideFrustum);
+       KX_PYMETHOD_DOC_O(KX_Camera, boxInsideFrustum);
+       KX_PYMETHOD_DOC_O(KX_Camera, pointInsideFrustum);
        
-       KX_PYMETHOD_DOC(KX_Camera, getCameraToWorld);
-       KX_PYMETHOD_DOC(KX_Camera, getWorldToCamera);
-       KX_PYMETHOD_DOC(KX_Camera, getProjectionMatrix);
-       KX_PYMETHOD_DOC(KX_Camera, setProjectionMatrix);
+       KX_PYMETHOD_DOC_NOARGS(KX_Camera, getCameraToWorld);
+       KX_PYMETHOD_DOC_NOARGS(KX_Camera, getWorldToCamera);
+       KX_PYMETHOD_DOC_NOARGS(KX_Camera, getProjectionMatrix);
+       KX_PYMETHOD_DOC_O(KX_Camera, setProjectionMatrix);
        
-       KX_PYMETHOD_DOC(KX_Camera, enableViewport);
-       KX_PYMETHOD_DOC(KX_Camera, setViewport);        
-       KX_PYMETHOD_DOC(KX_Camera, setOnTop);   
+       KX_PYMETHOD_DOC_O(KX_Camera, enableViewport);
+       KX_PYMETHOD_DOC_VARARGS(KX_Camera, setViewport);        
+       KX_PYMETHOD_DOC_NOARGS(KX_Camera, setOnTop);    
 
        virtual PyObject* _getattr(const char *attr); /* lens, near, far, projection_matrix */
        virtual int       _setattr(const char *attr, PyObject *pyvalue);
index 7d785f07ed254c38ab76f4762fd9fa9a15412211..82b5fff534c2b951d6832da26d124204213f0c51 100644 (file)
@@ -1030,8 +1030,8 @@ PyMethodDef KX_GameObject::Methods[] = {
        {"endObject",(PyCFunction) KX_GameObject::sPyEndObject, METH_NOARGS},
        KX_PYMETHODTABLE(KX_GameObject, rayCastTo),
        KX_PYMETHODTABLE(KX_GameObject, rayCast),
-       KX_PYMETHODTABLE(KX_GameObject, getDistanceTo),
-       KX_PYMETHODTABLE(KX_GameObject, getVectTo),
+       KX_PYMETHODTABLE_O(KX_GameObject, getDistanceTo),
+       KX_PYMETHODTABLE_O(KX_GameObject, getVectTo),
        {NULL,NULL} //Sentinel
 };
 
@@ -1136,10 +1136,7 @@ PyObject* KX_GameObject::_getattr(const char *attr)
        {       
                KX_GameObject* parent = GetParent();
                if (parent)
-               {
-                       parent->AddRef();
-                       return parent;
-               }
+                       return parent->AddRef();
                Py_RETURN_NONE;
        }
 
@@ -1297,7 +1294,7 @@ PyObject* KX_GameObject::PyApplyForce(PyObject* self, PyObject* args)
        int local = 0;
        PyObject* pyvect;
 
-       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+       if (PyArg_ParseTuple(args, "O|i:applyForce", &pyvect, &local)) {
                MT_Vector3 force;
                if (PyVecTo(pyvect, force)) {
                        ApplyForce(force, (local!=0));
@@ -1312,7 +1309,7 @@ PyObject* KX_GameObject::PyApplyTorque(PyObject* self, PyObject* args)
        int local = 0;
        PyObject* pyvect;
 
-       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+       if (PyArg_ParseTuple(args, "O|i:applyTorque", &pyvect, &local)) {
                MT_Vector3 torque;
                if (PyVecTo(pyvect, torque)) {
                        ApplyTorque(torque, (local!=0));
@@ -1327,7 +1324,7 @@ PyObject* KX_GameObject::PyApplyRotation(PyObject* self, PyObject* args)
        int local = 0;
        PyObject* pyvect;
 
-       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+       if (PyArg_ParseTuple(args, "O|i:applyRotation", &pyvect, &local)) {
                MT_Vector3 rotation;
                if (PyVecTo(pyvect, rotation)) {
                        ApplyRotation(rotation, (local!=0));
@@ -1342,7 +1339,7 @@ PyObject* KX_GameObject::PyApplyMovement(PyObject* self, PyObject* args)
        int local = 0;
        PyObject* pyvect;
 
-       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+       if (PyArg_ParseTuple(args, "O|i:applyMovement", &pyvect, &local)) {
                MT_Vector3 movement;
                if (PyVecTo(pyvect, movement)) {
                        ApplyMovement(movement, (local!=0));
@@ -1356,7 +1353,7 @@ PyObject* KX_GameObject::PyGetLinearVelocity(PyObject* self, PyObject* args)
 {
        // only can get the velocity if we have a physics object connected to us...
        int local = 0;
-       if (PyArg_ParseTuple(args,"|i",&local))
+       if (PyArg_ParseTuple(args,"|i:getLinearVelocity",&local))
        {
                return PyObjectFrom(GetLinearVelocity((local!=0)));
        }
@@ -1371,7 +1368,7 @@ PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self, PyObject* args)
        int local = 0;
        PyObject* pyvect;
        
-       if (PyArg_ParseTuple(args,"O|i",&pyvect,&local)) {
+       if (PyArg_ParseTuple(args,"O|i:setLinearVelocity",&pyvect,&local)) {
                MT_Vector3 velocity;
                if (PyVecTo(pyvect, velocity)) {
                        setLinearVelocity(velocity, (local!=0));
@@ -1385,7 +1382,7 @@ PyObject* KX_GameObject::PyGetAngularVelocity(PyObject* self, PyObject* args)
 {
        // only can get the velocity if we have a physics object connected to us...
        int local = 0;
-       if (PyArg_ParseTuple(args,"|i",&local))
+       if (PyArg_ParseTuple(args,"|i:getAngularVelocity",&local))
        {
                return PyObjectFrom(GetAngularVelocity((local!=0)));
        }
@@ -1400,7 +1397,7 @@ PyObject* KX_GameObject::PySetAngularVelocity(PyObject* self, PyObject* args)
        int local = 0;
        PyObject* pyvect;
        
-       if (PyArg_ParseTuple(args,"O|i",&pyvect,&local)) {
+       if (PyArg_ParseTuple(args,"O|i:setAngularVelocity",&pyvect,&local)) {
                MT_Vector3 velocity;
                if (PyVecTo(pyvect, velocity)) {
                        setAngularVelocity(velocity, (local!=0));
@@ -1413,7 +1410,7 @@ PyObject* KX_GameObject::PySetAngularVelocity(PyObject* self, PyObject* args)
 PyObject* KX_GameObject::PySetVisible(PyObject* self, PyObject* args)
 {
        int visible, recursive = 0;
-       if (!PyArg_ParseTuple(args,"i|i",&visible, &recursive))
+       if (!PyArg_ParseTuple(args,"i|i:setVisible",&visible, &recursive))
                return NULL;
        
        SetVisible(visible ? true:false, recursive ? true:false);
@@ -1464,7 +1461,7 @@ PyObject* KX_GameObject::PyGetVelocity(PyObject* self, PyObject* args)
        
        
        PyObject* pypos = NULL;
-       if (PyArg_ParseTuple(args, "|O", &pypos))
+       if (PyArg_ParseTuple(args, "|O:getVelocity", &pypos))
        {
                if (pypos)
                        PyVecTo(pypos, point);
@@ -1520,10 +1517,7 @@ PyObject* KX_GameObject::PyGetParent(PyObject* self)
 {
        KX_GameObject* parent = this->GetParent();
        if (parent)
-       {
-               parent->AddRef();
-               return parent;
-       }
+               return parent->AddRef();
        Py_RETURN_NONE;
 }
 
@@ -1592,7 +1586,7 @@ PyObject* KX_GameObject::PyGetMesh(PyObject* self, PyObject* args)
 {
        int mesh = 0;
 
-       if (!PyArg_ParseTuple(args, "|i", &mesh))
+       if (!PyArg_ParseTuple(args, "|i:getMesh", &mesh))
                return NULL; // python sets a simple error
        
        if (((unsigned int)mesh < m_meshes.size()) && mesh >= 0)
@@ -1638,7 +1632,7 @@ PyObject* KX_GameObject::PyApplyImpulse(PyObject* self, PyObject* args)
                return NULL;
        }
        
-       if (PyArg_ParseTuple(args, "OO", &pyattach, &pyimpulse))
+       if (PyArg_ParseTuple(args, "OO:applyImpulse", &pyattach, &pyimpulse))
        {
                MT_Point3  attach;
                MT_Vector3 impulse;
@@ -1705,7 +1699,7 @@ PyObject* KX_GameObject::PyAlignAxisToVect(PyObject* self, PyObject* args)
        int axis = 2; //z axis is the default
        float fac = 1.0;
        
-       if (PyArg_ParseTuple(args,"O|if",&pyvect,&axis, &fac))
+       if (PyArg_ParseTuple(args,"O|if:alignAxisToVect",&pyvect,&axis, &fac))
        {
                MT_Vector3 vect;
                if (PyVecTo(pyvect, vect))
@@ -1773,19 +1767,18 @@ PyObject* KX_GameObject::PyGetPropertyNames(PyObject* self)
        return ConvertKeysToPython();
 }
 
-KX_PYMETHODDEF_DOC(KX_GameObject, getDistanceTo,
+KX_PYMETHODDEF_DOC_O(KX_GameObject, getDistanceTo,
 "getDistanceTo(other): get distance to another point/KX_GameObject")
 {
        MT_Point3 b;
-       if (PyVecArgTo(args, b))
+       if (PyVecTo(value, b))
        {
                return PyFloat_FromDouble(NodeGetWorldPosition().distance(b));
        }
        PyErr_Clear();
        
-       PyObject *pyother;
        KX_GameObject *other;
-       if (PyArg_ParseTuple(args, "O", &pyother) && ConvertPythonToGameObject(pyother, &other, false))
+       if (ConvertPythonToGameObject(value, &other, false))
        {
                return PyFloat_FromDouble(NodeGetWorldPosition().distance(other->NodeGetWorldPosition()));
        }
@@ -1793,7 +1786,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, getDistanceTo,
        return NULL;
 }
 
-KX_PYMETHODDEF_DOC(KX_GameObject, getVectTo,
+KX_PYMETHODDEF_DOC_O(KX_GameObject, getVectTo,
 "getVectTo(other): get vector and the distance to another point/KX_GameObject\n"
 "Returns a 3-tuple with (distance,worldVector,localVector)\n")
 {
@@ -1802,14 +1795,13 @@ KX_PYMETHODDEF_DOC(KX_GameObject, getVectTo,
        MT_Scalar distance;
 
        PyObject *returnValue;
-       PyObject *pyother;
 
-       if (!PyVecArgTo(args, toPoint))
+       if (!PyVecTo(value, toPoint))
        {
                PyErr_Clear();
                
                KX_GameObject *other;
-               if (PyArg_ParseTuple(args, "O", &pyother) && ConvertPythonToGameObject(pyother, &other, false))
+               if (ConvertPythonToGameObject(value, &other, false))
                {
                        toPoint = other->NodeGetWorldPosition();
                } else
@@ -1894,7 +1886,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCastTo,
        float dist = 0.0f;
        char *propName = NULL;
 
-       if (!PyArg_ParseTuple(args,"O|fs", &pyarg, &dist, &propName)) {
+       if (!PyArg_ParseTuple(args,"O|fs:rayCastTo", &pyarg, &dist, &propName)) {
                return NULL; // python sets simple error
        }
 
@@ -1937,10 +1929,8 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCastTo,
        KX_RayCast::RayTest(pe, fromPoint, toPoint, callback);
 
     if (m_pHitObject)
-       {
-               m_pHitObject->AddRef();
-               return m_pHitObject;
-       }
+               return m_pHitObject->AddRef();
+       
        Py_RETURN_NONE;
 }
 
@@ -1973,7 +1963,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCast,
        KX_GameObject *other;
        int face=0, xray=0, poly=0;
 
-       if (!PyArg_ParseTuple(args,"O|Ofsiii", &pyto, &pyfrom, &dist, &propName, &face, &xray, &poly)) {
+       if (!PyArg_ParseTuple(args,"O|Ofsiii:rayCast", &pyto, &pyfrom, &dist, &propName, &face, &xray, &poly)) {
                return NULL; // Python sets a simple error
        }
 
index 7fe3009a95730e0ee8d307609d9e43f08c880da4..d95e3751d331d652e6f385852a792e2aea3f20f5 100644 (file)
@@ -799,8 +799,8 @@ public:
        KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);
        KX_PYMETHOD_DOC(KX_GameObject,rayCastTo);
        KX_PYMETHOD_DOC(KX_GameObject,rayCast);
-       KX_PYMETHOD_DOC(KX_GameObject,getDistanceTo);
-       KX_PYMETHOD_DOC(KX_GameObject,getVectTo);
+       KX_PYMETHOD_DOC_O(KX_GameObject,getDistanceTo);
+       KX_PYMETHOD_DOC_O(KX_GameObject,getVectTo);
        
 private :
 
index afb20acec2d4d0461af29733366f778993677fe3..92f18590a7e04ddf44f86c759fddb6cacd578577 100644 (file)
@@ -77,35 +77,92 @@ bool PyObject_IsMT_Matrix(PyObject *pymat, unsigned int rank)
 
 PyObject* PyObjectFrom(const MT_Matrix4x4 &mat)
 {
+#if 0
        return Py_BuildValue("[[ffff][ffff][ffff][ffff]]",
                mat[0][0], mat[0][1], mat[0][2], mat[0][3], 
                mat[1][0], mat[1][1], mat[1][2], mat[1][3], 
                mat[2][0], mat[2][1], mat[2][2], mat[2][3], 
                mat[3][0], mat[3][1], mat[3][2], mat[3][3]);
+#else
+       PyObject *list = PyList_New(4);
+       PyObject *sublist;
+       int i;
+       
+       for(i=0; i < 4; i++) {
+               sublist = PyList_New(4);
+               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(list, i, sublist);
+       }
+       
+       return list;
+#endif
 }
 
 PyObject* PyObjectFrom(const MT_Matrix3x3 &mat)
 {
+#if 0
        return Py_BuildValue("[[fff][fff][fff]]",
                mat[0][0], mat[0][1], mat[0][2], 
                mat[1][0], mat[1][1], mat[1][2], 
                mat[2][0], mat[2][1], mat[2][2]);
+#else
+       PyObject *list = PyList_New(3);
+       PyObject *sublist;
+       int i;
+       
+       for(i=0; i < 3; i++) {
+               sublist = PyList_New(3);
+               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(list, i, sublist);
+       }
+       
+       return list;
+#endif
 }
 
 PyObject* PyObjectFrom(const MT_Tuple4 &vec)
 {
+#if 0
        return Py_BuildValue("[ffff]", 
                vec[0], vec[1], vec[2], vec[3]);
+#else
+       PyObject *list = PyList_New(4);
+       PyList_SET_ITEM(list, 0, PyFloat_FromDouble(vec[0]));
+       PyList_SET_ITEM(list, 1, PyFloat_FromDouble(vec[1]));
+       PyList_SET_ITEM(list, 2, PyFloat_FromDouble(vec[2]));
+       PyList_SET_ITEM(list, 3, PyFloat_FromDouble(vec[3]));
+       return list;
+#endif
 }
 
 PyObject* PyObjectFrom(const MT_Tuple3 &vec)
 {
+#if 0
        return Py_BuildValue("[fff]", 
                vec[0], vec[1], vec[2]);
+#else
+       PyObject *list = PyList_New(3);
+       PyList_SET_ITEM(list, 0, PyFloat_FromDouble(vec[0]));
+       PyList_SET_ITEM(list, 1, PyFloat_FromDouble(vec[1]));
+       PyList_SET_ITEM(list, 2, PyFloat_FromDouble(vec[2]));
+       return list;
+#endif 
 }
 
 PyObject* PyObjectFrom(const MT_Tuple2 &vec)
 {
+#if 0
        return Py_BuildValue("[ff]",
                vec[0], vec[1]);
+#else
+       PyObject *list = PyList_New(2);
+       PyList_SET_ITEM(list, 0, PyFloat_FromDouble(vec[0]));
+       PyList_SET_ITEM(list, 1, PyFloat_FromDouble(vec[1]));
+       return list;
+#endif
 }
index 4e383e9b3d44f59426058a9bd242d2eb334022a9..39c9c3587927e7d7ede497b5386fe1ef3040534f 100644 (file)
@@ -130,20 +130,6 @@ bool PyVecTo(PyObject* pyval, T& vec)
        return false;
 }
 
-/**
- *  Converts a python argument to an MT class.
- *  This paramater expects arguments as passed to a python method.
- */
-template<class T>
-bool PyVecArgTo(PyObject* args, T& vec)
-{
-       PyObject* pylist;
-       if (PyArg_ParseTuple(args,"O",&pylist))
-               return PyVecTo(pylist, vec);
-               
-       return false;
-}
-
 /**
  * Converts an MT_Matrix4x4 to a python object.
  */
index 13f141dec13c1f53d9df4b9d8e1905da60967f9c..c3ae3d0ec52ae7f16a5162ac4e5288404ad5476d 100644 (file)
@@ -125,10 +125,10 @@ static PyObject* gPyGetRandomFloat(PyObject*)
        return PyFloat_FromDouble(MT_random());
 }
 
-static PyObject* gPySetGravity(PyObject*, PyObject* args)
+static PyObject* gPySetGravity(PyObject*, PyObject* value)
 {
-       MT_Vector3 vec = MT_Vector3(0., 0., 0.);
-       if (!PyVecArgTo(args, vec))
+       MT_Vector3 vec;
+       if (!PyVecTo(value, vec))
                return NULL;
 
        if (gp_KetsjiScene)
@@ -412,7 +412,7 @@ static struct PyMethodDef game_methods[] = {
        METH_VARARGS, (PY_METHODCHAR)SCA_PythonController::sPyAddActiveActuator__doc__},
        {"getRandomFloat",(PyCFunction) gPyGetRandomFloat,
        METH_NOARGS, (PY_METHODCHAR)gPyGetRandomFloat_doc.Ptr()},
-       {"setGravity",(PyCFunction) gPySetGravity, METH_VARARGS, (PY_METHODCHAR)"set Gravitation"},
+       {"setGravity",(PyCFunction) gPySetGravity, METH_O, (PY_METHODCHAR)"set Gravitation"},
        {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (PY_METHODCHAR)"get audio spectrum"},
        {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (PY_METHODCHAR)"stop using the audio dsp (for performance reasons)"},
        {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (PY_METHODCHAR)"Gets the logic tic rate"},
@@ -542,11 +542,11 @@ static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
        Py_RETURN_NONE;
 }
 
-static PyObject* gPySetBackgroundColor(PyObject*, PyObject* args)
+static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
 {
        
-       MT_Vector4 vec = MT_Vector4(0., 0., 0.3, 0.);
-       if (!PyVecArgTo(args, vec))
+       MT_Vector4 vec;
+       if (!PyVecTo(value, vec))
                return NULL;
        
        if (gp_Canvas)
@@ -558,11 +558,11 @@ static PyObject* gPySetBackgroundColor(PyObject*, PyObject* args)
 
 
 
-static PyObject* gPySetMistColor(PyObject*, PyObject* args)
+static PyObject* gPySetMistColor(PyObject*, PyObject* value)
 {
        
-       MT_Vector3 vec = MT_Vector3(0., 0., 0.);
-       if (!PyVecArgTo(args, vec))
+       MT_Vector3 vec;
+       if (!PyVecTo(value, vec))
                return NULL;
        
        if (!gp_Rasterizer) {
@@ -613,11 +613,11 @@ static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
 }
 
 
-static PyObject* gPySetAmbientColor(PyObject*, PyObject* args)
+static PyObject* gPySetAmbientColor(PyObject*, PyObject* value)
 {
        
-       MT_Vector3 vec = MT_Vector3(0., 0., 0.);
-       if (!PyVecArgTo(args, vec))
+       MT_Vector3 vec;
+       if (!PyVecTo(value, vec))
                return NULL;
        
        if (!gp_Rasterizer) {
@@ -812,9 +812,9 @@ static PyObject* gPyDrawLine(PyObject*, PyObject* args)
        if (!PyArg_ParseTuple(args,"OOO",&ob_from,&ob_to,&ob_color))
                return NULL;
 
-       MT_Vector3 from(0., 0., 0.);
-       MT_Vector3 to(0., 0., 0.);
-       MT_Vector3 color(0., 0., 0.);
+       MT_Vector3 from;
+       MT_Vector3 to;
+       MT_Vector3 color;
        if (!PyVecTo(ob_from, from))
                return NULL;
        if (!PyVecTo(ob_to, to))
@@ -840,9 +840,9 @@ static struct PyMethodDef rasterizer_methods[] = {
    METH_VARARGS, "showMouse(bool visible)"},
    {"setMousePosition",(PyCFunction) gPySetMousePosition,
    METH_VARARGS, "setMousePosition(int x,int y)"},
-  {"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_VARARGS,"set Background Color (rgb)"},
-       {"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_VARARGS,"set Ambient Color (rgb)"},
- {"setMistColor",(PyCFunction)gPySetMistColor,METH_VARARGS,"set Mist Color (rgb)"},
+  {"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_O,"set Background Color (rgb)"},
+       {"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_O,"set Ambient Color (rgb)"},
+ {"setMistColor",(PyCFunction)gPySetMistColor,METH_O,"set Mist Color (rgb)"},
   {"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
   {"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
   {"enableMotionBlur",(PyCFunction)gPyEnableMotionBlur,METH_VARARGS,"enable motion blur"},
index 49babedd46783720a4c5c11d17da498f14e7e4da..7fcbf5b54bb5312a350ee8e9a1e77f1740876e93 100644 (file)
@@ -1512,9 +1512,9 @@ double KX_Scene::getSuspendedDelta()
 //Python
 
 PyMethodDef KX_Scene::Methods[] = {
-       KX_PYMETHODTABLE(KX_Scene, getLightList),
-       KX_PYMETHODTABLE(KX_Scene, getObjectList),
-       KX_PYMETHODTABLE(KX_Scene, getName),
+       KX_PYMETHODTABLE_NOARGS(KX_Scene, getLightList),
+       KX_PYMETHODTABLE_NOARGS(KX_Scene, getObjectList),
+       KX_PYMETHODTABLE_NOARGS(KX_Scene, getName),
        
        {NULL,NULL} //Sentinel
 };
@@ -1549,12 +1549,11 @@ PyObject* KX_Scene::_getattr(const char *attr)
        if (!strcmp(attr, "name"))
                return PyString_FromString(GetName());
        
+       if (!strcmp(attr, "objects"))
+               return (PyObject*) m_objectlist->AddRef();
+       
        if (!strcmp(attr, "active_camera"))
-       {
-               KX_Camera *camera = GetActiveCamera();
-               camera->AddRef();
-               return (PyObject*) camera;
-       }
+               return (PyObject*) GetActiveCamera()->AddRef();
        
        if (!strcmp(attr, "suspended"))
                return PyInt_FromLong(m_suspend);
@@ -1589,25 +1588,24 @@ int KX_Scene::_setattr(const char *attr, PyObject *pyvalue)
        return PyObjectPlus::_setattr(attr, pyvalue);
 }
 
-KX_PYMETHODDEF_DOC(KX_Scene, getLightList,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Scene, getLightList,
 "getLightList() -> list [KX_Light]\n"
 "Returns a list of all lights in the scene.\n"
 )
 {
-       m_lightlist->AddRef();
-       return (PyObject*) m_lightlist;
+       return (PyObject*) m_lightlist->AddRef();
 }
 
-KX_PYMETHODDEF_DOC(KX_Scene, getObjectList,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Scene, getObjectList,
 "getObjectList() -> list [KX_GameObject]\n"
 "Returns a list of all game objects in the scene.\n"
 )
 {
-       m_objectlist->AddRef();
-       return (PyObject*) m_objectlist;
+       // ShowDeprecationWarning("getObjectList()", "the objects property"); // XXX Grr, why doesnt this work?
+       return (PyObject*) m_objectlist->AddRef();
 }
 
-KX_PYMETHODDEF_DOC(KX_Scene, getName,
+KX_PYMETHODDEF_DOC_NOARGS(KX_Scene, getName,
 "getName() -> string\n"
 "Returns the name of the scene.\n"
 )
index ecc0fd51d73812f1124d017a34d350a1086b84b8..e4d4b6fe2cd03ed95c29954e2c125faf0d3a915d 100644 (file)
@@ -547,9 +547,9 @@ public:
         */
        void SetNodeTree(SG_Tree* root);
 
-       KX_PYMETHOD_DOC(KX_Scene, getLightList);
-       KX_PYMETHOD_DOC(KX_Scene, getObjectList);
-       KX_PYMETHOD_DOC(KX_Scene, getName);
+       KX_PYMETHOD_DOC_NOARGS(KX_Scene, getLightList);
+       KX_PYMETHOD_DOC_NOARGS(KX_Scene, getObjectList);
+       KX_PYMETHOD_DOC_NOARGS(KX_Scene, getName);
 /*     
        KX_PYMETHOD_DOC(KX_Scene, getActiveCamera);
        KX_PYMETHOD_DOC(KX_Scene, getActiveCamera);
index ab102ee547af9f0c6e381112e31550b3c75bce91..1c427768b66aa7ff40320b925cc8e33e65e55f02 100644 (file)
@@ -63,18 +63,18 @@ PyParentObject KX_VertexProxy::Parents[] = {
 };
 
 PyMethodDef KX_VertexProxy::Methods[] = {
-{"getXYZ", (PyCFunction)KX_VertexProxy::sPyGetXYZ,METH_VARARGS},
-{"setXYZ", (PyCFunction)KX_VertexProxy::sPySetXYZ,METH_VARARGS},
-{"getUV", (PyCFunction)KX_VertexProxy::sPyGetUV,METH_VARARGS},
-{"setUV", (PyCFunction)KX_VertexProxy::sPySetUV,METH_VARARGS},
+{"getXYZ", (PyCFunction)KX_VertexProxy::sPyGetXYZ,METH_NOARGS},
+{"setXYZ", (PyCFunction)KX_VertexProxy::sPySetXYZ,METH_O},
+{"getUV", (PyCFunction)KX_VertexProxy::sPyGetUV,METH_NOARGS},
+{"setUV", (PyCFunction)KX_VertexProxy::sPySetUV,METH_O},
 
-{"getUV2", (PyCFunction)KX_VertexProxy::sPyGetUV2,METH_VARARGS},
+{"getUV2", (PyCFunction)KX_VertexProxy::sPyGetUV2,METH_NOARGS},
 {"setUV2", (PyCFunction)KX_VertexProxy::sPySetUV2,METH_VARARGS},
 
-{"getRGBA", (PyCFunction)KX_VertexProxy::sPyGetRGBA,METH_VARARGS},
-{"setRGBA", (PyCFunction)KX_VertexProxy::sPySetRGBA,METH_VARARGS},
-{"getNormal", (PyCFunction)KX_VertexProxy::sPyGetNormal,METH_VARARGS},
-{"setNormal", (PyCFunction)KX_VertexProxy::sPySetNormal,METH_VARARGS},
+{"getRGBA", (PyCFunction)KX_VertexProxy::sPyGetRGBA,METH_NOARGS},
+{"setRGBA", (PyCFunction)KX_VertexProxy::sPySetRGBA,METH_O},
+{"getNormal", (PyCFunction)KX_VertexProxy::sPyGetNormal,METH_NOARGS},
+{"setNormal", (PyCFunction)KX_VertexProxy::sPySetNormal,METH_O},
   {NULL,NULL} //Sentinel
 };
 
@@ -312,130 +312,103 @@ void            KX_VertexProxy::ReplicaSetName(STR_String) {};
 
 // stuff for python integration
        
-PyObject* KX_VertexProxy::PyGetXYZ(PyObject*, 
-                              PyObject*, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PyGetXYZ(PyObject*)
 {
        return PyObjectFrom(MT_Point3(m_vertex->getXYZ()));
 }
 
-PyObject* KX_VertexProxy::PySetXYZ(PyObject*, 
-                              PyObject* args, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PySetXYZ(PyObject*, PyObject* value)
 {
        MT_Point3 vec;
-       if (PyVecArgTo(args, vec))
-       {
-               m_vertex->SetXYZ(vec);
-               m_mesh->SetMeshModified(true);
-               Py_RETURN_NONE;
-       }
-       
-       return NULL;
+       if (!PyVecTo(value, vec))
+               return NULL;
+               
+       m_vertex->SetXYZ(vec);
+       m_mesh->SetMeshModified(true);
+       Py_RETURN_NONE;
 }
 
-PyObject* KX_VertexProxy::PyGetNormal(PyObject*, 
-                              PyObject*, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PyGetNormal(PyObject*)
 {
        return PyObjectFrom(MT_Vector3(m_vertex->getNormal()));
 }
 
-PyObject* KX_VertexProxy::PySetNormal(PyObject*, 
-                              PyObject* args, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PySetNormal(PyObject*, PyObject* value)
 {
        MT_Vector3 vec;
-       if (PyVecArgTo(args, vec))
-       {
-               m_vertex->SetNormal(vec);
-               m_mesh->SetMeshModified(true);
-               Py_RETURN_NONE;
-       }
+       if (!PyVecTo(value, vec))
+               return NULL;
        
-       return NULL;
+       m_vertex->SetNormal(vec);
+       m_mesh->SetMeshModified(true);
+       Py_RETURN_NONE;
 }
 
 
-PyObject* KX_VertexProxy::PyGetRGBA(PyObject*,
-                              PyObject*, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PyGetRGBA(PyObject*)
 {
        int *rgba = (int *) m_vertex->getRGBA();
        return PyInt_FromLong(*rgba);
 }
 
-PyObject* KX_VertexProxy::PySetRGBA(PyObject*, 
-                              PyObject* args, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PySetRGBA(PyObject*, PyObject* value)
 {
-       float r, g, b, a;
-       if (PyArg_ParseTuple(args, "(ffff)", &r, &g, &b, &a))
-       {
-               m_vertex->SetRGBA(MT_Vector4(r, g, b, a));
-               m_mesh->SetMeshModified(true);
-               Py_RETURN_NONE;
-       }
-       PyErr_Clear();
-       
-       int rgba;
-       if (PyArg_ParseTuple(args,"i",&rgba))
-       {
+       if PyInt_Check(value) {
+               int rgba = PyInt_AsLong(value);
                m_vertex->SetRGBA(rgba);
                m_mesh->SetMeshModified(true);
                Py_RETURN_NONE;
        }
+       else {  
+               MT_Vector4 vec;
+               if (PyVecTo(value, vec))
+               {
+                       m_vertex->SetRGBA(vec);
+                       m_mesh->SetMeshModified(true);
+                       Py_RETURN_NONE;
+               }
+       }
        
+       PyErr_SetString(PyExc_TypeError, "expected a 4D vector or an int");
        return NULL;
 }
 
 
-PyObject* KX_VertexProxy::PyGetUV(PyObject*, 
-                              PyObject*, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PyGetUV(PyObject*)
 {
        return PyObjectFrom(MT_Vector2(m_vertex->getUV1()));
 }
 
-PyObject* KX_VertexProxy::PySetUV(PyObject*, 
-                              PyObject* args, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PySetUV(PyObject*, PyObject* value)
 {
        MT_Point2 vec;
-       if (PyVecArgTo(args, vec))
-       {
-               m_vertex->SetUV(vec);
-               m_mesh->SetMeshModified(true);
-               Py_RETURN_NONE;
-       }
+       if (!PyVecTo(value, vec))
+               return NULL;
        
-       return NULL;
+       m_vertex->SetUV(vec);
+       m_mesh->SetMeshModified(true);
+       Py_RETURN_NONE;
 }
 
-PyObject* KX_VertexProxy::PyGetUV2(PyObject*, 
-                              PyObject*, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PyGetUV2(PyObject*)
 {
        return PyObjectFrom(MT_Vector2(m_vertex->getUV2()));
 }
 
-PyObject* KX_VertexProxy::PySetUV2(PyObject*, 
-                              PyObject* args, 
-                              PyObject*)
+PyObject* KX_VertexProxy::PySetUV2(PyObject*, PyObject* args)
 {
        MT_Point2 vec;
        unsigned int unit=0;
-       PyObject* list=0;
-       if(PyArg_ParseTuple(args, "Oi", &list, &unit))
-       {
-               if (PyVecTo(list, vec))
-               {
-                       m_vertex->SetFlag((m_vertex->getFlag()|RAS_TexVert::SECOND_UV));
-                       m_vertex->SetUnit(unit);
-                       m_vertex->SetUV2(vec);
-                       m_mesh->SetMeshModified(true);
-                       Py_RETURN_NONE;
-               }
-       }
-       return NULL;
+       PyObject* list= NULL;
+       if(!PyArg_ParseTuple(args, "Oi:setUV2", &list, &unit))
+               return NULL;
+       
+       if (!PyVecTo(list, vec))
+               return NULL;
+       
+       m_vertex->SetFlag((m_vertex->getFlag()|RAS_TexVert::SECOND_UV));
+       m_vertex->SetUnit(unit);
+       m_vertex->SetUV2(vec);
+       m_mesh->SetMeshModified(true);
+       Py_RETURN_NONE;
 }
index 72949268e6d10e70a82dc22ced185ad32632d1b9..2819607590460e9e753090aa3d2525b1a90d7229 100644 (file)
@@ -57,18 +57,18 @@ public:
        virtual PyObject* _getattr(const char *attr);
        virtual int    _setattr(const char *attr, PyObject *pyvalue);
 
-       KX_PYMETHOD(KX_VertexProxy,GetXYZ);
-       KX_PYMETHOD(KX_VertexProxy,SetXYZ);
-       KX_PYMETHOD(KX_VertexProxy,GetUV);
-       KX_PYMETHOD(KX_VertexProxy,SetUV);
+       KX_PYMETHOD_NOARGS(KX_VertexProxy,GetXYZ);
+       KX_PYMETHOD_O(KX_VertexProxy,SetXYZ);
+       KX_PYMETHOD_NOARGS(KX_VertexProxy,GetUV);
+       KX_PYMETHOD_O(KX_VertexProxy,SetUV);
        
-       KX_PYMETHOD(KX_VertexProxy,GetUV2);
-       KX_PYMETHOD(KX_VertexProxy,SetUV2);
+       KX_PYMETHOD_NOARGS(KX_VertexProxy,GetUV2);
+       KX_PYMETHOD_VARARGS(KX_VertexProxy,SetUV2);
 
-       KX_PYMETHOD(KX_VertexProxy,GetRGBA);
-       KX_PYMETHOD(KX_VertexProxy,SetRGBA);
-       KX_PYMETHOD(KX_VertexProxy,GetNormal);
-       KX_PYMETHOD(KX_VertexProxy,SetNormal);
+       KX_PYMETHOD_NOARGS(KX_VertexProxy,GetRGBA);
+       KX_PYMETHOD_O(KX_VertexProxy,SetRGBA);
+       KX_PYMETHOD_NOARGS(KX_VertexProxy,GetNormal);
+       KX_PYMETHOD_O(KX_VertexProxy,SetNormal);
 
 };