[Bf-blender-cvs] [d273e2002c6] fracture_modifier: added an automerge distortion cache
Martin Felke
noreply at git.blender.org
Tue Aug 22 12:38:27 CEST 2017
Commit: d273e2002c62c915cfbc68787807962312d217ab
Author: Martin Felke
Date: Tue Aug 22 12:37:53 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd273e2002c62c915cfbc68787807962312d217ab
added an automerge distortion cache
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_fracture_types.h
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/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 7b5d79b8f33..c9e49313bce 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -5337,6 +5337,13 @@ static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
Object *ob = go->ob;
FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+ if ((fmd && fmd->fracture_mode != MOD_FRACTURE_DYNAMIC && !(rbw->pointcache->flag & PTCACHE_BAKED)))
+ {
+ //also purge distortion cache here too (called from cache reset
+ fmd->distortion_cached = false;
+ fmd->refresh_autohide = true;
+ }
+
if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
{
//Scene *scene = fmd->modifier.scene;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 78df9d00501..414b515ac71 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5294,8 +5294,6 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
fmd->visible_mesh = NULL;
fmd->dm = NULL;
fmd->visible_mesh_cached = NULL;
- fmd->shared_verts.first = NULL;
- fmd->shared_verts.last = NULL;
/*HARDCODING this for now, until we can version it properly, say with 2.75 ? */
if (fd->fileversion < 275) {
@@ -5333,6 +5331,35 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
fmd->constraint_type = RBC_TYPE_FIXED;
}
+ //if there is no cached distortion element, there is none, set false
+ if (!DNA_struct_elem_find(fd->filesdna, "FractureModifierData", "int", "distortion_cached"))
+ {
+ fmd->distortion_cached = false;
+ }
+
+ //instead of version number, check just for existence of shared verts in DNA
+ if (DNA_struct_elem_find(fd->filesdna, "FractureModifierData", "ListBase", "shared_verts"))
+ {
+ SharedVertGroup *vg;
+ link_list(fd, &fmd->shared_verts);
+ for (vg = fmd->shared_verts.first; vg; vg = vg->next)
+ {
+ link_list(fd, &vg->verts);
+ }
+
+ if (BLI_listbase_is_empty(&fmd->shared_verts))
+ {
+ fmd->distortion_cached = false;
+ }
+ else {
+ fmd->distortion_cached = true;
+ }
+ }
+ else {
+ fmd->shared_verts.first = NULL;
+ fmd->shared_verts.last = NULL;
+ }
+
if (fm == NULL || fmd->dm_group) {
fmd->dm = NULL;
fmd->meshIslands.first = NULL;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 4439cf99ad0..a8cd11bb004 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1919,6 +1919,7 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
MeshIsland *mi;
Shard *s;
RigidBodyShardCon *con;
+ SharedVertGroup *vg;
bool mode = fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED ||
fmd->fracture_mode == MOD_FRACTURE_EXTERNAL;
@@ -1930,6 +1931,16 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
{
writestruct(wd, DATA, FracMesh, 1, fm);
+ for (vg = fmd->shared_verts.first; vg; vg = vg->next)
+ {
+ SharedVert *sv;
+ writestruct(wd, DATA, SharedVertGroup, 1, vg);
+ for (sv = vg->verts.first; sv; sv = sv->next)
+ {
+ writestruct(wd, DATA, SharedVert, 1, sv);
+ }
+ }
+
for (s = fm->shard_map.first; s; s = s->next) {
write_shard(wd, s);
}
diff --git a/source/blender/makesdna/DNA_fracture_types.h b/source/blender/makesdna/DNA_fracture_types.h
index 48cac246be9..1695bcef083 100644
--- a/source/blender/makesdna/DNA_fracture_types.h
+++ b/source/blender/makesdna/DNA_fracture_types.h
@@ -92,6 +92,25 @@ typedef struct FracMesh {
int last_expected_shards;
} FracMesh;
+typedef struct SharedVertGroup {
+ struct SharedVertGroup *next, *prev;
+ float rest_co[3];
+ float delta[3];
+ int index, excession_frame;
+ int exceeded, deltas_set, moved;
+ char pad[4];
+ ListBase verts;
+} SharedVertGroup;
+
+typedef struct SharedVert {
+ struct SharedVert *next, *prev;
+ float rest_co[3];
+ float delta[3];
+ int index, excession_frame;
+ int exceeded, deltas_set, moved;
+ char pad[4];
+} SharedVert;
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index b9e4e79970f..5731d4beb9b 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1798,6 +1798,7 @@ typedef struct FractureModifierData {
int explo_shared;
int refresh_images;
int update_dynamic;
+ int distortion_cached;
/* internal values */
float max_vol;
@@ -1813,7 +1814,7 @@ typedef struct FractureModifierData {
short mat_ofs_intersect;
short mat_ofs_difference;
- char pad[4];
+ //char pad[4];
} FractureModifierData;
typedef struct DataTransferModifierData {
diff --git a/source/blender/makesrna/intern/rna_fracture.c b/source/blender/makesrna/intern/rna_fracture.c
index 80ea94bada3..ac749e62e75 100644
--- a/source/blender/makesrna/intern/rna_fracture.c
+++ b/source/blender/makesrna/intern/rna_fracture.c
@@ -344,6 +344,7 @@ static void rna_FractureModifier_autohide_dist_set(PointerRNA *ptr, float value)
FractureModifierData *rmd = (FractureModifierData*)ptr->data;
rmd->autohide_dist = value;
rmd->refresh_autohide = true;
+ rmd->distortion_cached = false;
}
static void rna_FractureModifier_automerge_dist_set(PointerRNA *ptr, float value)
@@ -351,6 +352,7 @@ static void rna_FractureModifier_automerge_dist_set(PointerRNA *ptr, float value
FractureModifierData *rmd = (FractureModifierData*)ptr->data;
rmd->automerge_dist = value;
rmd->refresh_autohide = true;
+ rmd->distortion_cached = false;
}
static void rna_FractureModifier_cluster_breaking_angle_set(PointerRNA *ptr, float value)
@@ -601,6 +603,18 @@ static void rna_FractureModifier_autohide_filter_group_set(PointerRNA* ptr, Poin
//rmd->reset_shards = true;
}
+static void rna_FractureModifier_keep_distort_set(PointerRNA* ptr, int value)
+{
+ FractureModifierData *rmd = (FractureModifierData *)ptr->data;
+ rmd->keep_distort = value;
+}
+
+static void rna_FractureModifier_do_merge_set(PointerRNA* ptr, int value)
+{
+ FractureModifierData *rmd = (FractureModifierData *)ptr->data;
+ rmd->do_merge = value;
+}
+
static void rna_Modifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
ModifierData* md = ptr->data;
@@ -942,7 +956,7 @@ void RNA_def_fracture(BlenderRNA *brna)
prop = RNA_def_property(srna, "automerge_dist", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "automerge_dist");
- //RNA_def_property_float_funcs(prop, NULL, "rna_FractureModifier_automerge_dist_set", NULL);
+ RNA_def_property_float_funcs(prop, NULL, "rna_FractureModifier_automerge_dist_set", NULL);
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Automerge Distance",
"Distance between faces below which vertices of both faces should be merged; (costs performance, use with smooth objects and fix normals to better hide cracks)");
@@ -1298,14 +1312,14 @@ void RNA_def_fracture(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "keep_distort", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "keep_distort", false);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_FractureModifier_keep_distort_set");
RNA_def_property_ui_text(prop, "Keep Distortion", "Whether or not to make the distortion on torn merged shards persistent.");
- RNA_def_property_update(prop, 0, "rna_Modifier_update_and_keep");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "do_merge", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "do_merge", false);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_FractureModifier_do_merge_set");
RNA_def_property_ui_text(prop, "Perform Merge", "Whether or not to actually weld the prepared automerge geometry.");
- RNA_def_property_update(prop, 0, "rna_Modifier_update_and_keep");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "deform_angle", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "deform_angle");
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 4654fc10677..113593ecbf2 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -98,23 +98,6 @@ static void reset_automerge(FractureModifierData *fmd);
static void do_refresh_automerge(FractureModifierData *fmd);
static void free_shards(FractureModifierData *fmd);
-typedef struct SharedVertGroup {
- struct SharedVertGroup* next, *prev;
- int index, excession_frame;
- bool exceeded, deltas_set, moved;
- float rest_co[3];
- float delta[3];
- ListBase verts;
-} SharedVertGroup;
-
-typedef struct SharedVert {
- struct SharedVert* next, *prev;
- int index, excession_frame;
- bool exceeded, deltas_set, moved;
- float rest_co[3];
- float delta[3];
-} SharedVert;
-
//TODO XXX Make BKE
static FracMesh* copy_fracmesh(FracMesh* fm)
{
@@ -265,6 +248,7 @@ static void initData(ModifierData *md)
fmd->pack_storage.last = NULL;
fmd->deform_weakening = 0.0f;
+ fmd->distortion_cached = false;
}
//XXX TODO, freeing functionality should be in BKE too
@@ -1804,6 +1788,7 @@ static void copyData(ModifierData *md, ModifierData *target)
trmd->deform_distance_weighted = rmd->deform_distance_weighted;
trmd->cluster_deform_distance = rmd->cluster_deform_distance;
trmd->deform_weakening = rmd->deform_weakening;
+ trmd->distortion_cached = rmd->distortion_cached;
}
//XXXX TODO, is BB really useds still ? aint there exact volume calc now ?
@@ -3236,24 +3221,20 @@ static void handle_vertex(FractureModifierData *fmd, BMesh* bm, SharedVert *sv,
BMEdge *e = NULL;
Scene *sc = fmd->modifier.scene;
int frame = sc ? (int)BKE_scene_frame_get(sc) : 1;
-
BMVert *v = bm->vtable[sv->index];
+ bool exceeded = (frame >= sv->excession_frame) && (sv->exce
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list