[Bf-blender-cvs] [3392741] fracture_modifier: dynamic fracture: do reset after settings changes and clean up constraints now too in dynamic fracture events

Martin Felke noreply at git.blender.org
Mon Jun 1 21:29:30 CEST 2015


Commit: 3392741d1921e0b6c98b8819d0703ab356ff28b1
Author: Martin Felke
Date:   Wed May 27 18:29:25 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB3392741d1921e0b6c98b8819d0703ab356ff28b1

dynamic fracture: do reset after settings changes and clean up constraints now too in dynamic fracture events

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

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

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

diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index ecc9ba8..268d4a9 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -431,10 +431,16 @@ static void rna_Modifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Point
 	if (md && md->type == eModifierType_Fracture)
 	{
 		FractureModifierData *fmd = (FractureModifierData*)md;
-		if (fmd->refresh)
+		if (fmd->refresh && fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
 		{
 			return;
 		}
+		else if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+		{
+			// do purge
+			fmd->last_frame = INT_MAX;
+			fmd->refresh = true;
+		}
 	}
 
 	DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 9e7afe5..4102815 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -292,6 +292,10 @@ static void free_constraints(FractureModifierData *fmd)
 	while (fmd->meshConstraints.first) {
 		rbsc = fmd->meshConstraints.first;
 		BLI_remlink(&fmd->meshConstraints, rbsc);
+		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+		{
+			BKE_rigidbody_remove_shard_con(fmd->modifier.scene, rbsc);
+		}
 		MEM_freeN(rbsc);
 		rbsc = NULL;
 	}
@@ -2825,7 +2829,7 @@ static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob,
 	if (is_parent)
 	{
 		copy_v3_v3(centr, mi->centroid);
-		//mul_qt_v3(rot, centr);
+		mul_qt_v3(rot, centr);
 		add_v3_v3(centr, loc);
 	}
 	else
@@ -2923,7 +2927,14 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 		mi->locs = MEM_mallocN(sizeof(float)*3, "mi->locs");
 		mi->rots = MEM_mallocN(sizeof(float)*4, "mi->rots");
 		mi->frame_count = 0;
-		mi->start_frame = fmd->modifier.scene->rigidbody_world->pointcache->startframe;
+		if (fmd->modifier.scene->rigidbody_world)
+		{
+			mi->start_frame = fmd->modifier.scene->rigidbody_world->pointcache->startframe;
+		}
+		else
+		{
+			mi->start_frame = 1;
+		}
 	}
 	else
 	{
@@ -3675,6 +3686,7 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
 			 *then update*/
 			if (frame < fmd->current_mi_entry->prev->frame + 1)
 			{
+				free_constraints(fmd);
 				get_prev_entries(fmd);
 				fmd->modifier.scene->rigidbody_world->object_changed = true;
 			}
@@ -3685,6 +3697,7 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
 			/*forward playback*/
 			if (frame >= fmd->current_mi_entry->frame)
 			{
+				free_constraints(fmd);
 				get_next_entries(fmd);
 				fmd->modifier.scene->rigidbody_world->object_changed = true;
 			}
@@ -3711,6 +3724,7 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
 
 			if (count > 0)
 			{
+				free_constraints(fmd);
 				printf("REFRESH: %s \n", ob->id.name);
 				fmd->modifier.scene->rigidbody_world->object_changed = true;
 				fmd->refresh = true;
@@ -3719,6 +3733,7 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
 
 			if (fmd->update_dynamic)
 			{
+				free_constraints(fmd);
 				printf("ADD NEW 2: %s \n", ob->id.name);
 				fmd->update_dynamic = false;
 				add_new_entries(fmd, dm, ob);




More information about the Bf-blender-cvs mailing list