[Bf-blender-cvs] [06341c19c4d] temp_bmesh_multires: Fix crash

Joseph Eagar noreply at git.blender.org
Mon Apr 12 06:43:05 CEST 2021


Commit: 06341c19c4d09f1f927ff42fa0ea531a60c62757
Author: Joseph Eagar
Date:   Sun Apr 11 21:42:47 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB06341c19c4d09f1f927ff42fa0ea531a60c62757

Fix crash

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

M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c

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

diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 8d44655e59c..bb87b2b5054 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -2168,7 +2168,7 @@ bool ray_face_intersection_quad(const float ray_start[3],
   return false;
 }
 
-bool ray_face_intersection_tri(const float ray_start[3],
+__attribute__((optnone)) bool ray_face_intersection_tri(const float ray_start[3],
                                struct IsectRayPrecalc *isect_precalc,
                                const float t0[3],
                                const float t1[3],
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 5f159a2916f..71d76de14e2 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -633,8 +633,12 @@ static BMVert *pbvh_bmesh_vert_create(PBVH *pbvh,
 /**
  * \note Callers are responsible for checking if the face exists before adding.
  */
-static BMFace *pbvh_bmesh_face_create(
-    PBVH *pbvh, int node_index, BMVert *v_tri[3], BMEdge *e_tri[3], const BMFace *f_example)
+static BMFace *pbvh_bmesh_face_create(PBVH *pbvh,
+                                      int node_index,
+                                      BMVert *v_tri[3],
+                                      BMEdge *e_tri[3],
+                                      const BMFace *f_example,
+                                      bool ensure_verts)
 {
   PBVHNode *node = &pbvh->nodes[node_index];
 
@@ -661,6 +665,20 @@ static BMFace *pbvh_bmesh_face_create(
 
   /* Log the new face */
   BM_log_face_added(pbvh->bm_log, f);
+  int cd_vert_node = pbvh->cd_vert_node_offset;
+
+  if (ensure_verts) {
+    BMLoop *l = f->l_first;
+    do {
+      if (BM_ELEM_CD_GET_INT(l->v, cd_vert_node) == DYNTOPO_NODE_NONE) {
+        BLI_table_gset_add(node->bm_unique_verts, l->v);
+      } else {
+        BLI_table_gset_add(node->bm_other_verts, l->v);
+      }
+       
+      l = l->next;
+    } while (l != f->l_first);
+  }
 
   return f;
 }
@@ -2045,7 +2063,7 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx,
     v_tri[1] = v_new;
     v_tri[2] = v_opp;
     bm_edges_from_tri(pbvh->bm, v_tri, e_tri);
-    f_new = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f_adj);
+    f_new = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f_adj, false);
     long_edge_queue_face_add(eq_ctx, f_new);
 
     pbvh_bmesh_copy_facedata(bm, f_new, f_adj);
@@ -2087,7 +2105,7 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx,
     e_tri[2] = e_tri[1]; /* switched */
     e_tri[1] = BM_edge_create(pbvh->bm, v_tri[1], v_tri[2], NULL, BM_CREATE_NO_DOUBLE);
 
-    f_new = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f_adj);
+    f_new = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f_adj, false);
     long_edge_queue_face_add(eq_ctx, f_new);
 
     pbvh_bmesh_copy_facedata(bm, f_new, f_adj);
@@ -2333,7 +2351,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
     ws[i] = w;
   }
 
-  //snap customdata
+  // snap customdata
   if (totl > 0) {
     CustomData_bmesh_interp(&pbvh->bm->ldata, blocks, ws, NULL, totl, ls[0]->head.data);
     //*
@@ -2400,7 +2418,7 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
       PBVHNode *n = pbvh_bmesh_node_from_face(pbvh, f);
       int ni = n - pbvh->nodes;
       bm_edges_from_tri(pbvh->bm, v_tri, e_tri);
-      BMFace *f2 = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f);
+      BMFace *f2 = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f, false);
 
       BMLoop *l2 = f2->l_first;
 
@@ -2648,15 +2666,15 @@ static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx,
 
 /************************* Called from pbvh.c *************************/
 
-bool pbvh_bmesh_node_raycast(PBVHNode *node,
-                             const float ray_start[3],
-                             const float ray_normal[3],
-                             struct IsectRayPrecalc *isect_precalc,
-                             float *depth,
-                             bool use_original,
-                             SculptVertRef *r_active_vertex_index,
-                             SculptFaceRef *r_active_face_index,
-                             float *r_face_normal)
+__attribute__((optnone)) bool pbvh_bmesh_node_raycast(PBVHNode *node,
+                                                      const float ray_start[3],
+                                                      const float ray_normal[3],
+                                                      struct IsectRayPrecalc *isect_precalc,
+                                                      float *depth,
+                                                      bool use_original,
+                                                      SculptVertRef *r_active_vertex_index,
+                                                      SculptFaceRef *r_active_face_index,
+                                                      float *r_face_normal)
 {
   bool hit = false;
   float nearest_vertex_co[3] = {0.0f};
@@ -3276,11 +3294,11 @@ bool BKE_pbvh_bmesh_update_topology_nodes(PBVH *pbvh,
 }
 
 static bool cleanup_valence_3_4(PBVH *pbvh,
-                                                         const float center[3],
-                                                         const float view_normal[3],
-                                                         float radius,
-                                                         const bool use_frontface,
-                                                         const bool use_projected)
+                                const float center[3],
+                                const float view_normal[3],
+                                float radius,
+                                const bool use_frontface,
+                                const bool use_projected)
 {
   bool modified = false;
 
@@ -3385,7 +3403,7 @@ static bool cleanup_valence_3_4(PBVH *pbvh,
 
       BMFace *f1 = NULL;
       if (vs[0] != vs[1] && vs[1] != vs[2] && vs[0] != vs[2]) {
-        f1 = pbvh_bmesh_face_create(pbvh, n, vs, NULL, l->f);
+        f1 = pbvh_bmesh_face_create(pbvh, n, vs, NULL, l->f, true);
       }
 
       if (val == 4 && vs[0] != vs[2] && vs[2] != vs[3] && vs[0] != vs[3]) {
@@ -3393,7 +3411,7 @@ static bool cleanup_valence_3_4(PBVH *pbvh,
         vs[1] = ls[2]->v;
         vs[2] = ls[3]->v;
 
-        BMFace *f2 = pbvh_bmesh_face_create(pbvh, n, vs, NULL, v->e->l->f);
+        BMFace *f2 = pbvh_bmesh_face_create(pbvh, n, vs, NULL, v->e->l->f, true);
         SWAP(void *, f2->l_first->prev->head.data, ls[3]->head.data);
 
         CustomData_bmesh_copy_data(
@@ -3530,6 +3548,8 @@ bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
           !(node->flag & PBVH_FullyHidden)) {
         node->flag &= ~PBVH_UpdateTopology;
 
+        pbvh_bmesh_node_drop_orig(node);
+
         /* Recursively split nodes that have gotten too many
          * elements */
         if (updatePBVH) {
@@ -3562,7 +3582,7 @@ bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
  * (currently just raycast), store the node's triangles and vertices.
  *
  * Skips triangles that are hidden. */
-void BKE_pbvh_bmesh_node_save_ortri(BMesh *bm, PBVHNode *node)
+__attribute__((optnone)) void BKE_pbvh_bmesh_node_save_ortri(BMesh *bm, PBVHNode *node)
 {
   /* Skip if original coords/triangles are already saved */
   if (node->bm_orco) {
@@ -3605,6 +3625,14 @@ void BKE_pbvh_bmesh_node_save_ortri(BMesh *bm, PBVHNode *node)
       continue;
     }
 
+#if 0
+    if (f->l_first->v->head.index >= totvert || f->l_first->next->v->head.index >= totvert ||
+        f->l_first->prev->v->head.index >= totvert) {
+      printf("Error!\n");
+      continue;
+    }
+#endif
+
 #if 0
     BMIter bm_iter;
     BMVert *v;
@@ -3619,6 +3647,7 @@ void BKE_pbvh_bmesh_node_save_ortri(BMesh *bm, PBVHNode *node)
     i++;
   }
   TGSET_ITER_END
+
   node->bm_tot_ortri = i;
 }



More information about the Bf-blender-cvs mailing list