[Bf-blender-cvs] [90b7665] fracture_modifier: some more fixes to have proper plastic constraint support
Martin Felke
noreply at git.blender.org
Sat Jan 23 21:41:03 CET 2016
Commit: 90b76659cac8b65da9d355240b80d39c06676783
Author: Martin Felke
Date: Sat Jan 23 21:40:40 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB90b76659cac8b65da9d355240b80d39c06676783
some more fixes to have proper plastic constraint support
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index db99fa4..94a1177 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1598,22 +1598,22 @@ 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);
}
}
}
-static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd, Object* ob, RigidBodyShardCon *rbc)
+static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd, Object* ob, RigidBodyShardCon *rbc, RigidBodyWorld *rbw)
{
float loc[3];
float rot[4];
@@ -1715,11 +1715,21 @@ static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
else
{
/*plastic mode, activate depending on flag */
- rigidbody_set_springs_active(rbc, rbc->flag & RBC_FLAG_USE_PLASTIC);
-
/* mark immediate activation, so we dont activate again */
- if (rbc->flag & RBC_FLAG_USE_PLASTIC)
- rbc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+
+ if (rbw->ltime > rbw->pointcache->startframe)
+ {
+ if (rbc->flag & RBC_FLAG_USE_PLASTIC)
+ {
+ rbc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+ rigidbody_set_springs_active(rbc, true);
+ }
+ else
+ {
+ rbc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
+ rigidbody_set_springs_active(rbc, false);
+ }
+ }
}
}
else
@@ -1833,7 +1843,7 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, FractureMo
rbc->physics_constraint = NULL;
}
- rigidbody_create_shard_physics_constraint(fmd, ob, rbc);
+ rigidbody_create_shard_physics_constraint(fmd, ob, rbc, rbw);
}
if ((rbw && rbw->physics_world && rbc->physics_constraint)) {
@@ -3214,15 +3224,16 @@ static void handle_plastic_breaking(RigidBodyShardCon *rbsc)
{
if (rbsc->type == RBC_TYPE_6DOF_SPRING)
{
- if (!(rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE) /*&& !(rbsc->flag & RBC_FLAG_NEEDS_VALIDATE)*/)
+ if (!(rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE))
{
/* activate only once */
rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
rigidbody_set_springs_active(rbsc, true);
- RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
+ if (rbsc->physics_constraint)
+ RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
}
}
- else if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint))
+ else if (rbsc->physics_constraint)
{
/* break regular connections */
RB_constraint_set_enabled(rbsc->physics_constraint, false);
@@ -3237,9 +3248,8 @@ static void handle_plastic_breaking(RigidBodyShardCon *rbsc)
{
if (rbsc->type == RBC_TYPE_6DOF_SPRING && rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE)
{
- if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint))
+ if (rbsc->physics_constraint)
{
- rigidbody_set_springs_active(rbsc, false);
RB_constraint_set_enabled(rbsc->physics_constraint, false);
}
}
@@ -3403,13 +3413,24 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
RB_constraint_set_enabled(rbsc->physics_constraint, rbsc->flag & RBC_FLAG_ENABLED);
if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && rbsc->type == RBC_TYPE_6DOF_SPRING)
{
- if (rbsc->plastic_angle >= 0.0f || rbsc->plastic_dist >= 0.0f)
+ if (rbw->ltime > rbw->pointcache->startframe)
{
- /*reset plastic constraints with immediate activation*/
- if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
+ if (rbsc->plastic_angle >= 0.0f || rbsc->plastic_dist >= 0.0f)
{
- rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
- rigidbody_set_springs_active(rbsc, true);
+ /*reset plastic constraints with immediate activation*/
+ if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
+ {
+ rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+ rigidbody_set_springs_active(rbsc, true);
+ }
+ else
+ {
+ rigidbody_set_springs_active(rbsc, false);
+ rbsc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
+ }
+
+ if (rbsc->physics_constraint)
+ RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
}
}
}
More information about the Bf-blender-cvs
mailing list