Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPorteries Tristan <republicthunderbolt9@gmail.com>2015-10-26 22:27:08 +0300
committerPorteries Tristan <republicthunderbolt9@gmail.com>2015-10-26 22:27:08 +0300
commit95164a09a73b5f72cfb21abfe608dfd0873b7706 (patch)
tree440302a0ada2776edb2b27c7830633e984669d82 /source/gameengine/Ketsji
parent5b3af3dd46307fcf5389f1ede9cfb9da77b120a4 (diff)
BGE: generic python callback list + replace KX_PythonSeq.
I made this patch to declared a python list without converting all elements in python object (too slow) or use a CListValue which required CValue items (too expensive in memory). In the case of a big list of points like a collision contacts points list, to use a CListValue we must implement a new class based on CValue for 3D vector to create a python proxy even if mathutils do it perfectly, we must also convert all points (frequently ~100 points) when fill the CListValue even if the list is not used (in the case of the collision callback). The easy way is to use callback (it doesn't worth to do an inheritance) which convert the item in PyObject only during an acces. 5 callbacks are used : - Check if the list is valid = allow acces (like PyObjectPlus.invalid) - Get the list size - Get an item in the list by index. - Get an item name in the list by index (used for operator `list["name"]`) - Set an item in the list at the index position. All of these callback take as first argument the client instance. Why do we use a void * for the client instance ? : In KX_PythonInitTypes.cpp we have to initialize each python inherited class, if we use a template (the only other way) we must add this class each time we use a new type with in KX_PythonInitTypes.cpp To check if the list can be accessed from python by the user, we check if the python proxy, which is the `m_base` member, is still a valid proxy like in PyObjectPlus. But we can use a callback for more control of user access (e.g a list of collision point invalidate a frame later, in this case no real python owner). This python list is easily defined with : ``` CPythonCallBackList( void *client, // The client instance PyObject *base, // The python instance which owned this list, used to know if the list is valid (like in KX_PythonSeq) bool (*checkValid)(void *), // A callback to check if this list is till valid (optional) int (*getSize)(void *), // A callback to get size PyObject *(*getItem)(void *, int), // A callback to get an item const char *(*getItemName)(void *, int), // A callback to get an item name (optional) use for acces by string key bool (*setItem)(void *, int, PyObject *) // A callback to set an item (optional) ) ``` To show its usecase i replaced the odd KX_PythonSeq, it modify KX_Gameobject.sensors/controllers/actuators, SCA_IController.sensors/actuators and BL_ArmatureObject.constraints/channels. Example : {F245193}, See message in console, press R to erase the object and see invalid proxy error message. Reviewers: brita_, #game_python, youle, campbellbarton, moguri, agoose77, sergey Reviewed By: campbellbarton, moguri, agoose77, sergey Subscribers: sergey Projects: #game_engine Differential Revision: https://developer.blender.org/D1363
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt2
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp71
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp526
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.h68
5 files changed, 69 insertions, 605 deletions
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index 2607e2bb4b7..a5bdb2c7c5f 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -108,7 +108,6 @@ set(SRC
KX_PythonInit.cpp
KX_PythonInitTypes.cpp
KX_PythonMain.cpp
- KX_PythonSeq.cpp
KX_RadarSensor.cpp
KX_RayCast.cpp
KX_RayEventManager.cpp
@@ -188,7 +187,6 @@ set(SRC
KX_PythonInit.h
KX_PythonInitTypes.h
KX_PythonMain.h
- KX_PythonSeq.h
KX_RadarSensor.h
KX_RayCast.h
KX_RayEventManager.h
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 1dbcf14af89..974a2e56d16 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -55,7 +55,6 @@
#include "KX_RayCast.h"
#include "KX_PythonInit.h"
#include "KX_PyMath.h"
-#include "KX_PythonSeq.h"
#include "SCA_IActuator.h"
#include "SCA_ISensor.h"
#include "SCA_IController.h"
@@ -69,6 +68,7 @@
#include "BL_Action.h"
#include "EXP_PyObjectPlus.h" /* python stuff */
+#include "EXP_ListWrapper.h"
#include "BLI_utildefines.h"
#ifdef WITH_PYTHON
@@ -3057,20 +3057,83 @@ int KX_GameObject::pyattr_set_obcolor(void *self_v, const KX_PYATTRIBUTE_DEF *at
return PY_SET_ATTR_SUCCESS;
}
+static int kx_game_object_get_sensors_size_cb(void *self_v)
+{
+ return ((KX_GameObject *)self_v)->GetSensors().size();
+}
+
+static PyObject *kx_game_object_get_sensors_item_cb(void *self_v, int index)
+{
+ return ((KX_GameObject *)self_v)->GetSensors()[index]->GetProxy();
+}
+
+static const char *kx_game_object_get_sensors_item_name_cb(void *self_v, int index)
+{
+ return ((KX_GameObject *)self_v)->GetSensors()[index]->GetName().ReadPtr();
+}
+
/* These are experimental! */
PyObject *KX_GameObject::pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- return KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_SENSORS);
+ return (new CListWrapper(self_v,
+ ((KX_GameObject *)self_v)->GetProxy(),
+ NULL,
+ kx_game_object_get_sensors_size_cb,
+ kx_game_object_get_sensors_item_cb,
+ kx_game_object_get_sensors_item_name_cb,
+ NULL))->NewProxy(true);
+}
+
+static int kx_game_object_get_controllers_size_cb(void *self_v)
+{
+ return ((KX_GameObject *)self_v)->GetControllers().size();
+}
+
+static PyObject *kx_game_object_get_controllers_item_cb(void *self_v, int index)
+{
+ return ((KX_GameObject *)self_v)->GetControllers()[index]->GetProxy();
+}
+
+static const char *kx_game_object_get_controllers_item_name_cb(void *self_v, int index)
+{
+ return ((KX_GameObject *)self_v)->GetControllers()[index]->GetName().ReadPtr();
}
PyObject *KX_GameObject::pyattr_get_controllers(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- return KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_CONTROLLERS);
+ return (new CListWrapper(self_v,
+ ((KX_GameObject *)self_v)->GetProxy(),
+ NULL,
+ kx_game_object_get_controllers_size_cb,
+ kx_game_object_get_controllers_item_cb,
+ kx_game_object_get_controllers_item_name_cb,
+ NULL))->NewProxy(true);
+}
+
+static int kx_game_object_get_actuators_size_cb(void *self_v)
+{
+ return ((KX_GameObject *)self_v)->GetActuators().size();
+}
+
+static PyObject *kx_game_object_get_actuators_item_cb(void *self_v, int index)
+{
+ return ((KX_GameObject *)self_v)->GetActuators()[index]->GetProxy();
+}
+
+static const char *kx_game_object_get_actuators_item_name_cb(void *self_v, int index)
+{
+ return ((KX_GameObject *)self_v)->GetActuators()[index]->GetName().ReadPtr();
}
PyObject *KX_GameObject::pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- return KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_ACTUATORS);
+ return (new CListWrapper(self_v,
+ ((KX_GameObject *)self_v)->GetProxy(),
+ NULL,
+ kx_game_object_get_actuators_size_cb,
+ kx_game_object_get_actuators_item_cb,
+ kx_game_object_get_actuators_item_name_cb,
+ NULL))->NewProxy(true);
}
/* End experimental */
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index ef6ad4712a5..a86cea58635 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -58,7 +58,6 @@
#include "KX_ObjectActuator.h"
#include "KX_ParentActuator.h"
#include "KX_PolyProxy.h"
-#include "KX_PythonSeq.h"
#include "KX_SCA_AddObjectActuator.h"
#include "KX_SCA_EndObjectActuator.h"
#include "KX_SCA_ReplaceMeshActuator.h"
@@ -99,6 +98,7 @@
#include "SCA_IController.h"
#include "KX_NavMeshObject.h"
#include "KX_MouseActuator.h"
+#include "EXP_ListWrapper.h"
static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr)
{
@@ -203,6 +203,7 @@ PyMODINIT_FUNC initGameTypesPythonBinding(void)
PyType_Ready_AttrPtr(dict, BL_ArmatureChannel, init_getset);
// PyType_Ready_Attr(dict, CPropValue, init_getset); // doesn't use Py_Header
PyType_Ready_Attr(dict, CListValue, init_getset);
+ PyType_Ready_Attr(dict, CListWrapper, init_getset);
PyType_Ready_Attr(dict, CValue, init_getset);
PyType_Ready_Attr(dict, KX_ArmatureSensor, init_getset);
PyType_Ready_Attr(dict, KX_BlenderMaterial, init_getset);
@@ -273,10 +274,6 @@ PyMODINIT_FUNC initGameTypesPythonBinding(void)
PyType_Ready_Attr(dict, SCA_PythonMouse, init_getset);
}
-
- /* Normal python type */
- PyType_Ready(&KX_PythonSeq_Type);
-
#ifdef USE_MATHUTILS
/* Init mathutils callbacks */
KX_GameObject_Mathutils_Callback_Init();
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp
deleted file mode 100644
index ab4f2c2d2c9..00000000000
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Contributor(s): Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- * Readonly sequence wrapper for lookups on logic bricks
- */
-
-/** \file gameengine/Ketsji/KX_PythonSeq.cpp
- * \ingroup ketsji
- */
-
-
-#ifdef WITH_PYTHON
-
-#include "KX_PythonSeq.h"
-#include "KX_GameObject.h"
-#include "BL_ArmatureObject.h"
-#include "SCA_ISensor.h"
-#include "SCA_IController.h"
-#include "SCA_IActuator.h"
-
-
-PyObject *KX_PythonSeq_CreatePyObject( PyObject *base, short type )
-{
- KX_PythonSeq *seq = PyObject_GC_New(KX_PythonSeq, &KX_PythonSeq_Type);
- seq->base = base;
- Py_INCREF(base); /* so we can always access to check if its valid */
- seq->type = type;
- seq->iter = -1; /* init */
- return (PyObject *)seq;
-}
-
-static int KX_PythonSeq_traverse(KX_PythonSeq *self, visitproc visit, void *arg)
-{
- Py_VISIT(self->base);
- return 0;
-}
-
-static int KX_PythonSeq_clear(KX_PythonSeq *self)
-{
- Py_CLEAR(self->base);
- return 0;
-}
-
-static void KX_PythonSeq_dealloc(KX_PythonSeq *self)
-{
- KX_PythonSeq_clear(self);
- PyObject_GC_Del(self);
-}
-
-static Py_ssize_t KX_PythonSeq_len( PyObject *self )
-{
- PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
-
- if (self_plus==NULL) {
- PyErr_SetString(PyExc_SystemError, "len(seq): " BGE_PROXY_ERROR_MSG);
- return -1;
- }
-
- switch (((KX_PythonSeq *)self)->type) {
- case KX_PYGENSEQ_CONT_TYPE_SENSORS:
- return ((SCA_IController *)self_plus)->GetLinkedSensors().size();
- case KX_PYGENSEQ_CONT_TYPE_ACTUATORS:
- return ((SCA_IController *)self_plus)->GetLinkedActuators().size();
- case KX_PYGENSEQ_OB_TYPE_SENSORS:
- return ((KX_GameObject *)self_plus)->GetSensors().size();
- case KX_PYGENSEQ_OB_TYPE_CONTROLLERS:
- return ((KX_GameObject *)self_plus)->GetControllers().size();
- case KX_PYGENSEQ_OB_TYPE_ACTUATORS:
- return ((KX_GameObject *)self_plus)->GetActuators().size();
- case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
- return ((BL_ArmatureObject *)self_plus)->GetConstraintNumber();
- case KX_PYGENSEQ_OB_TYPE_CHANNELS:
- return ((BL_ArmatureObject *)self_plus)->GetChannelNumber();
- default:
- /* Should never happen */
- PyErr_SetString(PyExc_SystemError, "invalid type, internal error");
- return -1;
- }
-}
-
-static PyObject *KX_PythonSeq_getIndex(PyObject *self, Py_ssize_t index)
-{
- PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
-
- if (self_plus==NULL) {
- PyErr_SetString(PyExc_SystemError, "val = seq[i]: " BGE_PROXY_ERROR_MSG);
- return NULL;
- }
-
- switch (((KX_PythonSeq *)self)->type) {
- case KX_PYGENSEQ_CONT_TYPE_SENSORS:
- {
- vector<SCA_ISensor*>& linkedsensors = ((SCA_IController *)self_plus)->GetLinkedSensors();
- if (index<0) index += linkedsensors.size();
- if (index<0 || index>= linkedsensors.size()) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return linkedsensors[index]->GetProxy();
- }
- case KX_PYGENSEQ_CONT_TYPE_ACTUATORS:
- {
- vector<SCA_IActuator*>& linkedactuators = ((SCA_IController *)self_plus)->GetLinkedActuators();
- if (index<0) index += linkedactuators.size();
- if (index<0 || index>= linkedactuators.size()) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return linkedactuators[index]->GetProxy();
- }
- case KX_PYGENSEQ_OB_TYPE_SENSORS:
- {
- SCA_SensorList& linkedsensors= ((KX_GameObject *)self_plus)->GetSensors();
- if (index<0) index += linkedsensors.size();
- if (index<0 || index>= linkedsensors.size()) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return linkedsensors[index]->GetProxy();
- }
- case KX_PYGENSEQ_OB_TYPE_CONTROLLERS:
- {
- SCA_ControllerList& linkedcontrollers= ((KX_GameObject *)self_plus)->GetControllers();
- if (index<0) index += linkedcontrollers.size();
- if (index<0 || index>= linkedcontrollers.size()) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return linkedcontrollers[index]->GetProxy();
- }
- case KX_PYGENSEQ_OB_TYPE_ACTUATORS:
- {
- SCA_ActuatorList& linkedactuators= ((KX_GameObject *)self_plus)->GetActuators();
- if (index<0) index += linkedactuators.size();
- if (index<0 || index>= linkedactuators.size()) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return linkedactuators[index]->GetProxy();
- }
- case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
- {
- int nb_constraint = ((BL_ArmatureObject *)self_plus)->GetConstraintNumber();
- if (index<0)
- index += nb_constraint;
- if (index<0 || index>= nb_constraint) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return ((BL_ArmatureObject *)self_plus)->GetConstraint(index)->GetProxy();
- }
- case KX_PYGENSEQ_OB_TYPE_CHANNELS:
- {
- int nb_channel = ((BL_ArmatureObject *)self_plus)->GetChannelNumber();
- if (index<0)
- index += nb_channel;
- if (index<0 || index>= nb_channel) {
- PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
- return NULL;
- }
- return ((BL_ArmatureObject *)self_plus)->GetChannel(index)->GetProxy();
- }
-
- }
-
- PyErr_SetString(PyExc_SystemError, "invalid sequence type, this is a bug");
- return NULL;
-}
-
-static PyObjectPlus *KX_PythonSeq_subscript__internal(PyObject *self, const char *key)
-{
- PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
-
- switch (((KX_PythonSeq *)self)->type) {
- case KX_PYGENSEQ_CONT_TYPE_SENSORS:
- {
- vector<SCA_ISensor*>& linkedsensors = ((SCA_IController *)self_plus)->GetLinkedSensors();
- SCA_ISensor* sensor;
- for (unsigned int index=0;index<linkedsensors.size();index++) {
- sensor = linkedsensors[index];
- if (sensor->GetName() == key)
- return static_cast<PyObjectPlus *>(sensor);
-
- }
- break;
- }
- case KX_PYGENSEQ_CONT_TYPE_ACTUATORS:
- {
- vector<SCA_IActuator*>& linkedactuators = ((SCA_IController *)self_plus)->GetLinkedActuators();
- SCA_IActuator* actuator;
- for (unsigned int index=0;index<linkedactuators.size();index++) {
- actuator = linkedactuators[index];
- if (actuator->GetName() == key)
- return static_cast<PyObjectPlus *>(actuator);
- }
- break;
- }
- case KX_PYGENSEQ_OB_TYPE_SENSORS:
- {
- SCA_SensorList& linkedsensors= ((KX_GameObject *)self_plus)->GetSensors();
- SCA_ISensor *sensor;
- for (unsigned int index=0;index<linkedsensors.size();index++) {
- sensor= linkedsensors[index];
- if (sensor->GetName() == key)
- return static_cast<PyObjectPlus *>(sensor);
- }
- break;
- }
- case KX_PYGENSEQ_OB_TYPE_CONTROLLERS:
- {
- SCA_ControllerList& linkedcontrollers= ((KX_GameObject *)self_plus)->GetControllers();
- SCA_IController *controller;
- for (unsigned int index=0;index<linkedcontrollers.size();index++) {
- controller= linkedcontrollers[index];
- if (controller->GetName() == key)
- return static_cast<PyObjectPlus *>(controller);
- }
- break;
- }
- case KX_PYGENSEQ_OB_TYPE_ACTUATORS:
- {
- SCA_ActuatorList& linkedactuators= ((KX_GameObject *)self_plus)->GetActuators();
- SCA_IActuator *actuator;
- for (unsigned int index=0;index<linkedactuators.size();index++) {
- actuator= linkedactuators[index];
- if (actuator->GetName() == key)
- return static_cast<PyObjectPlus *>(actuator);
- }
- break;
- }
- case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
- {
- return ((BL_ArmatureObject*)self_plus)->GetConstraint(key);
- }
- case KX_PYGENSEQ_OB_TYPE_CHANNELS:
- {
- return ((BL_ArmatureObject*)self_plus)->GetChannel(key);
- }
- }
-
- return NULL;
-}
-
-
-static PyObject *KX_PythonSeq_subscript(PyObject *self, PyObject *key)
-{
- PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
-
- if (self_plus==NULL) {
- PyErr_SetString(PyExc_SystemError, "val = seq[key], KX_PythonSeq: " BGE_PROXY_ERROR_MSG);
- return NULL;
- }
-
- if (PyIndex_Check(key)) {
- return KX_PythonSeq_getIndex(self, PyLong_AsSsize_t(key));
- }
- else if ( PyUnicode_Check(key) ) {
- const char *name = _PyUnicode_AsString(key);
- PyObjectPlus *ret = KX_PythonSeq_subscript__internal(self, name);
-
- if (ret) {
- return ret->GetProxy();
- } else {
- PyErr_Format( PyExc_KeyError, "requested item \"%s\" does not exist", name);
- return NULL;
- }
- }
- else {
- PyErr_SetString( PyExc_TypeError, "expected a string or an index" );
- return NULL;
- }
-}
-
-
-static int KX_PythonSeq_contains(PyObject *self, PyObject *key)
-{
- PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
-
- if (self_plus==NULL) {
- PyErr_SetString(PyExc_SystemError, "key in seq, KX_PythonSeq: " BGE_PROXY_ERROR_MSG);
- return -1;
- }
- if (!PyUnicode_Check(key)) {
- PyErr_SetString(PyExc_SystemError, "key in seq, KX_PythonSeq: key must be a string");
- return -1;
- }
-
- if (KX_PythonSeq_subscript__internal(self, _PyUnicode_AsString(key)))
- return 1;
-
- return 0;
-}
-
-/* Matches python dict.get(key, [default]) */
-static PyObject *KX_PythonSeq_get(PyObject *self, PyObject *args)
-{
- char *key;
- PyObject *def = Py_None;
- PyObjectPlus* ret_plus;
-
- if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
- return NULL;
-
- if ((ret_plus = KX_PythonSeq_subscript__internal(self, key)))
- return ret_plus->GetProxy();
-
- Py_INCREF(def);
- return def;
-}
-
-static PySequenceMethods KX_PythonSeq_as_sequence = {
- NULL, /* Cant set the len otherwise it can evaluate as false */
- NULL, /* sq_concat */
- NULL, /* sq_repeat */
- NULL, /* sq_item */
- NULL, /* sq_slice */
- NULL, /* sq_ass_item */
- NULL, /* sq_ass_slice */
- (objobjproc)KX_PythonSeq_contains, /* sq_contains */
- (binaryfunc) NULL, /* sq_inplace_concat */
- (ssizeargfunc) NULL, /* sq_inplace_repeat */
-};
-
-static PyMappingMethods KX_PythonSeq_as_mapping = {
- KX_PythonSeq_len, /* mp_length */
- KX_PythonSeq_subscript, /* mp_subscript */
- 0, /* mp_ass_subscript */
-};
-
-static PyMethodDef KX_PythonSeq_methods[] = {
- // dict style access for props
- {"get",(PyCFunction) KX_PythonSeq_get, METH_VARARGS},
- {NULL,NULL} //Sentinel
-};
-
-/*
- * Initialize the iterator index
- */
-
-static PyObject *KX_PythonSeq_getIter(KX_PythonSeq *self)
-{
- if (BGE_PROXY_REF(self->base)==NULL) {
- PyErr_SetString(PyExc_SystemError, "for i in seq: " BGE_PROXY_ERROR_MSG);
- return NULL;
- }
-
- /* create a new iterator if were already using this one */
- if (self->iter == -1) {
- self->iter = 0;
- Py_INCREF(self);
- return (PyObject *)self;
- } else {
- return KX_PythonSeq_CreatePyObject(self->base, self->type);
- }
-}
-
-
-/*
- * Return next KX_PythonSeq iter.
- */
-
-static PyObject *KX_PythonSeq_nextIter(KX_PythonSeq *self)
-{
- PyObject *object = KX_PythonSeq_getIndex((PyObject *)self, self->iter);
-
- self->iter++;
- if ( object==NULL ) {
- self->iter= -1; /* for reuse */
- PyErr_SetNone(PyExc_StopIteration);
- }
- return object; /* can be NULL for end of iterator */
-}
-
-
-static int KX_PythonSeq_compare(KX_PythonSeq *a, KX_PythonSeq *b)
-{
- return (a->type == b->type && a->base == b->base) ? 0 : -1;
-}
-
-static PyObject *KX_PythonSeq_richcmp(PyObject *a, PyObject *b, int op)
-{
- PyObject *res;
- int ok= -1; /* zero is true */
-
- if (BPy_KX_PythonSeq_Check(a) && BPy_KX_PythonSeq_Check(b))
- ok= KX_PythonSeq_compare((KX_PythonSeq *)a, (KX_PythonSeq *)b);
-
- switch (op) {
- case Py_NE:
- ok = !ok;
- /* fall-through */
- case Py_EQ:
- res = ok ? Py_False : Py_True;
- break;
-
- case Py_LT:
- case Py_LE:
- case Py_GT:
- case Py_GE:
- res = Py_NotImplemented;
- break;
- default:
- PyErr_BadArgument();
- return NULL;
- }
-
- Py_INCREF(res);
- return res;
-}
-
-
-/*
- * repr function
- * convert to a list and get its string value
- */
-static PyObject *KX_PythonSeq_repr(KX_PythonSeq *self)
-{
- PyObject *list = PySequence_List((PyObject *)self);
- PyObject *repr = PyObject_Repr(list);
- Py_DECREF(list);
- return repr;
-}
-
-
-/*****************************************************************************/
-/* Python KX_PythonSeq_Type structure definition: */
-/*****************************************************************************/
-PyTypeObject KX_PythonSeq_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* For printing, in format "<module>.<name>" */
- "KX_PythonSeq", /* char *tp_name; */
- sizeof( KX_PythonSeq ), /* int tp_basicsize; */
- 0, /* tp_itemsize; For allocation */
-
- /* Methods to implement standard operations */
-
- ( destructor ) KX_PythonSeq_dealloc, /* destructor tp_dealloc; */
- NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
- NULL, /* cmpfunc tp_compare; */
- ( reprfunc ) KX_PythonSeq_repr, /* reprfunc tp_repr; */
-
- /* Method suites for standard classes */
-
- NULL, /* PyNumberMethods *tp_as_number; */
- &KX_PythonSeq_as_sequence, /* PySequenceMethods *tp_as_sequence; */
- &KX_PythonSeq_as_mapping, /* PyMappingMethods *tp_as_mapping; */
-
- /* More standard operations (here for binary compatibility) */
-
- NULL, /* hashfunc tp_hash; */
- NULL, /* ternaryfunc tp_call; */
- NULL, /* reprfunc tp_str; */
- NULL, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
-
- /* Functions to access object as input/output buffer */
- NULL, /* PyBufferProcs *tp_as_buffer; */
-
- /*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* long tp_flags; */
-
- NULL, /* char *tp_doc; Documentation string */
- /*** Assigned meaning in release 2.0 ***/
- /* call function for all accessible objects */
- (traverseproc)KX_PythonSeq_traverse, /* traverseproc tp_traverse; */
-
- /* delete references to contained objects */
- (inquiry)KX_PythonSeq_clear, /* inquiry tp_clear; */
-
- /*** Assigned meaning in release 2.1 ***/
- /*** rich comparisons ***/
- (richcmpfunc)KX_PythonSeq_richcmp, /* richcmpfunc tp_richcompare; */
-
- /*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
-
- /*** Added in release 2.2 ***/
- /* Iterators */
- ( getiterfunc) KX_PythonSeq_getIter, /* getiterfunc tp_iter; */
- ( iternextfunc ) KX_PythonSeq_nextIter, /* iternextfunc tp_iternext; */
-
- /*** Attribute descriptor and subclassing stuff ***/
- KX_PythonSeq_methods, /* struct PyMethodDef *tp_methods; */
- NULL, /* struct PyMemberDef *tp_members; */
- NULL, /* struct PyGetSetDef *tp_getset; */
- NULL, /* struct _typeobject *tp_base; */
- NULL, /* PyObject *tp_dict; */
- NULL, /* descrgetfunc tp_descr_get; */
- NULL, /* descrsetfunc tp_descr_set; */
- 0, /* long tp_dictoffset; */
- NULL, /* initproc tp_init; */
- NULL, /* allocfunc tp_alloc; */
- NULL, /* newfunc tp_new; */
- /* Low-level free-memory routine */
- NULL, /* freefunc tp_free; */
- /* For PyObject_IS_GC */
- NULL, /* inquiry tp_is_gc; */
- NULL, /* PyObject *tp_bases; */
- /* method resolution order */
- NULL, /* PyObject *tp_mro; */
- NULL, /* PyObject *tp_cache; */
- NULL, /* PyObject *tp_subclasses; */
- NULL, /* PyObject *tp_weaklist; */
- NULL
-};
-
-#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.h b/source/gameengine/Ketsji/KX_PythonSeq.h
deleted file mode 100644
index 33b5335ddf4..00000000000
--- a/source/gameengine/Ketsji/KX_PythonSeq.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file KX_PythonSeq.h
- * \ingroup ketsji
- * \brief Readonly sequence wrapper for lookups on logic bricks
- */
-
-#ifndef __KX_PYTHONSEQ_H__
-#define __KX_PYTHONSEQ_H__
-
-#ifdef WITH_PYTHON
-
-#include "EXP_PyObjectPlus.h"
-
-// -------------------------
-enum KX_PYGENSEQ_TYPE {
- KX_PYGENSEQ_CONT_TYPE_SENSORS,
- KX_PYGENSEQ_CONT_TYPE_ACTUATORS,
- KX_PYGENSEQ_OB_TYPE_SENSORS,
- KX_PYGENSEQ_OB_TYPE_CONTROLLERS,
- KX_PYGENSEQ_OB_TYPE_ACTUATORS,
- KX_PYGENSEQ_OB_TYPE_CONSTRAINTS,
- KX_PYGENSEQ_OB_TYPE_CHANNELS,
-};
-
-/* The Main PyType Object defined in Main.c */
-extern PyTypeObject KX_PythonSeq_Type;
-
-#define BPy_KX_PythonSeq_Check(obj) \
- (Py_TYPE(obj) == &KX_PythonSeq_Type)
-
-typedef struct {
- PyObject_VAR_HEAD
- PyObject *base;
- short type;
- short iter;
-} KX_PythonSeq;
-
-PyObject *KX_PythonSeq_CreatePyObject(PyObject *base, short type);
-
-#endif /* WITH_PYTHON */
-
-#endif /* __KX_PYTHONSEQ_H__ */