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

Campbell Barton ideasman42 at gmail.com
Mon Apr 20 11:14:00 CEST 2009


Revision: 19809
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19809
Author:   campbellbarton
Date:     2009-04-20 11:13:59 +0200 (Mon, 20 Apr 2009)

Log Message:
-----------
BGE Python API
- initialize pythons sys.argv in the blenderplayer
- ignore all arguments after a single " - " in the blenderplayer (like in blender), so args can be passed to the game.
- add a utility function PyOrientationTo() - to take a Py euler, quat or 3x3 matrix and convert into a C++ MT_Matrix3x3.
- add utility function ConvertPythonToMesh to get a RAS_MeshObject from a KX_MeshProxy or a name.
- Added error prefix arguments to ConvertPythonToGameObject, ConvertPythonToMesh and PyOrientationTo so the error messages can include what function they came from.
- deprecated brick.getOwner() for the "owner" attribute.
 

Modified Paths:
--------------
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
    trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
    trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PyMath.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PyMath.h
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
    trunk/blender/source/gameengine/PyDoc/KX_VehicleWrapper.py
    trunk/blender/source/gameengine/PyDoc/SCA_ILogicBrick.py

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -246,8 +246,8 @@
 
 
 PyMethodDef SCA_ILogicBrick::Methods[] = {
+	// --> Deprecated
   {"getOwner", (PyCFunction) SCA_ILogicBrick::sPyGetOwner, METH_NOARGS},
-  // --> Deprecated
   {"getExecutePriority", (PyCFunction) SCA_ILogicBrick::sPyGetExecutePriority, METH_NOARGS},
   {"setExecutePriority", (PyCFunction) SCA_ILogicBrick::sPySetExecutePriority, METH_VARARGS},
   // <-- Deprecated
@@ -255,6 +255,7 @@
 };
 
 PyAttributeDef SCA_ILogicBrick::Attributes[] = {
+	KX_PYATTRIBUTE_RO_FUNCTION("owner",	SCA_ILogicBrick, pyattr_get_owner),
 	KX_PYATTRIBUTE_INT_RW("executePriority",0,100000,false,SCA_ILogicBrick,m_Execute_Ueber_Priority),
 	{NULL} //Sentinel
 };
@@ -291,6 +292,8 @@
 
 PyObject* SCA_ILogicBrick::PyGetOwner()
 {
+	ShowDeprecationWarning("getOwner()", "the owner property");
+	
 	CValue* parent = GetParent();
 	if (parent)
 	{
@@ -327,7 +330,20 @@
 }
 
 
+/*Attribute functions */
+PyObject* SCA_ILogicBrick::pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	SCA_ILogicBrick* self= static_cast<SCA_ILogicBrick*>(self_v);
+	CValue* parent = self->GetParent();
+	
+	if (parent)
+		return parent->GetProxy();
+	
+	Py_RETURN_NONE;
+}
 
+
+
 /* Conversions for making life better. */
 bool SCA_ILogicBrick::PyArgToBool(int boolArg)
 {
@@ -338,8 +354,6 @@
 	}
 }
 
-
-
 PyObject* SCA_ILogicBrick::BoolToPyArg(bool boolarg)
 {
 	return PyInt_FromLong(boolarg? KX_TRUE: KX_FALSE);	

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h	2009-04-20 09:13:59 UTC (rev 19809)
@@ -90,6 +90,8 @@
 	KX_PYMETHOD_NOARGS(SCA_ILogicBrick,GetOwner);
 	KX_PYMETHOD_VARARGS(SCA_ILogicBrick,SetExecutePriority);
 	KX_PYMETHOD_NOARGS(SCA_ILogicBrick,GetExecutePriority);
+	
+	static PyObject*	pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
 
 	// check that attribute is a property
 	static int CheckProperty(void *self, const PyAttributeDef *attrdef);

Modified: trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -661,8 +661,8 @@
 				startscenename,
 				m_gamedata->curscene);
 			
-			PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Highest, m_gamedata->main);
-			//PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_gamedata->main);
+			PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Highest, m_gamedata->main, 0, NULL);
+			//PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_gamedata->main, 0, NULL);
 
 			///python scripting doesn't work
 			m_ketsjiengine->SetPythonDictionary(m_dictionaryobject);

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -151,7 +151,7 @@
 
 
 
-bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene)
+bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene, int argc, char **argv)
 {
 	bool result = false;
 
@@ -163,6 +163,10 @@
 		m_startScene = scene;
 		result = true;
 	}
+	
+	/* Python needs these */
+	m_argc= argc;
+	m_argv= argv;
 
 	return result;
 }
@@ -681,7 +685,7 @@
 		
 		
 		// some python things
-		PyObject* dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_maggie);
+		PyObject* dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_maggie, m_argc, m_argv);
 		m_ketsjiengine->SetPythonDictionary(dictionaryobject);
 		initRasterizer(m_rasterizer, m_canvas);
 		PyObject *gameLogic = initGameLogic(m_ketsjiengine, startscene);

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h	2009-04-20 09:13:59 UTC (rev 19809)
@@ -58,7 +58,7 @@
 	GPG_Application(GHOST_ISystem* system);
 	~GPG_Application(void);
 
-			bool SetGameEngineData(struct Main* maggie, struct Scene* scene);
+			bool SetGameEngineData(struct Main* maggie, struct Scene* scene, int argc, char** argv);
 			bool startWindow(STR_String& title, int windowLeft, int windowTop, int windowWidth, int windowHeight,
 			const bool stereoVisual, const int stereoMode);
 			bool startFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode);
@@ -154,5 +154,9 @@
 	 */
 	char* m_pyGlobalDictString;
 	int m_pyGlobalDictString_Length;
+	
+	/* argc and argv need to be passed on to python */
+	int		m_argc;
+	char**	m_argv;
 };
 

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -206,6 +206,8 @@
 	printf("       blender_material               0         Enable material settings\n");
 	printf("       ignore_deprecation_warnings    1         Ignore deprecation warnings\n");
 	printf("\n");
+	printf("  - : all arguments after this are ignored, allowing python to access them from sys.argv\n");
+	printf("\n");
 	printf("example: %s -w 320 200 10 10 -g noaudio c:\\loadtest.blend\n", program);
 	printf("example: %s -g show_framerate = 0 c:\\loadtest.blend\n", program);
 }
@@ -293,6 +295,7 @@
 int main(int argc, char** argv)
 {
 	int i;
+	int argc_py_clamped= argc; /* use this so python args can be added after ' - ' */
 	bool error = false;
 	SYS_SystemHandle syshandle = SYS_GetSystem();
 	bool fullScreen = false;
@@ -393,6 +396,12 @@
 #endif
 		if (argv[i][0] == '-')
 		{
+			/* ignore all args after " - ", allow python to have own args */
+			if (argv[i][1]=='\0') {
+				argc_py_clamped= i;
+				break;
+			}
+			
 			switch (argv[i][1])
 			{
 			case 'g':
@@ -596,7 +605,7 @@
 				char pathname[FILE_MAXDIR + FILE_MAXFILE];
 				char *titlename;
 
-				get_filename(argc, argv, filename);
+				get_filename(argc_py_clamped, argv, filename);
 				if(filename[0])
 					BLI_convertstringcwd(filename);
 				
@@ -691,7 +700,7 @@
 						}
 						
 						//					GPG_Application app (system, maggie, startscenename);
-						app.SetGameEngineData(maggie, scene);
+						app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
 						
 						BLI_strncpy(pathname, maggie->name, sizeof(pathname));
 						BLI_strncpy(G.sce, maggie->name, sizeof(G.sce));

Modified: trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -526,7 +526,7 @@
 		
 		PyObject* dictionaryobject 
 			= initGamePlayerPythonScripting("Ketsji", 
-						  psl_Highest);
+						  psl_Highest, 0, NULL);
 		if (k->keyboarddevice 
 		    && k->mousedevice 
 		    && k->net_dev 

Modified: trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -462,7 +462,7 @@
 	
 	ShowDeprecationWarning("setObject()", "the object property");
 	
-	if (!ConvertPythonToGameObject(value, &gameobj, true))
+	if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.setObject(value): KX_CameraActuator"))
 		return NULL; // ConvertPythonToGameObject sets the error
 	
 	if (m_ob != NULL)
@@ -589,7 +589,7 @@
 	KX_CameraActuator* self= static_cast<KX_CameraActuator*>(self_v);
 	KX_GameObject *gameobj;
 	
-	if (!ConvertPythonToGameObject(value, &gameobj, true))
+	if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_CameraActuator"))
 		return 1; // ConvertPythonToGameObject sets the error
 	
 	if (self->m_ob)

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-04-20 09:13:59 UTC (rev 19809)
@@ -1182,22 +1182,12 @@
 PyObject* KX_GameObject::PyReplaceMesh(PyObject* value)
 {
 	KX_Scene *scene = KX_GetActiveScene();
-	char* meshname;
-	void* mesh_pt;
-
-	meshname = PyString_AsString(value);
-	if (meshname==NULL) {
-		PyErr_SetString(PyExc_ValueError, "gameOb.replaceMesh(value): KX_GameObject, expected a mesh name");
-		return NULL;
-	}
-	mesh_pt = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname));
+	RAS_MeshObject* new_mesh;
 	
-	if (mesh_pt==NULL) {
-		PyErr_SetString(PyExc_ValueError, "gameOb.replaceMesh(value): KX_GameObject, the mesh name given does not exist");
+	if (!ConvertPythonToMesh(value, &new_mesh, false, "gameOb.replaceMesh(value): KX_GameObject"))
 		return NULL;
-	}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list