[Bf-blender-cvs] [b306d0d] fracture_modifier: had to disable trigger of constrained object by other non-triggers, this lead to permanent bullet crashes
Martin Felke
noreply at git.blender.org
Thu Nov 6 19:06:15 CET 2014
Commit: b306d0de396373ef66038234a6b957824e008027
Author: Martin Felke
Date: Thu Nov 6 19:06:08 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb306d0de396373ef66038234a6b957824e008027
had to disable trigger of constrained object by other non-triggers, this lead to permanent bullet crashes
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 1ad29aa..58a19bb 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1461,7 +1461,7 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
}
}
}
- if (rbc->physics_constraint == NULL || rebuild || rbc->flag & RBC_FLAG_USE_KINEMATIC_DEACTIVATION) {
+ if (rbc->physics_constraint == NULL || rebuild || (rbc->flag & RBC_FLAG_USE_KINEMATIC_DEACTIVATION)) {
/* remove constraint if it already exists before creating a new one */
if (rbc->physics_constraint) {
@@ -1630,57 +1630,95 @@ static int filterCallback(void* world, void* island1, void* island2) {
{
MeshIsland *mi;
ob1 = rbw->objects[ob_index1];
+ ob2 = rbw->objects[ob_index2];
+
if (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
{
+ bool valid = true, valid2 = true;
RigidBodyShardCon *con;
fmd1 = (FractureModifierData*)modifiers_findByType(ob1, eModifierType_Fracture);
- for (mi = fmd1->meshIslands.first; mi; mi = mi->next)
+ valid = valid && (fmd1 != NULL);
+ valid = valid && (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
+ valid = valid && (ob2->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
+
+ valid2 = valid2 && (fmd1->use_constraints == false);
+
+ if (valid || valid2)
{
- RigidBodyOb* rbo = mi->rigidbody;
- if (mi->rigidbody->flag & RBO_FLAG_KINEMATIC)
+ for (mi = fmd1->meshIslands.first; mi; mi = mi->next)
+ {
+ RigidBodyOb* rbo = mi->rigidbody;
+ if (mi->rigidbody->flag & RBO_FLAG_KINEMATIC)
+ {
+ rbo->flag &= ~RBO_FLAG_KINEMATIC;
+ rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+ 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)
+ {
+ RigidBodyOb* rbo = ob1->rigidbody_object;
+
+ if (rbo)
{
rbo->flag &= ~RBO_FLAG_KINEMATIC;
rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
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);
- /*RB_constraint_delete(con->physics_constraint);
- con->physics_constraint = NULL;*/
- con->flag |= RBC_FLAG_NEEDS_VALIDATE;
- con->flag |= RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
- }
}
- ob2 = rbw->objects[ob_index2];
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);
+ valid = valid && (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION);
- for (mi = fmd2->meshIslands.first; mi; mi = mi->next)
+ valid2 = valid2 && (fmd2->use_constraints == false);
+
+ if (valid || valid2)
{
- RigidBodyOb* rbo = mi->rigidbody;
+ for (mi = fmd2->meshIslands.first; mi; mi = mi->next)
+ {
+ RigidBodyOb* rbo = mi->rigidbody;
+
+ if (mi->rigidbody->flag & RBO_FLAG_KINEMATIC)
+ {
+ rbo->flag &= ~RBO_FLAG_KINEMATIC;
+ rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
+ rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
+ }
+ }
- if (mi->rigidbody->flag & RBO_FLAG_KINEMATIC)
+ 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)
+ {
+ RigidBodyOb* rbo = ob2->rigidbody_object;
+
+ if (rbo)
{
rbo->flag &= ~RBO_FLAG_KINEMATIC;
rbo->flag |= RBO_FLAG_KINEMATIC_REBUILD;
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);
- /*RB_constraint_delete(con->physics_constraint);
- con->physics_constraint = NULL;*/
- con->flag |= RBC_FLAG_NEEDS_VALIDATE;
- con->flag |= RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
- }
}
}
@@ -3027,7 +3065,6 @@ static void restoreKinematic(RigidBodyWorld *rbw)
if (fmd)
{
MeshIsland* mi;
- RigidBodyShardCon* con;
for (mi = fmd->meshIslands.first; mi; mi = mi->next)
{
if (mi->rigidbody)
More information about the Bf-blender-cvs
mailing list