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

Campbell Barton ideasman42 at gmail.com
Thu Feb 19 14:42:09 CET 2009


Revision: 19039
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19039
Author:   campbellbarton
Date:     2009-02-19 14:42:07 +0100 (Thu, 19 Feb 2009)

Log Message:
-----------
BGE Python API
Use 'const char *' rather then the C++ 'STR_String' type for the attribute identifier of python attributes.

Each attribute and method access from python was allocating and freeing the string.
A simple test with getting an attribute a loop shows this speeds up attribute lookups a bit over 2x.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp
    trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Expressions/ListValue.h
    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/Expressions/Value.h
    trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.h
    trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ANDController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ActuatorSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_DelaySensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_DelaySensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.h
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_NANDController.h
    trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_NORController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ORController.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_XNORController.h
    trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_XORController.h
    trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Shader.h
    trunk/blender/source/gameengine/Ketsji/BL_Texture.cpp
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_CDActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CDActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.h
    trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.h
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_NearSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_NearSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_RaySensor.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.h
    trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_StateActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_StateActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp	2009-02-19 13:42:07 UTC (rev 19039)
@@ -1035,8 +1035,8 @@
 	{ NULL }	//Sentinel
 };
 
-PyObject* BL_ActionActuator::_getattr(const STR_String& attr) {
-	if (attr == "action")
+PyObject* BL_ActionActuator::_getattr(const char *attr) {
+	if (!strcmp(attr, "action"))
 		return PyString_FromString(m_action->id.name+2);
 	PyObject* object = _getattr_self(Attributes, this, attr);
 	if (object != NULL)
@@ -1044,8 +1044,8 @@
 	_getattr_up(SCA_IActuator);
 }
 
-int BL_ActionActuator::_setattr(const STR_String& attr, PyObject* value) {
-	if (attr == "action")
+int BL_ActionActuator::_setattr(const char *attr, PyObject* value) {
+	if (!strcmp(attr, "action"))
 	{
 		if (!PyString_Check(value))
 		{

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.h	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.h	2009-02-19 13:42:07 UTC (rev 19039)
@@ -110,8 +110,8 @@
 
 	KX_PYMETHOD_DOC(BL_ActionActuator,setChannel);
 
-	virtual PyObject* _getattr(const STR_String& attr);
-	virtual int _setattr(const STR_String& attr, PyObject* value);
+	virtual PyObject* _getattr(const char *attr);
+	virtual int _setattr(const char *attr, PyObject* value);
 
 	/* attribute check */
 	static int CheckFrame(void *self, const PyAttributeDef*)

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-02-19 13:42:07 UTC (rev 19039)
@@ -361,7 +361,7 @@
 			facetex = true;
 		if(validface && mat->mtex[0]) {
 			MTex *tmp = mat->mtex[0];
-			if(!tmp->tex || tmp->tex && !tmp->tex->ima )
+			if(!tmp->tex || (tmp->tex && !tmp->tex->ima))
 				facetex = true;
 		}
 		numchan = numchan>MAXTEX?MAXTEX:numchan;

Modified: trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp	2009-02-19 13:42:07 UTC (rev 19039)
@@ -484,8 +484,8 @@
 };
 
 
-PyObject* BL_ShapeActionActuator::_getattr(const STR_String& attr) {
-	if (attr == "action")
+PyObject* BL_ShapeActionActuator::_getattr(const char *attr) {
+	if (!strcmp(attr, "action"))
 		return PyString_FromString(m_action->id.name+2);
 	PyObject* object = _getattr_self(Attributes, this, attr);
 	if (object != NULL)
@@ -493,8 +493,8 @@
 	_getattr_up(SCA_IActuator);
 }
 
-int BL_ShapeActionActuator::_setattr(const STR_String& attr, PyObject* value) {
-	if (attr == "action")
+int BL_ShapeActionActuator::_setattr(const char *attr, PyObject* value) {
+	if (!strcmp(attr, "action"))
 	{
 		if (!PyString_Check(value))
 		{

Modified: trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h	2009-02-19 13:42:07 UTC (rev 19039)
@@ -103,8 +103,8 @@
 	KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetType);
 	KX_PYMETHOD_DOC(BL_ShapeActionActuator,SetType);
 
-	virtual PyObject* _getattr(const STR_String& attr);
-	virtual int _setattr(const STR_String& attr, PyObject* value);
+	virtual PyObject* _getattr(const char *attr);
+	virtual int _setattr(const char *attr, PyObject* value);
 
 	static int CheckBlendTime(void *self, const PyAttributeDef*)
 	{

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-02-19 13:42:07 UTC (rev 19039)
@@ -234,7 +234,7 @@
 
 
 
-PyObject* CListValue::_getattr(const STR_String& attr) {
+PyObject* CListValue::_getattr(const char *attr) {
 	_getattr_up(CValue);
 }
 

Modified: trunk/blender/source/gameengine/Expressions/ListValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.h	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Expressions/ListValue.h	2009-02-19 13:42:07 UTC (rev 19039)
@@ -59,7 +59,7 @@
 
 	bool CheckEqual(CValue* first,CValue* second);
 
-	virtual PyObject* _getattr(const STR_String& attr);
+	virtual PyObject* _getattr(const char *attr);
 
 	KX_PYMETHOD(CListValue,append);
 	KX_PYMETHOD(CListValue,reverse);

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-02-19 13:42:07 UTC (rev 19039)
@@ -106,24 +106,24 @@
 /*------------------------------
  * PyObjectPlus attributes	-- attributes
 ------------------------------*/
-PyObject *PyObjectPlus::_getattr(const STR_String& attr)
+PyObject *PyObjectPlus::_getattr(const char *attr)
 {
-	if (attr == "__doc__" && GetType()->tp_doc)
+	if (!strcmp(attr, "__doc__") && GetType()->tp_doc)
 		return PyString_FromString(GetType()->tp_doc);
 
   //if (streq(attr, "type"))
   //  return Py_BuildValue("s", (*(GetParents()))->tp_name);
 
-  return Py_FindMethod(Methods, this, const_cast<char *>(attr.ReadPtr()));
+  return Py_FindMethod(Methods, this, attr);
 }
 
-int PyObjectPlus::_delattr(const STR_String& attr)
+int PyObjectPlus::_delattr(const char *attr)
 {
 	PyErr_SetString(PyExc_AttributeError, "attribute cant be deleted");
 	return 1;
 }
 
-int PyObjectPlus::_setattr(const STR_String& attr, PyObject *value)
+int PyObjectPlus::_setattr(const char *attr, PyObject *value)
 {
 	//return PyObject::_setattr(attr,value);
 	//cerr << "Unknown attribute" << endl;
@@ -131,12 +131,12 @@
 	return 1;
 }
 
-PyObject *PyObjectPlus::_getattr_self(const PyAttributeDef attrlist[], void *self, const STR_String &attr)
+PyObject *PyObjectPlus::_getattr_self(const PyAttributeDef attrlist[], void *self, const char *attr)
 {
 	const PyAttributeDef *attrdef;
 	for (attrdef=attrlist; attrdef->m_name != NULL; attrdef++)
 	{
-		if (attr == attrdef->m_name) 
+		if (!strcmp(attr, attrdef->m_name))
 		{
 			if (attrdef->m_type == KX_PYATTRIBUTE_TYPE_DUMMY)
 			{
@@ -238,7 +238,7 @@
 	return NULL;
 }
 
-int PyObjectPlus::_setattr_self(const PyAttributeDef attrlist[], void *self, const STR_String &attr, PyObject *value)
+int PyObjectPlus::_setattr_self(const PyAttributeDef attrlist[], void *self, const char *attr, PyObject *value)
 {
 	const PyAttributeDef *attrdef;
 	void *undoBuffer = NULL;
@@ -247,7 +247,7 @@
 
 	for (attrdef=attrlist; attrdef->m_name != NULL; attrdef++)
 	{
-		if (attr == attrdef->m_name) 
+		if (!strcmp(attr, attrdef->m_name))
 		{
 			if (attrdef->m_access == KX_PYATTRIBUTE_RO ||
 				attrdef->m_type == KX_PYATTRIBUTE_TYPE_DUMMY)

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.h	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.h	2009-02-19 13:42:07 UTC (rev 19039)
@@ -97,7 +97,7 @@
 								// to be properly passed up the hierarchy.
 #define _getattr_up(Parent) \
   PyObject *rvalue = NULL; \
-  if (attr=="__methods__") { \
+  if (!strcmp(attr, "__methods__")) { \
     PyObject *_attr_string = NULL; \
     PyMethodDef *meth = Methods; \
     rvalue = Parent::_getattr(attr); \
@@ -113,7 +113,7 @@
 	  } \
 	} \
   } else { \
-    rvalue = Py_FindMethod(Methods, this, const_cast<char*>(attr.ReadPtr())); \
+    rvalue = Py_FindMethod(Methods, this, attr); \
     if (rvalue == NULL) { \
       PyErr_Clear(); \
       rvalue = Parent::_getattr(attr); \
@@ -348,23 +348,23 @@
 //		  Py_DECREF(this);
 //	  };				// decref method
 	
-	virtual PyObject *_getattr(const STR_String& attr);			// _getattr method
+	virtual PyObject *_getattr(const char *attr);			// _getattr method
 	static  PyObject *__getattr(PyObject * PyObj, char *attr) 	// This should be the entry in Type. 
 	{
-		return ((PyObjectPlus*) PyObj)->_getattr(STR_String(attr)); 
+		return ((PyObjectPlus*) PyObj)->_getattr(attr); 
 	}
-	static PyObject *_getattr_self(const PyAttributeDef attrlist[], void *self, const STR_String &attr);
-	static int _setattr_self(const PyAttributeDef attrlist[], void *self, const STR_String &attr, PyObject *value);
+	static PyObject *_getattr_self(const PyAttributeDef attrlist[], void *self, const char *attr);
+	static int _setattr_self(const PyAttributeDef attrlist[], void *self, const char *attr, PyObject *value);
 	
-	virtual int _delattr(const STR_String& attr);
-	virtual int _setattr(const STR_String& attr, PyObject *value);		// _setattr method
+	virtual int _delattr(const char *attr);
+	virtual int _setattr(const char *attr, PyObject *value);		// _setattr method
 	static  int __setattr(PyObject *PyObj, 			// This should be the entry in Type. 
 				char *attr, 
 				PyObject *value)
 	{ 
 		if (!value)
 			return ((PyObjectPlus*) PyObj)->_delattr(attr);
-		return ((PyObjectPlus*) PyObj)->_setattr(STR_String(attr), value);  
+		return ((PyObjectPlus*) PyObj)->_setattr(attr, value);  
 	}
 	
 	virtual PyObject *_repr(void);				// _repr method

Modified: trunk/blender/source/gameengine/Expressions/Value.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/Value.cpp	2009-02-19 10:34:51 UTC (rev 19038)
+++ trunk/blender/source/gameengine/Expressions/Value.cpp	2009-02-19 13:42:07 UTC (rev 19039)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list