[Bf-blender-cvs] [e4e1467fa4b] temp-trimesh-sculpt: * code is in somewhat more working state * Began refactoring pbvh vertex indices to be uint64_t's, to eliminate usage of element tables in trimesh.

Joseph Eagar noreply at git.blender.org
Wed Oct 14 04:05:50 CEST 2020


Commit: e4e1467fa4bdd1cd7991fd2156dd967431a29091
Author: Joseph Eagar
Date:   Tue Oct 13 15:24:43 2020 -0700
Branches: temp-trimesh-sculpt
https://developer.blender.org/rBe4e1467fa4bdd1cd7991fd2156dd967431a29091

* code is in somewhat more working state
* Began refactoring pbvh vertex indices to be uint64_t's,
  to eliminate usage of element tables in trimesh.

===================================================================

M	source/blender/blenkernel/BKE_paint.h
M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/anim_data.c
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/lib_id.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/blenkernel/intern/pbvh_trimesh.c
M	source/blender/blenlib/BLI_smallhash.h
M	source/blender/blenlib/BLI_threadsafe_mempool.h
M	source/blender/blenlib/CMakeLists.txt
M	source/blender/blenlib/intern/BLI_threadsafe_mempool.c
M	source/blender/blenlib/intern/hashmap.cc
M	source/blender/blenlib/intern/task_pool.cc
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_automasking.c
M	source/blender/editors/sculpt_paint/sculpt_boundary.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h
M	source/blender/editors/sculpt_paint/sculpt_mask_expand.c
M	source/blender/editors/sculpt_paint/sculpt_pose.c
M	source/blender/editors/sculpt_paint/sculpt_smooth.c
M	source/blender/trimesh/intern/trimesh.c
M	source/blender/trimesh/intern/trimesh_log.c
M	source/blender/trimesh/trimesh.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index a6cca2910df..cd6127512bc 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -23,6 +23,8 @@
  * \ingroup bke
  */
 
+#include "BKE_pbvh.h"
+
 #include "BLI_bitmap.h"
 #include "BLI_utildefines.h"
 #include "DNA_object_enums.h"
@@ -500,7 +502,7 @@ typedef struct SculptSession {
   struct FilterCache *filter_cache;
 
   /* Cursor data and active vertex for tools */
-  int active_vertex_index;
+  SculptIdx active_vertex_index;
 
   int active_face_index;
   int active_grid_index;
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index de2e571af22..0461e1e48b2 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -24,6 +24,10 @@
 #include "BLI_bitmap.h"
 #include "BLI_ghash.h"
 
+#include "stdint.h"
+
+typedef uintptr_t SculptIdx;
+
 /* For embedding CCGKey in iterator. */
 #include "BKE_ccg.h"
 
@@ -169,8 +173,8 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh,
                            const float ray_normal[3],
                            struct IsectRayPrecalc *isect_precalc,
                            float *depth,
-                           int *active_vertex_index,
-                           int *active_face_grid_index,
+                           SculptIdx *active_vertex_index,
+                           SculptIdx *active_face_grid_index,
                            float *face_normal);
 
 bool BKE_pbvh_bmesh_node_raycast_detail(PBVHNode *node,
@@ -274,7 +278,7 @@ bool BKE_pbvh_trimesh_update_topology(PBVH *bvh,
   const float view_normal[3],
   float radius,
   const bool use_frontface,
-  const bool use_projected);
+  const bool use_projected, int sym_axis);
 /* Node Access */
 
 void BKE_pbvh_node_mark_update(PBVHNode *node);
@@ -373,7 +377,7 @@ typedef struct PBVHVertexIter {
   int gx;
   int gy;
   int i;
-  int index;
+  SculptIdx index;
   bool respect_hide;
 
   /* grid */
diff --git a/source/blender/blenkernel/intern/anim_data.c b/source/blender/blenkernel/intern/anim_data.c
index c26fc6578f1..6f2e0c7257d 100644
--- a/source/blender/blenkernel/intern/anim_data.c
+++ b/source/blender/blenkernel/intern/anim_data.c
@@ -452,7 +452,7 @@ void BKE_animdata_copy_id_action(Main *bmain, ID *id)
 
 void BKE_animdata_duplicate_id_action(struct Main *bmain,
                                       struct ID *id,
-                                      const eDupli_ID_Flags duplicate_flags)
+                                      const uint duplicate_flags)
 {
   if (duplicate_flags & USER_DUP_ACT) {
     animdata_copy_id_action(bmain, id, true, (duplicate_flags & USER_DUP_LINKED_ID) != 0);
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index de2ec273567..de37f4d0b15 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -471,8 +471,8 @@ static Collection *collection_duplicate_recursive(Main *bmain,
 Collection *BKE_collection_duplicate(Main *bmain,
                                      Collection *parent,
                                      Collection *collection,
-                                     eDupli_ID_Flags duplicate_flags,
-                                     eLibIDDuplicateFlags duplicate_options)
+                                     uint duplicate_flags,
+                                     uint duplicate_options)
 {
   const bool is_subprocess = (duplicate_options & LIB_ID_DUPLICATE_IS_SUBPROCESS) != 0;
 
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index 675e3956102..61b4d63f2e6 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -615,7 +615,7 @@ bool BKE_id_copy(Main *bmain, const ID *id, ID **newid)
  * Invokes the appropriate copy method for the block and returns the result in
  * newid, unless test. Returns true if the block can be copied.
  */
-ID *BKE_id_copy_for_duplicate(Main *bmain, ID *id, const eDupli_ID_Flags duplicate_flags)
+ID *BKE_id_copy_for_duplicate(Main *bmain, ID *id, const uint duplicate_flags)
 {
   if (id == NULL) {
     return id;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 16ac027fb34..f7a3b72a83c 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1812,8 +1812,8 @@ Object *BKE_object_copy(Main *bmain, const Object *ob)
  */
 Object *BKE_object_duplicate(Main *bmain,
                              Object *ob,
-                             eDupli_ID_Flags dupflag,
-                             const eLibIDDuplicateFlags duplicate_options)
+                             uint dupflag,
+                             const uint duplicate_options)
 {
   const bool is_subprocess = (duplicate_options & LIB_ID_DUPLICATE_IS_SUBPROCESS) != 0;
 
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index 3c14310ad6f..9a1233aced2 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -243,7 +243,7 @@ bool pbvh_bmesh_node_raycast(PBVHNode *node,
                              struct IsectRayPrecalc *isect_precalc,
                              float *dist,
                              bool use_original,
-                             int *r_active_vertex_index,
+                             SculptIdx *r_active_vertex_index,
                              float *r_face_normal);
 bool pbvh_bmesh_node_nearest_to_ray(PBVHNode *node,
                                     const float ray_start[3],
@@ -262,7 +262,7 @@ bool pbvh_trimesh_node_raycast(PBVHNode *node,
   struct IsectRayPrecalc *isect_precalc,
   float *dist,
   bool use_original,
-  int *r_active_vertex_index,
+  SculptIdx *r_active_vertex_index,
   float *r_face_normal);
 bool pbvh_trimesh_node_nearest_to_ray(PBVHNode *node,
   const float ray_start[3],
diff --git a/source/blender/blenkernel/intern/pbvh_trimesh.c b/source/blender/blenkernel/intern/pbvh_trimesh.c
index d96a1777180..40cc079d75e 100644
--- a/source/blender/blenkernel/intern/pbvh_trimesh.c
+++ b/source/blender/blenkernel/intern/pbvh_trimesh.c
@@ -27,6 +27,9 @@
 #include "BLI_memarena.h"
 #include "BLI_utildefines.h"
 
+#include "PIL_time.h"
+#include "BLI_rand.h"
+
 #include "BLI_threadsafe_mempool.h"
 #include "trimesh.h"
 
@@ -80,7 +83,7 @@ void BKE_pbvh_trimesh_detail_size_set(PBVH *pbvh, float detail_size)
   pbvh->bm_min_edge_len = pbvh->bm_max_edge_len * 0.4f;
 }
 
-TMFace *trimesh_tri_exists(TMEdge *e, TMVert *opposite) {
+static TMFace *trimesh_tri_exists(TMEdge *e, TMVert *opposite) {
   for (int i=0; i<e->tris.length; i++) {
     TMFace *tri = e->tris.items[i];
 
@@ -162,6 +165,8 @@ static void pbvh_trimesh_node_finalize(PBVH *bvh,
       TMEdge *e = TM_GET_TRI_EDGE(f, i);
       TMLoopData *l = TM_GET_TRI_LOOP(f, i);
 
+      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);
       }
@@ -242,7 +247,7 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in
   }
 
   /* Enforce at least one primitive in each node */
-  GSet *empty = NULL, *other;
+  GSet *empty = NULL, *other = NULL;
   if (BLI_gset_len(c1->tm_faces) == 0) {
     empty = c1->tm_faces;
     other = c2->tm_faces;
@@ -251,7 +256,8 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in
     empty = c2->tm_faces;
     other = c1->tm_faces;
   }
-  if (empty) {
+
+  if (empty && other) {
     GSET_ITER (gs_iter, other) {
       void *key = BLI_gsetIterator_getKey(&gs_iter);
       BLI_gset_insert(empty, key);
@@ -275,7 +281,7 @@ static void pbvh_trimesh_node_split(PBVH *bvh, const BBC *bbc_array, int node_in
   GSET_ITER (gs_iter, n->tm_faces) {
     TMFace *f = BLI_gsetIterator_getKey(&gs_iter);
     if (f) {
-//      TM_ELEM_CD_SET_INT(f, cd_face_node_offset, DYNTOPO_NODE_NONE);
+      TM_ELEM_CD_SET_INT(f, cd_face_node_offset, DYNTOPO_NODE_NONE);
     }
   }
   BLI_gset_free(n->tm_faces, NULL);
@@ -343,7 +349,7 @@ static bool pbvh_trimesh_node_limit_ensure(PBVH *bvh, int node_index)
     f->index = i; /* set_dirty! */
   }
   /* Likely this is already dirty. */
-  bvh->tm->elem_index_dirty |= TM_VERTEX;
+  bvh->tm->elem_index_dirty |= TM_TRI;
 
   pbvh_trimesh_node_split(bvh, bbc_array, node_index);
 
@@ -426,22 +432,50 @@ 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];
+  TMVert *v = TM_make_vert(bvh->tm, co, no, 0, false);
+
+  if (node_index < 0 || node_index >= bvh->totnode) {
+    printf("eek!");
+    return v;
+  }
+
+  v->index = bvh->tm->totvert-1;
+  TM_ELEM_CD_SET_INT(v, bvh->cd_vert_node_offset, node_index);
+
+  BLI_gset_insert(node->tm_unique_verts, v);
+
+  bvh->tm->elem_table_dirty |= TM_VERTEX;
+  bvh->tm->elem_index_dirty |= TM_VERTEX;
+
+  node->flag |= PBVH_UpdateDrawBuffers | PBVH_UpdateBB;
+
+  TM_log_vert_add(bvh->tm_log, v, cd_vert_mask_offset, false);
+
+  return v;
+#if 0
+  PBVHNode *node = &bvh->nodes[node_index];
 
   BLI_assert((bvh->totnode == 1 || node_index) && node_index <= bvh->totnode);
 
+
   /* avoid initializing customdata because its quite involved */
-  TMVert *v = TM_make_vert(bvh->tm, co, no, 0, true);
-  CustomData_bmesh_set_default(&bvh->tm->vdata, &v->customdata);
+  TMVert *v = TM_make_vert(bvh->tm, co, no, 0, false);
+  v->index = bvh->tm->totvert-1;
+  //CustomData_bmesh_set_default(&bvh->tm->vdata, &v->customdata);
 
-  BLI_gset_insert(node->tm_unique_verts, v);
+  //BLI_gset_insert(node->tm_unique_verts, v);
   TM_ELEM_CD_SET_INT(v, bvh->cd_vert_node_offset, node_index);
 
+  bvh->tm->elem_table_dirty |= TM_VERTEX|TM_EDGE|TM_TRI;
+  bvh->tm->elem_index_dirty |= TM_VERTEX|TM_EDGE|TM_TRI;
+
   node->flag |= PBVH_UpdateDrawBuffers | PBVH_UpdateBB;
 
   /* Log the new vertex */
   TM_log_vert_add(bvh->tm_lo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list