Commit: 2e64b16879c2d7986f94e7de4242ebdb7b4464ca Author: Joseph Eagar Date: Tue Sep 29 18:39:27 2020 -0700 Branches: temp-trimesh-sculpt https://developer.blender.org/rB2e64b16879c2d7986f94e7de4242ebdb7b4464ca
* More roughing out of code =================================================================== M source/blender/blenkernel/intern/pbvh_intern.h M source/blender/blenkernel/intern/pbvh_trimesh.c M source/blender/blenlib/BLI_trimesh.h M source/blender/blenlib/intern/BLI_trimesh.c =================================================================== diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h index fa054efbecb..cabe96dc158 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.h +++ b/source/blender/blenkernel/intern/pbvh_intern.h @@ -178,9 +178,11 @@ struct PBVH { struct BMLog *bm_log; /* trimesh data */ - struct TriMesh *tm; + struct BLI_TriMesh *tm; float tm_max_edge_len; float tm_min_edge_len; + + struct TriMeshLog *tm_log; }; /* pbvh.c */ diff --git a/source/blender/blenkernel/intern/pbvh_trimesh.c b/source/blender/blenkernel/intern/pbvh_trimesh.c index 71054592e18..35accad9133 100644 --- a/source/blender/blenkernel/intern/pbvh_trimesh.c +++ b/source/blender/blenkernel/intern/pbvh_trimesh.c @@ -74,9 +74,9 @@ static void pbvh_trimesh_verify(PBVH *bvh); #define _TRITEST(a, b, c) tri->v1 == a && tri->v2 == b && tri->v3 == c -OptTri *trimesh_tri_exists(OptTriEdge *e, OptTriVert *opposite) { +TMFace *trimesh_tri_exists(TMEdge *e, TMVert *opposite) { for (int i=0; i<e->tris.length; i++) { - OptTri *tri = e->tris.items[i]; + TMFace *tri = e->tris.items[i]; if (_TRITEST(e->v1, e->v2, opposite)) return tri; @@ -94,6 +94,38 @@ OptTri *trimesh_tri_exists(OptTriEdge *e, OptTriVert *opposite) { } #undef _TRITEST + +/** +* Uses a map of vertices to lookup the final target. +* References can't point to previous items (would cause infinite loop). +*/ +static TMVert *tm_vert_hash_lookup_chain(GHash *deleted_verts, TMVert *v) +{ + while (true) { + TMVert **v_next_p = (TMVert **)BLI_ghash_lookup_p(deleted_verts, v); + + if (v_next_p == NULL) { + /* not remapped*/ + return v; + } + else if (*v_next_p == NULL) { + /* removed and not remapped */ + return NULL; + } + else { + /* remapped */ + v = *v_next_p; + } + } +} + + +static void tm_edges_from_tri(BLI_TriMesh *tm, TMVert *vs[3], TMEdge *es[3], int threadnr, bool skipcd) { + es[0] = BLI_trimesh_get_edge(tm, vs[0], vs[1], threadnr, skipcd); + es[1] = BLI_trimesh_get_edge(tm, vs[1], vs[2], threadnr, skipcd); + es[2] = BLI_trimesh_get_edge(tm, vs[2], vs[0], threadnr, skipcd); +} + /* Update node data after splitting */ static void pbvh_trimesh_node_finalize(PBVH *bvh, const int node_index, @@ -111,16 +143,16 @@ static void pbvh_trimesh_node_finalize(PBVH *bvh, BB_reset(&n->vb); GSET_ITER (gs_iter, n->tm_faces) { - OptTri *f = BLI_gsetIterator_getKey(&gs_iter); + TMFace *f = BLI_gsetIterator_getKey(&gs_iter); /* Update ownership of faces */ TRIMESH_ELEM_CD_SET_INT(f, cd_face_node_offset, node_index); /* Update vertices */ for (int i=0; i<3; i++) { - OptTriVert *v = TRIMESH_GET_TRI_VERT(f, i); - OptTriEdge *e = TRIMESH_GET_TRI_EDGE(f, i); - OptTriLoop *l = TRIMESH_GET_TRI_LOOP(f, i); + TMVert *v = TRIMESH_GET_TRI_VERT(f, i); + TMEdge *e = TRIMESH_GET_TRI_EDGE(f, i); + TMLoopData *l = TRIMESH_GET_TRI_LOOP(f, i); if (TRIMESH_ELEM_CD_GET_INT(v, cd_vert_node_offset) != DYNTOPO_NODE_NONE) { BLI_gset_add(n->tm_other_verts, v); @@ -163,7 +195,7 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in BB_reset(&cb); GSetIterator gs_iter; GSET_ITER (gs_iter, n->tm_faces) { - const OptTri *f = BLI_gsetIterator_getKey(&gs_iter); + const TMFace *f = BLI_gsetIterator_getKey(&gs_iter); const BBC *bbc = &bbc_array[f->index]; BB_expand(&cb, bbc->bcentroid); @@ -190,7 +222,7 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in /* Partition the parent node's faces between the two children */ GSET_ITER (gs_iter, n->tm_faces) { - OptTri *f = BLI_gsetIterator_getKey(&gs_iter); + TMFace *f = BLI_gsetIterator_getKey(&gs_iter); const BBC *bbc = &bbc_array[f->index]; if (bbc->bcentroid[axis] < mid) { @@ -225,7 +257,7 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in /* Mark this node's unique verts as unclaimed */ if (n->tm_unique_verts) { GSET_ITER (gs_iter, n->tm_unique_verts) { - OptTriVert *v = BLI_gsetIterator_getKey(&gs_iter); + TMVert *v = BLI_gsetIterator_getKey(&gs_iter); TRIMESH_ELEM_CD_SET_INT(v, cd_vert_node_offset, DYNTOPO_NODE_NONE); } BLI_gset_free(n->tm_unique_verts, NULL); @@ -233,7 +265,7 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in /* Unclaim faces */ GSET_ITER (gs_iter, n->tm_faces) { - OptTri *f = BLI_gsetIterator_getKey(&gs_iter); + TMFace *f = BLI_gsetIterator_getKey(&gs_iter); TRIMESH_ELEM_CD_SET_INT(f, cd_face_node_offset, DYNTOPO_NODE_NONE); } BLI_gset_free(n->tm_faces, NULL); @@ -281,25 +313,24 @@ static bool pbvh_trimesh_node_limit_ensure(PBVH *bvh, int node_index) return false; } - /* For each BMFace, store the AABB and AABB centroid */ + /* For each TMFace, store the AABB and AABB centroid */ BBC *bbc_array = MEM_mallocN(sizeof(BBC) * tm_faces_size, "BBC"); GSetIterator gs_iter; int i; GSET_ITER_INDEX (gs_iter, tm_faces, i) { - BMFace *f = BLI_gsetIterator_getKey(&gs_iter); + TMFace *f = BLI_gsetIterator_getKey(&gs_iter); BBC *bbc = &bbc_array[i]; BB_reset((BB *)bbc); - BMLoop *l_first = BM_FACE_FIRST_LOOP(f); - BMLoop *l_iter = l_first; - do { - BB_expand((BB *)bbc, l_iter->v->co); - } while ((l_iter = l_iter->next) != l_first); + BB_expand((BB *)bbc, f->v1->co); + BB_expand((BB *)bbc, f->v2->co); + BB_expand((BB *)bbc, f->v3->co); + BBC_update_centroid(bbc); /* so we can do direct lookups on 'bbc_array' */ - BM_elem_index_set(f, i); /* set_dirty! */ + f->index = i; /* set_dirty! */ } /* Likely this is already dirty. */ bvh->bm->elem_index_dirty |= BM_FACE; @@ -344,38 +375,38 @@ static PBVHNode *pbvh_trimesh_node_from_elem(PBVH *bvh, void *key) /* typecheck */ # define pbvh_trimesh_node_index_from_elem(bvh, key) \ - (CHECK_TYPE_ANY(key, BMFace *, BMVert *), pbvh_trimesh_node_index_from_elem(bvh, key)) + (CHECK_TYPE_ANY(key, TMFace *, TMVert *), pbvh_trimesh_node_index_from_elem(bvh, key)) # define pbvh_trimesh_node_from_elem(bvh, key) \ - (CHECK_TYPE_ANY(key, BMFace *, BMVert *), pbvh_trimesh_node_from_elem(bvh, key)) + (CHECK_TYPE_ANY(key, TMFace *, TMVert *), pbvh_trimesh_node_from_elem(bvh, key)) #endif -BLI_INLINE int pbvh_trimesh_node_index_from_vert(PBVH *bvh, const OptTriVert *key) +BLI_INLINE int pbvh_trimesh_node_index_from_vert(PBVH *bvh, const TMVert *key) { - const int node_index = TRIMESH_ELEM_CD_GET_INT((const OptTriElem *)key, bvh->cd_vert_node_offset); + const int node_index = TRIMESH_ELEM_CD_GET_INT((const TMElement *)key, bvh->cd_vert_node_offset); BLI_assert(node_index != DYNTOPO_NODE_NONE); BLI_assert(node_index < bvh->totnode); return node_index; } -BLI_INLINE int pbvh_trimesh_node_index_from_face(PBVH *bvh, const OptTri *key) +BLI_INLINE int pbvh_trimesh_node_index_from_face(PBVH *bvh, const TMFace *key) { - const int node_index = TRIMESH_ELEM_CD_GET_INT((const OptTriElem *)key, bvh->cd_face_node_offset); + const int node_index = TRIMESH_ELEM_CD_GET_INT((const TMElement *)key, bvh->cd_face_node_offset); BLI_assert(node_index != DYNTOPO_NODE_NONE); BLI_assert(node_index < bvh->totnode); return node_index; } -BLI_INLINE PBVHNode *pbvh_trimesh_node_from_vert(PBVH *bvh, const OptTriVert *key) +BLI_INLINE PBVHNode *pbvh_trimesh_node_from_vert(PBVH *bvh, const TMVert *key) { return &bvh->nodes[pbvh_trimesh_node_index_from_vert(bvh, key)]; } -BLI_INLINE PBVHNode *pbvh_trimesh_node_from_face(PBVH *bvh, const OptTriFace *key) +BLI_INLINE PBVHNode *pbvh_trimesh_node_from_face(PBVH *bvh, const TMFace *key) { return &bvh->nodes[pbvh_trimesh_node_index_from_face(bvh, key)]; } -static BMVert *pbvh_trimesh_vert_create( +static TMVert *pbvh_trimesh_vert_create( PBVH *bvh, int node_index, const float co[3], const float no[3], const int cd_vert_mask_offset) { PBVHNode *node = &bvh->nodes[node_index]; @@ -383,7 +414,7 @@ static BMVert *pbvh_trimesh_vert_create( BLI_assert((bvh->totnode == 1 || node_index) && node_index <= bvh->totnode); /* avoid initializing customdata because its quite involved */ - OptTriVert *v = BLI_trimesh_make_vert(bvh->tm_max_edge_len, co, no, 0, true); + TMVert *v = BLI_trimesh_make_vert(bvh->tm, co, no, 0, true); CustomData_bmesh_set_default(&bvh->tm->vdata, &v->customdata); BLI_gset_insert(node->tm_unique_verts, v); @@ -392,7 +423,7 @@ static BMVert *pbvh_trimesh_vert_create( node->flag |= PBVH_UpdateDrawBuffers | PBVH_UpdateBB; /* Log the new vertex */ - BM_log_vert_added(bvh->bm_log, v, cd_vert_mask_offset); + BLI_trimesh_log_vert_add(bvh->tm_log, v, cd_vert_mask_offset, false); return v; } @@ -400,16 +431,16 @@ static BMVert *pbvh_trimesh_vert_create( /** * \note Callers are responsible for checking if the face exists before adding. */ -static BMFace *pbvh_trimesh_face_create( - PBVH *bvh, int node_index, BMVert *v_tri[3], BMEdge *e_tri[3], const BMFace *f_example) +static TMFace *pbvh_trimesh_face_create( + PBVH *bvh, int node_index, TMVert *v_tri[3], TMEdge *e_tri[3], const TMFace *f_example) { PBVHNode *node = &bvh->nodes[node_index]; - + /* ensure we never add existing face */ - BLI_assert(!BM_face_exists(v_tri, 3)); + //BLI_assert(!BM_face_exists(v_tri, 3)); - BMFace *f = BM_face_create(bvh->bm, v_tri, e_tri, 3, f_example, BM_CREATE_NOP); - f->head.hflag = f_example->head.hflag; + TMFace *f = BLI_trimesh_make_tri(bvh->tm, v_tri[0], v_tri[1], v_tri[2], 0, false); + //f->head.hflag = f_example->head.hflag; BLI_gset_insert(node->tm_faces, f); TRIMESH_ELEM_CD_SET_INT(f, bvh->cd_face_node_offset, node_index); @@ -419,25 +450,26 @@ static BMFace *pbvh_trimesh_face_create( node->flag &= ~PBVH_FullyHidden; /* Log the new face */ - BM_log_face_added(bvh->bm_log, f); + //BM_log_face_added(bvh->bm_log, f); + BLI_trimesh_log_tri(bvh->tm_log, f, false); return f; } /* Return the number of faces in 'node' that use vertex 'v' */ #if 0 -static int pbvh_trimesh_node_vert_use_c @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs