[Bf-blender-cvs] [fe55273] fracture_modifier: some more optimizations at bisect, bit faster and less memory consumption, and removing bakes now when refracturing

Martin Felke noreply at git.blender.org
Sun Aug 7 16:02:32 CEST 2016


Commit: fe5527319980e4dd0445118faf611726b685cab9
Author: Martin Felke
Date:   Sun Aug 7 16:02:13 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBfe5527319980e4dd0445118faf611726b685cab9

some more optimizations at bisect, bit faster and less memory consumption, and removing bakes now when refracturing

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

M	source/blender/blenkernel/intern/fracture_util.c
M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/blenkernel/intern/fracture_util.c b/source/blender/blenkernel/intern/fracture_util.c
index 0f02f30..e61983c 100644
--- a/source/blender/blenkernel/intern/fracture_util.c
+++ b/source/blender/blenkernel/intern/fracture_util.c
@@ -781,11 +781,9 @@ static BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tr
 	KDTreeNearest* n = NULL;
 	BMesh *bm_new = BM_mesh_create(&bm_mesh_allocsize_default);
 	BMIter iter;
-	BMEdge *e;
+	BMFace *f;
 #define MY_TAG (1 << 6)
 
-	n = MEM_mallocN(sizeof(KDTreeNearest) * bm_orig->totvert, "n kdtreenearest");
-
 	BM_mesh_elem_toolflags_ensure(bm_new);  /* needed for 'duplicate' bmo */
 
 	CustomData_copy(&bm_orig->vdata, &bm_new->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
@@ -809,7 +807,13 @@ static BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tr
 	BM_mesh_elem_hflag_disable_all(bm_orig, BM_VERT | BM_EDGE | BM_FACE, MY_TAG, false);
 
 	//do a range search first in case we have many verts as in dense geometry
-	r = BLI_kdtree_range_search(preselect_tree, child->raw_centroid, &n, sqrt(max_dist) * 2.0f);
+	r = BLI_kdtree_range_search(preselect_tree, child->raw_centroid, &n, sqrt(max_dist)*1.5f);
+
+	//skip empty cells
+	/*if (r == 0) {
+		BM_mesh_free(bm_new);
+		return NULL;
+	}*/
 
 	//if we have sparse geometry, just return all
 	if (r < child->totvert) {
@@ -826,7 +830,10 @@ static BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tr
 			v = BM_vert_at_index(bm_orig, index);
 			BM_elem_flag_enable(v, MY_TAG);
 		}
-
+		if (n2) {
+			MEM_freeN(n2);
+			n2 = NULL;
+		}
 	}
 	else {
 		BMVert *v = NULL;
@@ -834,17 +841,21 @@ static BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tr
 			int index = n[i].index;
 			v = BM_vert_at_index(bm_orig, index);
 			BM_elem_flag_enable(v, MY_TAG);
-		}
-
-		MEM_freeN(n);
-		n = NULL;
-	}
-
-	BM_ITER_MESH(e, &iter, bm_orig, BM_EDGES_OF_MESH) {
-		//select stretchy edges verts too
-		if (BM_edge_calc_length_squared(e) > max_dist * 1.5f) {
-			BM_elem_flag_enable(e->v1, MY_TAG);
-			BM_elem_flag_enable(e->v2, MY_TAG);
+		}	
+	}
+
+	BM_ITER_MESH(f, &iter, bm_orig, BM_FACES_OF_MESH) {
+		//select bigger squarish faces and long skinny ones
+		float area = BM_face_calc_area(f);
+		BMIter eiter;
+		BMEdge *e;
+		BM_ITER_ELEM(e, &eiter, f, BM_EDGES_OF_FACE) {
+			if ((area > 0.75f) || (BM_edge_calc_length_squared(e) > max_dist * 3.0f) ||
+				BM_elem_flag_test(e->v1, MY_TAG) || BM_elem_flag_test(e->v2, MY_TAG))
+			{
+				BM_elem_flag_enable(e->v1, MY_TAG);
+				BM_elem_flag_enable(e->v2, MY_TAG);
+			}
 		}
 	}
 
@@ -883,14 +894,17 @@ Shard *BKE_fracture_shard_bisect(BMesh *bm_orig, Shard *child, float obmat[4][4]
 		bm_parent = BM_mesh_copy(bm_orig);
 	}
 
-	BM_mesh_elem_hflag_enable_all(bm_parent, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
-
-	do_bisect(bm_parent, bm_child, obmat, use_fill, clear_inner, clear_outer, cutlimit, centroid, inner_mat_index);
-
-	output_s = do_output_shard(bm_parent, child, uv_layer);
+	if (bm_parent != NULL) {
+		BM_mesh_elem_hflag_enable_all(bm_parent, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
+		do_bisect(bm_parent, bm_child, obmat, use_fill, clear_inner, clear_outer, cutlimit, centroid, inner_mat_index);
+		output_s = do_output_shard(bm_parent, child, uv_layer);
+		BM_mesh_free(bm_parent);
+	}
+	else {
+		output_s = NULL;
+	}
 
 	BM_mesh_free(bm_child);
-	BM_mesh_free(bm_parent);
 
 	dm_child->needsFree = 1;
 	dm_child->release(dm_child);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 1f9b744..6c3a30e 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2460,6 +2460,13 @@ static int fracture_refresh_exec(bContext *C, wmOperator *op)
 	if (scene->rigidbody_world != NULL)
 	{
 		start = (double)scene->rigidbody_world->pointcache->startframe;
+		//free a possible bake...
+		scene->rigidbody_world->pointcache->flag &= ~PTCACHE_BAKED;
+	}
+
+	if (!rmd || (rmd && rmd->refresh)) {
+		rmd->refresh = false;
+		return OPERATOR_CANCELLED;
 	}
 
 	BKE_scene_frame_set(scene, start);
@@ -2467,11 +2474,6 @@ static int fracture_refresh_exec(bContext *C, wmOperator *op)
 	WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
 	WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
 	WM_event_add_notifier(C, NC_SCENE | ND_FRAME, NULL);
-
-	if (!rmd || (rmd && rmd->refresh) /*|| (scene->rigidbody_world && cfra != scene->rigidbody_world->pointcache->startframe)*/) {
-		rmd->refresh = false;
-		return OPERATOR_CANCELLED;
-	}
 	
 	if (!rmd->execute_threaded) {
 #if 0




More information about the Bf-blender-cvs mailing list