Refactor: Sculpt: Inline cube brush tip distance test

Part of #118145.
This commit is contained in:
Hans Goudey
2024-08-07 14:09:02 -04:00
parent 34d71b8088
commit 51152cec30
5 changed files with 50 additions and 70 deletions

View File

@@ -67,7 +67,7 @@ static void calc_faces(const Sculpt &sd,
tls.distances.resize(verts.size());
const MutableSpan<float> 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<float> 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<float> 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);

View File

@@ -243,15 +243,13 @@ void filter_distances_with_radius(float radius, Span<float> 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<float3> positions,
Span<int> verts,
MutableSpan<float> r_distances,
MutableSpan<float> factors);
void calc_brush_cube_distances(const SculptSession &ss,
const Brush &brush,
void calc_brush_cube_distances(const Brush &brush,
const float4x4 &mat,
Span<float3> positions,
MutableSpan<float> r_distances,

View File

@@ -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<float3> positions,
const Span<int> 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<float3> positions,
const MutableSpan<float> 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;
}
}

View File

@@ -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 {

View File

@@ -370,7 +370,7 @@ static void do_paint_brush_task(Object &object,
tls.distances.resize(verts.size());
const MutableSpan<float> 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 {