[Bf-blender-cvs] [d22d1ba] fracture_modifier: added constraint dynamic percentage and dynamic constraint building option
Martin Felke
noreply at git.blender.org
Wed Oct 12 12:06:47 CEST 2016
Commit: d22d1bae7ccd2aae2baa9641d2cf6cf14731f1a2
Author: Martin Felke
Date: Wed Oct 12 12:06:21 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd22d1bae7ccd2aae2baa9641d2cf6cf14731f1a2
added constraint dynamic percentage and dynamic constraint building option
===================================================================
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/blenloader/intern/readfile.c
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_modifier.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 1bf6329..b0cb74f 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -677,7 +677,11 @@ class AddPresetFracture(AddPresetBase, Operator):
"fracture.minimum_impulse",
"fracture.mass_threshold_factor",
"fracture.autohide_filter_group",
- "fracture.uv_layer"
+ "fracture.uv_layer",
+ "fracture.boolean_solver",
+ "fracture.boolean_double_threshold",
+ "fracture.dynamic_percentage",
+ "fracture.dynamic_new_constraints"
]
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 297529a..dbe0f7b 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -92,8 +92,12 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
return
if md.fracture_mode == 'DYNAMIC':
- layout.prop(md, "dynamic_force")
- layout.prop(md, "limit_impact")
+ row = layout.row(align=True)
+ row.prop(md, "dynamic_force")
+ row.prop(md, "dynamic_percentage")
+ row = layout.row()
+ row.prop(md, "limit_impact")
+ row.prop(md, "dynamic_new_constraints")
layout.prop(md, "frac_algorithm")
if md.frac_algorithm in {'BOOLEAN', 'BOOLEAN_FRACTAL'}:
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 1b438ef..7fcefe0 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2066,6 +2066,22 @@ static Shard* findShard(FractureModifierData *fmd, int id)
return s;
}
+static MeshIsland* findMeshIsland(FractureModifierData *fmd, int id)
+{
+ MeshIsland *mi = fmd->meshIslands.first;
+
+ while (mi)
+ {
+ if (mi->id == id)
+ {
+ return mi;
+ }
+ mi = mi->next;
+ }
+
+ return NULL;
+}
+
static bool check_shard_size(FractureModifierData *fmd, int id)
{
FractureID *fid;
@@ -2100,6 +2116,27 @@ static bool check_shard_size(FractureModifierData *fmd, int id)
return true;
}
+static bool check_constraints(FractureModifierData *fmd, MeshIsland *mi) {
+ //count broken constraints
+ RigidBodyShardCon *con;
+ int i = 0, broken = 0;
+ float percentage;
+ for (i = 0; i < mi->participating_constraint_count; i++) {
+ con = mi->participating_constraints[i];
+ if (con->physics_constraint && !RB_constraint_is_enabled(con->physics_constraint)) {
+ broken++;
+ }
+ }
+
+ percentage = (float)broken / (float)mi->participating_constraint_count;
+
+ if ((percentage * 100) >= fmd->dynamic_percentage) {
+ return true;
+ }
+
+ return false;
+}
+
static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
{
int linear_index1, linear_index2;
@@ -2140,11 +2177,12 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
RigidBodyOb *rbo = rbw->cache_index_map[linear_index1];
int id = rbo->meshisland_index;
Shard *s = findShard(fmd1, id);
+ MeshIsland* mi = findMeshIsland(fmd1, id);
//printf("FORCE1:%f\n",force);
bool canbreak = (force > fmd1->dynamic_force) || (fmd1->limit_impact && can_break(ob2, ob1, fmd1->limit_impact));
- if (canbreak)
+ if (canbreak && check_constraints(fmd1, mi))
{
if (s) {
float size[3];
@@ -2187,11 +2225,12 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
RigidBodyOb *rbo = rbw->cache_index_map[linear_index2];
int id = rbo->meshisland_index;
Shard *s = findShard(fmd2, id);
+ MeshIsland* mi = findMeshIsland(fmd2, id);
//printf("FORCE2:%f\n",force);
bool canbreak = (force > fmd2->dynamic_force) || (fmd2->limit_impact && can_break(ob1, ob2, fmd2->limit_impact));
- if (canbreak)
+ if (canbreak && check_constraints(fmd2, mi))
{
if (s) {
float size[3];
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 067fdef..c2d2f91 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5244,6 +5244,8 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
fmd->boolean_solver = eBooleanModifierSolver_Carve;
fmd->boolean_double_threshold = 1e-6f;
fmd->keep_cutter_shards = MOD_FRACTURE_KEEP_BOTH;
+ fmd->dynamic_new_constraints = true;
+ fmd->dynamic_percentage = 0;
}
if (fm == NULL || fmd->dm_group) {
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index f7e35fc..19c26d8 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1705,6 +1705,7 @@ typedef struct FractureModifierData {
int cluster_constraint_type;
int fracture_mode;
int boolean_solver;
+ int dynamic_percentage;
float breaking_angle;
float breaking_distance;
@@ -1755,6 +1756,7 @@ typedef struct FractureModifierData {
int constraint_target;
int limit_impact;
int fracture_all;
+ int dynamic_new_constraints;
/* internal flags */
int use_experimental;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 15896ba..41c51f3 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -6392,6 +6392,22 @@ static void rna_def_modifier_fracture(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Overlap Threshold", "Threshold for checking overlapping geometry");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ prop = RNA_def_property(srna, "dynamic_percentage", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "dynamic_percentage");
+ RNA_def_property_range(prop, 0, 100);
+ //RNA_def_property_int_funcs(prop, NULL, "rna_RigidBodyModifier_breaking_percentage_set", NULL);
+ RNA_def_property_ui_text(prop, "Constraint Percentage", "Percentage of broken constraints per island which leads to dynamic fracturing of this island");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop = RNA_def_property(srna, "dynamic_new_constraints", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "dynamic_new_constraints", false);
+ RNA_def_property_ui_text(prop, "New Constraints", "Create new constraints while dynamically fracturing");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+
+
/*Fracture Modifiers own python / RNA API */
rna_def_mesh_island(brna);
prop = RNA_def_property(srna, "mesh_islands", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index ebf8270..dbab9b6 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -223,6 +223,8 @@ static void initData(ModifierData *md)
fmd->boolean_solver = eBooleanModifierSolver_Carve;
fmd->boolean_double_threshold = 1e-6f;
+ fmd->dynamic_percentage = 0.0f;
+ fmd->dynamic_new_constraints = true;
}
//XXX TODO, freeing functionality should be in BKE too
@@ -1767,6 +1769,12 @@ static void copyData(ModifierData *md, ModifierData *target)
trmd->use_compounds = rmd->use_compounds;
trmd->autohide_filter_group = rmd->autohide_filter_group;
+
+ trmd->boolean_solver = rmd->boolean_solver;
+ trmd->boolean_double_threshold = rmd->boolean_double_threshold;
+
+ trmd->dynamic_percentage = rmd->dynamic_percentage;
+ trmd->dynamic_new_constraints = rmd->dynamic_new_constraints;
}
//XXXX TODO, is BB really useds still ? aint there exact volume calc now ?
@@ -2531,6 +2539,14 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl
dist = rmd->contact_dist;
factor = rmd->mass_threshold_factor;
+ if ((rmd->fracture_mode == MOD_FRACTURE_DYNAMIC) && !rmd->dynamic_new_constraints)
+ {
+ Shard* s = find_shard(&rmd->frac_mesh->shard_map, mi->id);
+ if (s->parent_id > -1) {
+ return;
+ }
+ }
+
#if 0
if (factor > 0.0f && rmd->use_compounds) {
if (mi->rigidbody->mass > 0.0f && max_mass > 0.0f) {
More information about the Bf-blender-cvs
mailing list