[Bf-blender-cvs] [f0c2994b021] sculpt-dev: Sculpt-dev: Fix more crashes from recent merge

Joseph Eagar noreply at git.blender.org
Tue Apr 12 07:15:54 CEST 2022


Commit: f0c2994b02194d8719e75b90a4ed4756752dac11
Author: Joseph Eagar
Date:   Mon Apr 11 21:59:38 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rBf0c2994b02194d8719e75b90a4ed4756752dac11

Sculpt-dev: Fix more crashes from recent merge

* Fixed crashes in color attribute system
* Fixed mask related crash.
* Removed dead code.

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

M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c
M	source/blender/editors/sculpt_paint/sculpt_ops.c
M	source/blender/editors/transform/transform_snap_object.cc
M	source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index fdb602f9961..5d6a47727a9 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -788,9 +788,6 @@ PBVH *BKE_pbvh_new(void)
   PBVH *pbvh = MEM_callocN(sizeof(PBVH), "pbvh");
   pbvh->respect_hide = true;
 
-  pbvh->vcol_type = -1;
-  pbvh->vcol_domain = ATTR_DOMAIN_NUM;
-
   return pbvh;
 }
 
@@ -1435,9 +1432,9 @@ bool BKE_pbvh_get_color_layer(const Mesh *me, CustomDataLayer **r_layer, Attribu
   return true;
 }
 
-static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
-                                       const int n,
-                                       const TaskParallelTLS *__restrict UNUSED(tls))
+ATTR_NO_OPT static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
+                                                   const int n,
+                                                   const TaskParallelTLS *__restrict UNUSED(tls))
 {
   /* Create and update draw buffers. The functions called here must not
    * do any OpenGL calls. Flags are not cleared immediately, that happens
@@ -1585,9 +1582,9 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
                                    .face_sets_color_default = pbvh->face_sets_color_default,
                                    .flat_vcol = data->flat_vcol_shading,
                                    .mat_nr = node->tri_buffers[i].mat_nr,
-                                   .active_vcol_domain = pbvh->vcol_domain,
-                                   .active_vcol_type = pbvh->vcol_type,
-                                   .active_vcol_layer = vcol_layer,
+                                   .active_vcol_domain = pbvh->color_domain,
+                                   .active_vcol_type = pbvh->color_type,
+                                   .active_vcol_layer = pbvh->color_layer,
                                    .render_vcol_layer = render_vcol_layer};
 
           GPU_pbvh_bmesh_buffers_update(&args);
@@ -1673,34 +1670,21 @@ static void pbvh_update_draw_buffers(
     ldata = &me->ldata;
   }
 
+  Mesh me_query;
+  BKE_id_attribute_copy_domains_temp(ID_ME, vdata, NULL, ldata, NULL, NULL, &me_query.id);
+
   CustomDataLayer *vcol_layer = NULL;
   AttributeDomain domain;
-  BKE_pbvh_get_color_layer(me, &vcol_layer, &domain);
-
-  CustomDataLayer *render_vcol_layer = BKE_id_attributes_render_color_get((ID *)me);
-
-  if (pbvh->bm && render_vcol_layer) {
-    AttributeDomain domain = BKE_id_attribute_domain((ID *)me, render_vcol_layer);
-    CustomData *cdata = domain == ATTR_DOMAIN_POINT ? &pbvh->bm->vdata : &pbvh->bm->ldata;
-
-    int idx = CustomData_get_named_layer_index(
-        cdata, render_vcol_layer->type, render_vcol_layer->name);
-
-    if (idx == -1) {
-      render_vcol_layer = NULL; /* layer hasn't been synced over yet */
-    }
-    else {
-      render_vcol_layer = cdata->layers + idx;
-    }
-  }
+  BKE_pbvh_get_color_layer(&me_query, &vcol_layer, &domain);
+  CustomDataLayer *render_vcol_layer = BKE_id_attributes_render_color_get(&me_query.id);
 
   /* rebuild all draw buffers if attribute layout changed */
   if (GPU_pbvh_update_attribute_names(vdata,
                                       ldata,
                                       GPU_pbvh_need_full_render_get(),
                                       pbvh->flags & PBVH_FAST_DRAW,
-                                      pbvh->vcol_type,
-                                      pbvh->vcol_domain,
+                                      pbvh->color_type,
+                                      pbvh->color_domain,
                                       vcol_layer,
                                       render_vcol_layer,
                                       !GPU_pbvh_need_full_render_get())) {
@@ -4270,7 +4254,7 @@ void BKE_pbvh_check_tri_areas(PBVH *pbvh, PBVHNode *node)
 
   switch (BKE_pbvh_type(pbvh)) {
     case PBVH_FACES: {
-      for (int i = 0; i < node->totprim; i++) {
+      for (int i = 0; i < (int)node->totprim; i++) {
         const MLoopTri *lt = &pbvh->looptri[node->prim_indices[i]];
 
         if (pbvh->face_sets[lt->poly] < 0) {
@@ -4281,7 +4265,7 @@ void BKE_pbvh_check_tri_areas(PBVH *pbvh, PBVHNode *node)
         pbvh->face_areas[lt->poly * 2 + cur_i] = 0.0f;
       }
 
-      for (int i = 0; i < node->totprim; i++) {
+      for (int i = 0; i < (int)node->totprim; i++) {
         const MLoopTri *lt = &pbvh->looptri[node->prim_indices[i]];
 
         if (pbvh->face_sets[lt->poly] < 0) {
@@ -4835,7 +4819,7 @@ bool BKE_pbvh_cache_is_valid(const struct Object *ob,
   }
 
   bool ok = true;
-  int totvert, totedge, totloop, totpoly;
+  int totvert = 0, totedge = 0, totloop = 0, totpoly = 0;
   const CustomData *vdata, *edata, *ldata, *pdata;
 
   switch (pbvh_type) {
@@ -5185,10 +5169,27 @@ void BKE_pbvh_update_active_vcol(PBVH *pbvh, const Mesh *mesh)
 {
   CustomDataLayer *last_layer = pbvh->color_layer;
 
-  BKE_pbvh_get_color_layer(mesh, &pbvh->color_layer, &pbvh->color_domain);
+  Mesh me_query;
+  const CustomData *vdata, *ldata;
+
+  if (pbvh->type == PBVH_BMESH && pbvh->bm) {
+    vdata = &pbvh->bm->vdata;
+    ldata = &pbvh->bm->ldata;
+  }
+  else {
+    vdata = &mesh->vdata;
+    ldata = &mesh->ldata;
+  }
+
+  BKE_id_attribute_copy_domains_temp(ID_ME, vdata, NULL, ldata, NULL, NULL, &me_query.id);
+  BKE_pbvh_get_color_layer(&me_query, &pbvh->color_layer, &pbvh->color_domain);
 
   if (pbvh->color_layer) {
     pbvh->color_type = pbvh->color_layer->type;
+
+    if (pbvh->bm) {
+      pbvh->cd_vcol_offset = pbvh->color_layer->offset;
+    }
   }
 
   if (pbvh->color_layer != last_layer) {
@@ -5241,7 +5242,7 @@ void BKE_pbvh_ensure_node_loops(PBVH *pbvh)
     node->loop_indices = MEM_malloc_arrayN(node->totprim * 3, sizeof(int), __func__);
     node->loop_indices_num = 0;
 
-    for (int j = 0; j < node->totprim; j++) {
+    for (int j = 0; j < (int)node->totprim; j++) {
       const MLoopTri *mlt = pbvh->looptri + node->prim_indices[j];
 
       for (int k = 0; k < 3; k++) {
@@ -5268,10 +5269,12 @@ bool BKE_pbvh_get_origvert(
 
       if (mv->stroke_id != pbvh->stroke_id) {
         mv->stroke_id = pbvh->stroke_id;
+        float *mask = NULL;
 
         if (pbvh->type == PBVH_FACES) {
           copy_v3_v3(mv->origco, pbvh->verts[vertex.i].co);
           copy_v3_v3(mv->origno, pbvh->vert_normals[vertex.i]);
+          mask = (float *)CustomData_get_layer(pbvh->vdata, CD_PAINT_MASK);
         }
         else {
           const CCGKey *key = BKE_pbvh_get_grid_key(pbvh);
@@ -5281,12 +5284,11 @@ bool BKE_pbvh_get_origvert(
 
           copy_v3_v3(mv->origco, CCG_elem_co(key, CCG_elem_offset(key, elem, vertex_index)));
           copy_v3_v3(mv->origno, CCG_elem_no(key, CCG_elem_offset(key, elem, vertex_index)));
+          mask = CCG_elem_mask(key, CCG_elem_offset(key, elem, vertex_index));
         }
 
-        float *mask = (float *)CustomData_get_layer(pbvh->vdata, CD_PAINT_MASK);
-
         if (mask) {
-          mv->origmask = mask[vertex.i];
+          mv->origmask = (ushort)(mask[vertex.i] * 65535.0f);
         }
 
         if (pbvh->color_layer) {
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index 707260029b2..c298d56d01e 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -217,9 +217,6 @@ struct PBVH {
 
   int totuv;
 
-  int vcol_type;
-  int vcol_domain;
-
   float planes[6][4];
   int num_planes;
 
diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
index c73d402057a..a8d2f282dc5 100644
--- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
@@ -719,7 +719,9 @@ void SCULPT_dynamic_topology_enable_ex(Main *bmain, Depsgraph *depsgraph, Scene
     e->head.hflag |= BM_ELEM_DRAW;
   }
 
-  BKE_pbvh_update_sculpt_verts(ss->pbvh);
+  if (ss->pbvh) {
+    BKE_pbvh_update_sculpt_verts(ss->pbvh);
+  }
 
   /* Make sure the data for existing faces are initialized. */
   if (me->totpoly != ss->bm->totface) {
diff --git a/source/blender/editors/sculpt_paint/sculpt_ops.c b/source/blender/editors/sculpt_paint/sculpt_ops.c
index bcecda5aac4..4b38970c9cf 100644
--- a/source/blender/editors/sculpt_paint/sculpt_ops.c
+++ b/source/blender/editors/sculpt_paint/sculpt_ops.c
@@ -654,7 +654,7 @@ static bool sculpt_sample_color_update_from_base(bContext *C,
   return true;
 }
 
-static int sculpt_sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event)
+ATTR_NO_OPT static int sculpt_sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
   ARegion *region = CTX_wm_region(C);
   Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
diff --git a/source/blender/editors/transform/transform_snap_object.cc b/source/blender/editors/transform/transform_snap_object.cc
index c3168b58c47..ec963de6f6e 100644
--- a/source/blender/editors/transform/transform_snap_object.cc
+++ b/source/blender/editors/transform/transform_snap_object.cc
@@ -1003,7 +1003,7 @@ struct RaycastObjUserData {
 /**
  * \note Duplicate args here are documented at #snapObjectsRay
  */
-static void raycast_obj_fn(SnapObjectContext *sctx,
+ATTR_NO_OPT static void raycast_obj_fn(SnapObjectContext *sctx,
                            const struct SnapObjectParams *params,
                            Object *ob_eval,
                            const float obmat[4][4],
@@ -2489,7 +2489,7 @@ static short snapMesh(SnapObjectContext *sctx,
   return 0;
 }
 
-static short snapEditMesh(SnapObjectContext *sctx,
+ATTR_NO_OPT static short snapEditMesh(SnapObjectContext *sctx,
                           const struct SnapObjectParams *params,
                           Object *ob_eval,
                           BMEditMesh *em,
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 27e593cc291..137cba6a368 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -238,22 +238,22 @@ static bool gpu_pbvh_is_looptri_visible(cons

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list