[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25883] trunk/blender/source/gameengine: get rid of annoying duplicate python initialization code, added setupGamePython() which initializes modules

Campbell Barton ideasman42 at gmail.com
Sun Jan 10 23:03:26 CET 2010


Revision: 25883
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25883
Author:   campbellbarton
Date:     2010-01-10 23:03:26 +0100 (Sun, 10 Jan 2010)

Log Message:
-----------
get rid of annoying duplicate python initialization code, added setupGamePython() which initializes modules

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h

Modified: trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2010-01-10 21:58:40 UTC (rev 25882)
+++ trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2010-01-10 22:03:26 UTC (rev 25883)
@@ -391,22 +391,8 @@
 
 #ifndef DISABLE_PYTHON
 			// some python things
-			PyObject* dictionaryobject = initGamePythonScripting("Ketsji", psl_Lowest, blenderdata);
-			ketsjiengine->SetPyNamespace(dictionaryobject);
-			initRasterizer(rasterizer, canvas);
-			PyObject *gameLogic = initGameLogic(ketsjiengine, startscene);
-			PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
-			PyObject *gameLogic_keys = PyDict_Keys(PyModule_GetDict(gameLogic));
-			PyDict_SetItemString(dictionaryobject, "GameLogic", gameLogic); // Same as importing the module.
-			
-			initGameKeys();
-			initPythonConstraintBinding();
-			initMathutils();
-			initGeometry();
-			initBGL();
-#ifdef WITH_FFMPEG
-			initVideoTexture();
-#endif
+			PyObject *gameLogic, *gameLogic_keys;
+			setupGamePython(ketsjiengine, startscene, blenderdata, pyGlobalDict, &gameLogic, &gameLogic_keys, 0, NULL);
 #endif // DISABLE_PYTHON
 
 			//initialize Dome Settings
@@ -622,6 +608,7 @@
 	// Acquire Python's GIL (global interpreter lock)
 	// so we can safely run Python code and API calls
 	PyGILState_STATE gilstate = PyGILState_Ensure();
+	PyObject *pyGlobalDict = PyDict_New(); /* python utility storage, spans blend file loading */
 #endif
 
 	bgl::InitExtensions(true);
@@ -722,19 +709,8 @@
 
 #ifndef DISABLE_PYTHON
 			// some python things
-			PyObject* dictionaryobject = initGamePythonScripting("Ketsji", psl_Lowest, blenderdata);
-			ketsjiengine->SetPyNamespace(dictionaryobject);
-			initRasterizer(rasterizer, canvas);
-			PyObject *gameLogic = initGameLogic(ketsjiengine, startscene);
-			PyDict_SetItemString(dictionaryobject, "GameLogic", gameLogic); // Same as importing the module
-			initGameKeys();
-			initPythonConstraintBinding();
-			initMathutils();
-			initGeometry();
-			initBGL();
-#ifdef WITH_FFMPEG
-			initVideoTexture();
-#endif
+			PyObject *gameLogic, *gameLogic_keys;
+			setupGamePython(ketsjiengine, startscene, blenderdata, pyGlobalDict, &gameLogic, &gameLogic_keys, 0, NULL);
 #endif // DISABLE_PYTHON
 
 			if (sceneconverter)
@@ -820,6 +796,8 @@
 	} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
 
 #ifndef DISABLE_PYTHON
+	Py_DECREF(pyGlobalDict);
+
 	// Release Python's GIL
 	PyGILState_Release(gilstate);
 #endif

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp	2010-01-10 21:58:40 UTC (rev 25882)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp	2010-01-10 22:03:26 UTC (rev 25883)
@@ -679,21 +679,11 @@
 			startscenename,
 			m_startScene);
 		
-		
-		// some python things
-		PyObject* dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_maggie, m_argc, m_argv);
-		m_ketsjiengine->SetPyNamespace(dictionaryobject);
-		initRasterizer(m_rasterizer, m_canvas);
-		PyObject *gameLogic = initGameLogic(m_ketsjiengine, startscene);
-		PyDict_SetItemString(dictionaryobject, "GameLogic", gameLogic); // Same as importing the module
-		initGameKeys();
-		initPythonConstraintBinding();
-		initMathutils();
-		initGeometry();
-		initBGL();
-#ifdef WITH_FFMPEG
-        initVideoTexture();
-#endif
+#ifndef DISABLE_PYTHON
+			// some python things
+			PyObject *gameLogic, *gameLogic_keys;
+			setupGamePython(m_ketsjiengine, startscene, m_maggie, NULL, &gameLogic, &gameLogic_keys, m_argc, m_argv);
+#endif // DISABLE_PYTHON
 
 		//initialize Dome Settings
 		if(m_startScene->gm.stereoflag == STEREO_DOME)

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp	2010-01-10 21:58:40 UTC (rev 25882)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp	2010-01-10 22:03:26 UTC (rev 25883)
@@ -1926,7 +1926,39 @@
 	PyObjectPlus::ClearDeprecationWarning();
 }
 
+/* similar to the above functions except it sets up the namespace
+ * and other more general things */
+void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *blenderdata, PyObject * pyGlobalDict, PyObject **gameLogic, PyObject **gameLogic_keys, int argc, char** argv)
+{
+	PyObject* dictionaryobject;
 
+	if(argv) /* player only */
+		dictionaryobject= initGamePlayerPythonScripting("Ketsji", psl_Lowest, blenderdata, argc, argv);
+	else
+		dictionaryobject= initGamePythonScripting("Ketsji", psl_Lowest, blenderdata);
+
+	ketsjiengine->SetPyNamespace(dictionaryobject);
+	initRasterizer(ketsjiengine->GetRasterizer(), ketsjiengine->GetCanvas());
+	*gameLogic = initGameLogic(ketsjiengine, startscene);
+
+	/* is set in initGameLogic so only set here if we want it to persist between scenes */
+	if(pyGlobalDict)
+		PyDict_SetItemString(PyModule_GetDict(*gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
+
+	*gameLogic_keys = PyDict_Keys(PyModule_GetDict(*gameLogic));
+	PyDict_SetItemString(dictionaryobject, "GameLogic", *gameLogic); // Same as importing the module.
+
+	initGameKeys();
+	initPythonConstraintBinding();
+	initMathutils();
+	initGeometry();
+	initBGL();
+
+#ifdef WITH_FFMPEG
+	initVideoTexture();
+#endif
+}
+
 static struct PyModuleDef Rasterizer_module_def = {
 	{}, /* m_base */
 	"Rasterizer",  /* m_name */

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h	2010-01-10 21:58:40 UTC (rev 25882)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h	2010-01-10 22:03:26 UTC (rev 25883)
@@ -52,6 +52,8 @@
 PyObject*	initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, struct Main *maggie);
 void		exitGamePythonScripting();
 
+void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *blenderdata, PyObject *pyGlobalDict, PyObject **gameLogic, PyObject **gameLogic_keys, int argc, char** argv);
+
 void		setGamePythonPath(char *path);
 void		resetGamePythonPath();
 void		pathGamePythonConfig( char *path );





More information about the Bf-blender-cvs mailing list