[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