Commit: 256aeb213a55ab99256afe83e000d685d8a90282 Author: Martin Felke Date: Sun Jun 18 17:20:38 2017 +0200 Branches: fracture_modifier https://developer.blender.org/rB256aeb213a55ab99256afe83e000d685d8a90282
added additional distances and angles settings in order to control plastic deform better =================================================================== M release/scripts/startup/bl_operators/presets.py M release/scripts/startup/bl_ui/properties_physics_fracture.py M source/blender/blenkernel/intern/rigidbody.c M source/blender/makesdna/DNA_modifier_types.h M source/blender/makesrna/intern/rna_fracture.c M source/blender/modifiers/intern/MOD_fracture.c =================================================================== diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py index 98b84a5f323..d917eaabcf1 100644 --- a/release/scripts/startup/bl_operators/presets.py +++ b/release/scripts/startup/bl_operators/presets.py @@ -690,7 +690,14 @@ class AddPresetFracture(AddPresetBase, Operator): "fracture.orthogonality_factor", "fracture.keep_distort", "fracture.do_merge", - "fracture.constraint_type" + "fracture.constraint_type", + "fracture.automerge_dist", + "fracture.deform_distance", + "fracture.deform_distance_weighted", + "fracture.cluster_deform_distance", + "fracture.deform_angle", + "fracture.deform_angle_weighted", + "fracture.cluster_deform_angle" ] preset_subdir = "fracture" diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py index a1bf23978a5..ea155a7eefc 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fracture.py +++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py @@ -242,6 +242,24 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel): col.prop(md, "cluster_solver_iterations_override") layout.prop(md, "use_mass_dependent_thresholds") + if not md.use_compounds: + layout.label("Constraint Deform Settings") + col = layout.column(align=True) + row = col.row(align=True) + row.prop(md, "deform_angle", text="Deforming Angle") + row.prop(md, "cluster_deform_angle", text="Cluster Deforming Angle") + + row = col.row(align=True) + row.prop(md, "deform_distance", text="Deforming Distance") + row.prop(md, "cluster_deform_distance", text="Cluster Deforming Distance") + + row = col.row(align=True) + row.prop(md, "deform_angle_weighted") + row.prop(md, "deform_distance_weighted") + + + + class PHYSICS_PT_fracture_utilities(PhysicButtonsPanel, Panel): bl_label = "Fracture Utilities" diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 543edc3f6b7..ac90857ccdf 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -3744,21 +3744,66 @@ static void deactivateRigidbody(RigidBodyOb *rbo) //RB_body_set_kinematic_state(rbo->physics_object, true); //RB_body_set_mass(rbo->physics_object, 0.0f); //rbo->flag |= RBO_FLAG_IS_GHOST; + //rbo->flag |= RBO_FLAG_NEEDS_VALIDATE; RB_body_deactivate(rbo->physics_object); } static void deform_constraint(FractureModifierData *fmd, Object *ob, RigidBodyShardCon* rbsc, RigidBodyWorld *rbw) { RB_dworld_remove_constraint(rbw->physics_world, rbsc->physics_constraint); - BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true); - BKE_rigidbody_start_dist_angle(rbsc, fmd->fracture_mode == MOD_FRACTURE_EXTERNAL || - (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external)); + BKE_rigidbody_start_dist_angle(rbsc, true); //rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS; + BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true); + //set_constraint_index(fmd, rbsc); + deactivateRigidbody(rbsc->mi1->rigidbody); deactivateRigidbody(rbsc->mi2->rigidbody); } +static void handle_deform_angle(FractureModifierData *fmd, Object *ob, RigidBodyShardCon *rbsc, RigidBodyWorld *rbw, + float anglediff, float weight, float deform_angle) +{ + if ((fmd->deform_angle > 0 || (fmd->deform_angle_weighted && weight > 0)) && + (anglediff > deform_angle)) + { + /* if we have cluster breaking angle, then only treat equal cluster indexes like the default, else all */ + if ((fmd->cluster_deform_angle > 0 && rbsc->mi1->particle_index == rbsc->mi2->particle_index) || + fmd->cluster_deform_angle == 0) + { + deform_constraint(fmd, ob, rbsc, rbw); + } + } + + if ((fmd->cluster_deform_angle > 0) && (rbsc->mi1->particle_index != rbsc->mi2->particle_index) + && anglediff > fmd->cluster_deform_angle) + { + deform_constraint(fmd, ob, rbsc, rbw); + } +} + +static void handle_deform_dist(FractureModifierData *fmd, Object *ob, RigidBodyShardCon *rbsc, RigidBodyWorld *rbw, + float distdiff, float weight, float deform_dist) +{ + if ((fmd->deform_distance > 0 || (fmd->deform_angle_weighted && weight > 0)) && + (distdiff > deform_dist)) + { + /* if we have cluster breaking angle, then only treat equal cluster indexes like the default, else all */ + if ((fmd->cluster_deform_distance > 0 && rbsc->mi1->particle_index == rbsc->mi2->particle_index) || + fmd->cluster_deform_distance == 0) + { + deform_constraint(fmd, ob, rbsc, rbw); + } + } + + if ((fmd->cluster_deform_distance > 0) && (rbsc->mi1->particle_index != rbsc->mi2->particle_index) + && distdiff > fmd->cluster_deform_distance) + { + deform_constraint(fmd, ob, rbsc, rbw); + } +} + + static void handle_breaking_angle(FractureModifierData *fmd, Object *ob, RigidBodyShardCon *rbsc, RigidBodyWorld *rbw, float anglediff, float weight, float breaking_angle) { @@ -3778,12 +3823,6 @@ static void handle_breaking_angle(FractureModifierData *fmd, Object *ob, RigidBo activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob); } } - else { - //attempt to make plastic deform by reconstraining the shards - if (rbsc->physics_constraint) { - deform_constraint(fmd, ob, rbsc, rbw); - } - } } } @@ -3798,12 +3837,6 @@ static void handle_breaking_angle(FractureModifierData *fmd, Object *ob, RigidBo activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob); } } - else { - //attempt to make plastic deform by reconstraining the shards - if (rbsc->physics_constraint) { - deform_constraint(fmd, ob, rbsc, rbw); - } - } } } @@ -3825,12 +3858,6 @@ static void handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob); } } - else { - //attempt to make plastic deform by reconstraining the shards - if (rbsc->physics_constraint) { - deform_constraint(fmd, ob, rbsc, rbw); - } - } } } @@ -3845,12 +3872,6 @@ static void handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob); } } - else { - //attempt to make plastic deform by reconstraining the shards - if (rbsc->physics_constraint) { - deform_constraint(fmd, ob, rbsc, rbw); - } - } } } @@ -3940,6 +3961,9 @@ 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; + float deform_angle = fmd->deform_angle_weighted ? fmd->deform_angle * weight : fmd->deform_angle; + float deform_distance = fmd->deform_distance_weighted ? fmd->deform_distance * weight : fmd->deform_distance; + float dist, angle, distdiff, anglediff; if ((fmd->use_mass_dependent_thresholds || fmd->use_compounds /*|| fmd->mass_threshold_factor > 0.0f*/)) { BKE_rigidbody_calc_threshold(max_con_mass, fmd, rbsc); @@ -3949,18 +3973,30 @@ static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid (fmd->breaking_distance > 0) || (fmd->breaking_distance_weighted && weight > 0) || (fmd->cluster_breaking_angle > 0 || (fmd->cluster_breaking_distance > 0))) /*&& !rebuild*/) { - float dist, angle, distdiff, anglediff; calc_dist_angle(rbsc, &dist, &angle, false); - anglediff = fabs(angle - rbsc->start_angle); distdiff = fabs(dist - rbsc->start_dist); - /* Treat angles here */ + /* handle breaking */ handle_breaking_angle(fmd, ob, rbsc, rbw, anglediff, weight, breaking_angle); - - /* Treat distances here */ handle_breaking_distance(fmd, ob, rbsc, rbw, distdiff, weight, breaking_distance); } + + if ((((fmd->deform_angle) > 0) || (fmd->deform_angle_weighted && weight > 0) || + (fmd->deform_distance > 0) || (fmd->deform_distance_weighted && weight > 0) || + (fmd->cluster_deform_angle > 0 || (fmd->cluster_deform_distance > 0))) /*&& !rebuild*/) + { + if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint)) + { + calc_dist_angle(rbsc, &dist, &angle, false); + anglediff = fabs(angle - rbsc->start_angle); + distdiff = fabs(dist - rbsc->start_dist); + + /* handle deform */ + handle_deform_angle(fmd, ob, rbsc, rbw, anglediff, weight, deform_angle); + handle_deform_dist(fmd, ob, rbsc, rbw, distdiff, weight, deform_distance); + } + } } static void handle_solver_iterations(RigidBodyWorld *rbw, FractureModifierData *fmd, RigidBodyShardCon *rbsc) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index bbaa970b294..2e61d5fa6f9 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1734,6 +1734,10 @@ typedef struct FractureModifierData { float physics_mesh_scale; float grease_offset; float dynamic_force; + float deform_angle; + float deform_distance; + float cluster_deform_angle; + float cluster_deform_distance; float impulse_dampening; float minimum_impulse; @@ -1774,6 +1778,8 @@ typedef struct FractureModifierData { int is_dynamic_external; int keep_distort; int do_merge; + int deform_angle_weighted; + int deform_distance_weighted; /* internal flags */ int use_experimental; diff --git a/source/blender/makesrna/intern/rna_fracture.c b/source/blender/makesrna/intern/rna_fracture.c index daede62a9e9..0505c05861e 100644 --- a/source/blender/makesrna/intern/rna_fracture.c +++ b/source/blender/makesrna/intern/rna_fracture.c @@ -283,6 +283,34 @@ static void rna_FractureModifier_breaking_distance_set( @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs