[Bf-blender-cvs] [d3b52a6cbcc] fracture_modifier: added ghost stop triggers

Martin Felke noreply at git.blender.org
Thu May 24 14:45:54 CEST 2018


Commit: d3b52a6cbcc5b086359816cf7b581f3f7438c981
Author: Martin Felke
Date:   Thu May 24 14:45:27 2018 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd3b52a6cbcc5b086359816cf7b581f3f7438c981

added ghost stop triggers

stopped shards also will get their constraints disabled and still attached partners will be stopped too

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 51db95539b6..2715682d9ae 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -103,7 +103,7 @@ static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED_rbw, Mesh
 static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bool rebuild);
 static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw, float ctime);
 static void DM_mesh_boundbox(DerivedMesh *bm, float r_loc[3], float r_size[3]);
-static void test_deactivate_rigidbody(RigidBodyOb *rbo);
+static void test_deactivate_rigidbody(RigidBodyOb *rbo, MeshIsland *mi);
 static float box_volume(float size[3]);
 
 #endif
@@ -4119,7 +4119,7 @@ static bool do_activate(Object* ob, Object *ob2, MeshIsland *mi_compare, RigidBo
 			if ((mi_compare == mi) && antiValid && activate)
 			{
 				if (rbo->physics_object) {
-					test_deactivate_rigidbody(rbo);
+					test_deactivate_rigidbody(rbo, mi);
 				}
 			}
 		}
@@ -4140,7 +4140,7 @@ static bool do_activate(Object* ob, Object *ob2, MeshIsland *mi_compare, RigidBo
 
 		if (rbo && antiValid && activate)
 		{
-			test_deactivate_rigidbody(rbo);
+			test_deactivate_rigidbody(rbo, NULL);
 		}
 	}
 
@@ -4308,8 +4308,11 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		          ((ob1->rigidbody_object->type == RBO_TYPE_ACTIVE) && (ob2->rigidbody_object->type == RBO_TYPE_ACTIVE)));
 	}
 
-	if (validOb || (ob1->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE) || (ob2->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE) ||
-	   (ob1->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER) || (ob2->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER))
+	if (validOb || ((colgroup_check(ob1->rigidbody_object->col_groups, ob2->rigidbody_object->col_groups) &&
+	               ((ob1->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE) ||
+	                (ob2->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE) ||
+                    (ob1->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER) ||
+	                (ob2->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER)))))
 	{
 		//override for 2 regular rigidbodies to enable ghost trigger functionality; else bullet wont call this again here with "activate == true"
 
@@ -4317,14 +4320,18 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		if (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
 		{
 			bool override = activate || (!mi1 && !mi2 && (ob2->rigidbody_object->flag & RBO_FLAG_IS_GHOST) &&
-			                                             (ob2->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER));
+			                                             (ob2->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER)) ||
+			                ((ob2->rigidbody_object->flag & RBO_FLAG_IS_GHOST) && (ob2->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER));
+
 			check_activate = do_activate(ob1, ob2, mi1, rbw, mi2, override);
 		}
 
 		if (ob2->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
 		{
 			bool override = activate || (!mi1 && !mi2 && (ob1->rigidbody_object->flag & RBO_FLAG_IS_GHOST) &&
-			                                             (ob1->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER));
+			                                             (ob1->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER)) ||
+			                ((ob1->rigidbody_object->flag & RBO_FLAG_IS_GHOST) && (ob1->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER));
+
 			check_activate = do_activate(ob2, ob1, mi2, rbw, mi1, override);
 		}
 	}
@@ -4844,13 +4851,13 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 	}
 }
 
-static void test_deactivate_rigidbody(RigidBodyOb *rbo)
+static void test_deactivate_rigidbody(RigidBodyOb *rbo, MeshIsland* mi)
 {
 	//make kinematic again (un-trigger)
 	//printf("Untrigger\n");
 	//if (rbo->physics_object)
 
-	if (rbo->physics_object) {
+	if (rbo->physics_object && ((rbo->flag & RBO_FLAG_KINEMATIC) == 0)) {
 		float lin_vel[3], ang_vel[3];
 
 		RB_body_get_linear_velocity(rbo->physics_object, lin_vel);
@@ -4864,9 +4871,36 @@ static void test_deactivate_rigidbody(RigidBodyOb *rbo)
 			//rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
 			//RB_body_deactivate(rbo->physics_object);
 
+			int i = 0;
+
 			rbo->flag |= RBO_FLAG_KINEMATIC;
 			rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
 			rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
+
+			if (mi != NULL)
+			{
+				for (i = 0; i < mi->participating_constraint_count; i++)
+				{
+					RigidBodyShardCon *con;
+					con = mi->participating_constraints[i];
+
+					if (con && con->physics_constraint && RB_constraint_is_enabled(con->physics_constraint))
+					{
+						RigidBodyOb *rb1 = con->mi1->rigidbody;
+						RigidBodyOb *rb2 = con->mi2->rigidbody;
+
+						RB_constraint_set_enabled(con->physics_constraint, false);
+
+						rb1->flag |= RBO_FLAG_KINEMATIC;
+						rb1->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+						rb1->flag |= RBO_FLAG_NEEDS_VALIDATE;
+
+						rb2->flag |= RBO_FLAG_KINEMATIC;
+						rb2->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+						rb2->flag |= RBO_FLAG_NEEDS_VALIDATE;
+					}
+				}
+			}
 		}
 	}
 }



More information about the Bf-blender-cvs mailing list