[Bf-blender-cvs] [6be05e12205] temp-trimesh-sculpt: Created a new TMElemSet to replace GSet for tm_unique_verts and tm_other_verts

Joseph Eagar noreply at git.blender.org
Wed Oct 14 09:35:57 CEST 2020


Commit: 6be05e12205570879147b931810fbba469eca25a
Author: Joseph Eagar
Date:   Wed Oct 14 00:35:22 2020 -0700
Branches: temp-trimesh-sculpt
https://developer.blender.org/rB6be05e12205570879147b931810fbba469eca25a

Created a new TMElemSet to replace GSet for tm_unique_verts and
tm_other_verts

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

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/blenkernel/intern/pbvh_trimesh.c
M	source/blender/editors/sculpt_paint/paint_hide.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c
M	source/blender/makesrna/intern/rna_object.c

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

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 69fb4f3291e..5188303adf0 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -35,19 +35,6 @@ typedef intptr_t SculptIdx;
 extern "C" {
 #endif
 
-typedef struct TMElemSet {
-  GHash *ptr_to_idx;
-  void **elems;
-  int size, length;
-  int cur;
-} TMElemSet;
-
-TMElemSet *TMElemSet_new();
-void TMElemSet_free(TMElemSet *ts);
-void TMElemSet_insert(TMElemSet *ts, void *elem);
-void TMElemSet_remove(TMElemSet *ts, void *elem);
-bool TMElemSet_has(TMElemSet *ts, void *elem);
-
 struct BMLog;
 struct BMesh;
 struct CCGElem;
@@ -103,6 +90,28 @@ typedef struct PBVHFrustumPlanes {
   int num_planes;
 } PBVHFrustumPlanes;
 
+typedef struct TMElemSet {
+  struct GHash *ptr_to_idx;
+  void **elems;
+  int size, length;
+  int cur;
+} TMElemSet;
+
+TMElemSet *TMElemSet_new();
+void TMElemSet_free(TMElemSet *ts);
+void TMElemSet_insert(TMElemSet *ts, void *elem);
+bool TMElemSet_add(TMElemSet *ts, void *elem);
+void TMElemSet_remove(TMElemSet *ts, void *elem);
+bool TMElemSet_has(TMElemSet *ts, void *elem);
+
+#define TMS_ITER(v, ts) \
+{int _i1; for (_i1=0; _i1<ts->cur; _i1++) {\
+  if (!ts->elems[_i1])\
+    continue;\
+  v = ts->elems[_i1];
+
+#define TMS_ITER_END }}
+
 void BKE_pbvh_set_frustum_planes(PBVH *pbvh, PBVHFrustumPlanes *planes);
 void BKE_pbvh_get_frustum_planes(PBVH *pbvh, PBVHFrustumPlanes *planes);
 
@@ -338,8 +347,8 @@ struct GSet *BKE_pbvh_bmesh_node_faces(PBVHNode *node);
 void BKE_pbvh_bmesh_node_save_orig(struct BMesh *bm, PBVHNode *node);
 void BKE_pbvh_bmesh_after_stroke(PBVH *pbvh);
 
-struct GSet *BKE_pbvh_trimesh_node_unique_verts(PBVHNode *node);
-struct GSet *BKE_pbvh_trimesh_node_other_verts(PBVHNode *node);
+struct TMElemSet *BKE_pbvh_trimesh_node_unique_verts(PBVHNode *node);
+struct TMElemSet *BKE_pbvh_trimesh_node_other_verts(PBVHNode *node);
 struct GSet *BKE_pbvh_trimesh_node_faces(PBVHNode *node);
 void BKE_pbvh_trimesh_node_save_orig(struct TM_TriMesh *tm, PBVHNode *node);
 void BKE_pbvh_trimesh_after_stroke(PBVH *bvh);
@@ -414,8 +423,10 @@ typedef struct PBVHVertexIter {
   struct GSetIterator bm_other_verts;
   struct CustomData *bm_vdata;
 
-  struct GSetIterator tm_unique_verts;
-  struct GSetIterator tm_other_verts;
+  int ti;
+  struct TMElemSet *tm_cur_set;
+  struct TMElemSet *tm_unique_verts;
+  struct TMElemSet *tm_other_verts;
   struct CustomData *tm_vdata;
 
   int cd_vert_mask_offset;
@@ -490,14 +501,26 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
           } \
         } \
         else if (vi.tm_vdata) { \
-          if (!BLI_gsetIterator_done(&vi.tm_unique_verts)) { \
-            vi.tm_vert = BLI_gsetIterator_getKey(&vi.tm_unique_verts); \
-            BLI_gsetIterator_step(&vi.tm_unique_verts); \
-          } \
-          else { \
-            vi.tm_vert = BLI_gsetIterator_getKey(&vi.tm_other_verts); \
-            BLI_gsetIterator_step(&vi.tm_other_verts); \
-          } \
+          TMVert *tv = NULL;\
+          while (!tv) {\
+            if (vi.ti >= vi.tm_cur_set->cur) {\
+              if (vi.tm_cur_set != vi.tm_other_verts) {\
+                vi.tm_cur_set = vi.tm_other_verts;\
+                vi.ti = 0;\
+                if (vi.ti >= vi.tm_other_verts->cur) {\
+                  break;\
+                }\
+              } else {\
+                break;\
+              }\
+            } else {\
+              tv = vi.tm_cur_set->elems[vi.ti++];\
+            }\
+          }\
+          if (!tv) {\
+            continue;\
+          }\
+          vi.tm_vert = tv;\
           vi.visible = !TM_elem_flag_test_bool(vi.tm_vert, TM_ELEM_HIDDEN); \
           if (mode == PBVH_ITER_UNIQUE && !vi.visible) { \
             continue; \
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 04cf1767792..245657fa595 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -693,6 +693,19 @@ void BKE_pbvh_free(PBVH *pbvh)
       if (node->face_vert_indices) {
         MEM_freeN((void *)node->face_vert_indices);
       }
+
+      if (node->tm_unique_verts) {
+        TMElemSet_free(node->tm_unique_verts);
+      }
+
+      if (node->tm_other_verts) {
+        TMElemSet_free(node->tm_other_verts);
+      }
+
+      if (node->tm_faces) {
+        BLI_gset_free(node->tm_faces, NULL);
+      }
+
       if (node->bm_faces) {
         BLI_gset_free(node->bm_faces, NULL);
       }
@@ -1544,28 +1557,25 @@ static void pbvh_bmesh_node_visibility_update(PBVHNode *node)
 
 static void pbvh_trimesh_node_visibility_update(PBVHNode *node)
 {
-  GSet *unique, *other;
+  TMElemSet *unique, *other;
+  TMVert *v;
 
   unique = BKE_pbvh_trimesh_node_unique_verts(node);
   other = BKE_pbvh_trimesh_node_other_verts(node);
 
-  GSetIterator gs_iter;
-
-  GSET_ITER (gs_iter, unique) {
-    TMVert *v = BLI_gsetIterator_getKey(&gs_iter);
+  TMS_ITER (v, unique) {
     if (!TM_elem_flag_test(v, TM_ELEM_HIDDEN)) {
       BKE_pbvh_node_fully_hidden_set(node, false);
       return;
     }
-  }
+  } TMS_ITER_END
 
-  GSET_ITER (gs_iter, other) {
-    TMVert *v = BLI_gsetIterator_getKey(&gs_iter);
+  TMS_ITER(v, other) {
     if (!TM_elem_flag_test(v, TM_ELEM_HIDDEN)) {
       BKE_pbvh_node_fully_hidden_set(node, false);
       return;
     }
-  }
+  } TMS_ITER_END;
 
   BKE_pbvh_node_fully_hidden_set(node, true);
 }
@@ -1903,9 +1913,9 @@ void BKE_pbvh_node_num_verts(PBVH *pbvh, PBVHNode *node, int *r_uniquevert, int
       }
       break;
     case PBVH_TRIMESH:
-      tot = BLI_gset_len(node->tm_unique_verts);
+      tot = node->tm_unique_verts->length;
       if (r_totvert) {
-        *r_totvert = tot + BLI_gset_len(node->tm_other_verts);
+        *r_totvert = tot + node->tm_other_verts->length;
       }
       if (r_uniquevert) {
         *r_uniquevert = tot;
@@ -3072,8 +3082,10 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
   }
 
   if (pbvh->type == PBVH_TRIMESH) {
-    BLI_gsetIterator_init(&vi->tm_unique_verts, node->tm_unique_verts);
-    BLI_gsetIterator_init(&vi->tm_other_verts, node->tm_other_verts);
+    vi->tm_unique_verts = node->tm_unique_verts;
+    vi->tm_other_verts = node->tm_other_verts;
+    vi->tm_cur_set = vi->tm_unique_verts;
+
     vi->tm_vdata = &pbvh->tm->vdata;
     vi->cd_vert_mask_offset = CustomData_get_offset(vi->tm_vdata, CD_PAINT_MASK);
   }
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index 9a1233aced2..5b5c3072949 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -33,6 +33,7 @@ typedef struct {
   float bmin[3], bmax[3], bcentroid[3];
 } BBC;
 
+struct GHash;
 /* Note: this structure is getting large, might want to split it into
  * union'd structs */
 struct PBVHNode {
@@ -110,8 +111,8 @@ struct PBVHNode {
 
   /* trimesh */
   GSet *tm_faces;
-  GSet *tm_unique_verts;
-  GSet *tm_other_verts;
+  TMElemSet *tm_unique_verts;
+  TMElemSet *tm_other_verts;
   float (*tm_orco)[3];
   int (*tm_ortri)[3];
   int tm_tot_ortri;
diff --git a/source/blender/blenkernel/intern/pbvh_trimesh.c b/source/blender/blenkernel/intern/pbvh_trimesh.c
index 6a71a7d8b9f..90764af0f3e 100644
--- a/source/blender/blenkernel/intern/pbvh_trimesh.c
+++ b/source/blender/blenkernel/intern/pbvh_trimesh.c
@@ -74,26 +74,37 @@ static void pbvh_trimesh_verify(PBVH *bvh);
 /** \} */
 
 
-static TMElemSet *TMElemSet_new() {
-  TMElemSet *ts = MEM_callocN(sizeof(*ts), "tmelemset");
+TMElemSet *TMElemSet_new() {
+  TMElemSet *ts = MEM_callocN(sizeof(TMElemSet), "tmelemset");
 
   ts->ptr_to_idx = BLI_ghash_ptr_new("tm elem set ptr to idx");
 
   return ts;
 }
 
-static void TMElemSet_free(TMElemSet *ts) {
+void TMElemSet_free(TMElemSet *ts) {
   if (ts->elems) {
     MEM_freeN(ts->elems);
   }
 
-  BLI_gset_free(ts->ptr_to_idx, NULL);
+  BLI_ghash_free(ts->ptr_to_idx, NULL, NULL);
+  MEM_freeN(ts);
 }
 
-static void TMElemSet_insert(TMElemSet *ts, void *elem) {
+bool TMElemSet_add(TMElemSet *ts, void *elem) {
+  if (TMElemSet_has(ts, elem)) {
+    return true;
+  }
+
+  TMElemSet_insert(ts, elem);
+  return false;
+}
+
+void TMElemSet_insert(TMElemSet *ts, void *elem) {
   if (ts->cur >= ts->size) {
     int newsize = (ts->cur+1);
-    newsize = (newsize >> 1) - (newsize << 1);
+    newsize = (newsize << 1) - (newsize >> 1);
+    newsize = MAX2(newsize, 8);
 
     if (!ts->elems) {
       ts->elems = (void*) MEM_mallocN(sizeof(void*)*newsize, "ts->elems");
@@ -123,7 +134,7 @@ static void TMElemSet_insert(TMElemSet *ts, void *elem) {
   ts->length++;
 }
 
-static void TMElemSet_remove(TMElemSet *ts, void *elem) {
+void TMElemSet_remove(TMElemSet *ts, void *elem) {
   int idx = (int)BLI_ghash_lookup(ts->ptr_to_idx, elem);
 
   BLI_ghash_remove(ts->ptr_to_idx, elem, NULL, NULL);
@@ -137,7 +148,7 @@ static void TMElemSet_remove(TMElemSet *ts, void *elem) {
   ts->elems[idx] = NULL;
 }
 
-static bool TMElemSet_has(TMElemSet *ts, void *elem) {
+bool TMElemSet_has(TMElemSet *ts, void *elem) {
   return BLI_ghash_haskey(ts->ptr_to_idx, elem);
 }
 
@@ -216,8 +227,8 @@ static void pbvh_trimesh_node_finalize(PBVH *bvh,
   bool has_visible = false;
 
   /* Create vert hash sets */
-  n->tm_unique_verts = BLI_gset_ptr_new("trimesh_unique_verts");
-  n->tm_other_verts = BLI_gset_ptr_new("trimesh_other_verts");
+  n->tm_unique_verts = TMElemSet_new();//BLI_gset_ptr_new("trimesh_unique_verts");
+  n->tm_other_verts = TMElemSet_new();//BLI_gset_ptr_new("trimesh_other_verts");
 
   BB_reset(&n->vb);
 
@@ -236,10 +247,10 @@ static void pbvh_trimesh_node_finalize(PBVH *bvh,
       has_visible |= !(v->flag & TM_ELEM_HIDDEN);
 
       if (TM_ELEM_CD_GET_INT(v, cd_vert_node_offset) != DYNTOPO_NODE_NONE) {
-        BLI_gset_add(n->tm_other_verts, v);
+        TMElemSet_add(n->tm_other_verts, v);
       }
       else {
-        BLI_gset_insert(n->tm_unique_verts, v);
+        TMElemSet_insert(n->tm_unique_verts, v);
         TM_ELEM_CD_SET_INT(v, cd_vert_node_offset, node_index);
       }
 
@@ -338,11 +349,13 @@ static void pbvh_tri

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list