[Bf-blender-cvs] [6a47330] master: Fix T37920: BGE LibLoad failed for meshes with no materials

Campbell Barton noreply at git.blender.org
Mon Dec 30 05:50:19 CET 2013


Commit: 6a473305af22468abfc4c4f8f3002dc0a97fffd7
Author: Campbell Barton
Date:   Mon Dec 30 15:49:13 2013 +1100
https://developer.blender.org/rB6a473305af22468abfc4c4f8f3002dc0a97fffd7

Fix T37920: BGE LibLoad failed for meshes with no materials

===================================================================

M	source/gameengine/Converter/KX_BlenderSceneConverter.cpp
M	source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
M	source/gameengine/Rasterizer/RAS_MaterialBucket.h
M	source/gameengine/Rasterizer/RAS_MeshObject.cpp

===================================================================

diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index c58746a..1d7d3eb 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -1313,6 +1313,8 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
 
 						int size_before = obs->GetCount();
 
+						gameobj->RemoveMeshes();
+
 						/* Eventually calls RemoveNodeDestructObject
 						 * frees m_map_gameobject_to_blender from UnregisterGameObject */
 						scene->RemoveObject(gameobj);
diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
index 0c71552..b7a5804 100644
--- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
+++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
@@ -558,7 +558,7 @@ RAS_MeshSlot* RAS_MaterialBucket::CopyMesh(RAS_MeshSlot *ms)
 	return &m_meshSlots.back();
 }
 
-void RAS_MaterialBucket::RemoveMesh(RAS_MeshSlot* ms)
+void RAS_MaterialBucket::RemoveMeshSlot(RAS_MeshSlot *ms)
 {
 	list<RAS_MeshSlot>::iterator it;
 
@@ -570,6 +570,20 @@ void RAS_MaterialBucket::RemoveMesh(RAS_MeshSlot* ms)
 	}
 }
 
+void RAS_MaterialBucket::RemoveMesh(RAS_MeshObject *mesh)
+{
+	list<RAS_MeshSlot>::iterator it;
+	it=m_meshSlots.begin();
+	while (it != m_meshSlots.end()) {
+		if ((*it).m_mesh == mesh) {
+			m_meshSlots.erase(it++);
+		}
+		else {
+			++it;
+		}
+	}
+}
+
 list<RAS_MeshSlot>::iterator RAS_MaterialBucket::msBegin()
 {
 	return m_meshSlots.begin();
diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.h b/source/gameengine/Rasterizer/RAS_MaterialBucket.h
index 007fdf2..a55bf1d 100644
--- a/source/gameengine/Rasterizer/RAS_MaterialBucket.h
+++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.h
@@ -228,7 +228,8 @@ public:
 
 	class RAS_MeshSlot*	AddMesh(int numverts);
 	class RAS_MeshSlot* CopyMesh(class RAS_MeshSlot *ms);
-	void				RemoveMesh(class RAS_MeshSlot* ms);
+	void				RemoveMeshSlot(class RAS_MeshSlot *ms);
+	void				RemoveMesh(class RAS_MeshObject *mesh);
 	void				Optimize(MT_Scalar distance);
 	void				ActivateMesh(RAS_MeshSlot* slot)
 	{
diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
index ff909b5..fb13596 100644
--- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp
+++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
@@ -458,9 +458,14 @@ void RAS_MeshObject::RemoveFromBuckets(void *clientobj)
 		if (!msp)
 			continue;
 
+		/* see [#37920] */
+#if 0
 		RAS_MeshSlot *ms = *msp;
 
-		it->m_bucket->RemoveMesh(ms);
+		it->m_bucket->RemoveMeshSlot(ms);
+#else
+		it->m_bucket->RemoveMesh(this);
+#endif
 		it->m_slots.remove(clientobj);
 	}
 }




More information about the Bf-blender-cvs mailing list