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++;
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs