[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