[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