From 51152cec3078b5a5966fa9f382bb35cde74513c3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 7 Aug 2024 14:09:02 -0400 Subject: [PATCH] Refactor: Sculpt: Inline cube brush tip distance test Part of #118145. --- .../sculpt_paint/brushes/clay_strips.cc | 6 +- .../editors/sculpt_paint/mesh_brush_common.hh | 6 +- source/blender/editors/sculpt_paint/sculpt.cc | 101 ++++++++---------- .../editors/sculpt_paint/sculpt_intern.hh | 5 - .../sculpt_paint/sculpt_paint_color.cc | 2 +- 5 files changed, 50 insertions(+), 70 deletions(-) diff --git a/source/blender/editors/sculpt_paint/brushes/clay_strips.cc b/source/blender/editors/sculpt_paint/brushes/clay_strips.cc index d858db15ef9..b05da9581c3 100644 --- a/source/blender/editors/sculpt_paint/brushes/clay_strips.cc +++ b/source/blender/editors/sculpt_paint/brushes/clay_strips.cc @@ -67,7 +67,7 @@ static void calc_faces(const Sculpt &sd, tls.distances.resize(verts.size()); const MutableSpan distances = tls.distances; - calc_brush_cube_distances(ss, brush, mat, positions_eval, verts, distances, factors); + calc_brush_cube_distances(brush, mat, positions_eval, verts, distances, factors); scale_factors(distances, cache.radius); apply_hardness_to_distances(cache, distances); calc_brush_strength_factors(cache, brush, distances, factors); @@ -123,7 +123,7 @@ static void calc_grids(const Sculpt &sd, tls.distances.resize(positions.size()); const MutableSpan distances = tls.distances; - calc_brush_cube_distances(ss, brush, mat, positions, distances, factors); + calc_brush_cube_distances(brush, mat, positions, distances, factors); scale_factors(distances, cache.radius); apply_hardness_to_distances(cache, distances); calc_brush_strength_factors(cache, brush, distances, factors); @@ -179,7 +179,7 @@ static void calc_bmesh(const Sculpt &sd, tls.distances.resize(verts.size()); const MutableSpan distances = tls.distances; - calc_brush_cube_distances(ss, brush, mat, positions, distances, factors); + calc_brush_cube_distances(brush, mat, positions, distances, factors); scale_factors(distances, cache.radius); apply_hardness_to_distances(cache, distances); calc_brush_strength_factors(cache, brush, distances, factors); diff --git a/source/blender/editors/sculpt_paint/mesh_brush_common.hh b/source/blender/editors/sculpt_paint/mesh_brush_common.hh index 37ae8955f0c..12415765a60 100644 --- a/source/blender/editors/sculpt_paint/mesh_brush_common.hh +++ b/source/blender/editors/sculpt_paint/mesh_brush_common.hh @@ -243,15 +243,13 @@ void filter_distances_with_radius(float radius, Span distances, MutableSp * Calculate distances based on a "square" brush tip falloff and ignore vertices that are too far * away. */ -void calc_brush_cube_distances(const SculptSession &ss, - const Brush &brush, +void calc_brush_cube_distances(const Brush &brush, const float4x4 &mat, Span positions, Span verts, MutableSpan r_distances, MutableSpan factors); -void calc_brush_cube_distances(const SculptSession &ss, - const Brush &brush, +void calc_brush_cube_distances(const Brush &brush, const float4x4 &mat, Span positions, MutableSpan r_distances, diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index d07051cfa43..5e25469d9ab 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -1786,44 +1786,6 @@ bool SCULPT_brush_test_circle_sq(SculptBrushTest &test, const float co[3]) return true; } -bool SCULPT_brush_test_cube(SculptBrushTest &test, - const float co[3], - const float local[4][4], - const float roundness, - const float /*tip_scale_x*/) -{ - float local_co[3]; - - mul_v3_m4v3(local_co, local, co); - - local_co[0] = fabsf(local_co[0]); - local_co[1] = fabsf(local_co[1]); - local_co[2] = fabsf(local_co[2]); - - const float hardness = 1.0f - roundness; - - if (!(local_co[0] <= 1.0f && local_co[1] <= 1.0f && local_co[2] <= 1.0f)) { - /* Outside the square. */ - return false; - } - if (min_ff(local_co[0], local_co[1]) > hardness) { - /* Corner, distance to the center of the corner circle. */ - float r_point[3]; - copy_v3_fl(r_point, hardness); - test.dist = len_v2v2(r_point, local_co) / roundness; - return true; - } - if (max_ff(local_co[0], local_co[1]) > hardness) { - /* Side, distance to the square XY axis. */ - test.dist = (max_ff(local_co[0], local_co[1]) - hardness) / roundness; - return true; - } - - /* Inside the square, constant distance. */ - test.dist = 0.0f; - return true; -} - SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(const SculptSession &ss, SculptBrushTest &test, char falloff_shape) @@ -7025,8 +6987,7 @@ void filter_distances_with_radius(const float radius, } } -void calc_brush_cube_distances(const SculptSession &ss, - const Brush &brush, +void calc_brush_cube_distances(const Brush &brush, const float4x4 &mat, const Span positions, const Span verts, @@ -7036,27 +6997,39 @@ void calc_brush_cube_distances(const SculptSession &ss, BLI_assert(verts.size() == factors.size()); BLI_assert(verts.size() == r_distances.size()); - SculptBrushTest test; - SCULPT_brush_test_init(ss, test); - const float tip_roundness = brush.tip_roundness; - const float tip_scale_x = brush.tip_scale_x; + const float roundness = brush.tip_roundness; + const float hardness = 1.0f - roundness; for (const int i : verts.index_range()) { if (factors[i] == 0.0f) { r_distances[i] = FLT_MAX; continue; } - /* TODO: Break up #SCULPT_brush_test_cube. */ - if (!SCULPT_brush_test_cube(test, positions[verts[i]], mat.ptr(), tip_roundness, tip_scale_x)) - { + const float3 local = math::abs(math::transform_point(mat, positions[verts[i]])); + + if (!(local[0] <= 1.0f && local[1] <= 1.0f && local[2] <= 1.0f)) { factors[i] = 0.0f; r_distances[i] = FLT_MAX; + continue; } - r_distances[i] = test.dist; + if (std::min(local[0], local[1]) > hardness) { + /* Corner, distance to the center of the corner circle. */ + float r_point[3]; + copy_v3_fl(r_point, hardness); + r_distances[i] = len_v2v2(r_point, local) / roundness; + continue; + } + if (std::max(local[0], local[1]) > hardness) { + /* Side, distance to the square XY axis. */ + r_distances[i] = (std::max(local[0], local[1]) - hardness) / roundness; + continue; + } + + /* Inside the square, constant distance. */ + r_distances[i] = 0.0f; } } -void calc_brush_cube_distances(const SculptSession &ss, - const Brush &brush, +void calc_brush_cube_distances(const Brush &brush, const float4x4 &mat, const Span positions, const MutableSpan r_distances, @@ -7065,21 +7038,35 @@ void calc_brush_cube_distances(const SculptSession &ss, BLI_assert(positions.size() == factors.size()); BLI_assert(positions.size() == r_distances.size()); - SculptBrushTest test; - SCULPT_brush_test_init(ss, test); - const float tip_roundness = brush.tip_roundness; - const float tip_scale_x = brush.tip_scale_x; + const float roundness = brush.tip_roundness; + const float hardness = 1.0f - roundness; for (const int i : positions.index_range()) { if (factors[i] == 0.0f) { r_distances[i] = FLT_MAX; continue; } - /* TODO: Break up #SCULPT_brush_test_cube. */ - if (!SCULPT_brush_test_cube(test, positions[i], mat.ptr(), tip_roundness, tip_scale_x)) { + const float3 local = math::abs(math::transform_point(mat, positions[i])); + + if (!(local[0] <= 1.0f && local[1] <= 1.0f && local[2] <= 1.0f)) { factors[i] = 0.0f; r_distances[i] = FLT_MAX; + continue; } - r_distances[i] = test.dist; + if (std::min(local[0], local[1]) > hardness) { + /* Corner, distance to the center of the corner circle. */ + float r_point[3]; + copy_v3_fl(r_point, hardness); + r_distances[i] = len_v2v2(r_point, local) / roundness; + continue; + } + if (std::max(local[0], local[1]) > hardness) { + /* Side, distance to the square XY axis. */ + r_distances[i] = (std::max(local[0], local[1]) - hardness) / roundness; + continue; + } + + /* Inside the square, constant distance. */ + r_distances[i] = 0.0f; } } diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index 004e34d7d97..82fa6c3653b 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -1185,11 +1185,6 @@ void SCULPT_flip_quat_by_symm_area(float quat[4], void SCULPT_brush_test_init(const SculptSession &ss, SculptBrushTest &test); bool SCULPT_brush_test_sphere_sq(SculptBrushTest &test, const float co[3]); -bool SCULPT_brush_test_cube(SculptBrushTest &test, - const float co[3], - const float local[4][4], - float roundness, - float tip_scale_x); bool SCULPT_brush_test_circle_sq(SculptBrushTest &test, const float co[3]); namespace blender::ed::sculpt_paint { diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.cc b/source/blender/editors/sculpt_paint/sculpt_paint_color.cc index a2eb39f71e3..2d9af119f97 100644 --- a/source/blender/editors/sculpt_paint/sculpt_paint_color.cc +++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.cc @@ -370,7 +370,7 @@ static void do_paint_brush_task(Object &object, tls.distances.resize(verts.size()); const MutableSpan distances = tls.distances; if (brush.tip_roundness < 1.0f) { - calc_brush_cube_distances(ss, brush, mat, vert_positions, verts, distances, factors); + calc_brush_cube_distances(brush, mat, vert_positions, verts, distances, factors); scale_factors(distances, cache.radius); } else {