[Bf-blender-cvs] [d21c1dc] fracture_modifier: partial material deletion fix for Fracture Modifier, effectively keeping necessary slots, else the mesh gets messed up which leads to crashes, and... making visible_mesh_cached now necessary for returning a dm out of the modifier

Martin Felke noreply at git.blender.org
Fri Mar 13 10:34:23 CET 2015


Commit: d21c1dc1b44c6bd8220a326b0f0bdc6b2bd74883
Author: Martin Felke
Date:   Fri Mar 13 10:32:54 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd21c1dc1b44c6bd8220a326b0f0bdc6b2bd74883

partial material deletion fix for Fracture Modifier, effectively keeping necessary slots, else the mesh gets messed up which leads to crashes, and... making visible_mesh_cached now necessary for returning a dm out of the modifier

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

M	source/blender/blenkernel/intern/material.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 981064b..9f3b405 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -45,6 +45,7 @@
 #include "DNA_customdata_types.h"
 #include "DNA_ID.h"
 #include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_node_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
@@ -56,6 +57,7 @@
 
 #include "BKE_animsys.h"
 #include "BKE_displist.h"
+#include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
 #include "BKE_icons.h"
 #include "BKE_image.h"
@@ -63,6 +65,7 @@
 #include "BKE_main.h"
 #include "BKE_material.h"
 #include "BKE_mesh.h"
+#include "BKE_modifier.h"
 #include "BKE_scene.h"
 #include "BKE_node.h"
 #include "BKE_curve.h"
@@ -1229,6 +1232,7 @@ bool object_remove_material_slot(Object *ob)
 	Object *obt;
 	short *totcolp;
 	short a, actcol;
+	FractureModifierData *fmd;
 	
 	if (ob == NULL || ob->totcol == 0) {
 		return false;
@@ -1307,6 +1311,14 @@ bool object_remove_material_slot(Object *ob)
 		}
 	}
 
+	/* also check the Fracture Modifier stored Derivedmesh, its polys may point to invalid index by now */
+	fmd = (FractureModifierData *)modifiers_findByType(ob, eModifierType_Fracture);
+	if (fmd && fmd->visible_mesh_cached) {
+		/* this effectively removes materials, but regenerates atleast 2 of them (as being necessary for modifier,
+		 * thus avoiding crashes and messing up the mesh, an ugly solution but better than crash... */
+		fmd->refresh = true;
+	}
+
 	return true;
 }
 
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 445e68b..2a4d092 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2813,6 +2813,7 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 		}
 	}
 
+#if 0
 	if ((fmd->visible_mesh != NULL) && exploOK) {
 		DerivedMesh *dm_final;
 		/* HERE Hide facepairs closer than dist X*/
@@ -2826,7 +2827,10 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 		}
 		return dm_final;
 	}
-	else if ((fmd->visible_mesh_cached != NULL) && exploOK) {
+	else
+#endif
+
+	if ((fmd->visible_mesh_cached != NULL) && exploOK) {
 		DerivedMesh *dm_final;
 
 		if (fmd->autohide_dist > 0 && fmd->face_pairs) {




More information about the Bf-blender-cvs mailing list