[Bf-blender-cvs] [6249fb68e0] cloth-improvements: Fix max subframe handling in adaptive subframes
Luca Rood
noreply at git.blender.org
Sat Mar 18 23:47:06 CET 2017
Commit: 6249fb68e0c3b5792bf89423e379c3164a062cc0
Author: Luca Rood
Date: Sat Mar 18 13:04:19 2017 -0300
Branches: cloth-improvements
https://developer.blender.org/rB6249fb68e0c3b5792bf89423e379c3164a062cc0
Fix max subframe handling in adaptive subframes
===================================================================
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 f030e58dcf..704570b5a9 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -1079,14 +1079,19 @@ int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase *
ImplicitSolverResult result;
float dt = max_ff((clmd->sim_parms->dt * clmd->sim_parms->timescale * cloth->adapt_fact),
(1.0f / clmd->sim_parms->max_subframes));
+ bool is_max;
+
max_vel = 0.0f;
max_elong = 0.0f;
adapt_fact = FLT_MAX;
if (step + dt > tf) {
dt = tf - step;
+ is_max = true;
}
+ is_max = is_max || ((clmd->sim_parms->max_subframes > 0) && ((1.0f / clmd->sim_parms->max_subframes) > dt));
+
if (is_hair) {
/* determine contact points */
if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
@@ -1181,7 +1186,9 @@ int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase *
}
if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COMPENSATE_INSTABILITY) && (max_elong > 2.0f)) {
- cloth->adapt_fact *= 0.5f;
+ if (!is_max) {
+ cloth->adapt_fact *= 0.5f;
+ }
}
else {
cloth->adapt_fact *= 1.1;
@@ -1190,18 +1197,20 @@ int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase *
if ((clmd->sim_parms->flags & (CLOTH_SIMSETTINGS_FLAG_ADAPTIVE_SUBFRAMES_VEL |
CLOTH_SIMSETTINGS_FLAG_ADAPTIVE_SUBFRAMES_IMP |
- CLOTH_SIMSETTINGS_FLAG_COMPENSATE_INSTABILITY))) {
+ CLOTH_SIMSETTINGS_FLAG_COMPENSATE_INSTABILITY)))
+ {
clmd->sim_parms->dt *= adapt_fact;
clmd->sim_parms->dt = min_ff(1.0f / clmd->sim_parms->stepsPerFrame, clmd->sim_parms->dt);
if ((clmd->sim_parms->max_subframes > 0) && ((1.0f / clmd->sim_parms->max_subframes) > clmd->sim_parms->dt)) {
clmd->sim_parms->dt = 1.0f / clmd->sim_parms->max_subframes;
}
- else {
- if (((max_vel > clmd->sim_parms->max_vel) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_ADAPTIVE_SUBFRAMES_VEL)) ||
- ((max_impulse > clmd->sim_parms->max_imp) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_ADAPTIVE_SUBFRAMES_IMP)) ||
- ((max_elong > 2.0f) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COMPENSATE_INSTABILITY)))
- {
+
+ if (((max_vel > clmd->sim_parms->max_vel) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_ADAPTIVE_SUBFRAMES_VEL)) ||
+ ((max_impulse > clmd->sim_parms->max_imp) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_ADAPTIVE_SUBFRAMES_IMP)) ||
+ ((max_elong > 2.0f) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COMPENSATE_INSTABILITY)))
+ {
+ if (!is_max) {
for (i = 0; i < mvert_num; i++) {
BPH_mass_spring_set_motion_state(id, i, verts[i].txold, verts[i].tvold);
}
More information about the Bf-blender-cvs
mailing list