[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20124] trunk/blender/source/gameengine: deprecate controller.getActuator(name) and controller.getSensor(name) for

Campbell Barton ideasman42 at gmail.com
Sun May 10 03:48:21 CEST 2009


Revision: 20124
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20124
Author:   campbellbarton
Date:     2009-05-10 03:48:14 +0200 (Sun, 10 May 2009)

Log Message:
-----------
deprecate controller.getActuator(name) and controller.getSensor(name) for
controller.actuators[name] and controller.sensors[name]

Made a read-only sequence type for logic brick sensors and actuators which can access single items or be used like a list or dictionary.
We could use a python dictionary or CValueList but that would be slower to create.

So you can do...
 for s in controller.sensors: print s

 print controller.sensors["Sensor"]

 print controller.sensors[0]

 sensors = list(controller.sensors)

This sequence type keeps a reference to the proxy it came from and will raise an error on access if the proxy has been removed.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/PyDoc/KX_GameObject.py
    trunk/blender/source/gameengine/PyDoc/SCA_IController.py

Added Paths:
-----------
    trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.h

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-05-09 21:54:22 UTC (rev 20123)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-05-10 01:48:14 UTC (rev 20124)
@@ -981,6 +981,5 @@
 void			PyObjectPlus::SetDeprecationWarningLinkLast(WarnLink* wlink) {m_base_wlink_last= wlink;}
 void			PyObjectPlus::NullDeprecationWarning() {m_base_wlink_first= m_base_wlink_last= NULL;}
 
-
 #endif //NO_EXP_PYTHON_EMBEDDING
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp	2009-05-09 21:54:22 UTC (rev 20123)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp	2009-05-10 01:48:14 UTC (rev 20124)
@@ -31,6 +31,7 @@
 #include "SCA_IActuator.h"
 #include "SCA_ISensor.h"
 #include "PyObjectPlus.h"
+#include "../Ketsji/KX_PythonSeq.h" /* not nice, only need for KX_PythonSeq_CreatePyObject */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -241,10 +242,9 @@
 };
 
 PyMethodDef SCA_IController::Methods[] = {
-	{"getActuator", (PyCFunction) SCA_IController::sPyGetActuator, METH_O},
-	{"getSensor", (PyCFunction) SCA_IController::sPyGetSensor, METH_O},
-	
 	//Deprecated functions ------>
+	{"getSensor", (PyCFunction) SCA_IController::sPyGetSensor, METH_O},
+	{"getActuator", (PyCFunction) SCA_IController::sPyGetActuator, METH_O},
 	{"getSensors", (PyCFunction) SCA_IController::sPyGetSensors, METH_NOARGS},
 	{"getActuators", (PyCFunction) SCA_IController::sPyGetActuators, METH_NOARGS},
 	{"getState", (PyCFunction) SCA_IController::sPyGetState, METH_NOARGS},
@@ -290,7 +290,8 @@
 
 PyObject* SCA_IController::PyGetSensor(PyObject* value)
 {
-
+	ShowDeprecationWarning("getSensor(string)", "the sensors[string] property");
+	
 	char *scriptArg = PyString_AsString(value);
 	if (scriptArg==NULL) {
 		PyErr_SetString(PyExc_TypeError, "controller.getSensor(string): Python Controller, expected a string (sensor name)");
@@ -313,7 +314,8 @@
 
 PyObject* SCA_IController::PyGetActuator(PyObject* value)
 {
-
+	ShowDeprecationWarning("getActuator(string)", "the actuators[string] property");
+	
 	char *scriptArg = PyString_AsString(value);
 	if (scriptArg==NULL) {
 		PyErr_SetString(PyExc_TypeError, "controller.getActuator(string): Python Controller, expected a string (actuator name)");
@@ -360,24 +362,10 @@
 
 PyObject* SCA_IController::pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
-	SCA_IController* self= static_cast<SCA_IController*>(self_v);
-	vector<SCA_ISensor*> linkedsensors = self->GetLinkedSensors();
-	PyObject* resultlist = PyList_New(linkedsensors.size());
-	
-	for (unsigned int index=0;index<linkedsensors.size();index++)
-		PyList_SET_ITEM(resultlist,index, linkedsensors[index]->GetProxy());
-	
-	return resultlist;
+	return KX_PythonSeq_CreatePyObject((static_cast<SCA_IController*>(self_v))->m_proxy, KX_PYGENSEQ_CONT_TYPE_SENSORS);	
 }
 
 PyObject* SCA_IController::pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
-	SCA_IController* self= static_cast<SCA_IController*>(self_v);
-	vector<SCA_IActuator*> linkedactuators = self->GetLinkedActuators();
-	PyObject* resultlist = PyList_New(linkedactuators.size());
-	
-	for (unsigned int index=0;index<linkedactuators.size();index++)
-		PyList_SET_ITEM(resultlist,index, linkedactuators[index]->GetProxy());
-
-	return resultlist;
+	return KX_PythonSeq_CreatePyObject((static_cast<SCA_IController*>(self_v))->m_proxy, KX_PYGENSEQ_CONT_TYPE_ACTUATORS);	
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-05-09 21:54:22 UTC (rev 20123)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-05-10 01:48:14 UTC (rev 20124)
@@ -63,6 +63,7 @@
 #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"
@@ -1735,38 +1736,17 @@
 /* experemental! */
 PyObject* KX_GameObject::pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
-	KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
-	SCA_SensorList& sensors= self->GetSensors();
-	PyObject* resultlist = PyList_New(sensors.size());
-	
-	for (unsigned int index=0;index<sensors.size();index++)
-		PyList_SET_ITEM(resultlist, index, sensors[index]->GetProxy());
-	
-	return resultlist;
+	return KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_SENSORS);
 }
 
 PyObject* KX_GameObject::pyattr_get_controllers(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
-	KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
-	SCA_ControllerList& controllers= self->GetControllers();
-	PyObject* resultlist = PyList_New(controllers.size());
-	
-	for (unsigned int index=0;index<controllers.size();index++)
-		PyList_SET_ITEM(resultlist, index, controllers[index]->GetProxy());
-	
-	return resultlist;
+	return KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_CONTROLLERS);
 }
 
 PyObject* KX_GameObject::pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
-	KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
-	SCA_ActuatorList& actuators= self->GetActuators();
-	PyObject* resultlist = PyList_New(actuators.size());
-	
-	for (unsigned int index=0;index<actuators.size();index++)
-		PyList_SET_ITEM(resultlist, index, actuators[index]->GetProxy());
-	
-	return resultlist;
+	return KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_ACTUATORS);
 }
 
 PyObject* KX_GameObject::pyattr_get_attrDict(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)

Added: trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp	                        (rev 0)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp	2009-05-10 01:48:14 UTC (rev 20124)
@@ -0,0 +1,384 @@
+/**
+ * $Id: 
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 *****
+ * Readonly sequence wrapper for lookups on logic bricks
+ */
+
+
+#include "KX_PythonSeq.h"
+#include "KX_GameObject.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_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 void KX_PythonSeq_dealloc( KX_PythonSeq * self )
+{
+	Py_DECREF(self->base);
+	PyObject_DEL( self );
+}
+
+static int KX_PythonSeq_len( KX_PythonSeq * self )
+{
+	PyObjectPlus *self_plus= BGE_PROXY_REF(self->base);
+	 
+	if(self_plus==NULL) {
+		PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+		return -1;
+	}
+	
+	switch(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();
+	default:
+		/* Should never happen */
+		PyErr_SetString(PyExc_SystemError, "invalid type, internal error");
+		return -1;
+	}
+}
+
+static PyObject *KX_PythonSeq_getIndex(KX_PythonSeq * self, int index)
+{
+	PyObjectPlus *self_plus= BGE_PROXY_REF(self->base);
+	 
+	if(self_plus==NULL) {
+		PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+		NULL;
+	}
+	
+	switch(self->type) {
+		case KX_PYGENSEQ_CONT_TYPE_SENSORS:
+		{
+			vector<SCA_ISensor*> linkedsensors = ((SCA_IController *)self_plus)->GetLinkedSensors();
+			SCA_ISensor* sensor;
+			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();
+			SCA_IActuator* sensor;
+			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();
+			SCA_ISensor *sensor;
+			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:
+		{

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list