From dbefe94c048f090d63ea7f05b7008dea5cfa19e5 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 15 Jul 2024 20:38:16 -0400 Subject: [PATCH] Cleanup: Sculpt: Pass displacement factor explicitly in layer brush Since this is such important data for the brush, it's clearer if it's an argument rather than accessed from the stroke cache for every vertex. --- .../editors/sculpt_paint/brushes/layer.cc | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/sculpt_paint/brushes/layer.cc b/source/blender/editors/sculpt_paint/brushes/layer.cc index 93db8cccd4f..5616a94f43b 100644 --- a/source/blender/editors/sculpt_paint/brushes/layer.cc +++ b/source/blender/editors/sculpt_paint/brushes/layer.cc @@ -41,7 +41,8 @@ static void calc_faces(const Sculpt &sd, const Span vert_normals, Object &object, PBVHNode &node, - LocalData &tls) + LocalData &tls, + MutableSpan layer_displacement_factor) { const SculptSession &ss = *object.sculpt; const StrokeCache &cache = *ss.cache; @@ -86,7 +87,7 @@ static void calc_faces(const Sculpt &sd, disp_factor = (float *)SCULPT_vertex_attr_get(vd.vertex, ss.attrs.persistent_disp); } else { - disp_factor = &ss.cache->layer_displacement_factor[vi]; + disp_factor = &layer_displacement_factor[vi]; } /* When using persistent base, the layer brush (holding Control) invert mode resets the @@ -127,8 +128,12 @@ static void calc_faces(const Sculpt &sd, BKE_pbvh_vertex_iter_end; } -static void calc_grids( - const Sculpt &sd, const Brush &brush, Object &object, PBVHNode &node, LocalData &tls) +static void calc_grids(const Sculpt &sd, + const Brush &brush, + Object &object, + PBVHNode &node, + LocalData &tls, + MutableSpan layer_displacement_factor) { SculptSession &ss = *object.sculpt; const StrokeCache &cache = *ss.cache; @@ -173,7 +178,7 @@ static void calc_grids( const int vi = vd.index; float *disp_factor; - disp_factor = &ss.cache->layer_displacement_factor[vi]; + disp_factor = &layer_displacement_factor[vi]; (*disp_factor) += factors[vd.i] * bstrength * (1.05f - std::abs(*disp_factor)); const float clamp_mask = 1.0f - vd.mask; @@ -195,8 +200,12 @@ static void calc_grids( BKE_pbvh_vertex_iter_end; } -static void calc_bmesh( - const Sculpt &sd, const Brush &brush, Object &object, PBVHNode &node, LocalData &tls) +static void calc_bmesh(const Sculpt &sd, + const Brush &brush, + Object &object, + PBVHNode &node, + LocalData &tls, + MutableSpan layer_displacement_factor) { SculptSession &ss = *object.sculpt; const StrokeCache &cache = *ss.cache; @@ -238,7 +247,7 @@ static void calc_bmesh( const int vi = vd.index; float *disp_factor; - disp_factor = &ss.cache->layer_displacement_factor[vi]; + disp_factor = &layer_displacement_factor[vi]; (*disp_factor) += factors[vd.i] * bstrength * (1.05f - std::abs(*disp_factor)); @@ -271,6 +280,7 @@ void do_layer_brush(const Sculpt &sd, Object &object, Span nodes) if (ss.cache->layer_displacement_factor.is_empty()) { ss.cache->layer_displacement_factor = Array(SCULPT_vertex_count_get(ss), 0.0f); } + const MutableSpan displacement = ss.cache->layer_displacement_factor; threading::EnumerableThreadSpecific all_tls; switch (BKE_pbvh_type(*object.sculpt->pbvh)) { @@ -281,7 +291,8 @@ void do_layer_brush(const Sculpt &sd, Object &object, Span nodes) threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { LocalData &tls = all_tls.local(); for (const int i : range) { - calc_faces(sd, brush, positions_eval, vert_normals, object, *nodes[i], tls); + calc_faces( + sd, brush, positions_eval, vert_normals, object, *nodes[i], tls, displacement); } }); break; @@ -290,7 +301,7 @@ void do_layer_brush(const Sculpt &sd, Object &object, Span nodes) threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { LocalData &tls = all_tls.local(); for (const int i : range) { - calc_grids(sd, brush, object, *nodes[i], tls); + calc_grids(sd, brush, object, *nodes[i], tls, displacement); } }); break; @@ -298,7 +309,7 @@ void do_layer_brush(const Sculpt &sd, Object &object, Span nodes) threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { LocalData &tls = all_tls.local(); for (const int i : range) { - calc_bmesh(sd, brush, object, *nodes[i], tls); + calc_bmesh(sd, brush, object, *nodes[i], tls, displacement); } }); break;