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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to