[Bf-blender-cvs] [256aeb213a5] fracture_modifier: added additional distances and angles settings in order to control plastic deform better
Martin Felke
noreply at git.blender.org
Sun Jun 18 17:20:49 CEST 2017
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. @@
More information about the Bf-blender-cvs
mailing list