[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