[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19668] trunk/blender/source/gameengine: BGE Py API

Campbell Barton ideasman42 at gmail.com
Sat Apr 11 22:58:09 CEST 2009


Revision: 19668
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19668
Author:   campbellbarton
Date:     2009-04-11 22:58:09 +0200 (Sat, 11 Apr 2009)

Log Message:
-----------
BGE Py API
- setting the scene attributes would always add to the scenes custom dictionary.
- new CListValue method from_id(id)

so you can store a Game Objects id and use it to get the game object back.

 ob_id = id(gameOb)
 ...
 gameOb = scene.objects.from_id(ob_id)
 
This is useful because names are not always unique.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Expressions/ListValue.h
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.h
    trunk/blender/source/gameengine/PyDoc/CListValue.py

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-04-11 19:04:59 UTC (rev 19667)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-04-11 20:58:09 UTC (rev 19668)
@@ -233,6 +233,7 @@
 	{"reverse", (PyCFunction)CListValue::sPyreverse,METH_NOARGS},
 	{"index", (PyCFunction)CListValue::sPyindex,METH_O},
 	{"count", (PyCFunction)CListValue::sPycount,METH_O},
+	{"from_id", (PyCFunction)CListValue::sPyfrom_id,METH_O},
 	
 	{NULL,NULL} //Sentinel
 };
@@ -502,6 +503,34 @@
 
 
 
+PyObject* CListValue::Pyfrom_id(PyObject* self, PyObject* value)
+{
+#if SIZEOF_VOID_P <= SIZEOF_LONG
+#define BGE_ID_TYPE unsigned long
+	BGE_ID_TYPE id= PyLong_AsUnsignedLong(value);
+#else
+#define BGE_ID_TYPE unsigned long long
+	BGE_ID_TYPE id= PyLong_FromUnsignedLongLong(value);
+#endif
+	
+	if (id==-1 && PyErr_Occurred())
+		return NULL;
+
+	int numelem = GetCount();
+	for (int i=0;i<numelem;i++)
+	{
+		if (reinterpret_cast<BGE_ID_TYPE>(static_cast<PyObject*>(m_pValueArray[i])) == id)
+			return GetValue(i);
+	
+	}
+	PyErr_SetString(PyExc_IndexError, "from_id(#), id not found in CValueList");
+	return NULL;	
+
+}
+
+#undef BGE_ID_TYPE
+
+
 /* --------------------------------------------------------------------- 
  * Some stuff taken from the header
  * --------------------------------------------------------------------- */

Modified: trunk/blender/source/gameengine/Expressions/ListValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.h	2009-04-11 19:04:59 UTC (rev 19667)
+++ trunk/blender/source/gameengine/Expressions/ListValue.h	2009-04-11 20:58:09 UTC (rev 19668)
@@ -71,6 +71,7 @@
 	KX_PYMETHOD_NOARGS(CListValue,reverse);
 	KX_PYMETHOD_O(CListValue,index);
 	KX_PYMETHOD_O(CListValue,count);
+	KX_PYMETHOD_O(CListValue,from_id);
 
 	
 private:

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.h	2009-04-11 19:04:59 UTC (rev 19667)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.h	2009-04-11 20:58:09 UTC (rev 19668)
@@ -404,9 +404,9 @@
 //	  };				// decref method
 	
 	virtual PyObject *py_getattro(PyObject *attr);			// py_getattro method
-	static  PyObject *py_base_getattro(PyObject * PyObj, PyObject *attr) 	// This should be the entry in Type. 
+	static  PyObject *py_base_getattro(PyObject * self, PyObject *attr) 	// This should be the entry in Type. 
 	{
-		return ((PyObjectPlus*) PyObj)->py_getattro(attr); 
+		return ((PyObjectPlus*) self)->py_getattro(attr); 
 	}
 	
 	static PyObject*	py_get_attrdef(void *self, const PyAttributeDef *attrdef);
@@ -419,13 +419,12 @@
 	
 	virtual int py_delattro(PyObject *attr);
 	virtual int py_setattro(PyObject *attr, PyObject *value);		// py_setattro method
-	static  int py_base_setattro(PyObject *PyObj, 			// This should be the entry in Type. 
-				PyObject *attr, 
-				PyObject *value)
-	{ 
+	static  int py_base_setattro(PyObject *self, PyObject *attr, PyObject *value) // the PyType should reference this
+	{
 		if (value==NULL)
-			return ((PyObjectPlus*) PyObj)->py_delattro(attr);
-		return ((PyObjectPlus*) PyObj)->py_setattro(attr, value);  
+			return ((PyObjectPlus*) self)->py_delattro(attr);
+		
+		return ((PyObjectPlus*) self)->py_setattro(attr, value); 
 	}
 	
 	virtual PyObject *py_repr(void);				// py_repr method

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-04-11 19:04:59 UTC (rev 19667)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-04-11 20:58:09 UTC (rev 19668)
@@ -1588,7 +1588,7 @@
 		py_base_repr,
 		0,0,0,0,0,0,
 		py_base_getattro,
-		py_base_setattro,
+		py_base_setattro_scene,	/* unlike almost all other types we need out own because user attributes are supported */
 		0,0,0,0,0,0,0,0,0,
 		Methods
 };
@@ -1669,11 +1669,9 @@
 	return 0;
 }
 
+/* py_base_setattro_scene deals with setting the dict, it will run if this returns an error */
 int KX_Scene::py_setattro(PyObject *attr, PyObject *pyvalue)
 {
-	if (!PyDict_SetItem(m_attrlist, attr, pyvalue))
-		return 0;
-
 	return PyObjectPlus::py_setattro(attr, pyvalue);
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.h	2009-04-11 19:04:59 UTC (rev 19667)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.h	2009-04-11 20:58:09 UTC (rev 19668)
@@ -590,6 +590,27 @@
 	/* for dir(), python3 uses __dir__() */
 	static PyObject*	pyattr_get_dir_dict(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
 	
+	static int py_base_setattro_scene(PyObject * self, PyObject *attr, PyObject *value)
+	{
+		if (value==NULL)
+			return ((PyObjectPlus*) self)->py_delattro(attr);
+		
+		int ret= ((PyObjectPlus*) self)->py_setattro(attr, value);
+		
+		if (ret) {
+			if (!PyDict_SetItem(((KX_Scene *) self)->m_attrlist, attr, value)) {
+				PyErr_Clear();
+				ret= 0;
+			}
+			else {
+				ret= -1;
+			}
+		}
+		
+		return ret;
+	}
+	
+	
 
 	virtual PyObject* py_getattro(PyObject *attr); /* name, active_camera, gravity, suspended, viewport, framing, activity_culling, activity_culling_radius */
 	virtual int py_setattro(PyObject *attr, PyObject *pyvalue);

Modified: trunk/blender/source/gameengine/PyDoc/CListValue.py
===================================================================
--- trunk/blender/source/gameengine/PyDoc/CListValue.py	2009-04-11 19:04:59 UTC (rev 19667)
+++ trunk/blender/source/gameengine/PyDoc/CListValue.py	2009-04-11 20:58:09 UTC (rev 19668)
@@ -33,7 +33,27 @@
 		@rtype: integer
 		@return: The index of the value in the list.
 		"""
-	def reverse(val):
+	def reverse():
 		"""
 		Reverse the order of the list.
+		"""
+	def from_id(id):
+		"""
+		This is a funtion especially for the game engine to return a value with a spesific id.
+		
+		Since object names are not always unique, the id of an object can be used to get an object from the CValueList.
+		
+		Example.
+			
+		C{myObID = id(gameObject)}
+		
+		C{...}
+		
+		C{ob= scene.objects.from_id(myObID)}
+		
+		Where myObID is an int or long from the id function.
+		
+		This has the advantage that you can store the id in places you could not store a gameObject.
+		
+		Warning: the id is derived from a memory location and will be different each time the game engine starts.
 		"""
\ No newline at end of file





More information about the Bf-blender-cvs mailing list