[Bf-blender-cvs] [390b6492e73] sculpt-dev: sculpt-dev: Fix bugs from merge:

Joseph Eagar noreply at git.blender.org
Sat Jan 28 09:35:01 CET 2023


Commit: 390b6492e7306d4536b982e62575902a00cd8d40
Author: Joseph Eagar
Date:   Thu Jan 26 21:22:45 2023 -0800
Branches: sculpt-dev
https://developer.blender.org/rB390b6492e7306d4536b982e62575902a00cd8d40

sculpt-dev: Fix bugs from merge:

* MSculptVert->valence was not initialized for PBVH_FACES
* PBVH_BMESH did not draw color attributes.
* Crashes related to active mesh attributes.

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

M	source/blender/blenkernel/intern/paint.cc
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/draw/intern/draw_pbvh.cc
M	source/blender/editors/sculpt_paint/sculpt_smooth.c

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

diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc
index ba859605c6f..8dff338f2e7 100644
--- a/source/blender/blenkernel/intern/paint.cc
+++ b/source/blender/blenkernel/intern/paint.cc
@@ -2786,21 +2786,14 @@ extern "C" bool BKE_sculptsession_check_sculptverts(Object *ob, struct PBVH *pbv
 
   sculpt_boundary_flags_ensure(ob, pbvh, totvert);
 
-  if (!ss->attrs.sculpt_vert) {
+  if (!ss->attrs.sculpt_vert || !ss->attrs.sculpt_vert->data) {
     SculptAttributeParams params = {0};
 
     ss->attrs.sculpt_vert = sculpt_attribute_ensure_ex(
         ob, ATTR_DOMAIN_POINT, CD_DYNTOPO_VERT, "", &params, BKE_pbvh_type(pbvh));
   }
 
-  if (!ss->bm && (!ss->msculptverts || totvert != ss->last_msculptverts_count)) {
-    ss->last_msculptverts_count = totvert;
-    ss->msculptverts = static_cast<MSculptVert *>(ss->attrs.sculpt_vert->data);
-
-    init_sculptvert_layer(ss, pbvh, totvert);
-    return true;
-  }
-
+  ss->msculptverts = static_cast<MSculptVert *>(ss->attrs.sculpt_vert->data);
   BKE_pbvh_set_sculpt_verts(pbvh, ss->msculptverts);
 
   return false;
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index b94e0c18caf..4fd2792b947 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -830,6 +830,10 @@ static void pbvh_draw_args_init(PBVH *pbvh, PBVH_GPU_Args *args, PBVHNode *node)
       break;
     case PBVH_BMESH:
       args->bm = pbvh->header.bm;
+
+      args->active_color = pbvh->mesh->active_color_attribute;
+      args->render_color = pbvh->mesh->default_color_attribute;
+
       args->me = pbvh->mesh;
       args->vdata = &args->bm->vdata;
       args->ldata = &args->bm->ldata;
@@ -980,6 +984,11 @@ void BKE_pbvh_build_mesh(PBVH *pbvh,
   /* For each face, store the AABB and the AABB centroid */
   prim_bbc = MEM_mallocN(sizeof(BBC) * looptri_num, "prim_bbc");
 
+  for (int i = 0; i < mesh->totvert; i++) {
+    msculptverts[i].flag &= ~SCULPTVERT_NEED_VALENCE;
+    msculptverts[i].valence = pmap->pmap[i].count;
+  }
+
   for (int i = 0; i < looptri_num; i++) {
     const MLoopTri *lt = &looptri[i];
     const int sides = 3;
@@ -1794,6 +1803,7 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
 
   Mesh me_query;
   BKE_id_attribute_copy_domains_temp(ID_ME, vdata, NULL, ldata, NULL, NULL, &me_query.id);
+  me_query.active_color_attribute = me->active_color_attribute;
 
   if (!pbvh->header.bm) {
     vdata = pbvh->vdata;
@@ -5374,6 +5384,8 @@ void BKE_pbvh_update_active_vcol(PBVH *pbvh, const Mesh *mesh)
   }
 
   BKE_id_attribute_copy_domains_temp(ID_ME, vdata, NULL, ldata, NULL, NULL, &me_query.id);
+  me_query.active_color_attribute = mesh->active_color_attribute;
+
   BKE_pbvh_get_color_layer(&me_query, &pbvh->color_layer, &pbvh->color_domain);
 
   if (pbvh->color_layer && pbvh->header.bm) {
diff --git a/source/blender/draw/intern/draw_pbvh.cc b/source/blender/draw/intern/draw_pbvh.cc
index 583bfefea7d..df00ebfa0ce 100644
--- a/source/blender/draw/intern/draw_pbvh.cc
+++ b/source/blender/draw/intern/draw_pbvh.cc
@@ -760,7 +760,7 @@ struct PBVHBatches {
     }
   }
 
-  void fill_vbo_bmesh(PBVHVbo &vbo, PBVH_GPU_Args *args)
+  ATTR_NO_OPT void fill_vbo_bmesh(PBVHVbo &vbo, PBVH_GPU_Args *args)
   {
     auto foreach_bmesh_normal = [&](std::function<void(BMLoop * l)> callback) {
       for (int i : IndexRange(args->tribuf->tottri)) {
@@ -931,6 +931,7 @@ struct PBVHBatches {
         const bool do_loop = vbo.domain == ATTR_DOMAIN_CORNER;
 
         const int cd_color = CustomData_get_offset_named(cdata, CD_PROP_COLOR, vbo.name.c_str());
+
         foreach_bmesh([&](BMLoop *l) {
           MPropCol *col;
 
diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.c b/source/blender/editors/sculpt_paint/sculpt_smooth.c
index e770cc053e0..0c51ba4ddbb 100644
--- a/source/blender/editors/sculpt_paint/sculpt_smooth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_smooth.c
@@ -1991,14 +1991,14 @@ void SCULPT_bound_smooth_ensure(SculptSession *ss, Object *ob)
   }
 }
 
-void SCULPT_smooth(Sculpt *sd,
-                   Object *ob,
-                   PBVHNode **nodes,
-                   const int totnode,
-                   float bstrength,
-                   const bool smooth_mask,
-                   float projection,
-                   bool do_origco)
+ATTR_NO_OPT void SCULPT_smooth(Sculpt *sd,
+                               Object *ob,
+                               PBVHNode **nodes,
+                               const int totnode,
+                               float bstrength,
+                               const bool smooth_mask,
+                               float projection,
+                               bool do_origco)
 {
   SculptSession *ss = ob->sculpt;
   Brush *brush = ss->cache && ss->cache->brush ? ss->cache->brush : BKE_paint_brush(&sd->paint);
@@ -2114,7 +2114,7 @@ void SCULPT_smooth(Sculpt *sd,
     };
 
     TaskParallelSettings settings;
-    BKE_pbvh_parallel_range_settings(&settings, true, totnode);
+    BKE_pbvh_parallel_range_settings(&settings, false /* XXX */, totnode);
     BLI_task_parallel_range(0, totnode, &data, do_smooth_brush_task_cb_ex, &settings);
 
 #ifndef SMOOTH_ITER_IN_THREADS



More information about the Bf-blender-cvs mailing list