[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48705] branches/soc-2012-swiss_cheese/ source/gameengine: LibLoad() now returns a KX_LibLoadStatus object that can be used to monitor the state of an async libload as well as register callbacks .

Mitchell Stokes mogurijin at gmail.com
Sat Jul 7 06:12:56 CEST 2012


Revision: 48705
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48705
Author:   moguri
Date:     2012-07-07 04:12:55 +0000 (Sat, 07 Jul 2012)
Log Message:
-----------
LibLoad() now returns a KX_LibLoadStatus object that can be used to monitor the state of an async libload as well as register callbacks.

Modified Paths:
--------------
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/CMakeLists.txt
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.h
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_PythonInit.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_PythonInitTypes.cpp

Added Paths:
-----------
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_LibLoadStatus.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_LibLoadStatus.h

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/CMakeLists.txt
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/CMakeLists.txt	2012-07-07 04:11:00 UTC (rev 48704)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/CMakeLists.txt	2012-07-07 04:12:55 UTC (rev 48705)
@@ -84,6 +84,7 @@
 	KX_ConvertProperties.cpp
 	KX_ConvertSensors.cpp
 	KX_IpoConvert.cpp
+	KX_LibLoadStatus.cpp
 	KX_SoftBodyDeformer.cpp
 
 	BL_ActionActuator.h
@@ -106,6 +107,7 @@
 	KX_ConvertProperties.h
 	KX_ConvertSensors.h
 	KX_IpoConvert.h
+	KX_LibLoadStatus.h
 	KX_SoftBodyDeformer.h
 )
 

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2012-07-07 04:11:00 UTC (rev 48704)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2012-07-07 04:12:55 UTC (rev 48705)
@@ -61,6 +61,7 @@
 #endif
 
 #include "KX_BlenderSceneConverter.h"
+#include "KX_LibLoadStatus.h"
 #include "KX_BlenderScalarInterpolator.h"
 #include "BL_BlenderDataConversion.h"
 #include "BlenderWorldInfo.h"
@@ -953,9 +954,7 @@
 void KX_BlenderSceneConverter::MergeAsyncLoads()
 {
 	vector<pair<KX_Scene*,KX_Scene*> >::iterator sit;
-	for (sit=m_mergequeue.begin(); sit!=m_mergequeue.end(); ++sit)
-	{
-		printf("Merging scene: %s\n", (*sit).first->GetName().ReadPtr());
+	for (sit=m_mergequeue.begin(); sit!=m_mergequeue.end(); ++sit) {
 		(*sit).first->MergeScene((*sit).second);
 		delete (*sit).second;
 	}
@@ -968,23 +967,29 @@
 	m_mergequeue.push_back(pair<KX_Scene*,KX_Scene*>(merge_scene, other));
 }
 
-typedef struct {KX_BlenderSceneConverter *converter; KX_KetsjiEngine *engine; Scene *scene; KX_Scene *merge_scene;} async_args;
-void *async_convert(void *ptr)
+static void *async_convert(void *ptr)
 {
-	int cleanedup=0;
-	KX_Scene *new_scene=NULL;
-	async_args *args = (async_args*)ptr;
+	KX_Scene *new_scene = NULL;
+	KX_LibLoadStatus *status = (KX_LibLoadStatus*)ptr;
+	vector<Scene*> *scenes = (vector<Scene*>*)status->GetData();
 
-	new_scene = args->engine->CreateScene(args->scene);
+	for (unsigned int i=0; i<scenes->size(); ++i) {
+		new_scene = status->GetEngine()->CreateScene((*scenes)[i]);
 
-	if (new_scene)
-		args->converter->AddScenesToMergeQueue(args->merge_scene, new_scene);
+		if (new_scene)
+			status->GetConverter()->AddScenesToMergeQueue(status->GetMergeScene(), new_scene);
 
-	delete args;
+		status->AddProgress(1.f/scenes->size());
+	}
+
+	status->Finish();
+
+	delete status->GetData();
+	status->SetData(NULL);
 	return NULL;
 }
 
-bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
+KX_LibLoadStatus *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);
 
@@ -992,7 +997,7 @@
 	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, short options)
+KX_LibLoadStatus *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);
 
@@ -1024,32 +1029,33 @@
 	BLO_library_append_end(NULL, main_tmp, &bpy_openlib, idcode, flag);
 }
 
-bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
+KX_LibLoadStatus *KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
 {
 	Main *main_newlib; /* stored as a dynamic 'main' until we free it */
 	int idcode= BKE_idcode_from_name(group);
 	ReportList reports;
 	static char err_local[255];
+	KX_LibLoadStatus *status;
 	
 	/* 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;
+		return NULL;
 	}
 	
 	if (GetMainDynamicPath(path)) {
 		snprintf(err_local, sizeof(err_local), "blend file already open \"%s\"\n", path);
 		*err_str= err_local;
 		BLO_blendhandle_close(bpy_openlib);
-		return false;
+		return NULL;
 	}
 
 	if (bpy_openlib==NULL) {
 		snprintf(err_local, sizeof(err_local), "could not open blendfile \"%s\"\n", path);
 		*err_str= err_local;
-		return false;
+		return NULL;
 	}
 	
 	main_newlib= (Main *)MEM_callocN( sizeof(Main), "BgeMain");
@@ -1077,6 +1083,8 @@
 	strncpy(main_newlib->name, path, sizeof(main_newlib->name));	
 	
 	
+	status = new KX_LibLoadStatus(this, m_ketsjiEngine, scene_merge, path);
+
 	if (idcode==ID_ME) {
 		/* Convert all new meshes into BGE meshes */
 		ID* mesh;
@@ -1101,23 +1109,16 @@
 	else if (idcode==ID_SCE) {		
 		/* Merge all new linked in scene into the existing one */
 		ID *scene;
+		// scenes gets deleted by the thread when it's done using it (look in async_convert())
+		vector<Scene*> *scenes =  (options & LIB_LOAD_ASYNC) ? new vector<Scene*>() : NULL;
+
 		for (scene= (ID *)main_newlib->scene.first; scene; scene= (ID *)scene->next ) {
 			if (options & LIB_LOAD_VERBOSE)
 				printf("SceneName: %s\n", scene->name+2);
 			
-			if (options & LIB_LOAD_ASYNC)
-			{
-				pthread_t id;
-				async_args *args = new async_args(); // Gets deleted in the thread
-				args->converter = this;
-				args->engine = m_ketsjiEngine;
-				args->scene = (Scene*)scene;
-				args->merge_scene = scene_merge;
-				pthread_create(&id, NULL, &async_convert, (void*)args);
-				m_threadinfo->threads.push_back(id);
-			}
-			else 
-			{
+			if (options & LIB_LOAD_ASYNC) {
+				scenes->push_back((Scene*)scene);
+			} else {
 				/* merge into the base  scene */
 				KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene);
 				scene_merge->MergeScene(other);
@@ -1127,8 +1128,14 @@
 			}
 		}
 
+		if (options & LIB_LOAD_ASYNC) {
+			pthread_t id;
+			status->SetData(scenes);
+			pthread_create(&id, NULL, &async_convert, (void*)status);
+			m_threadinfo->threads.push_back(id);
+		}
+
 		/* Handle any text datablocks */
-
 		addImportMain(main_newlib);
 
 		/* Now handle all the actions */
@@ -1143,7 +1150,7 @@
 		}
 	}
 	
-	return true;
+	return status;
 }
 
 /* Note m_map_*** are all ok and don't need to be freed

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.h	2012-07-07 04:11:00 UTC (rev 48704)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.h	2012-07-07 04:12:55 UTC (rev 48705)
@@ -162,9 +162,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, 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);
+	class KX_LibLoadStatus *LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+	class KX_LibLoadStatus *LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+	class KX_LibLoadStatus *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);

Added: branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_LibLoadStatus.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_LibLoadStatus.cpp	                        (rev 0)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_LibLoadStatus.cpp	2012-07-07 04:12:55 UTC (rev 48705)
@@ -0,0 +1,249 @@
+/*
+ * ***** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Mitchell Stokes
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file KX_LibLoadStatus.cpp
+ *  \ingroup bgeconv
+ */
+
+#include "KX_LibLoadStatus.h"
+#include "PIL_time.h"
+
+KX_LibLoadStatus::KX_LibLoadStatus(class KX_BlenderSceneConverter* kx_converter,
+				class KX_KetsjiEngine* kx_engine,
+				class KX_Scene* merge_scene,
+				const char *path) :
+			m_converter(kx_converter),
+			m_engine(kx_engine),
+			m_mergescene(merge_scene),
+			m_data(NULL),
+			m_libname(path),
+			m_refcount(1),
+			m_progress(0.f),
+#ifdef WITH_PYTHON
+			m_finish_cb(NULL),
+			m_progress_cb(NULL)
+#endif
+{
+	m_endtime = m_starttime = PIL_check_seconds_timer();
+}
+
+void KX_LibLoadStatus::Finish()
+{
+	m_progress = 1.f;
+	m_endtime = PIL_check_seconds_timer();
+
+	RunFinishCallback();
+	RunProgressCallback();
+}
+
+void KX_LibLoadStatus::RunFinishCallback()
+{
+#ifdef WITH_PYTHON

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list