forked from bartvdbraak/blender
replace hashes with sets where possible.
This commit is contained in:
parent
1d5eff36f5
commit
bbce51d116
@ -172,8 +172,8 @@ int BKE_pbvh_node_planes_contain_AABB(PBVHNode *node, void *data);
|
||||
/* test if AABB is at least partially outside the planes' volume */
|
||||
int BKE_pbvh_node_planes_exclude_AABB(PBVHNode *node, void *data);
|
||||
|
||||
struct GHash *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node);
|
||||
struct GHash *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node);
|
||||
struct GSet *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node);
|
||||
struct GSet *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node);
|
||||
void BKE_pbvh_bmesh_node_save_orig(PBVHNode *node);
|
||||
void BKE_pbvh_bmesh_after_stroke(PBVH *bvh);
|
||||
|
||||
@ -235,8 +235,8 @@ typedef struct PBVHVertexIter {
|
||||
float *vmask;
|
||||
|
||||
/* bmesh */
|
||||
struct GHashIterator bm_unique_verts;
|
||||
struct GHashIterator bm_other_verts;
|
||||
struct GSetIterator bm_unique_verts;
|
||||
struct GSetIterator bm_other_verts;
|
||||
struct CustomData *bm_vdata;
|
||||
|
||||
/* result: these are all computed in the macro, but we assume
|
||||
@ -294,13 +294,13 @@ void pbvh_vertex_iter_init(PBVH *bvh, PBVHNode *node,
|
||||
vi.mask = &vi.vmask[vi.vert_indices[vi.gx]]; \
|
||||
} \
|
||||
else { \
|
||||
if (!BLI_ghashIterator_done(&vi.bm_unique_verts)) {\
|
||||
vi.bm_vert = BLI_ghashIterator_getKey(&vi.bm_unique_verts); \
|
||||
BLI_ghashIterator_step(&vi.bm_unique_verts); \
|
||||
if (!BLI_gsetIterator_done(&vi.bm_unique_verts)) {\
|
||||
vi.bm_vert = BLI_gsetIterator_getKey(&vi.bm_unique_verts); \
|
||||
BLI_gsetIterator_step(&vi.bm_unique_verts); \
|
||||
} \
|
||||
else { \
|
||||
vi.bm_vert = BLI_ghashIterator_getKey(&vi.bm_other_verts); \
|
||||
BLI_ghashIterator_step(&vi.bm_other_verts); \
|
||||
vi.bm_vert = BLI_gsetIterator_getKey(&vi.bm_other_verts); \
|
||||
BLI_gsetIterator_step(&vi.bm_other_verts); \
|
||||
} \
|
||||
if (mode == PBVH_ITER_UNIQUE && \
|
||||
BM_elem_flag_test(vi.bm_vert, BM_ELEM_HIDDEN)) \
|
||||
|
@ -2642,7 +2642,7 @@ void CDDM_calc_edges_tessface(DerivedMesh *dm)
|
||||
|
||||
for (ehi = BLI_edgehashIterator_new(eh), i = 0;
|
||||
BLI_edgehashIterator_isDone(ehi) == FALSE;
|
||||
BLI_edgehashIterator_step(ehi), ++i, ++med, ++index)
|
||||
BLI_edgehashIterator_step(ehi), i++, med++, index++)
|
||||
{
|
||||
BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
|
||||
|
||||
|
@ -3852,9 +3852,7 @@ void BKE_mesh_poly_edgehash_insert(EdgeHash *ehash, const MPoly *mp, const MLoop
|
||||
ml = &ml_next[i - 1]; /* last loop */
|
||||
|
||||
while (i-- != 0) {
|
||||
if (!BLI_edgehash_haskey(ehash, ml->v, ml_next->v)) {
|
||||
BLI_edgehash_insert(ehash, ml->v, ml_next->v, NULL);
|
||||
}
|
||||
BLI_edgehash_reinsert(ehash, ml->v, ml_next->v, NULL);
|
||||
|
||||
ml = ml_next;
|
||||
ml_next++;
|
||||
|
@ -614,9 +614,9 @@ void BKE_pbvh_free(PBVH *bvh)
|
||||
if (node->bm_faces)
|
||||
BLI_ghash_free(node->bm_faces, NULL, NULL);
|
||||
if (node->bm_unique_verts)
|
||||
BLI_ghash_free(node->bm_unique_verts, NULL, NULL);
|
||||
BLI_gset_free(node->bm_unique_verts, NULL);
|
||||
if (node->bm_other_verts)
|
||||
BLI_ghash_free(node->bm_other_verts, NULL, NULL);
|
||||
BLI_gset_free(node->bm_other_verts, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1314,8 +1314,8 @@ void BKE_pbvh_node_num_verts(PBVH *bvh, PBVHNode *node, int *uniquevert, int *to
|
||||
if (uniquevert) *uniquevert = node->uniq_verts;
|
||||
break;
|
||||
case PBVH_BMESH:
|
||||
tot = BLI_ghash_size(node->bm_unique_verts);
|
||||
if (totvert) *totvert = tot + BLI_ghash_size(node->bm_other_verts);
|
||||
tot = BLI_gset_size(node->bm_unique_verts);
|
||||
if (totvert) *totvert = tot + BLI_gset_size(node->bm_other_verts);
|
||||
if (uniquevert) *uniquevert = tot;
|
||||
break;
|
||||
}
|
||||
@ -1866,8 +1866,8 @@ void pbvh_vertex_iter_init(PBVH *bvh, PBVHNode *node,
|
||||
vi->mverts = verts;
|
||||
|
||||
if (bvh->type == PBVH_BMESH) {
|
||||
BLI_ghashIterator_init(&vi->bm_unique_verts, node->bm_unique_verts);
|
||||
BLI_ghashIterator_init(&vi->bm_other_verts, node->bm_other_verts);
|
||||
BLI_gsetIterator_init(&vi->bm_unique_verts, node->bm_unique_verts);
|
||||
BLI_gsetIterator_init(&vi->bm_other_verts, node->bm_other_verts);
|
||||
vi->bm_vdata = &bvh->bm->vdata;
|
||||
}
|
||||
|
||||
|
@ -48,8 +48,8 @@ static void pbvh_bmesh_node_finalize(PBVH *bvh, int node_index)
|
||||
PBVHNode *n = &bvh->nodes[node_index];
|
||||
|
||||
/* Create vert hash sets */
|
||||
n->bm_unique_verts = BLI_ghash_ptr_new("bm_unique_verts");
|
||||
n->bm_other_verts = BLI_ghash_ptr_new("bm_other_verts");
|
||||
n->bm_unique_verts = BLI_gset_ptr_new("bm_unique_verts");
|
||||
n->bm_other_verts = BLI_gset_ptr_new("bm_other_verts");
|
||||
|
||||
BB_reset(&n->vb);
|
||||
|
||||
@ -67,13 +67,12 @@ static void pbvh_bmesh_node_finalize(PBVH *bvh, int node_index)
|
||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||
do {
|
||||
v = l_iter->v;
|
||||
if (!BLI_ghash_haskey(n->bm_unique_verts, v)) {
|
||||
if (!BLI_gset_haskey(n->bm_unique_verts, v)) {
|
||||
if (BLI_ghash_haskey(bvh->bm_vert_to_node, v)) {
|
||||
if (!BLI_ghash_haskey(n->bm_other_verts, v))
|
||||
BLI_ghash_insert(n->bm_other_verts, v, NULL);
|
||||
BLI_gset_reinsert(n->bm_other_verts, v, NULL);
|
||||
}
|
||||
else {
|
||||
BLI_ghash_insert(n->bm_unique_verts, v, NULL);
|
||||
BLI_gset_insert(n->bm_unique_verts, v);
|
||||
BLI_ghash_insert(bvh->bm_vert_to_node, v, node_val);
|
||||
}
|
||||
}
|
||||
@ -101,6 +100,7 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
|
||||
{
|
||||
GHash *empty, *other;
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
PBVHNode *n, *c1, *c2;
|
||||
BB cb;
|
||||
float mid;
|
||||
@ -177,11 +177,11 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
|
||||
|
||||
/* Mark this node's unique verts as unclaimed */
|
||||
if (n->bm_unique_verts) {
|
||||
GHASH_ITER (gh_iter, n->bm_unique_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, n->bm_unique_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
BLI_ghash_remove(bvh->bm_vert_to_node, v, NULL, NULL);
|
||||
}
|
||||
BLI_ghash_free(n->bm_unique_verts, NULL, NULL);
|
||||
BLI_gset_free(n->bm_unique_verts, NULL);
|
||||
}
|
||||
|
||||
/* Unclaim faces */
|
||||
@ -192,7 +192,7 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index)
|
||||
BLI_ghash_free(n->bm_faces, NULL, NULL);
|
||||
|
||||
if (n->bm_other_verts)
|
||||
BLI_ghash_free(n->bm_other_verts, NULL, NULL);
|
||||
BLI_gset_free(n->bm_other_verts, NULL);
|
||||
|
||||
if (n->layer_disp)
|
||||
MEM_freeN(n->layer_disp);
|
||||
@ -291,7 +291,7 @@ static BMVert *pbvh_bmesh_vert_create(PBVH *bvh, int node_index,
|
||||
|
||||
BLI_assert((bvh->totnode == 1 || node_index) && node_index <= bvh->totnode);
|
||||
|
||||
BLI_ghash_insert(bvh->nodes[node_index].bm_unique_verts, v, NULL);
|
||||
BLI_gset_insert(bvh->nodes[node_index].bm_unique_verts, v);
|
||||
BLI_ghash_insert(bvh->bm_vert_to_node, v, val);
|
||||
|
||||
/* Log the new vertex */
|
||||
@ -373,14 +373,14 @@ static void pbvh_bmesh_vert_ownership_transfer(PBVH *bvh, PBVHNode *new_owner,
|
||||
BLI_assert(current_owner != new_owner);
|
||||
|
||||
/* Remove current ownership */
|
||||
BLI_ghash_remove(current_owner->bm_unique_verts, v, NULL, NULL);
|
||||
BLI_gset_remove(current_owner->bm_unique_verts, v, NULL);
|
||||
|
||||
/* Set new ownership */
|
||||
BLI_ghash_reinsert(bvh->bm_vert_to_node, v,
|
||||
SET_INT_IN_POINTER(new_owner - bvh->nodes), NULL, NULL);
|
||||
BLI_ghash_insert(new_owner->bm_unique_verts, v, NULL);
|
||||
BLI_ghash_remove(new_owner->bm_other_verts, v, NULL, NULL);
|
||||
BLI_assert(!BLI_ghash_haskey(new_owner->bm_other_verts, v));
|
||||
BLI_gset_insert(new_owner->bm_unique_verts, v);
|
||||
BLI_gset_remove(new_owner->bm_other_verts, v, NULL);
|
||||
BLI_assert(!BLI_gset_haskey(new_owner->bm_other_verts, v));
|
||||
}
|
||||
|
||||
static void pbvh_bmesh_vert_remove(PBVH *bvh, BMVert *v)
|
||||
@ -391,7 +391,7 @@ static void pbvh_bmesh_vert_remove(PBVH *bvh, BMVert *v)
|
||||
|
||||
BLI_assert(BLI_ghash_haskey(bvh->bm_vert_to_node, v));
|
||||
v_node = pbvh_bmesh_node_lookup(bvh, bvh->bm_vert_to_node, v);
|
||||
BLI_ghash_remove(v_node->bm_unique_verts, v, NULL, NULL);
|
||||
BLI_gset_remove(v_node->bm_unique_verts, v, NULL);
|
||||
BLI_ghash_remove(bvh->bm_vert_to_node, v, NULL, NULL);
|
||||
|
||||
/* Have to check each neighboring face's node */
|
||||
@ -401,10 +401,10 @@ static void pbvh_bmesh_vert_remove(PBVH *bvh, BMVert *v)
|
||||
/* Remove current ownership */
|
||||
/* Should be handled above by vert_to_node removal, leaving just in case - psy-fi */
|
||||
//BLI_ghash_remove(f_node->bm_unique_verts, v, NULL, NULL);
|
||||
BLI_ghash_remove(f_node->bm_other_verts, v, NULL, NULL);
|
||||
BLI_gset_remove(f_node->bm_other_verts, v, NULL);
|
||||
|
||||
BLI_assert(!BLI_ghash_haskey(f_node->bm_unique_verts, v));
|
||||
BLI_assert(!BLI_ghash_haskey(f_node->bm_other_verts, v));
|
||||
BLI_assert(!BLI_gset_haskey(f_node->bm_unique_verts, v));
|
||||
BLI_assert(!BLI_gset_haskey(f_node->bm_other_verts, v));
|
||||
}
|
||||
}
|
||||
|
||||
@ -424,7 +424,7 @@ static void pbvh_bmesh_face_remove(PBVH *bvh, BMFace *f)
|
||||
do {
|
||||
v = l_iter->v;
|
||||
if (pbvh_bmesh_node_vert_use_count(bvh, f_node, v) == 1) {
|
||||
if (BLI_ghash_haskey(f_node->bm_unique_verts, v)) {
|
||||
if (BLI_gset_haskey(f_node->bm_unique_verts, v)) {
|
||||
/* Find a different node that uses 'v' */
|
||||
PBVHNode *new_node;
|
||||
|
||||
@ -435,13 +435,13 @@ static void pbvh_bmesh_face_remove(PBVH *bvh, BMFace *f)
|
||||
pbvh_bmesh_vert_ownership_transfer(bvh, new_node, v);
|
||||
}
|
||||
else {
|
||||
BLI_ghash_remove(f_node->bm_unique_verts, v, NULL, NULL);
|
||||
BLI_gset_remove(f_node->bm_unique_verts, v, NULL);
|
||||
BLI_ghash_remove(bvh->bm_vert_to_node, v, NULL, NULL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Remove from other verts */
|
||||
BLI_ghash_remove(f_node->bm_other_verts, v, NULL, NULL);
|
||||
BLI_gset_remove(f_node->bm_other_verts, v, NULL);
|
||||
}
|
||||
}
|
||||
} while ((l_iter = l_iter->next) != l_first);
|
||||
@ -733,10 +733,10 @@ static void pbvh_bmesh_split_edge(PBVH *bvh, EdgeQueue *q, BLI_mempool *pool,
|
||||
BM_face_kill(bvh->bm, f_adj);
|
||||
|
||||
/* Ensure new vertex is in the node */
|
||||
if (!BLI_ghash_haskey(bvh->nodes[ni].bm_unique_verts, v_new) &&
|
||||
!BLI_ghash_haskey(bvh->nodes[ni].bm_other_verts, v_new))
|
||||
if (!BLI_gset_haskey(bvh->nodes[ni].bm_unique_verts, v_new) &&
|
||||
!BLI_gset_haskey(bvh->nodes[ni].bm_other_verts, v_new))
|
||||
{
|
||||
BLI_ghash_insert(bvh->nodes[ni].bm_other_verts, v_new, NULL);
|
||||
BLI_gset_insert(bvh->nodes[ni].bm_other_verts, v_new);
|
||||
}
|
||||
|
||||
if (BM_vert_edge_count(v_opp) >= 9) {
|
||||
@ -857,10 +857,10 @@ static void pbvh_bmesh_collapse_edge(PBVH *bvh, BMEdge *e, BMVert *v1,
|
||||
pbvh_bmesh_face_create(bvh, ni, v_tri, e_tri, f);
|
||||
|
||||
/* Ensure that v1 is in the new face's node */
|
||||
if (!BLI_ghash_haskey(n->bm_unique_verts, v1) &&
|
||||
!BLI_ghash_haskey(n->bm_other_verts, v1))
|
||||
if (!BLI_gset_haskey(n->bm_unique_verts, v1) &&
|
||||
!BLI_gset_haskey(n->bm_other_verts, v1))
|
||||
{
|
||||
BLI_ghash_insert(n->bm_other_verts, v1, NULL);
|
||||
BLI_gset_insert(n->bm_other_verts, v1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1033,16 +1033,17 @@ void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode)
|
||||
|
||||
if (node->flag & PBVH_UpdateNormals) {
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
|
||||
GHASH_ITER (gh_iter, node->bm_faces) {
|
||||
BM_face_normal_update(BLI_ghashIterator_getKey(&gh_iter));
|
||||
}
|
||||
GHASH_ITER (gh_iter, node->bm_unique_verts) {
|
||||
BM_vert_normal_update(BLI_ghashIterator_getKey(&gh_iter));
|
||||
GSET_ITER (gs_iter, node->bm_unique_verts) {
|
||||
BM_vert_normal_update(BLI_gsetIterator_getKey(&gs_iter));
|
||||
}
|
||||
/* This should be unneeded normally */
|
||||
GHASH_ITER (gh_iter, node->bm_other_verts) {
|
||||
BM_vert_normal_update(BLI_ghashIterator_getKey(&gh_iter));
|
||||
GSET_ITER (gs_iter, node->bm_other_verts) {
|
||||
BM_vert_normal_update(BLI_gsetIterator_getKey(&gs_iter));
|
||||
}
|
||||
node->flag &= ~PBVH_UpdateNormals;
|
||||
}
|
||||
@ -1156,14 +1157,15 @@ BLI_INLINE void bm_face_as_array_index_tri(BMFace *f, int r_index[3])
|
||||
void BKE_pbvh_bmesh_node_save_orig(PBVHNode *node)
|
||||
{
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
int i, totvert, tottri;
|
||||
|
||||
/* Skip if original coords/triangles are already saved */
|
||||
if (node->bm_orco)
|
||||
return;
|
||||
|
||||
totvert = (BLI_ghash_size(node->bm_unique_verts) +
|
||||
BLI_ghash_size(node->bm_other_verts));
|
||||
totvert = (BLI_gset_size(node->bm_unique_verts) +
|
||||
BLI_gset_size(node->bm_other_verts));
|
||||
|
||||
tottri = BLI_ghash_size(node->bm_faces);
|
||||
|
||||
@ -1172,14 +1174,14 @@ void BKE_pbvh_bmesh_node_save_orig(PBVHNode *node)
|
||||
|
||||
/* Copy out the vertices and assign a temporary index */
|
||||
i = 0;
|
||||
GHASH_ITER (gh_iter, node->bm_unique_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, node->bm_unique_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
copy_v3_v3(node->bm_orco[i], v->co);
|
||||
BM_elem_index_set(v, i); /* set_dirty! */
|
||||
i++;
|
||||
}
|
||||
GHASH_ITER (gh_iter, node->bm_other_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, node->bm_other_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
copy_v3_v3(node->bm_orco[i], v->co);
|
||||
BM_elem_index_set(v, i); /* set_dirty! */
|
||||
i++;
|
||||
@ -1236,12 +1238,12 @@ void BKE_pbvh_node_mark_topology_update(PBVHNode *node)
|
||||
node->flag |= PBVH_UpdateTopology;
|
||||
}
|
||||
|
||||
GHash *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node)
|
||||
GSet *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node)
|
||||
{
|
||||
return node->bm_unique_verts;
|
||||
}
|
||||
|
||||
GHash *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node)
|
||||
GSet *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node)
|
||||
{
|
||||
return node->bm_other_verts;
|
||||
}
|
||||
@ -1270,6 +1272,27 @@ void bli_ghash_duplicate_key_check(GHash *gh)
|
||||
}
|
||||
}
|
||||
|
||||
void bli_gset_duplicate_key_check(GSet *gs)
|
||||
{
|
||||
GSetIterator gs_iter1, gs_iter2;
|
||||
|
||||
GSET_ITER (gs_iter1, gs) {
|
||||
void *key1 = BLI_gsetIterator_getKey(&gs_iter1);
|
||||
int dup = -1;
|
||||
|
||||
GSET_ITER (gs_iter2, gs) {
|
||||
void *key2 = BLI_gsetIterator_getKey(&gs_iter2);
|
||||
|
||||
if (key1 == key2) {
|
||||
dup++;
|
||||
if (dup > 0) {
|
||||
BLI_assert(!"duplicate in hash");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bmesh_print(BMesh *bm)
|
||||
{
|
||||
BMIter iter, siter;
|
||||
@ -1331,6 +1354,7 @@ void bmesh_print(BMesh *bm)
|
||||
void pbvh_bmesh_print(PBVH *bvh)
|
||||
{
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
int n;
|
||||
|
||||
fprintf(stderr, "\npbvh=%p\n", bvh);
|
||||
@ -1358,13 +1382,13 @@ void pbvh_bmesh_print(PBVH *bvh)
|
||||
fprintf(stderr, " %d\n",
|
||||
BM_elem_index_get((BMFace *)BLI_ghashIterator_getKey(&gh_iter)));
|
||||
fprintf(stderr, " unique verts:\n");
|
||||
GHASH_ITER (gh_iter, node->bm_unique_verts)
|
||||
GSET_ITER (gs_iter, node->bm_unique_verts)
|
||||
fprintf(stderr, " %d\n",
|
||||
BM_elem_index_get((BMVert *)BLI_ghashIterator_getKey(&gh_iter)));
|
||||
BM_elem_index_get((BMVert *)BLI_gsetIterator_getKey(&gs_iter)));
|
||||
fprintf(stderr, " other verts:\n");
|
||||
GHASH_ITER (gh_iter, node->bm_other_verts)
|
||||
GSET_ITER (gs_iter, node->bm_other_verts)
|
||||
fprintf(stderr, " %d\n",
|
||||
BM_elem_index_get((BMVert *)BLI_ghashIterator_getKey(&gh_iter)));
|
||||
BM_elem_index_get((BMVert *)BLI_gsetIterator_getKey(&gs_iter)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1382,6 +1406,7 @@ void print_flag_factors(int flag)
|
||||
void pbvh_bmesh_verify(PBVH *bvh)
|
||||
{
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
int i, vert_count = 0;
|
||||
BMIter iter;
|
||||
BMVert *vi;
|
||||
@ -1407,17 +1432,17 @@ void pbvh_bmesh_verify(PBVH *bvh)
|
||||
PBVHNode *nv;
|
||||
|
||||
/* Check that the vertex is in the node */
|
||||
BLI_assert(BLI_ghash_haskey(n->bm_unique_verts, v) ^
|
||||
BLI_ghash_haskey(n->bm_other_verts, v));
|
||||
BLI_assert(BLI_gset_haskey(n->bm_unique_verts, v) ^
|
||||
BLI_gset_haskey(n->bm_other_verts, v));
|
||||
|
||||
/* Check that the vertex has a node owner */
|
||||
nv = pbvh_bmesh_node_lookup(bvh, bvh->bm_vert_to_node, v);
|
||||
|
||||
/* Check that the vertex's node knows it owns the vert */
|
||||
BLI_assert(BLI_ghash_haskey(nv->bm_unique_verts, v));
|
||||
BLI_assert(BLI_gset_haskey(nv->bm_unique_verts, v));
|
||||
|
||||
/* Check that the vertex isn't duplicated as an 'other' vert */
|
||||
BLI_assert(!BLI_ghash_haskey(nv->bm_other_verts, v));
|
||||
BLI_assert(!BLI_gset_haskey(nv->bm_other_verts, v));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1436,10 +1461,10 @@ void pbvh_bmesh_verify(PBVH *bvh)
|
||||
BLI_assert(n->flag & PBVH_Leaf);
|
||||
|
||||
/* Check that the vert's node knows it owns the vert */
|
||||
BLI_assert(BLI_ghash_haskey(n->bm_unique_verts, v));
|
||||
BLI_assert(BLI_gset_haskey(n->bm_unique_verts, v));
|
||||
|
||||
/* Check that the vertex isn't duplicated as an 'other' vert */
|
||||
BLI_assert(!BLI_ghash_haskey(n->bm_other_verts, v));
|
||||
BLI_assert(!BLI_gset_haskey(n->bm_other_verts, v));
|
||||
|
||||
/* Check that the vert's node also contains one of the vert's
|
||||
* adjacent faces */
|
||||
@ -1451,13 +1476,13 @@ void pbvh_bmesh_verify(PBVH *bvh)
|
||||
}
|
||||
BLI_assert(found);
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
/* total freak stuff, check if node exists somewhere else */
|
||||
/* Slow */
|
||||
for (i = 0; i < bvh->totnode; i++) {
|
||||
PBVHNode *n = &bvh->nodes[i];
|
||||
if (i != ni && n->bm_unique_verts)
|
||||
BLI_assert(!BLI_ghash_haskey(n->bm_unique_verts, v));
|
||||
BLI_assert(!BLI_gset_haskey(n->bm_unique_verts, v));
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -1470,7 +1495,7 @@ void pbvh_bmesh_verify(PBVH *bvh)
|
||||
bool has_unique = false;
|
||||
for (i = 0; i < bvh->totnode; i++) {
|
||||
PBVHNode *n = &bvh->nodes[i];
|
||||
if ((n->bm_unique_verts != NULL) && BLI_ghash_haskey(n->bm_unique_verts, vi))
|
||||
if ((n->bm_unique_verts != NULL) && BLI_gset_haskey(n->bm_unique_verts, vi))
|
||||
has_unique = true;
|
||||
}
|
||||
BLI_assert(has_unique);
|
||||
@ -1489,8 +1514,8 @@ void pbvh_bmesh_verify(PBVH *bvh)
|
||||
/* Slow */
|
||||
#if 0
|
||||
bli_ghash_duplicate_key_check(n->bm_faces);
|
||||
bli_ghash_duplicate_key_check(n->bm_unique_verts);
|
||||
bli_ghash_duplicate_key_check(n->bm_other_verts);
|
||||
bli_gset_duplicate_key_check(n->bm_unique_verts);
|
||||
bli_gset_duplicate_key_check(n->bm_other_verts);
|
||||
#endif
|
||||
|
||||
GHASH_ITER (gh_iter, n->bm_faces) {
|
||||
@ -1500,16 +1525,16 @@ void pbvh_bmesh_verify(PBVH *bvh)
|
||||
BLI_assert(GET_INT_FROM_POINTER(nip) == (n - bvh->nodes));
|
||||
}
|
||||
|
||||
GHASH_ITER (gh_iter, n->bm_unique_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, n->bm_unique_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
void *nip = BLI_ghash_lookup(bvh->bm_vert_to_node, v);
|
||||
BLI_assert(BLI_ghash_haskey(bvh->bm_vert_to_node, v));
|
||||
BLI_assert(!BLI_ghash_haskey(n->bm_other_verts, v));
|
||||
BLI_assert(!BLI_gset_haskey(n->bm_other_verts, v));
|
||||
BLI_assert(GET_INT_FROM_POINTER(nip) == (n - bvh->nodes));
|
||||
}
|
||||
|
||||
GHASH_ITER (gh_iter, n->bm_other_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, n->bm_other_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
BLI_assert(BLI_ghash_haskey(bvh->bm_vert_to_node, v));
|
||||
BLI_assert(BM_vert_face_count(v) > 0);
|
||||
}
|
||||
|
@ -101,8 +101,8 @@ struct PBVHNode {
|
||||
|
||||
/* Dyntopo */
|
||||
GHash *bm_faces;
|
||||
GHash *bm_unique_verts;
|
||||
GHash *bm_other_verts;
|
||||
GSet *bm_unique_verts;
|
||||
GSet *bm_other_verts;
|
||||
float (*bm_orco)[3];
|
||||
int (*bm_ortri)[3];
|
||||
int bm_tot_ortri;
|
||||
|
@ -298,7 +298,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
|
||||
CCGVertHDL *fverts = NULL;
|
||||
BLI_array_declare(fverts);
|
||||
#endif
|
||||
EdgeHash *ehash;
|
||||
EdgeSet *eset;
|
||||
float creaseFactor = (float)ccgSubSurf_getSubdivisionLevels(ss);
|
||||
float uv[3] = {0.0f, 0.0f, 0.0f}; /* only first 2 values are written into */
|
||||
|
||||
@ -334,7 +334,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
|
||||
}
|
||||
|
||||
/* create edges */
|
||||
ehash = BLI_edgehash_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totface));
|
||||
eset = BLI_edgeset_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totface));
|
||||
|
||||
for (i = 0; i < totface; i++) {
|
||||
MPoly *mp = &((MPoly *) mpoly)[i];
|
||||
@ -359,7 +359,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
|
||||
MVert *mv0 = mvert + (ml[j_next].v);
|
||||
MVert *mv1 = mvert + (ml[j].v);
|
||||
|
||||
if (!BLI_edgehash_haskey(ehash, v0, v1)) {
|
||||
if (BLI_edgeset_reinsert(eset, v0, v1)) {
|
||||
CCGEdge *e, *orige = ccgSubSurf_getFaceEdge(origf, j_next);
|
||||
CCGEdgeHDL ehdl = SET_INT_IN_POINTER(mp->loopstart + j_next);
|
||||
float crease;
|
||||
@ -370,12 +370,11 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
|
||||
crease = ccgSubSurf_getEdgeCrease(orige);
|
||||
|
||||
ccgSubSurf_syncEdge(ss, ehdl, fverts[j_next], fverts[j], crease, &e);
|
||||
BLI_edgehash_insert(ehash, v0, v1, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BLI_edgehash_free(ehash, NULL);
|
||||
BLI_edgeset_free(eset);
|
||||
|
||||
/* create faces */
|
||||
for (i = 0; i < totface; i++) {
|
||||
|
@ -437,8 +437,6 @@ bool BLI_edgehashIterator_isDone(EdgeHashIterator *ehi)
|
||||
|
||||
/* Use edgehash API to give 'set' functionality */
|
||||
|
||||
/** \name EdgeSet Functions
|
||||
* \{ */
|
||||
EdgeSet *BLI_edgeset_new_ex(const char *info,
|
||||
const unsigned int nentries_reserve)
|
||||
{
|
||||
@ -500,5 +498,3 @@ void BLI_edgeset_free(EdgeSet *es)
|
||||
{
|
||||
BLI_edgehash_free((EdgeHash *)es, NULL);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@ -222,7 +222,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
|
||||
LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
|
||||
{
|
||||
FileData *fd = (FileData *) bh;
|
||||
GHash *gathered = BLI_ghash_ptr_new("linkable_groups gh");
|
||||
GSet *gathered = BLI_gset_ptr_new("linkable_groups gh");
|
||||
LinkNode *names = NULL;
|
||||
BHead *bhead;
|
||||
|
||||
@ -234,15 +234,15 @@ LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
|
||||
if (BKE_idcode_is_linkable(bhead->code)) {
|
||||
const char *str = BKE_idcode_to_name(bhead->code);
|
||||
|
||||
if (!BLI_ghash_haskey(gathered, (void *)str)) {
|
||||
if (!BLI_gset_haskey(gathered, (void *)str)) {
|
||||
BLI_linklist_prepend(&names, strdup(str));
|
||||
BLI_ghash_insert(gathered, (void *)str, NULL);
|
||||
BLI_gset_insert(gathered, (void *)str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BLI_ghash_free(gathered, NULL, NULL);
|
||||
BLI_gset_free(gathered, NULL);
|
||||
|
||||
return names;
|
||||
}
|
||||
|
@ -87,8 +87,8 @@ void BMW_init(BMWalker *walker, BMesh *bm, int type,
|
||||
walker->mask_edge = mask_edge;
|
||||
walker->mask_face = mask_face;
|
||||
|
||||
walker->visithash = BLI_ghash_ptr_new("bmesh walkers");
|
||||
walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec");
|
||||
walker->visit_set = BLI_gset_ptr_new("bmesh walkers");
|
||||
walker->visit_set_alt = BLI_gset_ptr_new("bmesh walkers sec");
|
||||
|
||||
if (UNLIKELY(type >= BMW_MAXWALKERS || type < 0)) {
|
||||
fprintf(stderr,
|
||||
@ -127,8 +127,8 @@ void BMW_init(BMWalker *walker, BMesh *bm, int type,
|
||||
void BMW_end(BMWalker *walker)
|
||||
{
|
||||
BLI_mempool_destroy(walker->worklist);
|
||||
BLI_ghash_free(walker->visithash, NULL, NULL);
|
||||
BLI_ghash_free(walker->secvisithash, NULL, NULL);
|
||||
BLI_gset_free(walker->visit_set, NULL);
|
||||
BLI_gset_free(walker->visit_set_alt, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -253,6 +253,6 @@ void BMW_reset(BMWalker *walker)
|
||||
BMW_state_remove(walker);
|
||||
}
|
||||
walker->depth = 0;
|
||||
BLI_ghash_clear(walker->visithash, NULL, NULL);
|
||||
BLI_ghash_clear(walker->secvisithash, NULL, NULL);
|
||||
BLI_gset_clear(walker->visit_set, NULL);
|
||||
BLI_gset_clear(walker->visit_set_alt, NULL);
|
||||
}
|
||||
|
@ -67,8 +67,8 @@ typedef struct BMWalker {
|
||||
|
||||
BMWFlag flag;
|
||||
|
||||
GHash *visithash;
|
||||
GHash *secvisithash;
|
||||
GSet *visit_set;
|
||||
GSet *visit_set_alt;
|
||||
int depth;
|
||||
} BMWalker;
|
||||
|
||||
|
@ -85,7 +85,7 @@ static void bmw_ShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
|
||||
{
|
||||
BMwShellWalker *shellWalk = NULL;
|
||||
|
||||
if (BLI_ghash_haskey(walker->visithash, e)) {
|
||||
if (BLI_gset_haskey(walker->visit_set, e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ static void bmw_ShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
|
||||
|
||||
shellWalk = BMW_state_add(walker);
|
||||
shellWalk->curedge = e;
|
||||
BLI_ghash_insert(walker->visithash, e, NULL);
|
||||
BLI_gset_insert(walker->visit_set, e);
|
||||
}
|
||||
|
||||
static void bmw_ShellWalker_begin(BMWalker *walker, void *data)
|
||||
@ -167,8 +167,8 @@ static void *bmw_ShellWalker_step(BMWalker *walker)
|
||||
bool restrictpass = true;
|
||||
BMwShellWalker shellWalk = *((BMwShellWalker *)BMW_current_state(walker));
|
||||
|
||||
if (!BLI_ghash_haskey(walker->visithash, shellWalk.base)) {
|
||||
BLI_ghash_insert(walker->visithash, shellWalk.base, NULL);
|
||||
if (!BLI_gset_haskey(walker->visit_set, shellWalk.base)) {
|
||||
BLI_gset_insert(walker->visit_set, shellWalk.base);
|
||||
}
|
||||
|
||||
BMW_state_remove(walker);
|
||||
@ -177,7 +177,7 @@ static void *bmw_ShellWalker_step(BMWalker *walker)
|
||||
/* find the next edge whose other vertex has not been visite */
|
||||
curedge = shellWalk.curedge;
|
||||
do {
|
||||
if (!BLI_ghash_haskey(walker->visithash, curedge)) {
|
||||
if (!BLI_gset_haskey(walker->visit_set, curedge)) {
|
||||
if (!walker->restrictflag ||
|
||||
(walker->restrictflag && BMO_elem_flag_test(walker->bm, curedge, walker->restrictflag)))
|
||||
{
|
||||
@ -187,7 +187,7 @@ static void *bmw_ShellWalker_step(BMWalker *walker)
|
||||
|
||||
/* push a new state onto the stac */
|
||||
newState = BMW_state_add(walker);
|
||||
BLI_ghash_insert(walker->visithash, curedge, NULL);
|
||||
BLI_gset_insert(walker->visit_set, curedge);
|
||||
|
||||
/* populate the new stat */
|
||||
|
||||
@ -211,7 +211,7 @@ static void bmw_ConnectedVertexWalker_visitVertex(BMWalker *walker, BMVert *v)
|
||||
{
|
||||
BMwConnectedVertexWalker *vwalk;
|
||||
|
||||
if (BLI_ghash_haskey(walker->visithash, v)) {
|
||||
if (BLI_gset_haskey(walker->visit_set, v)) {
|
||||
/* already visited */
|
||||
return;
|
||||
}
|
||||
@ -223,7 +223,7 @@ static void bmw_ConnectedVertexWalker_visitVertex(BMWalker *walker, BMVert *v)
|
||||
|
||||
vwalk = BMW_state_add(walker);
|
||||
vwalk->curvert = v;
|
||||
BLI_ghash_insert(walker->visithash, v, NULL);
|
||||
BLI_gset_insert(walker->visit_set, v);
|
||||
}
|
||||
|
||||
static void bmw_ConnectedVertexWalker_begin(BMWalker *walker, void *data)
|
||||
@ -251,7 +251,7 @@ static void *bmw_ConnectedVertexWalker_step(BMWalker *walker)
|
||||
|
||||
BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
|
||||
v2 = BM_edge_other_vert(e, v);
|
||||
if (!BLI_ghash_haskey(walker->visithash, v2)) {
|
||||
if (!BLI_gset_haskey(walker->visit_set, v2)) {
|
||||
bmw_ConnectedVertexWalker_visitVertex(walker, v2);
|
||||
}
|
||||
}
|
||||
@ -276,7 +276,7 @@ static void bmw_IslandboundWalker_begin(BMWalker *walker, void *data)
|
||||
iwalk->base = iwalk->curloop = l;
|
||||
iwalk->lastv = l->v;
|
||||
|
||||
BLI_ghash_insert(walker->visithash, data, NULL);
|
||||
BLI_gset_insert(walker->visit_set, data);
|
||||
|
||||
}
|
||||
|
||||
@ -334,11 +334,11 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker)
|
||||
if (l == owalk.curloop) {
|
||||
return NULL;
|
||||
}
|
||||
else if (BLI_ghash_haskey(walker->visithash, l)) {
|
||||
else if (BLI_gset_haskey(walker->visit_set, l)) {
|
||||
return owalk.curloop;
|
||||
}
|
||||
|
||||
BLI_ghash_insert(walker->visithash, l, NULL);
|
||||
BLI_gset_insert(walker->visit_set, l);
|
||||
iwalk = BMW_state_add(walker);
|
||||
iwalk->base = owalk.base;
|
||||
|
||||
@ -367,7 +367,7 @@ static void bmw_IslandWalker_begin(BMWalker *walker, void *data)
|
||||
}
|
||||
|
||||
iwalk = BMW_state_add(walker);
|
||||
BLI_ghash_insert(walker->visithash, data, NULL);
|
||||
BLI_gset_insert(walker->visit_set, data);
|
||||
|
||||
iwalk->cur = data;
|
||||
}
|
||||
@ -403,18 +403,18 @@ static void *bmw_IslandWalker_step(BMWalker *walker)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* saves checking BLI_ghash_haskey below (manifold edges theres a 50% chance) */
|
||||
/* saves checking BLI_gset_haskey below (manifold edges theres a 50% chance) */
|
||||
if (f == iwalk->cur) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (BLI_ghash_haskey(walker->visithash, f)) {
|
||||
if (BLI_gset_haskey(walker->visit_set, f)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
iwalk = BMW_state_add(walker);
|
||||
iwalk->cur = f;
|
||||
BLI_ghash_insert(walker->visithash, f, NULL);
|
||||
BLI_gset_insert(walker->visit_set, f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -448,7 +448,7 @@ static void bmw_LoopWalker_begin(BMWalker *walker, void *data)
|
||||
v = e->v1;
|
||||
|
||||
lwalk = BMW_state_add(walker);
|
||||
BLI_ghash_insert(walker->visithash, e, NULL);
|
||||
BLI_gset_insert(walker->visit_set, e);
|
||||
|
||||
lwalk->cur = lwalk->start = e;
|
||||
lwalk->lastv = lwalk->startv = v;
|
||||
@ -494,8 +494,8 @@ static void bmw_LoopWalker_begin(BMWalker *walker, void *data)
|
||||
|
||||
lwalk->lastv = lwalk->startv = BM_edge_other_vert(owalk.cur, lwalk->lastv);
|
||||
|
||||
BLI_ghash_clear(walker->visithash, NULL, NULL);
|
||||
BLI_ghash_insert(walker->visithash, owalk.cur, NULL);
|
||||
BLI_gset_clear(walker->visit_set, NULL);
|
||||
BLI_gset_insert(walker->visit_set, owalk.cur);
|
||||
}
|
||||
|
||||
static void *bmw_LoopWalker_yield(BMWalker *walker)
|
||||
@ -530,7 +530,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
nexte = BM_edge_exists(v, l->v);
|
||||
|
||||
if (bmw_mask_check_edge(walker, nexte) &&
|
||||
!BLI_ghash_haskey(walker->visithash, nexte) &&
|
||||
!BLI_gset_haskey(walker->visit_set, nexte) &&
|
||||
/* never step onto a boundary edge, this gives odd-results */
|
||||
(BM_edge_is_boundary(nexte) == false))
|
||||
{
|
||||
@ -542,7 +542,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
lwalk->is_single = owalk.is_single;
|
||||
lwalk->f_hub = owalk.f_hub;
|
||||
|
||||
BLI_ghash_insert(walker->visithash, nexte, NULL);
|
||||
BLI_gset_insert(walker->visit_set, nexte);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -556,7 +556,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
BM_ITER_ELEM (nexte, &eiter, v, BM_EDGES_OF_VERT) {
|
||||
if ((nexte->l == NULL) &&
|
||||
bmw_mask_check_edge(walker, nexte) &&
|
||||
!BLI_ghash_haskey(walker->visithash, nexte))
|
||||
!BLI_gset_haskey(walker->visit_set, nexte))
|
||||
{
|
||||
lwalk = BMW_state_add(walker);
|
||||
lwalk->cur = nexte;
|
||||
@ -566,7 +566,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
lwalk->is_single = owalk.is_single;
|
||||
lwalk->f_hub = owalk.f_hub;
|
||||
|
||||
BLI_ghash_insert(walker->visithash, nexte, NULL);
|
||||
BLI_gset_insert(walker->visit_set, nexte);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -601,7 +601,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
if (l != NULL) {
|
||||
if (l != e->l &&
|
||||
bmw_mask_check_edge(walker, l->e) &&
|
||||
!BLI_ghash_haskey(walker->visithash, l->e))
|
||||
!BLI_gset_haskey(walker->visit_set, l->e))
|
||||
{
|
||||
lwalk = BMW_state_add(walker);
|
||||
lwalk->cur = l->e;
|
||||
@ -611,7 +611,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
lwalk->is_single = owalk.is_single;
|
||||
lwalk->f_hub = owalk.f_hub;
|
||||
|
||||
BLI_ghash_insert(walker->visithash, l->e, NULL);
|
||||
BLI_gset_insert(walker->visit_set, l->e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -654,7 +654,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
if (l != NULL) {
|
||||
if (l != e->l &&
|
||||
bmw_mask_check_edge(walker, l->e) &&
|
||||
!BLI_ghash_haskey(walker->visithash, l->e))
|
||||
!BLI_gset_haskey(walker->visit_set, l->e))
|
||||
{
|
||||
lwalk = BMW_state_add(walker);
|
||||
lwalk->cur = l->e;
|
||||
@ -664,7 +664,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
|
||||
lwalk->is_single = owalk.is_single;
|
||||
lwalk->f_hub = owalk.f_hub;
|
||||
|
||||
BLI_ghash_insert(walker->visithash, l->e, NULL);
|
||||
BLI_gset_insert(walker->visit_set, l->e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -694,7 +694,7 @@ static bool bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l)
|
||||
}
|
||||
|
||||
/* the face must not have been already visited */
|
||||
if (BLI_ghash_haskey(walker->visithash, l->f) && BLI_ghash_haskey(walker->secvisithash, l->e)) {
|
||||
if (BLI_gset_haskey(walker->visit_set, l->f) && BLI_gset_haskey(walker->visit_set_alt, l->e)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -738,7 +738,7 @@ static void bmw_FaceLoopWalker_begin(BMWalker *walker, void *data)
|
||||
lwalk = BMW_state_add(walker);
|
||||
lwalk->l = e->l;
|
||||
lwalk->no_calc = false;
|
||||
BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
|
||||
BLI_gset_insert(walker->visit_set, lwalk->l->f);
|
||||
|
||||
/* rewind */
|
||||
while ((owalk_pt = BMW_current_state(walker))) {
|
||||
@ -750,11 +750,11 @@ static void bmw_FaceLoopWalker_begin(BMWalker *walker, void *data)
|
||||
*lwalk = owalk;
|
||||
lwalk->no_calc = false;
|
||||
|
||||
BLI_ghash_clear(walker->secvisithash, NULL, NULL);
|
||||
BLI_ghash_insert(walker->secvisithash, lwalk->l->e, NULL);
|
||||
BLI_gset_clear(walker->visit_set_alt, NULL);
|
||||
BLI_gset_insert(walker->visit_set_alt, lwalk->l->e);
|
||||
|
||||
BLI_ghash_clear(walker->visithash, NULL, NULL);
|
||||
BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
|
||||
BLI_gset_clear(walker->visit_set, NULL);
|
||||
BLI_gset_insert(walker->visit_set, lwalk->l->f);
|
||||
}
|
||||
|
||||
static void *bmw_FaceLoopWalker_yield(BMWalker *walker)
|
||||
@ -804,8 +804,8 @@ static void *bmw_FaceLoopWalker_step(BMWalker *walker)
|
||||
}
|
||||
|
||||
/* both may already exist */
|
||||
BLI_ghash_reinsert(walker->secvisithash, l->e, NULL, NULL, NULL);
|
||||
BLI_ghash_reinsert(walker->visithash, l->f, NULL, NULL, NULL);
|
||||
BLI_gset_reinsert(walker->visit_set_alt, l->e, NULL);
|
||||
BLI_gset_reinsert(walker->visit_set, l->f, NULL);
|
||||
}
|
||||
|
||||
return f;
|
||||
@ -836,7 +836,7 @@ static void bmw_EdgeringWalker_begin(BMWalker *walker, void *data)
|
||||
lwalk->wireedge = NULL;
|
||||
}
|
||||
|
||||
BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
|
||||
BLI_gset_insert(walker->visit_set, lwalk->l->e);
|
||||
|
||||
/* rewind */
|
||||
while ((owalk_pt = BMW_current_state(walker))) {
|
||||
@ -856,8 +856,8 @@ static void bmw_EdgeringWalker_begin(BMWalker *walker, void *data)
|
||||
lwalk->l = lwalk->l->radial_next;
|
||||
}
|
||||
|
||||
BLI_ghash_clear(walker->visithash, NULL, NULL);
|
||||
BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
|
||||
BLI_gset_clear(walker->visit_set, NULL);
|
||||
BLI_gset_insert(walker->visit_set, lwalk->l->e);
|
||||
}
|
||||
|
||||
static void *bmw_EdgeringWalker_yield(BMWalker *walker)
|
||||
@ -922,7 +922,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker)
|
||||
}
|
||||
/* only walk to manifold edge */
|
||||
if ((l->f->len % 2 == 0) && EDGE_CHECK(l->e) &&
|
||||
!BLI_ghash_haskey(walker->visithash, l->e))
|
||||
!BLI_gset_haskey(walker->visit_set, l->e))
|
||||
|
||||
#else
|
||||
|
||||
@ -934,14 +934,14 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker)
|
||||
}
|
||||
/* only walk to manifold edge */
|
||||
if ((l->f->len == 4) && EDGE_CHECK(l->e) &&
|
||||
!BLI_ghash_haskey(walker->visithash, l->e))
|
||||
!BLI_gset_haskey(walker->visit_set, l->e))
|
||||
#endif
|
||||
{
|
||||
lwalk = BMW_state_add(walker);
|
||||
lwalk->l = l;
|
||||
lwalk->wireedge = NULL;
|
||||
|
||||
BLI_ghash_insert(walker->visithash, l->e, NULL);
|
||||
BLI_gset_insert(walker->visit_set, l->e);
|
||||
}
|
||||
|
||||
return e;
|
||||
@ -954,12 +954,12 @@ static void bmw_UVEdgeWalker_begin(BMWalker *walker, void *data)
|
||||
BMwUVEdgeWalker *lwalk;
|
||||
BMLoop *l = data;
|
||||
|
||||
if (BLI_ghash_haskey(walker->visithash, l))
|
||||
if (BLI_gset_haskey(walker->visit_set, l))
|
||||
return;
|
||||
|
||||
lwalk = BMW_state_add(walker);
|
||||
lwalk->l = l;
|
||||
BLI_ghash_insert(walker->visithash, l, NULL);
|
||||
BLI_gset_insert(walker->visit_set, l);
|
||||
}
|
||||
|
||||
static void *bmw_UVEdgeWalker_yield(BMWalker *walker)
|
||||
@ -1001,7 +1001,7 @@ static void *bmw_UVEdgeWalker_step(BMWalker *walker)
|
||||
|
||||
rlen = BM_edge_face_count(l2->e);
|
||||
for (j = 0; j < rlen; j++) {
|
||||
if (BLI_ghash_haskey(walker->visithash, l2)) {
|
||||
if (BLI_gset_haskey(walker->visit_set, l2)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1019,7 +1019,7 @@ static void *bmw_UVEdgeWalker_step(BMWalker *walker)
|
||||
continue;
|
||||
|
||||
lwalk = BMW_state_add(walker);
|
||||
BLI_ghash_insert(walker->visithash, l2, NULL);
|
||||
BLI_gset_insert(walker->visit_set, l2);
|
||||
|
||||
lwalk->l = l2;
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* In principle this is very simple however there is the possibility of
|
||||
* going into an eternal loop where edges keep rotating.
|
||||
* To avoid this - each edge stores a hash of it previous
|
||||
* To avoid this - each edge stores a set of it previous
|
||||
* states so as not to rotate back.
|
||||
*
|
||||
* TODO
|
||||
@ -54,14 +54,14 @@ enum {
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* GHash for edge rotation */
|
||||
/* GSet for edge rotation */
|
||||
|
||||
typedef struct EdRotState {
|
||||
int v1, v2; /* edge vert, small -> large */
|
||||
int f1, f2; /* face vert, small -> large */
|
||||
} EdRotState;
|
||||
|
||||
static unsigned int erot_ghashutil_hash(const void *ptr)
|
||||
static unsigned int erot_gsetutil_hash(const void *ptr)
|
||||
{
|
||||
const EdRotState *e_state = (const EdRotState *)ptr;
|
||||
unsigned int
|
||||
@ -71,7 +71,7 @@ static unsigned int erot_ghashutil_hash(const void *ptr)
|
||||
hash ^= BLI_ghashutil_inthash(SET_INT_IN_POINTER(e_state->f2));
|
||||
return hash;
|
||||
}
|
||||
static int erot_ghashutil_cmp(const void *a, const void *b)
|
||||
static int erot_gsetutil_cmp(const void *a, const void *b)
|
||||
{
|
||||
const EdRotState *e_state_a = (const EdRotState *)a;
|
||||
const EdRotState *e_state_b = (const EdRotState *)b;
|
||||
@ -86,9 +86,9 @@ static int erot_ghashutil_cmp(const void *a, const void *b)
|
||||
else return 0;
|
||||
}
|
||||
|
||||
static GHash *erot_ghash_new(void)
|
||||
static GSet *erot_gset_new(void)
|
||||
{
|
||||
return BLI_ghash_new(erot_ghashutil_hash, erot_ghashutil_cmp, __func__);
|
||||
return BLI_gset_new(erot_gsetutil_hash, erot_gsetutil_cmp, __func__);
|
||||
}
|
||||
|
||||
/* ensure v0 is smaller */
|
||||
@ -236,12 +236,12 @@ static float bm_edge_calc_rotate_beauty(const BMEdge *e, const int flag)
|
||||
/* Update the edge cost of rotation in the heap */
|
||||
|
||||
/* recalc an edge in the heap (surrounding geometry has changed) */
|
||||
static void bm_edge_update_beauty_cost_single(BMEdge *e, Heap *eheap, HeapNode **eheap_table, GHash **edge_state_arr,
|
||||
static void bm_edge_update_beauty_cost_single(BMEdge *e, Heap *eheap, HeapNode **eheap_table, GSet **edge_state_arr,
|
||||
const int flag)
|
||||
{
|
||||
if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
|
||||
const int i = BM_elem_index_get(e);
|
||||
GHash *e_state_hash = edge_state_arr[i];
|
||||
GSet *e_state_set = edge_state_arr[i];
|
||||
|
||||
if (eheap_table[i]) {
|
||||
BLI_heap_remove(eheap, eheap_table[i]);
|
||||
@ -254,10 +254,10 @@ static void bm_edge_update_beauty_cost_single(BMEdge *e, Heap *eheap, HeapNode *
|
||||
// BMO_elem_flag_test(bm, e->l->radial_next->f, FACE_MARK));
|
||||
|
||||
/* check we're not moving back into a state we have been in before */
|
||||
if (e_state_hash != NULL) {
|
||||
if (e_state_set != NULL) {
|
||||
EdRotState e_state_alt;
|
||||
erot_state_alternate(e, &e_state_alt);
|
||||
if (BLI_ghash_haskey(e_state_hash, (void *)&e_state_alt)) {
|
||||
if (BLI_gset_haskey(e_state_set, (void *)&e_state_alt)) {
|
||||
// printf(" skipping, we already have this state\n");
|
||||
return;
|
||||
}
|
||||
@ -277,7 +277,7 @@ static void bm_edge_update_beauty_cost_single(BMEdge *e, Heap *eheap, HeapNode *
|
||||
}
|
||||
|
||||
/* we have rotated an edge, tag other edges and clear this one */
|
||||
static void bm_edge_update_beauty_cost(BMEdge *e, Heap *eheap, HeapNode **eheap_table, GHash **edge_state_arr,
|
||||
static void bm_edge_update_beauty_cost(BMEdge *e, Heap *eheap, HeapNode **eheap_table, GSet **edge_state_arr,
|
||||
const int flag)
|
||||
{
|
||||
BMLoop *l;
|
||||
@ -308,7 +308,7 @@ static void bm_mesh_beautify_fill(BMesh *bm, BMEdge **edge_array, const int edge
|
||||
Heap *eheap; /* edge heap */
|
||||
HeapNode **eheap_table; /* edge index aligned table pointing to the eheap */
|
||||
|
||||
GHash **edge_state_arr = MEM_callocN(edge_array_len * sizeof(GHash *), __func__);
|
||||
GSet **edge_state_arr = MEM_callocN(edge_array_len * sizeof(GSet *), __func__);
|
||||
BLI_mempool *edge_state_pool = BLI_mempool_create(sizeof(EdRotState), 512, 512, BLI_MEMPOOL_SYSMALLOC);
|
||||
int i;
|
||||
|
||||
@ -338,18 +338,18 @@ static void bm_mesh_beautify_fill(BMesh *bm, BMEdge **edge_array, const int edge
|
||||
|
||||
e = BM_edge_rotate(bm, e, false, BM_EDGEROT_CHECK_EXISTS);
|
||||
if (LIKELY(e)) {
|
||||
GHash *e_state_hash = edge_state_arr[i];
|
||||
GSet *e_state_set = edge_state_arr[i];
|
||||
|
||||
/* add the new state into the hash so we don't move into this state again
|
||||
/* add the new state into the set so we don't move into this state again
|
||||
* note: we could add the previous state too but this isn't essential)
|
||||
* for avoiding eternal loops */
|
||||
EdRotState *e_state = BLI_mempool_alloc(edge_state_pool);
|
||||
erot_state_current(e, e_state);
|
||||
if (UNLIKELY(e_state_hash == NULL)) {
|
||||
edge_state_arr[i] = e_state_hash = erot_ghash_new(); /* store previous state */
|
||||
if (UNLIKELY(e_state_set == NULL)) {
|
||||
edge_state_arr[i] = e_state_set = erot_gset_new(); /* store previous state */
|
||||
}
|
||||
BLI_assert(BLI_ghash_haskey(e_state_hash, (void *)e_state) == false);
|
||||
BLI_ghash_insert(e_state_hash, e_state, NULL);
|
||||
BLI_assert(BLI_gset_haskey(e_state_set, (void *)e_state) == false);
|
||||
BLI_gset_insert(e_state_set, e_state);
|
||||
|
||||
|
||||
// printf(" %d -> %d, %d\n", i, BM_elem_index_get(e->v1), BM_elem_index_get(e->v2));
|
||||
@ -373,7 +373,7 @@ static void bm_mesh_beautify_fill(BMesh *bm, BMEdge **edge_array, const int edge
|
||||
|
||||
for (i = 0; i < edge_array_len; i++) {
|
||||
if (edge_state_arr[i]) {
|
||||
BLI_ghash_free(edge_state_arr[i], NULL, NULL);
|
||||
BLI_gset_free(edge_state_arr[i], NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,7 @@ typedef struct HullTriangle {
|
||||
|
||||
/*************************** Hull Triangles ***************************/
|
||||
|
||||
static void hull_add_triangle(BMesh *bm, GHash *hull_triangles, BLI_mempool *pool,
|
||||
static void hull_add_triangle(BMesh *bm, GSet *hull_triangles, BLI_mempool *pool,
|
||||
BMVert *v1, BMVert *v2, BMVert *v3)
|
||||
{
|
||||
HullTriangle *t;
|
||||
@ -82,7 +82,7 @@ static void hull_add_triangle(BMesh *bm, GHash *hull_triangles, BLI_mempool *poo
|
||||
for (i = 0; i < 3; i++)
|
||||
BMO_elem_flag_disable(bm, t->v[i], HULL_FLAG_INTERIOR_ELE);
|
||||
|
||||
BLI_ghash_insert(hull_triangles, t, NULL);
|
||||
BLI_gset_insert(hull_triangles, t);
|
||||
normal_tri_v3(t->no, v1->co, v2->co, v3->co);
|
||||
}
|
||||
|
||||
@ -102,12 +102,12 @@ static BMFace *hull_find_example_face(BMesh *bm, BMEdge *e)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void hull_output_triangles(BMesh *bm, GHash *hull_triangles)
|
||||
static void hull_output_triangles(BMesh *bm, GSet *hull_triangles)
|
||||
{
|
||||
GHashIterator iter;
|
||||
GSetIterator iter;
|
||||
|
||||
GHASH_ITER (iter, hull_triangles) {
|
||||
HullTriangle *t = BLI_ghashIterator_getKey(&iter);
|
||||
GSET_ITER (iter, hull_triangles) {
|
||||
HullTriangle *t = BLI_gsetIterator_getKey(&iter);
|
||||
int i;
|
||||
|
||||
if (!t->skip) {
|
||||
@ -206,22 +206,22 @@ static int hull_final_edges_lookup(HullFinalEdges *final_edges,
|
||||
}
|
||||
|
||||
/* Used for checking whether a pre-existing edge lies on the hull */
|
||||
static HullFinalEdges *hull_final_edges(GHash *hull_triangles)
|
||||
static HullFinalEdges *hull_final_edges(GSet *hull_triangles)
|
||||
{
|
||||
HullFinalEdges *final_edges;
|
||||
GHashIterator iter;
|
||||
GSetIterator iter;
|
||||
|
||||
final_edges = MEM_callocN(sizeof(HullFinalEdges), "HullFinalEdges");
|
||||
final_edges->edges = BLI_ghash_ptr_new("final edges ghash");
|
||||
final_edges->base_pool = BLI_mempool_create(sizeof(ListBase), 128, 128, 0);
|
||||
final_edges->link_pool = BLI_mempool_create(sizeof(LinkData), 128, 128, 0);
|
||||
|
||||
GHASH_ITER (iter, hull_triangles) {
|
||||
GSET_ITER (iter, hull_triangles) {
|
||||
LinkData *link;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
HullTriangle *t = BLI_ghashIterator_getKey(&iter);
|
||||
HullTriangle *t = BLI_gsetIterator_getKey(&iter);
|
||||
BMVert *v1 = t->v[i];
|
||||
BMVert *v2 = t->v[(i + 1) % 3];
|
||||
ListBase *adj;
|
||||
@ -259,13 +259,13 @@ static void hull_final_edges_free(HullFinalEdges *final_edges)
|
||||
|
||||
/**************************** Final Output ****************************/
|
||||
|
||||
static void hull_remove_overlapping(BMesh *bm, GHash *hull_triangles,
|
||||
static void hull_remove_overlapping(BMesh *bm, GSet *hull_triangles,
|
||||
HullFinalEdges *final_edges)
|
||||
{
|
||||
GHashIterator hull_iter;
|
||||
GSetIterator hull_iter;
|
||||
|
||||
GHASH_ITER (hull_iter, hull_triangles) {
|
||||
HullTriangle *t = BLI_ghashIterator_getKey(&hull_iter);
|
||||
GSET_ITER (hull_iter, hull_triangles) {
|
||||
HullTriangle *t = BLI_gsetIterator_getKey(&hull_iter);
|
||||
BMIter bm_iter1, bm_iter2;
|
||||
BMFace *f;
|
||||
bool f_on_hull;
|
||||
@ -479,7 +479,7 @@ static BMVert **hull_verts_from_bullet(plConvexHull hull,
|
||||
}
|
||||
|
||||
static void hull_from_bullet(BMesh *bm, BMOperator *op,
|
||||
GHash *hull_triangles,
|
||||
GSet *hull_triangles,
|
||||
BLI_mempool *pool)
|
||||
{
|
||||
int *fvi = NULL;
|
||||
@ -556,7 +556,7 @@ void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
|
||||
BLI_mempool *hull_pool;
|
||||
BMElemF *ele;
|
||||
BMOIter oiter;
|
||||
GHash *hull_triangles;
|
||||
GSet *hull_triangles;
|
||||
|
||||
/* Verify that at least three verts in the input */
|
||||
if (!hull_num_input_verts_is_ok(op)) {
|
||||
@ -575,7 +575,7 @@ void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
|
||||
}
|
||||
|
||||
hull_pool = BLI_mempool_create(sizeof(HullTriangle), 128, 128, 0);
|
||||
hull_triangles = BLI_ghash_ptr_new("hull_triangles");
|
||||
hull_triangles = BLI_gset_ptr_new("hull_triangles");
|
||||
|
||||
hull_from_bullet(bm, op, hull_triangles, hull_pool);
|
||||
|
||||
@ -597,7 +597,7 @@ void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
|
||||
hull_output_triangles(bm, hull_triangles);
|
||||
BLI_mempool_destroy(hull_pool);
|
||||
|
||||
BLI_ghash_free(hull_triangles, NULL, NULL);
|
||||
BLI_gset_free(hull_triangles, NULL);
|
||||
|
||||
hull_tag_unused(bm, op);
|
||||
|
||||
|
@ -203,7 +203,7 @@ finally:
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* Edge Loop Pairs */
|
||||
/* key (ordered loop pointers) */
|
||||
static GHash *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
|
||||
static GSet *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
|
||||
{
|
||||
/**
|
||||
* Method for for finding pairs:
|
||||
@ -219,7 +219,7 @@ static GHash *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
|
||||
* could sort and optimize this but not really so important.
|
||||
*/
|
||||
|
||||
GHash *eloop_pair_gh = BLI_ghash_pair_new(__func__);
|
||||
GSet *eloop_pair_gs = BLI_gset_pair_new(__func__);
|
||||
GHash *vert_eloop_gh = BLI_ghash_ptr_new(__func__);
|
||||
|
||||
struct BMEdgeLoopStore *el_store;
|
||||
@ -256,9 +256,9 @@ static GHash *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
|
||||
if (pair_test.first > pair_test.second)
|
||||
SWAP(const void *, pair_test.first, pair_test.second);
|
||||
|
||||
if (!BLI_ghash_haskey(eloop_pair_gh, &pair_test)) {
|
||||
if (!BLI_gset_haskey(eloop_pair_gs, &pair_test)) {
|
||||
GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second);
|
||||
BLI_ghash_insert(eloop_pair_gh, pair, NULL);
|
||||
BLI_gset_insert(eloop_pair_gs, pair);
|
||||
}
|
||||
|
||||
}
|
||||
@ -268,12 +268,12 @@ static GHash *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
|
||||
|
||||
BLI_ghash_free(vert_eloop_gh, NULL, NULL);
|
||||
|
||||
if (BLI_ghash_size(eloop_pair_gh) == 0) {
|
||||
BLI_ghash_free(eloop_pair_gh, NULL, NULL);
|
||||
eloop_pair_gh = NULL;
|
||||
if (BLI_gset_size(eloop_pair_gs) == 0) {
|
||||
BLI_gset_free(eloop_pair_gs, NULL);
|
||||
eloop_pair_gs = NULL;
|
||||
}
|
||||
|
||||
return eloop_pair_gh;
|
||||
return eloop_pair_gs;
|
||||
}
|
||||
|
||||
|
||||
@ -1175,23 +1175,23 @@ void bmo_subdivide_edgering_exec(BMesh *bm, BMOperator *op)
|
||||
}
|
||||
}
|
||||
else {
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
int i;
|
||||
|
||||
GHash *eloop_pairs_gh = bm_edgering_pair_calc(bm, &eloops_rim);
|
||||
GSet *eloop_pairs_gs = bm_edgering_pair_calc(bm, &eloops_rim);
|
||||
LoopPairStore **lpair_arr;
|
||||
|
||||
if (eloop_pairs_gh == NULL) {
|
||||
if (eloop_pairs_gs == NULL) {
|
||||
BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
|
||||
"Edge-rings are not connected");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
lpair_arr = BLI_array_alloca(lpair_arr, BLI_ghash_size(eloop_pairs_gh));
|
||||
lpair_arr = BLI_array_alloca(lpair_arr, BLI_gset_size(eloop_pairs_gs));
|
||||
|
||||
/* first cache pairs */
|
||||
GHASH_ITER_INDEX (gh_iter, eloop_pairs_gh, i) {
|
||||
GHashPair *eloop_pair = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER_INDEX (gs_iter, eloop_pairs_gs, i) {
|
||||
GHashPair *eloop_pair = BLI_gsetIterator_getKey(&gs_iter);
|
||||
struct BMEdgeLoopStore *el_store_a = (void *)eloop_pair->first;
|
||||
struct BMEdgeLoopStore *el_store_b = (void *)eloop_pair->second;
|
||||
LoopPairStore *lpair;
|
||||
@ -1207,8 +1207,8 @@ void bmo_subdivide_edgering_exec(BMesh *bm, BMOperator *op)
|
||||
BLI_assert(bm_verts_tag_count(bm) == 0);
|
||||
}
|
||||
|
||||
GHASH_ITER_INDEX (gh_iter, eloop_pairs_gh, i) {
|
||||
GHashPair *eloop_pair = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER_INDEX (gs_iter, eloop_pairs_gs, i) {
|
||||
GHashPair *eloop_pair = BLI_gsetIterator_getKey(&gs_iter);
|
||||
struct BMEdgeLoopStore *el_store_a = (void *)eloop_pair->first;
|
||||
struct BMEdgeLoopStore *el_store_b = (void *)eloop_pair->second;
|
||||
LoopPairStore *lpair = lpair_arr[i];
|
||||
@ -1222,7 +1222,7 @@ void bmo_subdivide_edgering_exec(BMesh *bm, BMOperator *op)
|
||||
|
||||
BLI_assert(bm_verts_tag_count(bm) == 0);
|
||||
}
|
||||
BLI_ghash_free(eloop_pairs_gh, MEM_freeN, NULL);
|
||||
BLI_gset_free(eloop_pairs_gs, MEM_freeN);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
@ -2533,13 +2533,13 @@ static size_t animdata_filter_remove_invalid(ListBase *anim_data)
|
||||
static size_t animdata_filter_remove_duplis(ListBase *anim_data)
|
||||
{
|
||||
bAnimListElem *ale, *next;
|
||||
GHash *gh;
|
||||
GSet *gs;
|
||||
size_t items = 0;
|
||||
|
||||
/* build new hashtable to efficiently store and retrieve which entries have been
|
||||
* encountered already while searching
|
||||
*/
|
||||
gh = BLI_ghash_ptr_new("animdata_filter_duplis_remove gh");
|
||||
gs = BLI_gset_ptr_new(__func__);
|
||||
|
||||
/* loop through items, removing them from the list if a similar item occurs already */
|
||||
for (ale = anim_data->first; ale; ale = next) {
|
||||
@ -2549,9 +2549,8 @@ static size_t animdata_filter_remove_duplis(ListBase *anim_data)
|
||||
* - just use ale->data for now, though it would be nicer to involve
|
||||
* ale->type in combination too to capture corner cases (where same data performs differently)
|
||||
*/
|
||||
if (BLI_ghash_haskey(gh, ale->data) == 0) {
|
||||
if (BLI_gset_reinsert(gs, ale->data, NULL)) {
|
||||
/* this entry is 'unique' and can be kept */
|
||||
BLI_ghash_insert(gh, ale->data, NULL);
|
||||
items++;
|
||||
}
|
||||
else {
|
||||
@ -2561,7 +2560,7 @@ static size_t animdata_filter_remove_duplis(ListBase *anim_data)
|
||||
}
|
||||
|
||||
/* free the hash... */
|
||||
BLI_ghash_free(gh, NULL, NULL);
|
||||
BLI_gset_free(gs, NULL);
|
||||
|
||||
/* return the number of items still in the list */
|
||||
return items;
|
||||
|
@ -223,17 +223,17 @@ static void partialvis_update_grids(Object *ob,
|
||||
}
|
||||
|
||||
static void partialvis_update_bmesh_verts(BMesh *bm,
|
||||
GHash *verts,
|
||||
GSet *verts,
|
||||
PartialVisAction action,
|
||||
PartialVisArea area,
|
||||
float planes[4][4],
|
||||
int *any_changed,
|
||||
int *any_visible)
|
||||
{
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
|
||||
GHASH_ITER (gh_iter, verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
float *vmask = CustomData_bmesh_get(&bm->vdata,
|
||||
v->head.data,
|
||||
CD_PAINT_MASK);
|
||||
@ -260,7 +260,7 @@ static void partialvis_update_bmesh(Object *ob,
|
||||
float planes[4][4])
|
||||
{
|
||||
BMesh *bm;
|
||||
GHash *unique, *other;
|
||||
GSet *unique, *other;
|
||||
int any_changed = 0, any_visible = 0;
|
||||
|
||||
bm = BKE_pbvh_get_bmesh(pbvh);
|
||||
|
@ -46,6 +46,7 @@ struct CustomData;
|
||||
struct DMFlagMat;
|
||||
struct DerivedMesh;
|
||||
struct GHash;
|
||||
struct GSet;
|
||||
struct GPUVertPointLink;
|
||||
struct PBVH;
|
||||
|
||||
@ -177,8 +178,8 @@ GPU_Buffers *GPU_build_bmesh_buffers(int smooth_shading);
|
||||
void GPU_update_bmesh_buffers(GPU_Buffers *buffers,
|
||||
struct BMesh *bm,
|
||||
struct GHash *bm_faces,
|
||||
struct GHash *bm_unique_verts,
|
||||
struct GHash *bm_other_verts);
|
||||
struct GSet *bm_unique_verts,
|
||||
struct GSet *bm_other_verts);
|
||||
|
||||
void GPU_update_grid_buffers(GPU_Buffers *buffers, struct CCGElem **grids,
|
||||
const struct DMFlagMat *grid_flag_mats,
|
||||
|
@ -1963,19 +1963,19 @@ static void gpu_bmesh_vert_to_buffer_copy(BMVert *v,
|
||||
}
|
||||
|
||||
/* Return the total number of vertices that don't have BM_ELEM_HIDDEN set */
|
||||
static int gpu_bmesh_vert_visible_count(GHash *bm_unique_verts,
|
||||
GHash *bm_other_verts)
|
||||
static int gpu_bmesh_vert_visible_count(GSet *bm_unique_verts,
|
||||
GSet *bm_other_verts)
|
||||
{
|
||||
GHashIterator gh_iter;
|
||||
GSetIterator gs_iter;
|
||||
int totvert = 0;
|
||||
|
||||
GHASH_ITER (gh_iter, bm_unique_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, bm_unique_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN))
|
||||
totvert++;
|
||||
}
|
||||
GHASH_ITER (gh_iter, bm_other_verts) {
|
||||
BMVert *v = BLI_ghashIterator_getKey(&gh_iter);
|
||||
GSET_ITER (gs_iter, bm_other_verts) {
|
||||
BMVert *v = BLI_gsetIterator_getKey(&gs_iter);
|
||||
if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN))
|
||||
totvert++;
|
||||
}
|
||||
@ -2004,8 +2004,8 @@ static int gpu_bmesh_face_visible_count(GHash *bm_faces)
|
||||
void GPU_update_bmesh_buffers(GPU_Buffers *buffers,
|
||||
BMesh *bm,
|
||||
GHash *bm_faces,
|
||||
GHash *bm_unique_verts,
|
||||
GHash *bm_other_verts)
|
||||
GSet *bm_unique_verts,
|
||||
GSet *bm_other_verts)
|
||||
{
|
||||
VertexBufferFormat *vert_data;
|
||||
void *tri_data;
|
||||
@ -2036,22 +2036,23 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers,
|
||||
/* Fill vertex buffer */
|
||||
vert_data = glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
if (vert_data) {
|
||||
GHashIterator gh_iter;
|
||||
int v_index = 0;
|
||||
|
||||
if (buffers->smooth) {
|
||||
GSetIterator gs_iter;
|
||||
|
||||
/* Vertices get an index assigned for use in the triangle
|
||||
* index buffer */
|
||||
bm->elem_index_dirty |= BM_VERT;
|
||||
|
||||
GHASH_ITER (gh_iter, bm_unique_verts) {
|
||||
gpu_bmesh_vert_to_buffer_copy(BLI_ghashIterator_getKey(&gh_iter),
|
||||
GSET_ITER (gs_iter, bm_unique_verts) {
|
||||
gpu_bmesh_vert_to_buffer_copy(BLI_gsetIterator_getKey(&gs_iter),
|
||||
vert_data, &v_index, NULL, NULL,
|
||||
cd_vert_mask_offset);
|
||||
}
|
||||
|
||||
GHASH_ITER (gh_iter, bm_other_verts) {
|
||||
gpu_bmesh_vert_to_buffer_copy(BLI_ghashIterator_getKey(&gh_iter),
|
||||
GSET_ITER (gs_iter, bm_other_verts) {
|
||||
gpu_bmesh_vert_to_buffer_copy(BLI_gsetIterator_getKey(&gs_iter),
|
||||
vert_data, &v_index, NULL, NULL,
|
||||
cd_vert_mask_offset);
|
||||
}
|
||||
@ -2059,6 +2060,8 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers,
|
||||
maxvert = v_index;
|
||||
}
|
||||
else {
|
||||
GHashIterator gh_iter;
|
||||
|
||||
GHASH_ITER (gh_iter, bm_faces) {
|
||||
BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user