[Bf-blender-cvs] [2b63854ec10] fracture_modifier: allow autohide / automerge for external mode too, and some tweaks for shared vert group optimization

Martin Felke noreply at git.blender.org
Mon Jun 12 01:43:11 CEST 2017


Commit: 2b63854ec1095a2b6ec4803860fffca363f5e3a9
Author: Martin Felke
Date:   Mon Jun 12 01:40:00 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB2b63854ec1095a2b6ec4803860fffca363f5e3a9

allow autohide / automerge for external mode too, and some tweaks for shared vert group optimization

===================================================================

M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index d7140b561b8..675a640f1ec 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -87,10 +87,10 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
         row.prop(md, "fracture_mode")
 
         if md.fracture_mode == 'EXTERNAL':
-            col = layout.column(align=True)
-            col.context_pointer_set("modifier", md)
-            col.operator("object.rigidbody_convert_to_objects", text = "Convert To Objects")
-            col.operator("object.rigidbody_convert_to_keyframes", text = "Convert To Keyframed Objects")
+        #    col = layout.column(align=True)
+        #    col.context_pointer_set("modifier", md)
+        #    col.operator("object.rigidbody_convert_to_objects", text = "Convert To Objects")
+        #    col.operator("object.rigidbody_convert_to_keyframes", text = "Convert To Keyframed Objects")
             return
 
         if md.fracture_mode == 'DYNAMIC':
@@ -246,7 +246,7 @@ class PHYSICS_PT_fracture_utilities(PhysicButtonsPanel, Panel):
     @classmethod
     def poll(cls, context):
         md = context.fracture
-        return PhysicButtonsPanel.poll(context) and md.fracture_mode != 'EXTERNAL'
+        return PhysicButtonsPanel.poll(context) # and md.fracture_mode != 'EXTERNAL'
 
     def draw(self, context):
         layout = self.layout
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 05a6c09e8c8..b6fceee35db 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -93,8 +93,9 @@ static Shard* find_shard(ListBase *shards, ShardID id);
 static void cleanup_arrange_shard(FractureModifierData *fmd, Shard *s, float cent[]);
 static MeshIsland* find_meshisland(ListBase* meshIslands, int id);
 static void do_halving(FractureModifierData *fmd, Object* ob, DerivedMesh *dm, DerivedMesh *orig_dm, bool is_prehalving, ShardID id);
-static void free_shared_verts(FractureModifierData* fmd);
+static void free_shared_verts(ListBase *lb);
 static void reset_automerge(FractureModifierData *fmd);
+static void do_refresh_automerge(FractureModifierData *fmd);
 
 typedef struct SharedVertGroup {
 	struct SharedVertGroup* next, *prev;
@@ -493,7 +494,7 @@ static void free_modifier(FractureModifierData *fmd, bool do_free_seq, bool do_f
 		fmd->face_pairs = NULL;
 	}
 
-	free_shared_verts(fmd);
+	free_shared_verts(&fmd->shared_verts);
 
 	//called on deleting modifier, object or quitting blender...
 	//why was this necessary again ?!
@@ -3270,7 +3271,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 	SharedVert *sv;
 	SharedVertGroup *vg;
 	bool do_calc_delta = fmd->keep_distort;
-	float margin = 0.001f;
+	float dist = fmd->autohide_dist;
 
 	int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
 	if (cd_edge_crease_offset == -1) {
@@ -3324,7 +3325,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 			{
 				v2 = bm->vtable[sv->index];
 
-				if ((len_squared_v3v3(co, v2->co) > ((fmd->autohide_dist + margin) * (fmd->autohide_dist + margin))))
+				if ((len_squared_v3v3(co, v2->co) > (dist * dist)))
 				{
 					sv->moved = true;
 				}
@@ -3351,10 +3352,11 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 
 			if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
 			{
-				if ((len_squared_v3v3(co, v1->co) > ((fmd->autohide_dist + margin) * (fmd->autohide_dist + margin))))
+				if ((len_squared_v3v3(co, v1->co) > (dist * dist)))
 				{
 					vg->moved = true;
 				}
+
 				copy_v3_v3(v1->co, co);	
 				BM_elem_flag_enable(v1, BM_ELEM_SELECT);
 			}
@@ -3439,13 +3441,14 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 
 	BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
 
-#if 0
 	//if (fmd->automerge_dist > 0)
 	{
 		Scene* sc = fmd->modifier.scene;
 		RigidBodyWorld *rbw = sc ? sc->rigidbody_world : NULL;
 		PointCache *cache = rbw ? rbw->pointcache : NULL;
 		int frame = (int)BKE_scene_frame_get(sc);
+		int endframe = sc->r.efra;
+		int testframe = MIN2(cache->endframe, endframe);
 
 		if (fmd->automerge_dist > 0)
 		{
@@ -3453,18 +3456,10 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 			prepare_automerge(fmd, bm);
 		}
 
-		if (cache && cache->endframe == frame)
-		{
+		if (cache && frame == testframe) {
 			optimize_automerge(fmd);
 		}
 	}
-#endif
-
-	if (fmd->automerge_dist > 0)
-	{
-		//make vert groups together here, if vert is close enough
-		prepare_automerge(fmd, bm);
-	}
 
 	if (fmd->face_pairs && fmd->autohide_dist > 0)
 	{
@@ -4076,7 +4071,7 @@ static void do_refresh_constraints(FractureModifierData *fmd, Object *ob)
 	printf("Constraints: %d\n", BLI_listbase_count(&fmd->meshConstraints));
 }
 
-static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
+static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm, ListBase *shared_verts)
 {
 	/* make kdtree of all verts of dm, then find closest(rangesearch) verts for each vert*/
 	MVert* mvert = dm->getVertArray(dm), *mv = NULL;
@@ -4137,7 +4132,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 
 			if (gvert->verts.first != NULL)
 			{
-				BLI_addtail(&fmd->shared_verts, gvert);
+				BLI_addtail(shared_verts, gvert);
 				groups++;
 			}
 			else {
@@ -4155,40 +4150,46 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 	BLI_kdtree_free(tree);
 }
 
-static void free_shared_verts(FractureModifierData* fmd)
+static void free_shared_vert_group(SharedVertGroup *vg)
 {
-	SharedVertGroup *vg;
 	SharedVert *sv;
 
-	while (fmd->shared_verts.first)
+	while (vg->verts.first) {
+		sv = vg->verts.first;
+		BLI_remlink(&vg->verts, sv);
+		MEM_freeN(sv);
+	}
+	MEM_freeN(vg);
+}
+
+static void free_shared_verts(ListBase* lb)
+{
+	SharedVertGroup *vg;
+
+	while (lb->first)
 	{
-		vg = fmd->shared_verts.first;
-		BLI_remlink(&fmd->shared_verts, vg);
-		while (vg->verts.first) {
-			sv = vg->verts.first;
-			BLI_remlink(&vg->verts, sv);
-			MEM_freeN(sv);
-		}
-		MEM_freeN(vg);
+		vg = lb->first;
+		BLI_remlink(lb, vg);
+		free_shared_vert_group(vg);
 	}
 
-	fmd->shared_verts.first = NULL;
-	fmd->shared_verts.last = NULL;
+	lb->first = NULL;
+	lb->last = NULL;
 }
 
-static void do_refresh_automerge(FractureModifierData* fmd, Object *ob)
+static void do_refresh_automerge(FractureModifierData* fmd)
 {
-	free_shared_verts(fmd);
+	free_shared_verts(&fmd->shared_verts);
 
 	/* in case of re-using existing islands this one might become invalid for automerge, so force fallback */
 	if (fmd->dm && fmd->dm->getNumVerts(fmd->dm) > 0)
 	{
-		make_shared_vert_groups(fmd, fmd->dm);
+		make_shared_vert_groups(fmd, fmd->dm, &fmd->shared_verts);
 	}
 	else if (fmd->visible_mesh)
 	{
 		DerivedMesh *fdm = CDDM_from_bmesh(fmd->visible_mesh, true);
-		make_shared_vert_groups(fmd, fdm);
+		make_shared_vert_groups(fmd, fdm, &fmd->shared_verts);
 
 		fdm->needsFree = 1;
 		fdm->release(fdm);
@@ -4406,7 +4407,7 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMes
 		do_refresh_autohide(fmd, ob);
 
 		if (fmd->autohide_dist > 0) {
-			do_refresh_automerge(fmd, ob);
+			do_refresh_automerge(fmd);
 		}
 	}
 
@@ -5021,6 +5022,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	}
 	else if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
 	{
+		DerivedMesh *dm_final = NULL;
+
 		fmd->refresh = false;
 		fmd->shards_to_islands = false;
 
@@ -5029,8 +5032,29 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 			BKE_fracture_update_visual_mesh(fmd, ob, true);
 		}
 
-		if (fmd->visible_mesh_cached)
-			return CDDM_copy(fmd->visible_mesh_cached);
+		if (fmd->visible_mesh_cached) {
+
+			if (fmd->refresh_autohide) {
+				do_refresh_autohide(fmd, ob);
+
+				if (fmd->autohide_dist > 0) {
+					do_refresh_automerge(fmd);
+				}
+			}
+
+			if (fmd->autohide_dist > 0 || fmd->automerge_dist > 0)
+			{
+				dm_final = do_autoHide(fmd, fmd->visible_mesh_cached, ob);
+			}
+			else {
+				dm_final = CDDM_copy(fmd->visible_mesh_cached);
+				if (!fmd->fix_normals) {
+					dm_final->calcNormals(dm_final);
+				}
+			}
+
+			return dm_final;
+		}
 	}
 
 	if (final_dm != derivedData)




More information about the Bf-blender-cvs mailing list