[Bf-blender-cvs] [c04b4d3] fracture_modifier: fixes: activating clusters via percentage, add meshisland id as name in fracture too, load crash fix

Martin Felke noreply at git.blender.org
Fri Sep 9 14:12:40 CEST 2016


Commit: c04b4d393b88cc50a478fe20a9266b6f975e8171
Author: Martin Felke
Date:   Fri Sep 9 13:33:34 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBc04b4d393b88cc50a478fe20a9266b6f975e8171

fixes: activating clusters via percentage, add meshisland id as name in fracture too, load crash fix

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

M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ac42878..a4d0f50 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -3199,6 +3199,28 @@ static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int r
 	mi->rigidbody->flag &= ~(RBO_FLAG_NEEDS_VALIDATE | RBO_FLAG_NEEDS_RESHAPE);
 }
 
+static void activateCluster(MeshIsland *mi, int particle_index, RigidBodyWorld *rbw, Object *ob) {
+	RigidBodyShardCon *con;
+	int i = 0;
+	for (i = 0; i < mi->participating_constraint_count; i++)
+	{
+		con = mi->participating_constraints[i];
+		if (con->physics_constraint && con->mi1->particle_index == particle_index) {
+			if (con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+				activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
+				activateCluster(con->mi1, particle_index, rbw, ob);
+			}
+		}
+
+		if (con->physics_constraint && con->mi2->particle_index == particle_index) {
+			if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+				activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+				activateCluster(con->mi2, particle_index, rbw, ob);
+			}
+		}
+	}
+}
+
 static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, MeshIsland *mi, RigidBodyWorld *rbw, int breaking_percentage)
 {
 	int broken_cons = 0, cons = 0, i = 0, cluster_cons = 0, broken_cluster_cons = 0;
@@ -3239,9 +3261,17 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 					if (fmd->use_breaking)
 					{
 						if (con->physics_constraint) {
+
 							RB_constraint_set_enabled(con->physics_constraint, false);
-							activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
-							activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+							if (con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+								activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
+								activateCluster(con->mi1, mi->particle_index, rbw, ob);
+							}
+
+							if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+								activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+								activateCluster(con->mi2, mi->particle_index, rbw, ob);
+							}
 						}
 					}
 				}
@@ -4454,9 +4484,11 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
 	}
 	else if (rbw->ltime == startframe)
 	{
-		bool did_it = restoreKinematic(rbw);
-		if (did_it)
-			rigidbody_update_simulation(scene, rbw, true);
+		/*bool did_it = */restoreKinematic(rbw);
+		//if (did_it)
+
+		//make 1st run like later runs... hack...
+		rigidbody_update_simulation(scene, rbw, true);
 	}
 
 	/* advance simulation, we can only step one frame forward */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 0ffc34c..430a719 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5287,7 +5287,12 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
 				sh = shards[i]; //skip "empty" shards
 				while (sh->shard_id < mi->id)
 				{
-					sh = sh->next;
+					if (sh->next) {
+						sh = sh->next;
+					}
+					else {
+						break;
+					}
 				}
 
 				if (sh)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 58ac0d4..1d3987d 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1853,6 +1853,7 @@ static float do_setup_meshisland(FractureModifierData *fmd, Object *ob, int totv
 	mi->thresh_weight = 0.0f;
 	mi->ground_weight = 0.0f;
 	mi->id = id;
+	snprintf(mi->name, 64, "%d", mi->id);
 	mi->vertices = verts; /*those are temporary only !!! */
 	mi->vertco = MEM_mallocN(sizeof(float) * 3 * totvert, "mi->vertco");
 	memcpy(mi->vertco, vertco, 3 * totvert * sizeof(float));
@@ -2240,7 +2241,7 @@ static void halve(FractureModifierData *rmd, Object *ob, int minsize, BMesh **bm
 
 static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, DerivedMesh *dm)
 {
-	int minsize = 1000;
+	int minsize = 100;
 	BMesh *bm_work;
 	BMVert *vert, **orig_start;
 	BMIter iter;
@@ -2284,6 +2285,9 @@ static void do_constraint(FractureModifierData* fmd, MeshIsland *mi1, MeshIsland
 	rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, con_type, true);
 	rbsc->mi1 = mi1;
 	rbsc->mi2 = mi2;
+
+	snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
+
 	if (thresh == 0 || fmd->use_breaking == false) {
 		rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
 	}
@@ -3213,6 +3217,7 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 	mat4_to_loc_quat(dummyloc, rot, ob->obmat);
 	copy_qt_qt(mi->rot, rot);
 	mi->id = s->shard_id;
+	snprintf(mi->name, 64, "%d", mi->id);
 
 	if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 	{




More information about the Bf-blender-cvs mailing list