[Bf-blender-cvs] [83144efb4dd] fracture_modifier: further automerge speed optimization attempts

Martin Felke noreply at git.blender.org
Sun Jun 11 18:16:35 CEST 2017


Commit: 83144efb4dd5920d4462ace28af213e665feef38
Author: Martin Felke
Date:   Sun Jun 11 17:48:45 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB83144efb4dd5920d4462ace28af213e665feef38

further automerge speed optimization attempts

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

M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index b97e3a9df48..90ce57a1c93 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -99,7 +99,7 @@ static void reset_automerge(FractureModifierData *fmd);
 typedef struct SharedVertGroup {
 	struct SharedVertGroup* next, *prev;
 	int index;
-	bool exceeded, deltas_set;
+	bool exceeded, deltas_set, moved;
 	float rest_co[3];
 	float delta[3];
 	ListBase verts;
@@ -108,7 +108,7 @@ typedef struct SharedVertGroup {
 typedef struct SharedVert {
 	struct SharedVert* next, *prev;
 	int index;
-	bool exceeded, deltas_set;
+	bool exceeded, deltas_set, moved;
 	float rest_co[3];
 	float delta[3];
 } SharedVert;
@@ -3231,10 +3231,12 @@ static void reset_automerge(FractureModifierData *fmd)
 
 	for (vg = fmd->shared_verts.first; vg; vg = vg->next) {
 		vg->exceeded = false;
+		vg->moved = false;
 
 		for (sv = vg->verts.first; sv; sv = sv->next)
 		{
 			sv->exceeded = false;
+			sv->moved = false;
 		}
 	}
 }
@@ -3268,6 +3270,7 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 	SharedVert *sv;
 	SharedVertGroup *vg;
 	bool do_calc_delta = fmd->keep_distort;
+	float margin = 0.01f;
 
 	int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
 	if (cd_edge_crease_offset == -1) {
@@ -3320,11 +3323,18 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 			for (sv = vg->verts.first; sv; sv = sv->next)
 			{
 				v2 = bm->vtable[sv->index];
+
+				if ((len_squared_v3v3(co, v2->co) > ((fmd->autohide_dist + margin) * (fmd->autohide_dist + margin))))
+				{
+					sv->moved = true;
+				}
+
 				if (len_squared_v3v3(co, v2->co) <= fmd->automerge_dist * fmd->automerge_dist)
 				{
 					if (!sv->exceeded)
 					{
 						copy_v3_v3(v2->co, co);
+						BM_elem_flag_enable(v2, BM_ELEM_SELECT);
 					}
 				}
 				else {
@@ -3341,7 +3351,12 @@ 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))))
+				{
+					vg->moved = true;
+				}
 				copy_v3_v3(v1->co, co);	
+				BM_elem_flag_enable(v1, BM_ELEM_SELECT);
 			}
 			else {
 
@@ -3367,6 +3382,45 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 	}
 }
 
+static void optimize_automerge(FractureModifierData *fmd)
+{
+	SharedVertGroup *vg = fmd->shared_verts.first, *next = NULL;
+	SharedVert* sv = NULL;
+	int removed = 0, count = 0;
+
+	while(vg) {
+		bool intact = true;
+		sv = vg->verts.first;
+		while (sv) {
+			intact = intact && !sv->moved;
+			sv = sv->next;
+		}
+
+		intact = intact && !vg->moved;
+
+		next = vg->next;
+
+		if (intact) {
+			while(vg->verts.first) {
+				sv = vg->verts.first;
+				BLI_remlink(&vg->verts, sv);
+				MEM_freeN(sv);
+				sv = NULL;
+			}
+
+
+			BLI_remlink(&fmd->shared_verts, vg);
+			MEM_freeN(vg);
+			removed++;
+		}
+
+		vg = next;
+	}
+
+	count = BLI_listbase_count(&fmd->shared_verts);
+	printf("remaining | removed groups: %d | %d\n", count, removed);
+}
+
 static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Object *ob)
 {
 	int totpoly = dm->getNumPolys(dm);
@@ -3385,32 +3439,42 @@ 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 (fmd->automerge_dist > 0)
+	//if (fmd->automerge_dist > 0)
 	{
-		//make vert groups together here, if vert is close enough
-		prepare_automerge(fmd, bm);
-	}
+		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);
 
-	if (fmd->face_pairs)
-	{
-		if (fmd->autohide_dist > 0)
+		if (fmd->automerge_dist > 0)
 		{
-			for (i = 0; i < totpoly; i++) {
-				find_other_face(fmd, i, bm, ob,  &faces, &del_faces);
-			}
+			//make vert groups together here, if vert is close enough
+			prepare_automerge(fmd, bm);
+		}
 
-			for (i = 0; i < del_faces; i++) {
-				BMFace *f = faces[i];
-				if (f->l_first->e != NULL) { /* a lame check.... */
-					BMIter iter;
-					BMVert *v;
-					BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE)
-					{
-						BM_elem_flag_enable(v, BM_ELEM_SELECT);
-					}
+		if (cache && cache->endframe == frame)
+		{
+			optimize_automerge(fmd);
+		}
+	}
+
+	if (fmd->face_pairs && fmd->autohide_dist > 0)
+	{
+		for (i = 0; i < totpoly; i++) {
+			find_other_face(fmd, i, bm, ob,  &faces, &del_faces);
+		}
 
-					BM_elem_flag_enable(f, BM_ELEM_SELECT);
+		for (i = 0; i < del_faces; i++) {
+			BMFace *f = faces[i];
+			if (f->l_first->e != NULL) { /* a lame check.... */
+				BMIter iter;
+				BMVert *v;
+				BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE)
+				{
+					BM_elem_flag_enable(v, BM_ELEM_SELECT);
 				}
+
+				BM_elem_flag_enable(f, BM_ELEM_SELECT);
 			}
 		}
 
@@ -3456,7 +3520,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 		}
 	}
 
-	if (fmd->automerge_dist > 0 && !fmd->fix_normals)
+	if (!fmd->fix_normals)
 	{
 		BM_mesh_normals_update(bm);
 	}
@@ -3883,12 +3947,16 @@ static DerivedMesh *output_dm(FractureModifierData* fmd, DerivedMesh *dm, Object
 			}
 		}
 
-		if (fmd->autohide_dist > 0 || fmd->automerge_dist > 0) {
+		if (fmd->autohide_dist > 0 || fmd->automerge_dist > 0)
+		{
 			//printf("Autohide \n");
 			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;
@@ -4034,6 +4102,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 			gvert->verts.last = NULL;
 			gvert->exceeded = false;
 			gvert->deltas_set = false;
+			gvert->moved = false;
 			zero_v3(gvert->delta);
 			copy_v3_v3(gvert->rest_co, mvert[i].co);
 
@@ -4050,6 +4119,7 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 						svert->index = index;
 						svert->exceeded = false;
 						svert->deltas_set = false;
+						svert->moved = false;
 						zero_v3(svert->delta);
 						copy_v3_v3(svert->rest_co, mvert[index].co);
 						BLI_addtail(&gvert->verts, svert);




More information about the Bf-blender-cvs mailing list