[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