From 6a473305af22468abfc4c4f8f3002dc0a97fffd7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 30 Dec 2013 15:49:13 +1100 Subject: [PATCH] Fix T37920: BGE LibLoad failed for meshes with no materials --- .../Converter/KX_BlenderSceneConverter.cpp | 2 ++ .../gameengine/Rasterizer/RAS_MaterialBucket.cpp | 16 +++++++++++++++- .../gameengine/Rasterizer/RAS_MaterialBucket.h | 3 ++- source/gameengine/Rasterizer/RAS_MeshObject.cpp | 7 ++++++- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index c58746a22c1..1d7d3eba617 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 0c715524218..b7a5804c069 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::iterator it; @@ -570,6 +570,20 @@ void RAS_MaterialBucket::RemoveMesh(RAS_MeshSlot* ms) } } +void RAS_MaterialBucket::RemoveMesh(RAS_MeshObject *mesh) +{ + list::iterator it; + it=m_meshSlots.begin(); + while (it != m_meshSlots.end()) { + if ((*it).m_mesh == mesh) { + m_meshSlots.erase(it++); + } + else { + ++it; + } + } +} + list::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 007fdf240c4..a55bf1d1ba9 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 ff909b5955f..fb13596890f 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); } }