[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19519] trunk/blender/source/gameengine: Python BGE API
Campbell Barton
ideasman42 at gmail.com
Fri Apr 3 16:51:07 CEST 2009
Revision: 19519
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19519
Author: campbellbarton
Date: 2009-04-03 16:51:06 +0200 (Fri, 03 Apr 2009)
Log Message:
-----------
Python BGE API
- Initialize python types with PyType_Ready, which adds methods to the type dictionary.
- use Pythons get/setattro (uses a python string for the attribute rather then char*). Using basic C strings seems nice but internally python converts them to python strings and discards them for most functions that accept char arrays.
- Method lookups use the PyTypes dictionary (should be faster then Py_FindMethod)
- Renamed __getattr -> py_base_getattro, _getattr -> py_getattro, __repr -> py_base_repr, py_delattro, py_getattro_self etc.
>From here is possible to put all the parent classes methods into each python types dictionary to avoid nested lookups (api has 4 levels of lookups in some places), tested this but its not ready yet.
Simple tests for getting a method within a loop show this to be between 0.5 and 3.2x faster then using Py_FindMethod()
Modified Paths:
--------------
trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp
trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h
trunk/blender/source/gameengine/Expressions/ListValue.cpp
trunk/blender/source/gameengine/Expressions/ListValue.h
trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
trunk/blender/source/gameengine/Expressions/Value.cpp
trunk/blender/source/gameengine/Expressions/Value.h
trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.h
trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ANDController.h
trunk/blender/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ActuatorSensor.h
trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.h
trunk/blender/source/gameengine/GameLogic/SCA_DelaySensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_DelaySensor.h
trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h
trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
trunk/blender/source/gameengine/GameLogic/SCA_IObject.h
trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h
trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.h
trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.h
trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_NANDController.h
trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_NORController.h
trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ORController.h
trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.h
trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_PythonController.h
trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp
trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.h
trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h
trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_XNORController.h
trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_XORController.h
trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
trunk/blender/source/gameengine/Ketsji/BL_Shader.h
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
trunk/blender/source/gameengine/Ketsji/KX_CDActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_CDActuator.h
trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
trunk/blender/source/gameengine/Ketsji/KX_Camera.h
trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp.bras
trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.h
trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.h
trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h
trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.h
trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
trunk/blender/source/gameengine/Ketsji/KX_Light.h
trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.h
trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h
trunk/blender/source/gameengine/Ketsji/KX_NearSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_NearSensor.h
trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.h
trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.h
trunk/blender/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
trunk/blender/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.h
trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h
trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.h
trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_RaySensor.h
trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
trunk/blender/source/gameengine/Ketsji/KX_Scene.h
trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.h
trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.h
trunk/blender/source/gameengine/Ketsji/KX_StateActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_StateActuator.h
trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.h
trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.h
trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.h
trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.h
trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h
Added Paths:
-----------
trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.h
Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp 2009-04-03 14:51:06 UTC (rev 19519)
@@ -965,18 +965,21 @@
/* ------------------------------------------------------------------------- */
PyTypeObject BL_ActionActuator::Type = {
- PyObject_HEAD_INIT(&PyType_Type)
+ PyObject_HEAD_INIT(NULL)
0,
"BL_ActionActuator",
sizeof(BL_ActionActuator),
0,
PyDestructor,
0,
- __getattr,
- __setattr,
0,
- __repr,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,
+ py_base_getattro,
+ py_base_setattro,
+ 0,0,0,0,0,0,0,0,0,
Methods
};
@@ -1032,17 +1035,20 @@
{ NULL } //Sentinel
};
-PyObject* BL_ActionActuator::_getattr(const char *attr) {
- if (!strcmp(attr, "action"))
+PyObject* BL_ActionActuator::py_getattro(PyObject *attr) {
+ char *attr_str= PyString_AsString(attr);
+ if (!strcmp(attr_str, "action"))
return PyString_FromString(m_action->id.name+2);
- PyObject* object = _getattr_self(Attributes, this, attr);
+
+ PyObject* object = py_getattro_self(Attributes, this, attr);
if (object != NULL)
return object;
- _getattr_up(SCA_IActuator);
+ py_getattro_up(SCA_IActuator);
}
-int BL_ActionActuator::_setattr(const char *attr, PyObject* value) {
- if (!strcmp(attr, "action"))
+int BL_ActionActuator::py_setattro(PyObject *attr, PyObject* value) {
+ char *attr_str= PyString_AsString(attr);
+ if (!strcmp(attr_str, "action"))
{
if (!PyString_Check(value))
{
@@ -1072,8 +1078,8 @@
m_action = action;
return 0;
}
- int ret = _setattr_self(Attributes, this, attr, value);
+ int ret = py_setattro_self(Attributes, this, attr, value);
if (ret >= 0)
return ret;
- return SCA_IActuator::_setattr(attr, value);
+ return SCA_IActuator::py_setattro(attr, value);
}
\ No newline at end of file
Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.h 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.h 2009-04-03 14:51:06 UTC (rev 19519)
@@ -110,8 +110,8 @@
KX_PYMETHOD_DOC(BL_ActionActuator,setChannel);
- virtual PyObject* _getattr(const char *attr);
- virtual int _setattr(const char *attr, PyObject* value);
+ virtual PyObject* py_getattro(PyObject* attr);
+ virtual int py_setattro(PyObject* attr, PyObject* value);
/* attribute check */
static int CheckFrame(void *self, const PyAttributeDef*)
Modified: trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp 2009-04-03 14:51:06 UTC (rev 19519)
@@ -420,18 +420,21 @@
/* Integration hooks ------------------------------------------------------- */
PyTypeObject BL_ShapeActionActuator::Type = {
- PyObject_HEAD_INIT(&PyType_Type)
+ PyObject_HEAD_INIT(NULL)
0,
"BL_ShapeActionActuator",
sizeof(BL_ShapeActionActuator),
0,
PyDestructor,
0,
- __getattr,
- __setattr,
- 0, //&MyPyCompare,
- __repr,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,
+ py_base_getattro,
+ py_base_setattro,
+ 0,0,0,0,0,0,0,0,0,
Methods
};
@@ -481,17 +484,19 @@
};
-PyObject* BL_ShapeActionActuator::_getattr(const char *attr) {
- if (!strcmp(attr, "action"))
+PyObject* BL_ShapeActionActuator::py_getattro(PyObject* attr) {
+ char *attr_str= PyString_AsString(attr);
+ if (!strcmp(attr_str, "action"))
return PyString_FromString(m_action->id.name+2);
- PyObject* object = _getattr_self(Attributes, this, attr);
+ PyObject* object = py_getattro_self(Attributes, this, attr);
if (object != NULL)
return object;
- _getattr_up(SCA_IActuator);
+ py_getattro_up(SCA_IActuator);
}
-int BL_ShapeActionActuator::_setattr(const char *attr, PyObject* value) {
- if (!strcmp(attr, "action"))
+int BL_ShapeActionActuator::py_setattro(PyObject *attr, PyObject* value) {
+ char *attr_str= PyString_AsString(attr);
+ if (!strcmp(attr_str, "action"))
{
if (!PyString_Check(value))
{
@@ -521,10 +526,10 @@
m_action = action;
return 0;
}
- int ret = _setattr_self(Attributes, this, attr, value);
+ int ret = py_setattro_self(Attributes, this, attr, value);
if (ret >= 0)
return ret;
- return SCA_IActuator::_setattr(attr, value);
+ return SCA_IActuator::py_setattro(attr, value);
}
/* setStart */
Modified: trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h 2009-04-03 14:51:06 UTC (rev 19519)
@@ -103,8 +103,8 @@
KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetType);
KX_PYMETHOD_DOC(BL_ShapeActionActuator,SetType);
- virtual PyObject* _getattr(const char *attr);
- virtual int _setattr(const char *attr, PyObject* value);
+ virtual PyObject* py_getattro(PyObject* attr);
+ virtual int py_setattro(PyObject* attr, PyObject* value);
static int CheckBlendTime(void *self, const PyAttributeDef*)
{
Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp 2009-04-03 14:51:06 UTC (rev 19519)
@@ -193,7 +193,7 @@
PyTypeObject CListValue::Type = {
- PyObject_HEAD_INIT(&PyType_Type)
+ PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"CListValue", /*tp_name*/
sizeof(CListValue), /*tp_basicsize*/
@@ -201,16 +201,19 @@
/* methods */
PyDestructor, /*tp_dealloc*/
0, /*tp_print*/
- __getattr, /*tp_getattr*/
- __setattr, /*tp_setattr*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
0, /*tp_compare*/
- __repr, /*tp_repr*/
+ py_base_repr, /*tp_repr*/
0, /*tp_as_number*/
&listvalue_as_sequence, /*tp_as_sequence*/
&instance_as_mapping, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call */
- 0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,
+ py_base_getattro,
+ py_base_setattro,
+ 0,0,0,0,0,0,0,0,0,
Methods
};
@@ -238,8 +241,8 @@
{ NULL } //Sentinel
};
-PyObject* CListValue::_getattr(const char *attr) {
- _getattr_up(CValue);
+PyObject* CListValue::py_getattro(PyObject* attr) {
+ py_getattro_up(CValue);
}
Modified: trunk/blender/source/gameengine/Expressions/ListValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.h 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Expressions/ListValue.h 2009-04-03 14:51:06 UTC (rev 19519)
@@ -59,7 +59,7 @@
bool CheckEqual(CValue* first,CValue* second);
- virtual PyObject* _getattr(const char *attr);
+ virtual PyObject* py_getattro(PyObject* attr);
KX_PYMETHOD_O(CListValue,append);
KX_PYMETHOD_NOARGS(CListValue,reverse);
Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp 2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp 2009-04-03 14:51:06 UTC (rev 19519)
@@ -55,19 +55,22 @@
------------------------------*/
PyTypeObject PyObjectPlus::Type = {
- PyObject_HEAD_INIT(&PyType_Type)
+ PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"PyObjectPlus", /*tp_name*/
sizeof(PyObjectPlus), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
- PyDestructor, /*tp_dealloc*/
- 0, /*tp_print*/
- __getattr, /*tp_getattr*/
- __setattr, /*tp_setattr*/
- 0, /*tp_compare*/
- __repr,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ PyDestructor,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,
+ py_base_getattro,
+ py_base_setattro,
+ 0,0,0,0,0,0,0,0,0,
Methods
};
@@ -103,37 +106,41 @@
/*------------------------------
* PyObjectPlus attributes -- attributes
------------------------------*/
-PyObject *PyObjectPlus::_getattr(const char *attr)
+PyObject *PyObjectPlus::py_getattro(PyObject* attr)
{
- if (!strcmp(attr, "__doc__") && GetType()->tp_doc)
- return PyString_FromString(GetType()->tp_doc);
-
+ PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
+ if (descr == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "attribute not found");
+ return NULL;
+ } else {
+ return PyCFunction_New(((PyMethodDescrObject *)descr)->d_method, (PyObject *)this); \
+ }
//if (streq(attr, "type"))
// return Py_BuildValue("s", (*(GetParents()))->tp_name);
-
- return Py_FindMethod(Methods, this, attr);
}
-int PyObjectPlus::_delattr(const char *attr)
+int PyObjectPlus::py_delattro(PyObject* attr)
{
PyErr_SetString(PyExc_AttributeError, "attribute cant be deleted");
return 1;
}
-int PyObjectPlus::_setattr(const char *attr, PyObject *value)
+int PyObjectPlus::py_setattro(PyObject *attr, PyObject* value)
{
- //return PyObject::_setattr(attr,value);
+ //return PyObject::py_setattro(attr,value);
//cerr << "Unknown attribute" << endl;
PyErr_SetString(PyExc_AttributeError, "attribute cant be set");
return 1;
}
-PyObject *PyObjectPlus::_getattr_self(const PyAttributeDef attrlist[], void *self, const char *attr)
+PyObject *PyObjectPlus::py_getattro_self(const PyAttributeDef attrlist[], void *self, PyObject *attr)
{
+ char *attr_str= PyString_AsString(attr);
+
const PyAttributeDef *attrdef;
for (attrdef=attrlist; attrdef->m_name != NULL; attrdef++)
{
- if (!strcmp(attr, attrdef->m_name))
+ if (!strcmp(attr_str, attrdef->m_name))
{
if (attrdef->m_type == KX_PYATTRIBUTE_TYPE_DUMMY)
{
@@ -242,16 +249,17 @@
return NULL;
}
-int PyObjectPlus::_setattr_self(const PyAttributeDef attrlist[], void *self, const char *attr, PyObject *value)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list