[Bf-blender-cvs] [d7eeff2] fracture_modifier: another fix attempt for occasional loading crashes

Martin Felke noreply at git.blender.org
Fri Apr 1 16:30:58 CEST 2016


Commit: d7eeff23bf82c96879b2ec34ef77f3ef01d8d62a
Author: Martin Felke
Date:   Fri Apr 1 16:30:46 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd7eeff23bf82c96879b2ec34ef77f3ef01d8d62a

another fix attempt for occasional loading crashes

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

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

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

diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index aaf4edb..467dd30 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -410,9 +410,9 @@ static void free_shards(FractureModifierData *fmd)
 	}
 }
 
-static void free_modifier(FractureModifierData *fmd, bool do_free_seq)
+static void free_modifier(FractureModifierData *fmd, bool do_free_seq, bool do_free_rigidbody)
 {
-	free_simulation(fmd, do_free_seq, fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
+	free_simulation(fmd, do_free_seq, (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC) && do_free_rigidbody);
 
 	if (fmd->material_index_map)
 	{
@@ -481,11 +481,11 @@ static void free_modifier(FractureModifierData *fmd, bool do_free_seq)
 	}
 }
 
-static void freeData_internal(FractureModifierData *fmd, bool do_free_seq)
+static void freeData_internal(FractureModifierData *fmd, bool do_free_seq, bool do_free_rigidbody)
 {
 	if ((!fmd->refresh && !fmd->refresh_constraints) || (fmd->frac_mesh && fmd->frac_mesh->cancel == 1)) {
 		/* free entire modifier or when job has been cancelled */
-		free_modifier(fmd, do_free_seq);
+		free_modifier(fmd, do_free_seq, do_free_rigidbody);
 
 		if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED || fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
 		{
@@ -501,7 +501,7 @@ static void freeData_internal(FractureModifierData *fmd, bool do_free_seq)
 	else if (!fmd->refresh_constraints) {
 		/* refreshing all simulation data only, no refracture */
 		if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
-			free_simulation(fmd, false, true); // in this case keep the meshisland sequence!
+			free_simulation(fmd, false, do_free_rigidbody); // in this case keep the meshisland sequence!
 	}
 	else if (fmd->refresh_constraints) {
 		/* refresh constraints only */
@@ -513,7 +513,7 @@ static void freeData(ModifierData *md)
 {
 	FractureModifierData *fmd = (FractureModifierData *) md;
 
-	freeData_internal(fmd, true);
+	freeData_internal(fmd, true, false);
 
 	/*force deletion of meshshards here, it slips through improper state detection*/
 	/*here we know the modifier is about to be deleted completely*/
@@ -1517,7 +1517,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
 		{
 			fmd->frac_mesh->running = 0;
 			fmd->refresh = true;
-			freeData_internal(fmd, fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED);
+			freeData_internal(fmd, fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED, true);
 			fmd->frac_mesh = NULL;
 			fmd->refresh = false;
 			MEM_freeN(points.points);
@@ -3386,7 +3386,7 @@ static DerivedMesh *output_dm(FractureModifierData* fmd, DerivedMesh *dm, Object
 		if (fmd->visible_mesh == NULL && fmd->visible_mesh_cached == NULL) {
 			/* oops, something went definitely wrong... */
 			fmd->refresh = true;
-			freeData_internal(fmd, fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED);
+			freeData_internal(fmd, fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED, true);
 			fmd->visible_mesh_cached = NULL;
 			fmd->refresh = false;
 		}
@@ -3629,7 +3629,7 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 			(fmd->refresh_constraints && fmd->execute_threaded && fmd->frac_mesh && fmd->frac_mesh->running == 0))
 		{
 			/* if we changed the fracture parameters */
-			freeData_internal(fmd, fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED);
+			freeData_internal(fmd, fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED, true);
 
 			/* 2 cases, we can have a visible mesh or a cached visible mesh, the latter primarily when loading blend from file or using halving */
 			/* free cached mesh in case of "normal refracture here if we have a visible mesh, does that mean REfracture ?*/
@@ -3875,7 +3875,7 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
 			if (fmd->reset_shards)
 			{
 				free_simulation(fmd, true, true);
-				free_modifier(fmd, true);
+				free_modifier(fmd, true, true);
 				fmd->last_frame = 1;
 			}
 			else




More information about the Bf-blender-cvs mailing list