[Bf-blender-cvs] [96aac3f] fracture_modifier: rigidbody trigger activation fix, works better with constraints now and let objects with passive group appear as active

Martin Felke noreply at git.blender.org
Wed Nov 12 11:46:52 CET 2014


Commit: 96aac3fa6faca1a948a2354714b90cbeab16a22e
Author: Martin Felke
Date:   Wed Nov 12 11:46:36 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB96aac3fa6faca1a948a2354714b90cbeab16a22e

rigidbody trigger activation fix, works better with constraints now and let objects with passive group appear as active

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c8c7fd2..64cf013 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1692,7 +1692,6 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		if (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
 		{
 			bool valid = true, valid2 = true;
-			RigidBodyShardCon *con;
 			fmd1 = (FractureModifierData*)modifiers_findByType(ob1, eModifierType_Fracture);
 			valid = valid && (fmd1 != NULL);
 			valid = valid && (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
@@ -1706,19 +1705,16 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 				for (mi = fmd1->meshIslands.first; mi; mi = mi->next)
 				{
 					RigidBodyOb* rbo = mi->rigidbody;
-					if ((mi->rigidbody->flag & RBO_FLAG_KINEMATIC) && ((mi1 == mi)))
+					if ((rbo->flag & RBO_FLAG_KINEMATIC) && ((mi1 == mi)))
 					{
-						rbo->flag &= ~RBO_FLAG_KINEMATIC;
-						rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
-						rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
-					}
-				}
+						if (rbo->physics_object) {
+							rbo->flag &= ~RBO_FLAG_KINEMATIC;
+							RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
+							RB_body_set_kinematic_state(rbo->physics_object, false);
+							rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
+						}
 
-				for (con = fmd1->meshConstraints.first; con; con = con->next)
-				{
-					RB_dworld_remove_constraint(rbw->physics_world, con->physics_constraint);
-					con->flag |= RBC_FLAG_NEEDS_VALIDATE;
-					con->flag |= RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
+					}
 				}
 			}
 			else if (!fmd1)
@@ -1728,7 +1724,8 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 				if (rbo)
 				{
 					rbo->flag &= ~RBO_FLAG_KINEMATIC;
-					rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+					RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
+					RB_body_set_kinematic_state(rbo->physics_object, false);
 					rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
 				}
 			}
@@ -1737,7 +1734,6 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		if (ob2->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
 		{
 			bool valid = true, valid2 = true;
-			RigidBodyShardCon *con;
 			fmd2 = (FractureModifierData*)modifiers_findByType(ob2, eModifierType_Fracture);
 			valid = valid && (fmd2 != NULL);
 			valid = valid && (ob2->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
@@ -1752,20 +1748,16 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 				{
 					RigidBodyOb* rbo = mi->rigidbody;
 
-					if ((mi->rigidbody->flag & RBO_FLAG_KINEMATIC) && ((mi2 == mi)))
+					if ((rbo->flag & RBO_FLAG_KINEMATIC) && ((mi2 == mi)))
 					{
-						rbo->flag &= ~RBO_FLAG_KINEMATIC;
-						rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
-						rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
+						if (rbo->physics_object) {
+							rbo->flag &= ~RBO_FLAG_KINEMATIC;
+							RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
+							RB_body_set_kinematic_state(rbo->physics_object, false);
+							rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
+						}
 					}
 				}
-
-				for (con = fmd2->meshConstraints.first; con; con = con->next)
-				{
-					RB_dworld_remove_constraint(rbw->physics_world, con->physics_constraint);
-					con->flag |= RBC_FLAG_NEEDS_VALIDATE;
-					con->flag |= RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
-				}
 			}
 			else if (!fmd2)
 			{
@@ -1774,7 +1766,8 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 				if (rbo)
 				{
 					rbo->flag &= ~RBO_FLAG_KINEMATIC;
-					rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+					RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
+					RB_body_set_kinematic_state(rbo->physics_object, false);
 					rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
 				}
 			}
@@ -1964,10 +1957,10 @@ RigidBodyOb *BKE_rigidbody_create_shard(Scene *scene, Object *ob, MeshIsland *mi
 
 	/* make rigidbody object settings */
 	if (ob->rigidbody_object == NULL) {
-		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, mi->ground_weight > 0.5f ? RBO_TYPE_PASSIVE : RBO_TYPE_ACTIVE);
+		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE);
 	}
 	else {
-		ob->rigidbody_object->type = mi->ground_weight > 0.5f ? RBO_TYPE_PASSIVE : RBO_TYPE_ACTIVE;
+		ob->rigidbody_object->type = RBO_TYPE_ACTIVE;
 		ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE;
 	}




More information about the Bf-blender-cvs mailing list