[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19126] trunk/blender/source/gameengine: Py BGE API
Campbell Barton
ideasman42 at gmail.com
Thu Feb 26 10:05:07 CET 2009
Revision: 19126
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19126
Author: campbellbarton
Date: 2009-02-26 10:04:06 +0100 (Thu, 26 Feb 2009)
Log Message:
-----------
Py BGE API
Python dir(ob) for game types now includes attributes names,
* Use "__dict__" rather then "__methods__" attribute to be Python 3.0 compatible
* Added _getattr_dict() for getting the method and attribute names from a PyObject, rather then building it in the macro.
* Added place holder *::Attribute array, needed for the _getattr_up macro.
Modified Paths:
--------------
trunk/blender/source/gameengine/Expressions/ListValue.cpp
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/GameLogic/SCA_2DFilterActuator.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp
trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp
trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
trunk/blender/source/gameengine/Ketsji/KX_CDActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_NearSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_StateActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -232,8 +232,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef CListValue::Attributes[] = {
+ { NULL } //Sentinel
+};
-
PyObject* CListValue::_getattr(const char *attr) {
_getattr_up(CValue);
}
Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -707,5 +707,35 @@
Py_RETURN_FALSE;
}
+/* Utility function called by the macro _getattr_up()
+ * for getting ob.__dict__() values from our PyObject
+ * this is used by python for doing dir() on an object, so its good
+ * if we return a list of attributes and methods.
+ *
+ * Other then making dir() useful the value returned from __dict__() is not useful
+ * since every value is a Py_None
+ * */
+PyObject *_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef)
+{
+ if(pydict==NULL) { /* incase calling __dict__ on the parent of this object raised an error */
+ PyErr_Clear();
+ pydict = PyDict_New();
+ }
+
+ if(meth) {
+ for (; meth->ml_name != NULL; meth++) {
+ PyDict_SetItemString(pydict, meth->ml_name, Py_None);
+ }
+ }
+
+ if(attrdef) {
+ for (; attrdef->m_name != NULL; attrdef++) {
+ PyDict_SetItemString(pydict, attrdef->m_name, Py_None);
+ }
+ }
+
+ return pydict;
+}
+
#endif //NO_EXP_PYTHON_EMBEDDING
Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.h 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.h 2009-02-26 09:04:06 UTC (rev 19126)
@@ -89,36 +89,23 @@
virtual PyParentObject *GetParents(void) {return Parents;}
+
// This defines the _getattr_up macro
// which allows attribute and method calls
// to be properly passed up the hierarchy.
#define _getattr_up(Parent) \
- PyObject *rvalue = NULL; \
- if (!strcmp(attr, "__methods__")) { \
- PyObject *_attr_string = NULL; \
- PyMethodDef *meth = Methods; \
- rvalue = Parent::_getattr(attr); \
- if (rvalue==NULL) { \
- PyErr_Clear(); \
- rvalue = PyList_New(0); \
- } \
- if (meth) { \
- for (; meth->ml_name != NULL; meth++) { \
- _attr_string = PyString_FromString(meth->ml_name); \
- PyList_Append(rvalue, _attr_string); \
- Py_DECREF(_attr_string); \
- } \
+ PyObject *rvalue = Py_FindMethod(Methods, this, attr); \
+ \
+ if (rvalue == NULL) { \
+ PyErr_Clear(); \
+ rvalue = Parent::_getattr(attr); \
} \
- } else { \
- rvalue = Py_FindMethod(Methods, this, attr); \
- if (rvalue == NULL) { \
- PyErr_Clear(); \
- rvalue = Parent::_getattr(attr); \
- } \
- } \
- return rvalue; \
+ if ((rvalue == NULL) && !strcmp(attr, "__dict__")) {\
+ PyErr_Clear(); \
+ rvalue = _getattr_dict(Parent::_getattr(attr), Methods, Attributes); \
+ } \
+ return rvalue; \
-
/**
* These macros are helpfull when embedding Python routines. The second
* macro is one that also requires a documentation string
@@ -398,6 +385,8 @@
}
};
+PyObject *_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef);
+
#endif // _adr_py_lib_h_
#endif //NO_EXP_PYTHON_EMBEDDING
Modified: trunk/blender/source/gameengine/Expressions/Value.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/Value.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/Expressions/Value.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -673,7 +673,11 @@
{ NULL,NULL} // Sentinel
};
+PyAttributeDef CValue::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* CValue::_getattr(const char *attr)
{
CValue* resultattr = FindIdentifier(STR_String(attr));
Modified: trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -113,6 +113,9 @@
{NULL,NULL}
};
+PyAttributeDef SCA_2DFilterActuator::Attributes[] = {
+ { NULL } //Sentinel
+};
PyObject* SCA_2DFilterActuator::_getattr(const char *attr) {
_getattr_up(SCA_IActuator);
Modified: trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -137,6 +137,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_ANDController::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* SCA_ANDController::_getattr(const char *attr) {
_getattr_up(SCA_IController);
}
Modified: trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -135,6 +135,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_AlwaysSensor::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* SCA_AlwaysSensor::_getattr(const char *attr) {
_getattr_up(SCA_ISensor);
}
Modified: trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -407,6 +407,9 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_IObject::Attributes[] = {
+ { NULL } //Sentinel
+};
PyObject* SCA_IObject::_getattr(const char *attr) {
Modified: trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -137,6 +137,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_NANDController::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* SCA_NANDController::_getattr(const char *attr) {
_getattr_up(SCA_IController);
}
Modified: trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -137,6 +137,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_NORController::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* SCA_NORController::_getattr(const char *attr) {
_getattr_up(SCA_IController);
}
Modified: trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -129,6 +129,11 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_ORController::Attributes[] = {
+ { NULL } //Sentinel
+};
+
+
PyObject* SCA_ORController::_getattr(const char *attr) {
_getattr_up(SCA_IController);
}
Modified: trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -264,6 +264,9 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_PythonController::Attributes[] = {
+ { NULL } //Sentinel
+};
bool SCA_PythonController::Compile()
{
Modified: trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -141,6 +141,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_XNORController::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* SCA_XNORController::_getattr(const char *attr) {
_getattr_up(SCA_IController);
}
Modified: trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -141,6 +141,10 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef SCA_XORController::Attributes[] = {
+ { NULL } //Sentinel
+};
+
PyObject* SCA_XORController::_getattr(const char *attr) {
_getattr_up(SCA_IController);
}
Modified: trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp 2009-02-26 05:50:19 UTC (rev 19125)
+++ trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp 2009-02-26 09:04:06 UTC (rev 19126)
@@ -767,6 +767,9 @@
{NULL,NULL} //Sentinel
};
+PyAttributeDef BL_Shader::Attributes[] = {
+ { NULL } //Sentinel
+};
PyTypeObject BL_Shader::Type = {
PyObject_HEAD_INIT(&PyType_Type)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list