[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