[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48709] branches/soc-2012-swiss_cheese/ source/gameengine/Converter: The onFinish callbacks for KX_LibLoadStatus are now called after the scene has been merged .

Mitchell Stokes mogurijin at gmail.com
Sat Jul 7 09:38:43 CEST 2012


Revision: 48709
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48709
Author:   moguri
Date:     2012-07-07 07:38:42 +0000 (Sat, 07 Jul 2012)
Log Message:
-----------
The onFinish callbacks for KX_LibLoadStatus are now called after the scene has been merged. This will slightly mess up the timeTaken stat (it will include time waiting to synchronize and do the merge), but at least you'll be able to access the newly loaded object in the callback.

Modified Paths:
--------------
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.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 07:01:59 UTC (rev 48708)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2012-07-07 07:38:42 UTC (rev 48709)
@@ -953,18 +953,31 @@
 
 void KX_BlenderSceneConverter::MergeAsyncLoads()
 {
-	vector<pair<KX_Scene*,KX_Scene*> >::iterator sit;
-	for (sit=m_mergequeue.begin(); sit!=m_mergequeue.end(); ++sit) {
-		(*sit).first->MergeScene((*sit).second);
-		delete (*sit).second;
+	vector<KX_Scene*> *merge_scenes;
+
+	vector<KX_LibLoadStatus*>::iterator mit;
+	vector<KX_Scene*>::iterator sit;
+
+	for (mit=m_mergequeue.begin(); mit!=m_mergequeue.end(); ++mit) {
+		merge_scenes = (vector<KX_Scene*>*)(*mit)->GetData();
+
+		for (sit=merge_scenes->begin(); sit!=merge_scenes->end(); ++sit) {
+			(*mit)->GetMergeScene()->MergeScene(*sit);
+			delete (*sit);
+		}
+
+		delete (*mit)->GetData();
+		(*mit)->SetData(NULL);
+
+		(*mit)->Finish();
 	}
 
 	m_mergequeue.clear();
 }
 
-void KX_BlenderSceneConverter::AddScenesToMergeQueue(KX_Scene *merge_scene, KX_Scene *other)
+void KX_BlenderSceneConverter::AddScenesToMergeQueue(KX_LibLoadStatus *status)
 {
-	m_mergequeue.push_back(pair<KX_Scene*,KX_Scene*>(merge_scene, other));
+	m_mergequeue.push_back(status);
 }
 
 static void *async_convert(void *ptr)
@@ -972,20 +985,22 @@
 	KX_Scene *new_scene = NULL;
 	KX_LibLoadStatus *status = (KX_LibLoadStatus*)ptr;
 	vector<Scene*> *scenes = (vector<Scene*>*)status->GetData();
+	vector<KX_Scene*> *merge_scenes = new vector<KX_Scene*>(); // Deleted in MergeAsyncLoads
 
 	for (unsigned int i=0; i<scenes->size(); ++i) {
 		new_scene = status->GetEngine()->CreateScene((*scenes)[i]);
 
 		if (new_scene)
-			status->GetConverter()->AddScenesToMergeQueue(status->GetMergeScene(), new_scene);
+			merge_scenes->push_back(new_scene);
 
-		status->AddProgress(1.f/scenes->size());
+		status->AddProgress((1.f/scenes->size())*0.9f); // We'll call conversion 90% and merging 10% for now
 	}
 
-	status->Finish();
+	delete status->GetData();
+	status->SetData(merge_scenes);
 
-	delete status->GetData();
-	status->SetData(NULL);
+	status->GetConverter()->AddScenesToMergeQueue(status);
+
 	return NULL;
 }
 
@@ -1149,6 +1164,9 @@
 			}
 		}
 	}
+
+	if (!(options & LIB_LOAD_ASYNC))
+		status->Finish();
 	
 	return status;
 }

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 07:01:59 UTC (rev 48708)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.h	2012-07-07 07:38:42 UTC (rev 48709)
@@ -62,7 +62,7 @@
 	vector<pair<KX_Scene*,RAS_MeshObject*> > m_meshobjects;
 	vector<pair<KX_Scene*,BL_Material *> >	m_materials;
 
-	vector<pair<KX_Scene*,KX_Scene*> > m_mergequeue;
+	vector<class KX_LibLoadStatus*> m_mergequeue;
 	ThreadInfo	*m_threadinfo;
 
 	// Cached material conversions
@@ -171,7 +171,7 @@
 	bool FreeBlendFile(const char *path);
 
 	virtual void MergeAsyncLoads();
-	void AddScenesToMergeQueue(KX_Scene *merge_scene, KX_Scene *other);
+	void AddScenesToMergeQueue(class KX_LibLoadStatus *status);
  
 	void PrintStats() {
 		printf("BGE STATS!\n");




More information about the Bf-blender-cvs mailing list