[Bf-blender-cvs] [ebaf378] master: Dyntopo: replace GHash with GSet, saves some memory

Campbell Barton noreply at git.blender.org
Tue Apr 8 07:00:40 CEST 2014


Commit: ebaf3781fa4165808cd9ddb2ed0944788a31af7c
Author: Campbell Barton
Date:   Tue Apr 8 14:45:48 2014 +1000
https://developer.blender.org/rBebaf3781fa4165808cd9ddb2ed0944788a31af7c

Dyntopo: replace GHash with GSet, saves some memory

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

M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index c595ee5..d568d61 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -594,7 +594,7 @@ void BKE_pbvh_free(PBVH *bvh)
 			BKE_pbvh_node_layer_disp_free(node);
 
 			if (node->bm_faces)
-				BLI_ghash_free(node->bm_faces, NULL, NULL);
+				BLI_gset_free(node->bm_faces, NULL);
 			if (node->bm_unique_verts)
 				BLI_gset_free(node->bm_unique_verts, NULL);
 			if (node->bm_other_verts)
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index bba949f..432694f 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -48,7 +48,7 @@
 /* Update node data after splitting */
 static void pbvh_bmesh_node_finalize(PBVH *bvh, int node_index)
 {
-	GHashIterator gh_iter;
+	GSetIterator gs_iter;
 	PBVHNode *n = &bvh->nodes[node_index];
 
 	/* Create vert hash sets */
@@ -57,8 +57,8 @@ static void pbvh_bmesh_node_finalize(PBVH *bvh, int node_index)
 
 	BB_reset(&n->vb);
 
-	GHASH_ITER (gh_iter, n->bm_faces) {
-		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+	GSET_ITER (gs_iter, n->bm_faces) {
+		BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 		BMLoop *l_iter;
 		BMLoop *l_first;
 		BMVert *v;
@@ -99,8 +99,7 @@ static void pbvh_bmesh_node_finalize(PBVH *bvh, int node_index)
 /* Recursively split the node if it exceeds the leaf_limit */
 static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
 {
-	GHash *empty, *other;
-	GHashIterator gh_iter;
+	GSet *empty, *other;
 	GSetIterator gs_iter;
 	PBVHNode *n, *c1, *c2;
 	BB cb;
@@ -109,7 +108,7 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
 
 	n = &bvh->nodes[node_index];
 
-	if (BLI_ghash_size(n->bm_faces) <= bvh->leaf_limit) {
+	if (BLI_gset_size(n->bm_faces) <= bvh->leaf_limit) {
 		/* Node limit not exceeded */
 		pbvh_bmesh_node_finalize(bvh, node_index);
 		return;
@@ -117,8 +116,8 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
 
 	/* Calculate bounding box around primitive centroids */
 	BB_reset(&cb);
-	GHASH_ITER (gh_iter, n->bm_faces) {
-		const BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+	GSET_ITER (gs_iter, n->bm_faces) {
+		const BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 		const BBC *bbc = BLI_ghash_lookup(prim_bbc, f);
 
 		BB_expand(&cb, bbc->bcentroid);
@@ -141,35 +140,35 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
 	c2 = &bvh->nodes[children + 1];
 	c1->flag |= PBVH_Leaf;
 	c2->flag |= PBVH_Leaf;
-	c1->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", BLI_ghash_size(n->bm_faces) / 2);
-	c2->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", BLI_ghash_size(n->bm_faces) / 2);
+	c1->bm_faces = BLI_gset_ptr_new_ex("bm_faces", BLI_gset_size(n->bm_faces) / 2);
+	c2->bm_faces = BLI_gset_ptr_new_ex("bm_faces", BLI_gset_size(n->bm_faces) / 2);
 
 	/* Partition the parent node's faces between the two children */
-	GHASH_ITER (gh_iter, n->bm_faces) {
-		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+	GSET_ITER (gs_iter, n->bm_faces) {
+		BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 		const BBC *bbc = BLI_ghash_lookup(prim_bbc, f);
 
 		if (bbc->bcentroid[axis] < mid)
-			BLI_ghash_insert(c1->bm_faces, f, NULL);
+			BLI_gset_insert(c1->bm_faces, f);
 		else
-			BLI_ghash_insert(c2->bm_faces, f, NULL);
+			BLI_gset_insert(c2->bm_faces, f);
 	}
 
 	/* Enforce at least one primitive in each node */
 	empty = NULL;
-	if (BLI_ghash_size(c1->bm_faces) == 0) {
+	if (BLI_gset_size(c1->bm_faces) == 0) {
 		empty = c1->bm_faces;
 		other = c2->bm_faces;
 	}
-	else if (BLI_ghash_size(c2->bm_faces) == 0) {
+	else if (BLI_gset_size(c2->bm_faces) == 0) {
 		empty = c2->bm_faces;
 		other = c1->bm_faces;
 	}
 	if (empty) {
-		GHASH_ITER (gh_iter, other) {
-			void *key = BLI_ghashIterator_getKey(&gh_iter);
-			BLI_ghash_insert(empty, key, NULL);
-			BLI_ghash_remove(other, key, NULL, NULL);
+		GSET_ITER (gs_iter, other) {
+			void *key = BLI_gsetIterator_getKey(&gs_iter);
+			BLI_gset_insert(empty, key);
+			BLI_gset_remove(other, key, NULL);
 			break;
 		}
 	}
@@ -186,11 +185,11 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
 	}
 
 	/* Unclaim faces */
-	GHASH_ITER (gh_iter, n->bm_faces) {
-		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+	GSET_ITER (gs_iter, n->bm_faces) {
+		BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 		BLI_ghash_remove(bvh->bm_face_to_node, f, NULL, NULL);
 	}
-	BLI_ghash_free(n->bm_faces, NULL, NULL);
+	BLI_gset_free(n->bm_faces, NULL);
 
 	if (n->bm_other_verts)
 		BLI_gset_free(n->bm_other_verts, NULL);
@@ -228,14 +227,14 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
 static bool pbvh_bmesh_node_limit_ensure(PBVH *bvh, int node_index)
 {
 	GHash *prim_bbc;
-	GHash *bm_faces;
+	GSet *bm_faces;
 	int bm_faces_size;
-	GHashIterator gh_iter;
+	GSetIterator gs_iter;
 	BBC *bbc_array;
 	unsigned int i;
 
 	bm_faces = bvh->nodes[node_index].bm_faces;
-	bm_faces_size = BLI_ghash_size(bm_faces);
+	bm_faces_size = BLI_gset_size(bm_faces);
 	if (bm_faces_size <= bvh->leaf_limit) {
 		/* Node limit not exceeded */
 		return false;
@@ -245,8 +244,8 @@ static bool pbvh_bmesh_node_limit_ensure(PBVH *bvh, int node_index)
 	prim_bbc = BLI_ghash_ptr_new_ex("prim_bbc", bm_faces_size);
 	bbc_array = MEM_callocN(sizeof(BBC) * bm_faces_size, "BBC");
 
-	GHASH_ITER_INDEX (gh_iter, bm_faces, i) {
-		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+	GSET_ITER_INDEX (gs_iter, bm_faces, i) {
+		BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 		BBC *bbc = &bbc_array[i];
 		BMLoop *l_iter;
 		BMLoop *l_first;
@@ -317,7 +316,7 @@ static BMFace *pbvh_bmesh_face_create(PBVH *bvh, int node_index,
 	BLI_assert(!BLI_ghash_haskey(bvh->bm_face_to_node, f));
 
 	{
-		BLI_ghash_insert(bvh->nodes[node_index].bm_faces, f, NULL);
+		BLI_gset_insert(bvh->nodes[node_index].bm_faces, f);
 		BLI_ghash_insert(bvh->bm_face_to_node, f, val);
 
 		/* mark node for update */
@@ -456,7 +455,7 @@ static void pbvh_bmesh_face_remove(PBVH *bvh, BMFace *f)
 	} while ((l_iter = l_iter->next) != l_first);
 
 	/* Remove face from node and top level */
-	BLI_ghash_remove(f_node->bm_faces, f, NULL, NULL);
+	BLI_gset_remove(f_node->bm_faces, f, NULL);
 	BLI_ghash_remove(bvh->bm_face_to_node, f, NULL, NULL);
 
 	/* Log removed face */
@@ -622,11 +621,11 @@ static void long_edge_queue_create(EdgeQueueContext *eq_ctx,
 		if ((node->flag & PBVH_Leaf) &&
 		    (node->flag & PBVH_UpdateTopology))
 		{
-			GHashIterator gh_iter;
+			GSetIterator gs_iter;
 
 			/* Check each face */
-			GHASH_ITER (gh_iter, node->bm_faces) {
-				BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+			GSET_ITER (gs_iter, node->bm_faces) {
+				BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 
 				long_edge_queue_face_add(eq_ctx, f);
 			}
@@ -661,11 +660,11 @@ static void short_edge_queue_create(EdgeQueueContext *eq_ctx,
 		if ((node->flag & PBVH_Leaf) &&
 		    (node->flag & PBVH_UpdateTopology))
 		{
-			GHashIterator gh_iter;
+			GSetIterator gs_iter;
 
 			/* Check each face */
-			GHASH_ITER (gh_iter, node->bm_faces) {
-				BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+			GSET_ITER (gs_iter, node->bm_faces) {
+				BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
 
 				short_edge_queue_face_add(eq_ctx, f);
 			}
@@ -815,8 +814,9 @@ static bool pbvh_bmesh_subdivide_long_edges(EdgeQueueContext *eq_ctx, PBVH *bvh,
 	return any_subdivided;
 }
 
-static void pbvh_bmesh_collapse_edge(PBVH *bvh, BMEdge *e, BMVert *v1,
-                                     BMVert *v2, GHash *deleted_verts,
+static void pbvh_bmesh_collapse_edge(PBVH *bvh, BMEdge *e,
+                                     BMVert *v1, BMVert *v2,
+                                     GSet *deleted_verts,
                                      BLI_Buffer *edge_loops,
                                      BLI_Buffer *deleted_faces,
                                      int cd_vert_mask_offset)
@@ -922,7 +922,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *bvh, BMEdge *e, BMVert *v1,
 		 * remove them from the PBVH */
 		for (j = 0; j < 3; j++) {
 			if (v_tri[j] != v_del && BM_vert_face_count(v_tri[j]) == 1) {
-				BLI_ghash_insert(deleted_verts, v_tri[j], NULL);
+				BLI_gset_insert(deleted_verts, v_tri[j]);
 				pbvh_bmesh_vert_remove(bvh, v_tri[j]);
 			}
 			else {
@@ -952,14 +952,14 @@ static void pbvh_bmesh_collapse_edge(PBVH *bvh, BMEdge *e, BMVert *v1,
 
 	/* Move v_conn to the midpoint of v_conn and v_del (if v_conn still exists, it
 	 * may have been deleted above) */
-	if (!BLI_ghash_haskey(deleted_verts, v_conn)) {
+	if (!BLI_gset_haskey(deleted_verts, v_conn)) {
 		BM_log_vert_before_modified(bvh->bm_log, v_conn, cd_vert_mask_offset);
 		mid_v3_v3v3(v_conn->co, v_conn->co, v_del->co);
 	}
 
 	/* Delete v_del */
 	BLI_assert(BM_vert_face_count(v_del) == 0);
-	BLI_ghash_insert(deleted_verts, v_del, NULL);
+	BLI_gset_insert(deleted_verts, v_del);
 	BM_log_vert_removed(bvh->bm_log, v_del, cd_vert_mask_offset);
 	BM_vert_kill(bvh->bm, v_del);
 }
@@ -970,10 +970,10 @@ static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx,
                                             BLI_Buffer *deleted_faces)
 {
 	float min_len_squared = bvh->bm_min_edge_len * bvh->bm_min_edge_len;
-	GHash *deleted_verts;
+	GSet *deleted_verts;
 	bool any_collapsed = false;
 
-	deleted_verts = BLI_ghash_ptr_new("deleted_verts");
+	deleted_verts = BLI_gset_ptr_new("deleted_verts");
 
 	while (!BLI_heap_is_empty(eq_ctx->q->heap)) {
 		BMVert **pair = BLI_heap_popmin(eq_ctx->q->heap);
@@ -984,8 +984,8 @@ static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx,
 		pair = NULL;
 
 		/* Check the verts still exist */
-		if (BLI_ghash_haskey(deleted_verts, v1) ||
-		    BLI_ghash_haskey(deleted_verts, v2))
+		if (BLI_gset_haskey(deleted_verts, v1) ||
+		    BLI_gset_haskey(deleted_verts, v2))
 		{
 			continue;
 		}
@@ -1015,19 +1015,18 @@ static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx,
 		                         deleted_faces, eq_ctx->cd_vert_mask_offset

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list