[Bf-blender-cvs] [2e64b16879c] temp-trimesh-sculpt: * More roughing out of code
Joseph Eagar
noreply at git.blender.org
Wed Oct 14 04:05:42 CEST 2020
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. @@
More information about the Bf-blender-cvs
mailing list