[Bf-blender-cvs] [5d2a092] cloth-improvements: Scale damping by spring length as well

Luca Rood noreply at git.blender.org
Mon Dec 5 18:51:14 CET 2016


Commit: 5d2a092f40d2ca7924ef8d320c8849dace60c32a
Author: Luca Rood
Date:   Mon Dec 5 13:01:55 2016 -0200
Branches: cloth-improvements
https://developer.blender.org/rB5d2a092f40d2ca7924ef8d320c8849dace60c32a

Scale damping by spring length as well

I had forgotten to scale the damping forces...
This made for uneven damping on irregular meshes.

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

M	source/blender/physics/intern/BPH_mass_spring.cpp

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

diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp
index 9de1c95..f8152ba 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -348,6 +348,7 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
 	if ((s->type & CLOTH_SPRING_TYPE_STRUCTURAL) || (s->type & CLOTH_SPRING_TYPE_SEWING) ) {
 #ifdef CLOTH_FORCE_SPRING_STRUCTURAL
 		float k_tension, k_compression, scaling_tension, scaling_compression;
+		float d_tension, d_compression;
 
 		s->flags |= CLOTH_SPRING_FLAG_NEEDED;
 
@@ -358,11 +359,12 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
 		if (s->type & CLOTH_SPRING_TYPE_SEWING) {
 			// Multiply by some arbitrary large value, just so zero-length (sewing) springs have enough force.
 			k_tension = scaling_tension * 10000;
+			d_tension = parms->tension_damp * 10000;
 
 			// TODO: verify, half verified (couldn't see error)
 			// sewing springs usually have a large distance at first so clamp the force so we don't get tunnelling through colission objects
 			BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k_tension, 0,
-			                                    parms->tension_damp, 0, no_compress, parms->max_sewing);
+			                                    d_tension, 0, no_compress, parms->max_sewing);
 		}
 		else {
 			scaling_compression = parms->compression + s->stiffness * fabsf(parms->max_compression - parms->compression);
@@ -370,32 +372,40 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
 			if (s->restlen > ALMOST_ZERO) {
 				k_tension = scaling_tension / s->restlen;
 				k_compression = scaling_compression / s->restlen;
+				d_tension = parms->tension_damp / s->restlen;
+				d_compression = parms->compression_damp / s->restlen;
 			}
 			else {
 				// Multiply by some arbitrary large value, just so zero-length springs have enough force.
 				k_tension = scaling_tension * 10000;
 				k_compression = 0; // No compression for zero-length springs
+				d_tension = parms->tension_damp * 1000;
+				d_compression = 0;
 			}
 
 			BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k_tension, k_compression,
-			                                    parms->tension_damp, parms->compression_damp, no_compress, 0.0f);
+			                                    d_tension, d_compression, no_compress, 0.0f);
 		}
 #endif
 	}
 	else if (s->type & CLOTH_SPRING_TYPE_SHEAR) {
 #ifdef CLOTH_FORCE_SPRING_SHEAR
-		float k, scaling;
+		float k, d, scaling;
 
 		s->flags |= CLOTH_SPRING_FLAG_NEEDED;
 
 		scaling = parms->shear + s->stiffness * fabsf(parms->max_shear - parms->shear);
 
-		if (s->restlen > ALMOST_ZERO)
+		if (s->restlen > ALMOST_ZERO) {
 			k = scaling / s->restlen;
-		else
+			d = parms->shear_damp / s->restlen;
+		}
+		else {
 			k = scaling * 10000;
+			d = parms->shear_damp * 10000;
+		}
 
-		BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k, 0.0f, parms->shear_damp, 0.0f, no_compress, 0.0f);
+		BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k, 0.0f, d, 0.0f, no_compress, 0.0f);
 #endif
 	}
 	else if (s->type & CLOTH_SPRING_TYPE_GOAL) {




More information about the Bf-blender-cvs mailing list