[Bf-blender-cvs] [4cf48bb] fracture_modifier: fix for solver / cluster solver iterations override, it caused different behavior at loading / refresh

Martin Felke noreply at git.blender.org
Fri Apr 8 13:56:27 CEST 2016


Commit: 4cf48bbe1f74e6c2f728e910c7a319f6962f01df
Author: Martin Felke
Date:   Fri Apr 8 13:52:38 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4cf48bbe1f74e6c2f728e910c7a319f6962f01df

fix for solver / cluster solver iterations override, it caused different behavior at loading / refresh

solver iteration override was taken into account too late, after first validation which probably caused different simulation behavior using the default value for one frame

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

M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c177d50..2b7f8ba 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -226,7 +226,7 @@ void BKE_rigidbody_calc_threshold(float max_con_mass, FractureModifierData *rmd,
 
 			thresh = ((min_mass + (rmd->mass_threshold_factor * max_mass)) / (min_mass + max_mass)) * max_thresh;
 		}
-		else;
+		else
 		{
 			con_mass = con->mi1->rigidbody->mass + con->mi2->rigidbody->mass;
 			if (rmd->use_mass_dependent_thresholds)
@@ -3400,24 +3400,6 @@ static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid
 	float weight = MIN2(rbsc->mi1->thresh_weight, rbsc->mi2->thresh_weight);
 	float breaking_angle = fmd->breaking_angle_weighted ? fmd->breaking_angle * weight : fmd->breaking_angle;
 	float breaking_distance = fmd->breaking_distance_weighted ? fmd->breaking_distance * weight : fmd->breaking_distance;
-	int iterations;
-
-	if (fmd->solver_iterations_override == 0) {
-		iterations = rbw->num_solver_iterations;
-	}
-	else {
-		if ((rbsc->mi1->particle_index != -1) && (rbsc->mi1->particle_index == rbsc->mi2->particle_index)) {
-			iterations = fmd->cluster_solver_iterations_override;
-		}
-		else {
-			iterations = fmd->solver_iterations_override;
-		}
-	}
-
-	if (iterations > 0) {
-		rbsc->flag |= RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS;
-		rbsc->num_solver_iterations = iterations;
-	}
 
 	if ((fmd->use_mass_dependent_thresholds || fmd->use_compounds /*|| fmd->mass_threshold_factor > 0.0f*/)) {
 		BKE_rigidbody_calc_threshold(max_con_mass, fmd, rbsc);
@@ -3441,6 +3423,28 @@ static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid
 	}
 }
 
+static void handle_solver_iterations(RigidBodyWorld *rbw, FractureModifierData *fmd, RigidBodyShardCon *rbsc)
+{
+	int iterations;
+
+	if (fmd->solver_iterations_override == 0) {
+		iterations = rbw->num_solver_iterations;
+	}
+	else {
+		if ((rbsc->mi1->particle_index != -1) && (rbsc->mi1->particle_index == rbsc->mi2->particle_index)) {
+			iterations = fmd->cluster_solver_iterations_override;
+		}
+		else {
+			iterations = fmd->solver_iterations_override;
+		}
+	}
+
+	if (iterations > 0) {
+		rbsc->flag |= RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS;
+		rbsc->num_solver_iterations = iterations;
+	}
+}
+
 static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bool rebuild)
 {
 	ModifierData *md = NULL;
@@ -3546,6 +3550,10 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 				rbsc->start_dist = 0.0f;
 			}
 
+			/* needs probably taken into account BEFORE validation already, instead of after it
+			 * (causing a delay by one frame with old value and thus different simulation behavior at start) */
+			handle_solver_iterations(rbw, fmd, rbsc);
+
 			if (rbsc->physics_constraint && !(RB_constraint_is_enabled(rbsc->physics_constraint)))
 			{
 				brokencount++;




More information about the Bf-blender-cvs mailing list