[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49073] branches/soc-2012-swiss_cheese/ source/gameengine: When libloading, don' t attempt to compile shaders until during the scene merge.

Mitchell Stokes mogurijin at gmail.com
Fri Jul 20 08:34:31 CEST 2012


Revision: 49073
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49073
Author:   moguri
Date:     2012-07-20 06:34:31 +0000 (Fri, 20 Jul 2012)
Log Message:
-----------
When libloading, don't attempt to compile shaders until during the scene merge. This prevents the shaders from getting compiled twice (giving a speedup), and it solves the problem of trying to load shaders in a separate thread, which resulted in an error.

Modified Paths:
--------------
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.h
    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/Converter/KX_ConvertActuators.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.h
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_ISceneConverter.h
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_KetsjiEngine.h
    branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-07-19 21:55:16 UTC (rev 49072)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-07-20 06:34:31 UTC (rev 49073)
@@ -917,7 +917,7 @@
 		{
 			kx_blmat = new KX_BlenderMaterial();
 
-			kx_blmat->Initialize(scene, bl_mat, (ma?&ma->game:NULL));
+			kx_blmat->Initialize(scene, bl_mat, (ma?&ma->game:NULL), lightlayer);
 			polymat = static_cast<RAS_IPolyMaterial*>(kx_blmat);
 			converter->CachePolyMaterial(ma, polymat);
 		}
@@ -1067,7 +1067,7 @@
 }
 
 /* blenderobj can be NULL, make sure its checked for */
-RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene, KX_BlenderSceneConverter *converter)
+RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene, KX_BlenderSceneConverter *converter, bool libloading)
 {
 	RAS_MeshObject *meshobj;
 	int lightlayer = blenderobj ? blenderobj->lay:(1<<20)-1; // all layers if no object.
@@ -1265,9 +1265,12 @@
 	meshobj->EndConversion();
 
 	// pre calculate texture generation
-	for (list<RAS_MeshMaterial>::iterator mit = meshobj->GetFirstMaterial();
-		mit != meshobj->GetLastMaterial(); ++ mit) {
-		mit->m_bucket->GetPolyMaterial()->OnConstruction(lightlayer);
+	// However, we want to delay this if we're libloading so we can make sure we have the right scene.
+	if (!libloading) {
+		for (list<RAS_MeshMaterial>::iterator mit = meshobj->GetFirstMaterial();
+			mit != meshobj->GetLastMaterial(); ++ mit) {
+			mit->m_bucket->GetPolyMaterial()->OnConstruction();
+		}
 	}
 
 	if (layers)
@@ -1431,7 +1434,7 @@
 				if (kx_blmat == NULL)
 					kx_blmat = new KX_BlenderMaterial();
 
-				kx_blmat->Initialize(scene, bl_mat, (ma?&ma->game:NULL));
+				kx_blmat->Initialize(scene, bl_mat, (ma?&ma->game:NULL), lightlayer);
 				polymat = static_cast<RAS_IPolyMaterial*>(kx_blmat);
 			}
 			else {
@@ -1660,7 +1663,7 @@
 	// pre calculate texture generation
 	for (list<RAS_MeshMaterial>::iterator mit = meshobj->GetFirstMaterial();
 		mit != meshobj->GetLastMaterial(); ++ mit) {
-		mit->m_bucket->GetPolyMaterial()->OnConstruction(lightlayer);
+		mit->m_bucket->GetPolyMaterial()->OnConstruction();
 	}
 
 	if (layers)
@@ -2327,7 +2330,8 @@
 								Object *ob, 
 								KX_Scene *kxscene, 
 								RAS_IRenderTools *rendertools, 
-								KX_BlenderSceneConverter *converter) 
+								KX_BlenderSceneConverter *converter,
+								bool libloading) 
 {
 	KX_GameObject *gameobj = NULL;
 	Scene *blenderscene = kxscene->GetBlenderScene();
@@ -2365,7 +2369,7 @@
 		Mesh* mesh = static_cast<Mesh*>(ob->data);
 		float center[3], extents[3];
 		float radius = my_boundbox_mesh((Mesh*) ob->data, center, extents);
-		RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,kxscene,converter);
+		RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,kxscene,converter, libloading);
 		
 		// needed for python scripting
 		kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
@@ -2728,7 +2732,8 @@
 							  RAS_IRenderTools* rendertools,
 							  RAS_ICanvas* canvas,
 							  KX_BlenderSceneConverter* converter,
-							  bool alwaysUseExpandFraming
+							  bool alwaysUseExpandFraming,
+							  bool libloading
 							  )
 {
 
@@ -2838,7 +2843,8 @@
 										base->object, 
 										kxscene, 
 										rendertools, 
-										converter);
+										converter,
+										libloading);
 										
 		bool isInActiveLayer = (blenderobject->lay & activeLayerBitInfo) !=0;
 		bool addobj=true;
@@ -2897,7 +2903,8 @@
 														blenderobject, 
 														kxscene, 
 														rendertools, 
-														converter);
+														converter,
+														libloading);
 										
 						// this code is copied from above except that
 						// object from groups are never in active layer

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.h	2012-07-19 21:55:16 UTC (rev 49072)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/BL_BlenderDataConversion.h	2012-07-20 06:34:31 UTC (rev 49073)
@@ -38,7 +38,7 @@
 #include "KX_PhysicsEngineEnums.h"
 #include "SCA_IInputDevice.h"
 
-class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter);
+class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter, bool libloading);
 
 void BL_ConvertBlenderObjects(struct Main* maggie,
 							  class KX_Scene* kxscene,
@@ -47,7 +47,8 @@
 							  class RAS_IRenderTools* rendertools,
 							  class RAS_ICanvas* canvas, 
 							  class KX_BlenderSceneConverter* sceneconverter, 
-							  bool alwaysUseExpandFraming
+							  bool alwaysUseExpandFraming,
+							  bool libloading=false
 							  );
 
 SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code);

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-19 21:55:16 UTC (rev 49072)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2012-07-20 06:34:31 UTC (rev 49073)
@@ -306,7 +306,8 @@
 
 void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
 											class RAS_IRenderTools* rendertools,
-											class RAS_ICanvas* canvas)
+											class RAS_ICanvas* canvas,
+											bool libloading)
 {
 	//find out which physics engine
 	Scene *blenderscene = destinationscene->GetBlenderScene();
@@ -375,7 +376,8 @@
 		rendertools,
 		canvas,
 		this,
-		m_alwaysUseExpandFraming
+		m_alwaysUseExpandFraming,
+		libloading
 		);
 
 	//These lookup are not needed during game
@@ -993,7 +995,7 @@
 	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]);
+		new_scene = status->GetEngine()->CreateScene((*scenes)[i], true);
 
 		if (new_scene)
 			merge_scenes->push_back(new_scene);
@@ -1112,7 +1114,7 @@
 		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);
+			RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)mesh, NULL, scene_merge, this, false); // For now only use the libloading option for scenes, which need to handle materials/shaders
 			scene_merge->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
 		}
 	}
@@ -1140,7 +1142,7 @@
 				scenes->push_back((Scene*)scene);
 			} else {
 				/* merge into the base  scene */
-				KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene);
+				KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene, true);
 				scene_merge->MergeScene(other);
 			
 				// RemoveScene(other); // Don't run this, it frees the entire scene converter data, just delete the scene
@@ -1577,7 +1579,7 @@
 		}
 	}
 	
-	RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)me, NULL, kx_scene, this);
+	RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)me, NULL, kx_scene, this, false);
 	kx_scene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
 	m_map_mesh_to_gamemesh.clear(); /* This is at runtime so no need to keep this, BL_ConvertMesh adds */
 	return meshobj;

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-19 21:55:16 UTC (rev 49072)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_BlenderSceneConverter.h	2012-07-20 06:34:31 UTC (rev 49073)
@@ -104,7 +104,8 @@
 	virtual void	ConvertScene(
 						class KX_Scene* destinationscene,
 						class RAS_IRenderTools* rendertools,
-						class RAS_ICanvas* canvas
+						class RAS_ICanvas* canvas,
+						bool libloading=false
 					);
 	virtual void RemoveScene(class KX_Scene *scene);
 

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_ConvertActuators.cpp	2012-07-19 21:55:16 UTC (rev 49072)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Converter/KX_ConvertActuators.cpp	2012-07-20 06:34:31 UTC (rev 49073)
@@ -523,7 +523,8 @@
 								editobact->me,
 								blenderobject,
 								scene,
-								converter
+								converter,
+								false
 								);
 
 						KX_SCA_ReplaceMeshActuator* tmpreplaceact

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2012-07-19 21:55:16 UTC (rev 49072)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2012-07-20 06:34:31 UTC (rev 49073)
@@ -64,7 +64,8 @@
 void KX_BlenderMaterial::Initialize(
 	KX_Scene *scene,
 	BL_Material *data,
-	GameSettings *game)
+	GameSettings *game,
+	int lightlayer)
 {
 	RAS_IPolyMaterial::Initialize(
 		data->texname[0],
@@ -88,6 +89,7 @@
 	mModified = 0;
 	mConstructed = false;
 	mPass = 0;
+	mLightLayer = lightlayer;
 	// --------------------------------
 	// RAS_IPolyMaterial variables...
 	m_flag |= RAS_BLENDERMAT;
@@ -179,14 +181,14 @@
 	}
 }
 
-void KX_BlenderMaterial::OnConstruction(int layer)
+void KX_BlenderMaterial::OnConstruction()
 {
 	if (mConstructed)
 		// when material are reused between objects
 		return;
 	
 	if (mMaterial->glslmat)
-		SetBlenderGLSLShader(layer);
+		SetBlenderGLSLShader();
 
 	InitTextures();
 
@@ -785,10 +787,19 @@
 	mMaterial->ref			= (float)(ref);
 }
 
-void KX_BlenderMaterial::SetBlenderGLSLShader(int layer)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list