[Bf-blender-cvs] [eb8af75] fracture_modifier: further attempt to fix "plastic constraint" logic (external fracturing mode only)
Martin Felke
noreply at git.blender.org
Tue Jan 19 19:03:15 CET 2016
Commit: eb8af755ddae51d9368a386ee8bc2dad7a59fbb6
Author: Martin Felke
Date: Tue Jan 19 19:02:55 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBeb8af755ddae51d9368a386ee8bc2dad7a59fbb6
further attempt to fix "plastic constraint" logic (external fracturing mode only)
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 0872da2..309ef0d 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1583,17 +1583,17 @@ static void rigidbody_set_springs_active(RigidBodyShardCon *rbc, bool active)
}
else
{
- RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, false);
+ RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->flag & RBC_FLAG_USE_SPRING_X);
RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, 0);
- RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, 0);
+ RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_damping_x);
- RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, false);
+ RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->flag & RBC_FLAG_USE_SPRING_Y);
RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0);
- RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0);
+ RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_damping_y);
- RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, false);
+ RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->flag & RBC_FLAG_USE_SPRING_Z);
RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
- RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
+ RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_damping_z);
}
}
}
@@ -1609,7 +1609,6 @@ static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
rbRigidBody *rb1;
rbRigidBody *rb2;
-
if (rbc && rbc->mi1 && rbc->mi2)
{
rb1 = rbc->mi1->rigidbody->physics_object;
@@ -3105,41 +3104,52 @@ static void handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
}
}
-static void handle_plastic_breaking_constraint(RigidBodyShardCon *con, MeshIsland *mi1, MeshIsland *mi2)
+static void handle_plastic_breaking_constraint(RigidBodyShardCon *rbsc, RigidBodyShardCon *con)
{
- bool same = (((con->mi1 == mi1 && con->mi2 == mi2) || (con->mi1 == mi2 && con->mi2 == mi1)));
+ bool same = (((con->mi1 == rbsc->mi1 && con->mi2 == rbsc->mi2)) || ((con->mi1 == rbsc->mi2 && con->mi2 == rbsc->mi1)));
if (con->physics_constraint && same)
{
- if (con->type == RBC_TYPE_6DOF_SPRING)
+ if (rbsc->type == RBC_TYPE_6DOF_SPRING)
{
- if (con->flag & RBC_FLAG_USE_PLASTIC)
+ if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
{
- if (!(con->flag & RBC_FLAG_PLASTIC_ACTIVE))
+ /* I am plastic, the other is... */
+ /* doesnt matter, nothing should happen to the other con */
+ }
+ else
+ { /* I am NOT plastic and a spring */
+ /* so the other needs to break */
+ RB_constraint_set_enabled(con->physics_constraint, false);
+ }
+ }
+ else
+ {
+ /*I am no spring and the other is plastic*/
+ /*if i am broken, activate the other if inactive, else break it */
+ if (con->type == RBC_TYPE_6DOF_SPRING && con->flag & RBC_FLAG_USE_PLASTIC)
+ {
+ if (con->flag & RBC_FLAG_PLASTIC_ACTIVE)
{
- /* if the other constraint is plastic and not plastic active and enabled, make plastic active (set stiffness) */
- con->flag |= RBC_FLAG_PLASTIC_ACTIVE;
- rigidbody_set_springs_active(con, true);
+ /*Other is plastic active, break it*/
+ RB_constraint_set_enabled(con->physics_constraint, false);
}
else
{
- /*break active plastic spring*/
- RB_constraint_set_enabled(con->physics_constraint, false);
+ /* activate other plastic */
+ con->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+ rigidbody_set_springs_active(con, true);
}
}
else
- { /*break non-plastic spring */
+ {
+ /*other is not plastic, break it */
RB_constraint_set_enabled(con->physics_constraint, false);
}
}
- else
- {
- /*break all other constraints */
- RB_constraint_set_enabled(con->physics_constraint, false);
- }
}
}
-static void handle_plastic_breaking_participants(RigidBodyShardCon *rbsc)
+static void handle_plastic_breaking_participants(FractureModifierData *fmd, RigidBodyShardCon *rbsc)
{
float dist, angle, distdiff, anglediff;
bool exceeded = false;
@@ -3148,30 +3158,36 @@ static void handle_plastic_breaking_participants(RigidBodyShardCon *rbsc)
anglediff = fabs(angle - rbsc->start_angle);
distdiff = fabs(dist - rbsc->start_dist);
+ if (fmd->use_special_breaking) {
+ //need distdiff in range 0...1, so norm it here
+ distdiff /= rbsc->start_dist;
+ }
+
exceeded = (rbsc->breaking_angle > 0.0f && anglediff > rbsc->breaking_angle);
exceeded = exceeded || (rbsc->breaking_dist > 0.0f && distdiff > rbsc->breaking_dist);
- /* is there a break event on THIS constraint ? */
- if (rbsc->physics_constraint && (!(RB_constraint_is_enabled(rbsc->physics_constraint)) || exceeded))
+ if (exceeded && rbsc->physics_constraint)
{
- MeshIsland *mi1 = rbsc->mi1;
- MeshIsland *mi2 = rbsc->mi2;
- int i;
+ RB_constraint_set_enabled(rbsc->physics_constraint, false);
+ }
- /* if THIS constraint is not plastic (or not in plastic mode -> enabled and plastic active), handle the others ...*/
- if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
- return;
+ if (!fmd->use_special_breaking)
+ return;
- for (i = 0; i < mi1->participating_constraint_count; i++)
+ /* is there a break event on THIS constraint ? */
+ if (rbsc->physics_constraint && (!(RB_constraint_is_enabled(rbsc->physics_constraint))))
+ {
+ int i;
+ for (i = 0; i < rbsc->mi1->participating_constraint_count; i++)
{
- RigidBodyShardCon *con = mi1->participating_constraints[i];
- handle_plastic_breaking_constraint(con, mi1, mi2);
+ RigidBodyShardCon *con = rbsc->mi1->participating_constraints[i];
+ handle_plastic_breaking_constraint(rbsc, con);
}
- for (i = 0; i < mi2->participating_constraint_count; i++)
+ for (i = 0; i < rbsc->mi2->participating_constraint_count; i++)
{
- RigidBodyShardCon *con = mi2->participating_constraints[i];
- handle_plastic_breaking_constraint(con, mi1, mi2);
+ RigidBodyShardCon *con = rbsc->mi2->participating_constraints[i];
+ handle_plastic_breaking_constraint(rbsc, con);
}
}
}
@@ -3395,8 +3411,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
{
//hmm maybe enable "special" constraint behavior
//handle_plastic_breaking(fmd, rbsc);
- if (fmd->use_special_breaking)
- handle_plastic_breaking_participants(rbsc);
+ //if (fmd->use_special_breaking)
+ handle_plastic_breaking_participants(fmd, rbsc);
}
rbsc->flag &= ~RBC_FLAG_NEEDS_VALIDATE;
More information about the Bf-blender-cvs
mailing list