Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-12-30 08:49:13 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-12-30 08:49:13 +0400
commit6a473305af22468abfc4c4f8f3002dc0a97fffd7 (patch)
treebd908052010f661a93ff3cfeb356490cb391f521 /source
parent0d6ae3fda2e5a3dbde941b6985e6895a42c71b9e (diff)
Fix T37920: BGE LibLoad failed for meshes with no materials
Diffstat (limited to 'source')
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp2
-rw-r--r--source/gameengine/Rasterizer/RAS_MaterialBucket.cpp16
-rw-r--r--source/gameengine/Rasterizer/RAS_MaterialBucket.h3
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.cpp7
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<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 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);
}
}