Commit: ec640510a8c8ef5de8daea907da2351ef1988915
Author: Alexander Gavrilov
Date:   Sat Jul 14 17:01:02 2018 +0300
Branches: master
https://developer.blender.org/rBec640510a8c8ef5de8daea907da2351ef1988915

Fix T55958: allow the user to select between spring and spring2.

The old springs with damping 1.0 operate in a special way that
is more similar to plastic deformation than a spring. Some users
rely on that, so let the user choose which implementation to use.
This also restores full backward compatibility with 2.79.

Reviewers: sergof

Differential Revision: https://developer.blender.org/D3544

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

M       intern/rigidbody/RBI_api.h
M       intern/rigidbody/rb_bullet_api.cpp
M       release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/makesdna/DNA_rigidbody_types.h
M       source/blender/makesrna/intern/rna_rigidbody.c

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

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 556ca959e64..eec94bcea50 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -268,6 +268,7 @@ rbConstraint *RB_constraint_new_slider(float pivot[3], 
float orn[4], rbRigidBody
 rbConstraint *RB_constraint_new_piston(float pivot[3], float orn[4], 
rbRigidBody *rb1, rbRigidBody *rb2);
 rbConstraint *RB_constraint_new_6dof(float pivot[3], float orn[4], rbRigidBody 
*rb1, rbRigidBody *rb2);
 rbConstraint *RB_constraint_new_6dof_spring(float pivot[3], float orn[4], 
rbRigidBody *rb1, rbRigidBody *rb2);
+rbConstraint *RB_constraint_new_6dof_spring2(float pivot[3], float orn[4], 
rbRigidBody *rb1, rbRigidBody *rb2);
 rbConstraint *RB_constraint_new_motor(float pivot[3], float orn[4], 
rbRigidBody *rb1, rbRigidBody *rb2);
 
 /* ............ */
@@ -299,12 +300,18 @@ void RB_constraint_set_limits_piston(rbConstraint *con, 
float lin_lower, float l
 void RB_constraint_set_limits_6dof(rbConstraint *con, int axis, float lower, 
float upper);
 
 /* 6dof spring specific */
-void RB_constraint_set_limits_6dof_spring(rbConstraint *con, int axis, float 
lower, float upper);
 void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, int axis, 
float stiffness);
 void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float 
damping);
 void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int axis, int 
enable);
 void RB_constraint_set_equilibrium_6dof_spring(rbConstraint *con);
 
+/* 6dof spring 2 specific */
+void RB_constraint_set_limits_6dof_spring2(rbConstraint *con, int axis, float 
lower, float upper);
+void RB_constraint_set_stiffness_6dof_spring2(rbConstraint *con, int axis, 
float stiffness);
+void RB_constraint_set_damping_6dof_spring2(rbConstraint *con, int axis, float 
damping);
+void RB_constraint_set_spring_6dof_spring2(rbConstraint *con, int axis, int 
enable);
+void RB_constraint_set_equilibrium_6dof_spring2(rbConstraint *con);
+
 /* motors */
 void RB_constraint_set_enable_motor(rbConstraint *con, int enable_lin, int 
enable_ang);
 void RB_constraint_set_max_impulse_motor(rbConstraint *con, float 
max_impulse_lin, float max_impulse_ang);
diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index a9fbcb28529..6a50c5c93ee 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -954,11 +954,25 @@ rbConstraint *RB_constraint_new_6dof_spring(float 
pivot[3], float orn[4], rbRigi
        
        make_constraint_transforms(transform1, transform2, body1, body2, pivot, 
orn);
        
-       btTypedConstraint *con = new btGeneric6DofSpring2Constraint(*body1, 
*body2, transform1, transform2);
+       btTypedConstraint *con = new btGeneric6DofSpringConstraint(*body1, 
*body2, transform1, transform2, true);
        
        return (rbConstraint *)con;
 }
 
+rbConstraint *RB_constraint_new_6dof_spring2(float pivot[3], float orn[4], 
rbRigidBody *rb1, rbRigidBody *rb2)
+{
+       btRigidBody *body1 = rb1->body;
+       btRigidBody *body2 = rb2->body;
+       btTransform transform1;
+       btTransform transform2;
+
+       make_constraint_transforms(transform1, transform2, body1, body2, pivot, 
orn);
+
+       btTypedConstraint *con = new btGeneric6DofSpring2Constraint(*body1, 
*body2, transform1, transform2);
+
+       return (rbConstraint *)con;
+}
+
 rbConstraint *RB_constraint_new_motor(float pivot[3], float orn[4], 
rbRigidBody *rb1, rbRigidBody *rb2)
 {
        btRigidBody *body1 = rb1->body;
@@ -1034,7 +1048,7 @@ void RB_constraint_set_limits_6dof(rbConstraint *con, int 
axis, float lower, flo
        constraint->setLimit(axis, lower, upper);
 }
 
-void RB_constraint_set_limits_6dof_spring(rbConstraint *con, int axis, float 
lower, float upper)
+void RB_constraint_set_limits_6dof_spring2(rbConstraint *con, int axis, float 
lower, float upper)
 {
        btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
 
@@ -1043,26 +1057,57 @@ void RB_constraint_set_limits_6dof_spring(rbConstraint 
*con, int axis, float low
 
 void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, int axis, 
float stiffness)
 {
-       btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
+       btGeneric6DofSpringConstraint *constraint = 
reinterpret_cast<btGeneric6DofSpringConstraint*>(con);
 
        constraint->setStiffness(axis, stiffness);
 }
 
 void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float 
damping)
 {
-       btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
+       btGeneric6DofSpringConstraint *constraint = 
reinterpret_cast<btGeneric6DofSpringConstraint*>(con);
+
+       // invert damping range so that 0 = no damping
+       damping = (damping > 1.0f) ? 0.0f : 1.0f - damping;
 
        constraint->setDamping(axis, damping);
 }
 
 void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int axis, int 
enable)
 {
-       btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
+       btGeneric6DofSpringConstraint *constraint = 
reinterpret_cast<btGeneric6DofSpringConstraint*>(con);
 
        constraint->enableSpring(axis, enable);
 }
 
 void RB_constraint_set_equilibrium_6dof_spring(rbConstraint *con)
+{
+       btGeneric6DofSpringConstraint *constraint = 
reinterpret_cast<btGeneric6DofSpringConstraint*>(con);
+
+       constraint->setEquilibriumPoint();
+}
+
+void RB_constraint_set_stiffness_6dof_spring2(rbConstraint *con, int axis, 
float stiffness)
+{
+       btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
+
+       constraint->setStiffness(axis, stiffness);
+}
+
+void RB_constraint_set_damping_6dof_spring2(rbConstraint *con, int axis, float 
damping)
+{
+       btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
+
+       constraint->setDamping(axis, damping);
+}
+
+void RB_constraint_set_spring_6dof_spring2(rbConstraint *con, int axis, int 
enable)
+{
+       btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
+
+       constraint->enableSpring(axis, enable);
+}
+
+void RB_constraint_set_equilibrium_6dof_spring2(rbConstraint *con)
 {
        btGeneric6DofSpring2Constraint *constraint = 
reinterpret_cast<btGeneric6DofSpring2Constraint*>(con);
 
diff --git 
a/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py 
b/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
index 84a4cbb4b68..8f6b5b5d8b2 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
@@ -140,6 +140,11 @@ class 
PHYSICS_PT_rigid_body_constraint(PHYSICS_PT_rigidbody_constraint_panel, Pa
             sub.prop(rbc, "motor_ang_max_impulse", text="Max Impulse")
 
         elif rbc.type in {'GENERIC', 'GENERIC_SPRING'}:
+            if rbc.type == 'GENERIC_SPRING':
+                row = layout.row()
+                row.label("Spring Type:")
+                row.prop(rbc, "spring_type", text="")
+
             col = layout.column(align=True)
             col.label("Limits:")
 
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 502b6a81c76..5d6695e6598 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -700,6 +700,35 @@ static void rigidbody_validate_sim_object(RigidBodyWorld 
*rbw, Object *ob, bool
 
 /* --------------------- */
 
+static void rigidbody_constraint_init_spring(
+       RigidBodyCon *rbc, void (*set_spring)(rbConstraint*,int,int),
+       void (*set_stiffness)(rbConstraint*,int,float), void 
(*set_damping)(rbConstraint*,int,float)
+) {
+       set_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->flag & 
RBC_FLAG_USE_SPRING_X);
+       set_stiffness(rbc->physics_constraint, RB_LIMIT_LIN_X, 
rbc->spring_stiffness_x);
+       set_damping(rbc->physics_constraint, RB_LIMIT_LIN_X, 
rbc->spring_damping_x);
+
+       set_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->flag & 
RBC_FLAG_USE_SPRING_Y);
+       set_stiffness(rbc->physics_constraint, RB_LIMIT_LIN_Y, 
rbc->spring_stiffness_y);
+       set_damping(rbc->physics_constraint, RB_LIMIT_LIN_Y, 
rbc->spring_damping_y);
+
+       set_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->flag & 
RBC_FLAG_USE_SPRING_Z);
+       set_stiffness(rbc->physics_constraint, RB_LIMIT_LIN_Z, 
rbc->spring_stiffness_z);
+       set_damping(rbc->physics_constraint, RB_LIMIT_LIN_Z, 
rbc->spring_damping_z);
+
+       set_spring(rbc->physics_constraint, RB_LIMIT_ANG_X, rbc->flag & 
RBC_FLAG_USE_SPRING_ANG_X);
+       set_stiffness(rbc->physics_constraint, RB_LIMIT_ANG_X, 
rbc->spring_stiffness_ang_x);
+       set_damping(rbc->physics_constraint, RB_LIMIT_ANG_X, 
rbc->spring_damping_ang_x);
+
+       set_spring(rbc->physics_constraint, RB_LIMIT_ANG_Y, rbc->flag & 
RBC_FLAG_USE_SPRING_ANG_Y);
+       set_stiffness(rbc->physics_constraint, RB_LIMIT_ANG_Y, 
rbc->spring_stiffness_ang_y);
+       set_damping(rbc->physics_constraint, RB_LIMIT_ANG_Y, 
rbc->spring_damping_ang_y);
+
+       set_spring(rbc->physics_constraint, RB_LIMIT_ANG_Z, rbc->flag & 
RBC_FLAG_USE_SPRING_ANG_Z);
+       set_stiffness(rbc->physics_constraint, RB_LIMIT_ANG_Z, 
rbc->spring_stiffness_ang_z);
+       set_damping(rbc->physics_constraint, RB_LIMIT_ANG_Z, 
rbc->spring_damping_ang_z);
+}
+
 static void rigidbody_constraint_set_limits(RigidBodyCon *rbc, void 
(*set_limits)(rbConstraint*,int,float,float))
 {
        if (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_X)
@@ -824,35 +853,24 @@ static void 
rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
                                        
RB_constraint_set_limits_piston(rbc->physics_constraint, lin_lower, lin_upper, 
ang_lower, ang_upper);
                                        break;
                                case RBC_TYPE_6DOF_SPRING:
-                                       rbc->physics_constraint = 
RB_constraint_new_6dof_spring(loc, rot, rb1, rb2);
-
-                                       
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, rbc->spring_stiffness_x);
-                                       
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, 
rbc->flag & RBC_FLAG_USE_SPRING_Y);
-                                       RB_cons

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to