[Bf-blender-cvs] [94f379acf77] temp-trimesh-sculpt: pre-refactor commit

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


Commit: 94f379acf77d6f3e5d4ec0bf4246754e6499791c
Author: Joseph Eagar
Date:   Tue Oct 13 23:43:54 2020 -0700
Branches: temp-trimesh-sculpt
https://developer.blender.org/rB94f379acf77d6f3e5d4ec0bf4246754e6499791c

pre-refactor commit

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

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/pbvh_trimesh.c

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

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 2fd0e34e0e1..69fb4f3291e 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -35,6 +35,19 @@ 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;
diff --git a/source/blender/blenkernel/intern/pbvh_trimesh.c b/source/blender/blenkernel/intern/pbvh_trimesh.c
index dc79740b7b5..6a71a7d8b9f 100644
--- a/source/blender/blenkernel/intern/pbvh_trimesh.c
+++ b/source/blender/blenkernel/intern/pbvh_trimesh.c
@@ -73,6 +73,74 @@ static void pbvh_trimesh_verify(PBVH *bvh);
 
 /** \} */
 
+
+static TMElemSet *TMElemSet_new() {
+  TMElemSet *ts = MEM_callocN(sizeof(*ts), "tmelemset");
+
+  ts->ptr_to_idx = BLI_ghash_ptr_new("tm elem set ptr to idx");
+
+  return ts;
+}
+
+static void TMElemSet_free(TMElemSet *ts) {
+  if (ts->elems) {
+    MEM_freeN(ts->elems);
+  }
+
+  BLI_gset_free(ts->ptr_to_idx, NULL);
+}
+
+static void TMElemSet_insert(TMElemSet *ts, void *elem) {
+  if (ts->cur >= ts->size) {
+    int newsize = (ts->cur+1);
+    newsize = (newsize >> 1) - (newsize << 1);
+
+    if (!ts->elems) {
+      ts->elems = (void*) MEM_mallocN(sizeof(void*)*newsize, "ts->elems");
+    } else {
+      ts->elems = (void*) MEM_reallocN(ts->elems, newsize*sizeof(void*));
+    }
+
+    BLI_ghash_clear(ts->ptr_to_idx, NULL, NULL);
+
+    //compact
+    int i = 0, j = 0;
+    for (i=0; i<ts->cur; i++) {
+      void *elem2 = ts->elems[j];
+
+      if (elem2) {
+        BLI_ghash_insert(ts->ptr_to_idx, elem2, (void*)j);
+        ts->elems[j++] = elem2;
+      }
+    }
+
+    ts->size = newsize;
+    ts->cur = ts->length;
+  }
+
+  BLI_ghash_insert(ts->ptr_to_idx, elem, (void*)ts->cur);
+  ts->elems[ts->cur++] = elem;
+  ts->length++;
+}
+
+static 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);
+
+  if (ts->elems[idx] != elem) {
+    printf("eek! %p", elem);
+    return;
+  }
+
+  ts->length--;
+  ts->elems[idx] = NULL;
+}
+
+static bool TMElemSet_has(TMElemSet *ts, void *elem) {
+  return BLI_ghash_haskey(ts->ptr_to_idx, elem);
+}
+
 /****************************** Building ******************************/
 
 #define _TRITEST(a, b, c) tri->v1 == a && tri->v2 == b && tri->v3 == c



More information about the Bf-blender-cvs mailing list