[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