[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35682] trunk/blender/source/gameengine: BGE Dynamic Loading:

Mitchell Stokes mogurijin at gmail.com
Tue Mar 22 03:39:08 CET 2011


Revision: 35682
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35682
Author:   moguri
Date:     2011-03-22 02:39:08 +0000 (Tue, 22 Mar 2011)
Log Message:
-----------
BGE Dynamic Loading:
 * Adding keyword arguments to LibLoad
   - load_actions (Default: False) Ensures that all actions are loaded. Otherwise, just actions used by objects in the scene are loaded.
   - verbose (Default: False) Turns on extra prints (eg SceneName: MyScene).
 * Also making error reporting better for when an invalid group/idcode is given.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp

Modified: trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2011-03-22 02:38:39 UTC (rev 35681)
+++ trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2011-03-22 02:39:08 UTC (rev 35682)
@@ -932,23 +932,23 @@
 	return NULL;
 }
 
-bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
 {
 	BlendHandle *bpy_openlib = BLO_blendhandle_from_memory(data, length);
 
 	// Error checking is done in LinkBlendFile
-	return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str);
+	return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str, options);
 }
 
-bool KX_BlenderSceneConverter::LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
 {
 	BlendHandle *bpy_openlib = BLO_blendhandle_from_file((char *)path, NULL);
 
 	// Error checking is done in LinkBlendFile
-	return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str);
+	return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str, options);
 }
 
-bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
 {
 	bContext *C;
 	Main *main_newlib; /* stored as a dynamic 'main' until we free it */
@@ -962,6 +962,7 @@
 	/* only scene and mesh supported right now */
 	if(idcode!=ID_SCE && idcode!=ID_ME &&idcode!=ID_AC) {
 		snprintf(err_local, sizeof(err_local), "invalid ID type given \"%s\"\n", group);
+		*err_str= err_local;
 		BLO_blendhandle_close(bpy_openlib);
 		return false;
 	}
@@ -1000,6 +1001,26 @@
 	BLI_linklist_free(names, free);	/* free linklist *and* each node's data */
 	
 	BLO_library_append_end(C, main_tmp, &bpy_openlib, idcode, flag);
+
+	/* now do another round of linking for Scenes so all actions are properly loaded */
+	if (idcode==ID_SCE && options & LIB_LOAD_LOAD_ACTIONS) {
+		main_tmp = BLO_library_append_begin(C, &bpy_openlib, (char *)path);
+
+		int totnames_dummy;
+		names = BLO_blendhandle_get_datablock_names( bpy_openlib, ID_AC, &totnames_dummy);
+	
+		int i=0;
+		LinkNode *n= names;
+		while(n) {
+			BLO_library_append_named_part(C, main_tmp, &bpy_openlib, (char *)n->link, ID_AC, 0);
+			n= (LinkNode *)n->next;
+			i++;
+		}
+		BLI_linklist_free(names, free);	/* free linklist *and* each node's data */
+	
+		BLO_library_append_end(C, main_tmp, &bpy_openlib, ID_AC, flag);
+	}
+	
 	BLO_blendhandle_close(bpy_openlib);
 	
 	CTX_free(C);
@@ -1016,6 +1037,8 @@
 		ID* mesh;
 	
 		for(mesh= (ID *)main_newlib->mesh.first; mesh; mesh= (ID *)mesh->next ) {
+			if (options & LIB_LOAD_VERBOSE)
+				printf("MeshName: %s\n", mesh->name+2);
 			RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)mesh, NULL, scene_merge, this);
 			scene_merge->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
 		}
@@ -1025,7 +1048,8 @@
 		ID *action;
 
 		for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
-			printf("ActionName: %s\n", action->name);
+			if (options & LIB_LOAD_VERBOSE)
+				printf("ActionName: %s\n", action->name+2);
 			scene_merge->GetLogicManager()->RegisterActionName(action->name+2, action);
 		}
 	}
@@ -1033,7 +1057,8 @@
 		/* Merge all new linked in scene into the existing one */
 		ID *scene;
 		for(scene= (ID *)main_newlib->scene.first; scene; scene= (ID *)scene->next ) {
-			printf("SceneName: %s\n", scene->name);
+			if (options & LIB_LOAD_VERBOSE)
+				printf("SceneName: %s\n", scene->name+2);
 			
 			/* merge into the base  scene */
 			KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene);
@@ -1042,6 +1067,17 @@
 			// RemoveScene(other); // Dont run this, it frees the entire scene converter data, just delete the scene
 			delete other;
 		}
+
+		/* Now handle all the actions */
+		if (options & LIB_LOAD_LOAD_ACTIONS) {
+			ID *action;
+
+			for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
+				if (options & LIB_LOAD_VERBOSE)
+					printf("ActionName: %s\n", action->name+2);
+				scene_merge->GetLogicManager()->RegisterActionName(action->name+2, action);
+			}
+		}
 	}
 	
 	return true;

Modified: trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h	2011-03-22 02:38:39 UTC (rev 35681)
+++ trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h	2011-03-22 02:39:08 UTC (rev 35682)
@@ -147,9 +147,9 @@
 	struct Main*		  GetMainDynamicPath(const char *path);
 	vector<struct Main*> &GetMainDynamic();
 	
-	bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
-	bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str);
-	bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
+	bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+	bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+	bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
 	bool MergeScene(KX_Scene *to, KX_Scene *from);
 	RAS_MeshObject *ConvertMeshSpecial(KX_Scene* kx_scene, Main *maggie, const char *name);
 	bool FreeBlendFile(struct Main *maggie);
@@ -176,6 +176,13 @@
 #endif
 //		/printf("\t m_ketsjiEngine->m_scenes: %d\n", m_ketsjiEngine->CurrentScenes()->size());
 	}
+	
+	/* LibLoad Options */
+	enum 
+	{
+		LIB_LOAD_LOAD_ACTIONS = 1,
+		LIB_LOAD_VERBOSE = 2,
+	};
 
 
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp	2011-03-22 02:38:39 UTC (rev 35681)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp	2011-03-22 02:39:08 UTC (rev 35682)
@@ -638,7 +638,7 @@
 	Py_RETURN_NONE;
 }
 
-static PyObject *gLibLoad(PyObject*, PyObject* args)
+static PyObject *gLibLoad(PyObject*, PyObject* args, PyObject* kwds)
 {
 	KX_Scene *kx_scene= gp_KetsjiScene;
 	char *path;
@@ -646,10 +646,22 @@
 	Py_buffer py_buffer;
 	py_buffer.buf = NULL;
 	char *err_str= NULL;
+
+	short options=0;
+	int load_actions=0, verbose=0;
+
+	static const char *kwlist[] = {"path", "group", "buffer", "load_actions", "verbose", NULL};
 	
-	if (!PyArg_ParseTuple(args,"ss|y*:LibLoad",&path, &group, &py_buffer))
+	if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|y*ii:LibLoad", const_cast<char**>(kwlist),
+									&path, &group, &py_buffer, &load_actions, &verbose))
 		return NULL;
 
+	/* setup options */
+	if (load_actions != 0)
+		options |= KX_BlenderSceneConverter::LIB_LOAD_LOAD_ACTIONS;
+	if (verbose != 0)
+		options |= KX_BlenderSceneConverter::LIB_LOAD_VERBOSE;
+
 	if (!py_buffer.buf)
 	{
 		char abs_path[FILE_MAX];
@@ -657,14 +669,14 @@
 		BLI_strncpy(abs_path, path, sizeof(abs_path));
 		BLI_path_abs(abs_path, gp_GamePythonPath);
 
-		if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str)) {
+		if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str, options)) {
 			Py_RETURN_TRUE;
 		}
 	}
 	else
 	{
 
-		if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str))	{
+		if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str, options))	{
 			PyBuffer_Release(&py_buffer);
 			Py_RETURN_TRUE;
 		}
@@ -798,7 +810,7 @@
 	{"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
 	
 	/* library functions */
-	{"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS, (const char *)""},
+	{"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS|METH_KEYWORDS, (const char *)""},
 	{"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
 	{"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
 	{"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},




More information about the Bf-blender-cvs mailing list