[Bf-blender-cvs] [c5e7265b1e9] fracture_modifier: fix for infinite recursion with cluster percentage activation

Martin Felke noreply at git.blender.org
Thu Nov 16 20:29:02 CET 2017


Commit: c5e7265b1e9f87272beabb7dab85e3f516358772
Author: Martin Felke
Date:   Thu Nov 16 20:28:39 2017 +0100
Branches: fracture_modifier
https://developer.blender.org/rBc5e7265b1e9f87272beabb7dab85e3f516358772

fix for infinite recursion with cluster percentage activation

also remove kinematic state of stopped shards (if object is triggered and not kinematic) at start frame now

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

M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 47298d8d21f..caf5dcf61ca 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4513,14 +4513,16 @@ static void activateCluster(MeshIsland *mi, int particle_index, RigidBodyWorld *
 	for (i = 0; i < mi->participating_constraint_count; i++)
 	{
 		con = mi->participating_constraints[i];
-		if (con->physics_constraint && con->mi1->particle_index == particle_index || particle_index == -1) {
+		if (con->physics_constraint && con->mi1->particle_index == particle_index) /*|| particle_index == -1)*/
+		{
 			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 || particle_index == -1) {
+		if (con->physics_constraint && con->mi2->particle_index == particle_index) /*|| particle_index == -1)*/
+		{
 			if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
 				activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
 				activateCluster(con->mi2, particle_index, rbw, ob);
@@ -5383,7 +5385,7 @@ static bool restoreKinematic(RigidBodyWorld *rbw)
 			triggered = go->ob->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION;
 
 			FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(go->ob, eModifierType_Fracture);
-			if (fmd && kinematic && triggered)
+			if (fmd && triggered)
 			{
 				MeshIsland* mi;
 				for (mi = fmd->meshIslands.first; mi; mi = mi->next)
@@ -5391,7 +5393,15 @@ static bool restoreKinematic(RigidBodyWorld *rbw)
 					if (mi->rigidbody)
 					{
 						mi->rigidbody->flag &= ~RBO_FLAG_KINEMATIC_REBUILD;
-						mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
+						if (kinematic)
+						{
+							mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
+						}
+						else
+						{
+							//might happen if being hit by a stop trigger, remove kinematic here in this case
+							mi->rigidbody->flag &= ~RBO_FLAG_KINEMATIC;
+						}
 						mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
 						did_it = true;
 					}



More information about the Bf-blender-cvs mailing list