Cleanup: Sculpt: Use C++ types for area center/normal sampling

Also reduce variable scope, and remove an unnecessary `no_s`
variable that was leftover from when normals were stored as shorts.
This commit is contained in:
Hans Goudey
2024-06-06 15:45:43 -04:00
parent 914c400353
commit 46a9296c56

View File

@@ -1875,10 +1875,11 @@ namespace blender::ed::sculpt_paint {
struct AreaNormalCenterData {
/* 0 = towards view, 1 = flipped */
float area_cos[2][3];
float area_nos[2][3];
int count_no[2];
int count_co[2];
std::array<float3, 2> area_cos;
std::array<int, 2> count_co;
std::array<float3, 2> area_nos;
std::array<int, 2> count_no;
};
static void calc_area_normal_and_center_task(const Object &ob,
@@ -1892,12 +1893,9 @@ static void calc_area_normal_and_center_task(const Object &ob,
{
const SculptSession &ss = *ob.sculpt;
PBVHVertexIter vd;
undo::Node *unode = nullptr;
bool use_original = false;
bool normal_test_r, area_test_r;
if (ss.cache && !ss.cache->accum) {
unode = undo::get_node(node, undo::Type::Position);
if (unode) {
@@ -1946,7 +1944,6 @@ static void calc_area_normal_and_center_task(const Object &ob,
float(*orco_coords)[3];
int(*orco_tris)[3];
int orco_tris_num;
BKE_pbvh_node_get_bm_orco_data(node, &orco_tris, &orco_tris_num, &orco_coords, nullptr);
for (int i = 0; i < orco_tris_num; i++) {
@@ -1955,35 +1952,28 @@ static void calc_area_normal_and_center_task(const Object &ob,
orco_coords[orco_tris[i][1]],
orco_coords[orco_tris[i][2]],
};
float co[3];
float3 co;
closest_on_tri_to_point_v3(co, normal_test.location, UNPACK3(co_tri));
normal_test_r = sculpt_brush_normal_test_sq_fn(normal_test, co);
area_test_r = sculpt_brush_area_test_sq_fn(area_test, co);
const bool normal_test_r = sculpt_brush_normal_test_sq_fn(normal_test, co);
const bool area_test_r = sculpt_brush_area_test_sq_fn(area_test, co);
if (!normal_test_r && !area_test_r) {
continue;
}
float3 no;
int flip_index;
r_any_vertex_sampled = true;
float3 no;
normal_tri_v3(no, UNPACK3(co_tri));
flip_index = (math::dot(ss.cache->view_normal, no) <= 0.0f);
const int flip_index = (math::dot(ss.cache->view_normal, no) <= 0.0f);
if (use_area_cos && area_test_r) {
/* Weight the coordinates towards the center. */
float p = 1.0f - (std::sqrt(area_test.dist) / area_test.radius);
const float afactor = std::clamp(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
float disp[3];
sub_v3_v3v3(disp, co, area_test.location);
mul_v3_fl(disp, 1.0f - afactor);
add_v3_v3v3(co, area_test.location, disp);
add_v3_v3(anctd->area_cos[flip_index], co);
const float3 disp = (co - area_test.location) * (1.0f - afactor);
anctd->area_cos[flip_index] += area_test.location + disp;
anctd->count_co[flip_index] += 1;
}
@@ -1991,84 +1981,65 @@ static void calc_area_normal_and_center_task(const Object &ob,
/* Weight the normals towards the center. */
float p = 1.0f - (std::sqrt(normal_test.dist) / normal_test.radius);
const float nfactor = std::clamp(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
mul_v3_fl(no, nfactor);
add_v3_v3(anctd->area_nos[flip_index], no);
anctd->area_nos[flip_index] += no * nfactor;
anctd->count_no[flip_index] += 1;
}
}
}
else {
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (*ss.pbvh, node, vd, PBVH_ITER_UNIQUE) {
float co[3];
/* For bm_vert only. */
float no_s[3];
float3 co;
float3 no;
if (use_original) {
if (unode->bm_entry) {
const float *temp_co;
const float *temp_no_s;
BM_log_original_vert_data(ss.bm_log, vd.bm_vert, &temp_co, &temp_no_s);
copy_v3_v3(co, temp_co);
copy_v3_v3(no_s, temp_no_s);
co = temp_co;
no = temp_no_s;
}
else {
copy_v3_v3(co, unode->position[vd.i]);
copy_v3_v3(no_s, unode->normal[vd.i]);
co = unode->position[vd.i];
no = unode->normal[vd.i];
}
}
else {
copy_v3_v3(co, vd.co);
co = vd.co;
if (vd.no) {
no = vd.no;
}
else {
no = vd.fno;
}
}
normal_test_r = sculpt_brush_normal_test_sq_fn(normal_test, co);
area_test_r = sculpt_brush_area_test_sq_fn(area_test, co);
const bool normal_test_r = sculpt_brush_normal_test_sq_fn(normal_test, co);
const bool area_test_r = sculpt_brush_area_test_sq_fn(area_test, co);
if (!normal_test_r && !area_test_r) {
continue;
}
float no[3];
int flip_index;
r_any_vertex_sampled = true;
if (use_original) {
copy_v3_v3(no, no_s);
}
else {
if (vd.no) {
copy_v3_v3(no, vd.no);
}
else {
copy_v3_v3(no, vd.fno);
}
}
flip_index = (dot_v3v3(ss.cache ? ss.cache->view_normal : ss.cursor_view_normal, no) <=
0.0f);
const int flip_index = (math::dot(ss.cache ? ss.cache->view_normal : ss.cursor_view_normal,
no) <= 0.0f);
if (use_area_cos && area_test_r) {
/* Weight the coordinates towards the center. */
float p = 1.0f - (sqrtf(area_test.dist) / area_test.radius);
const float afactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
float disp[3];
sub_v3_v3v3(disp, co, area_test.location);
mul_v3_fl(disp, 1.0f - afactor);
add_v3_v3v3(co, area_test.location, disp);
const float3 disp = (co - area_test.location) * (1.0f - afactor);
add_v3_v3(anctd->area_cos[flip_index], co);
anctd->area_cos[flip_index] += area_test.location + disp;
anctd->count_co[flip_index] += 1;
}
if (use_area_nos && normal_test_r) {
/* Weight the normals towards the center. */
float p = 1.0f - (sqrtf(normal_test.dist) / normal_test.radius);
const float nfactor = clamp_f(3.0f * p * p - 2.0f * p * p * p, 0.0f, 1.0f);
mul_v3_fl(no, nfactor);
add_v3_v3(anctd->area_nos[flip_index], no);
anctd->area_nos[flip_index] += no * nfactor;
anctd->count_no[flip_index] += 1;
}
}
@@ -2081,17 +2052,15 @@ static AreaNormalCenterData calc_area_normal_and_center_reduce(const AreaNormalC
{
AreaNormalCenterData joined{};
/* For flatten center. */
add_v3_v3v3(joined.area_cos[0], a.area_cos[0], b.area_cos[0]);
add_v3_v3v3(joined.area_cos[1], a.area_cos[1], b.area_cos[1]);
joined.area_cos[0] = a.area_cos[0] + b.area_cos[0];
joined.area_cos[1] = a.area_cos[1] + b.area_cos[1];
joined.count_co[0] = a.count_co[0] + b.count_co[0];
joined.count_co[1] = a.count_co[1] + b.count_co[1];
/* For area normal. */
add_v3_v3v3(joined.area_nos[0], a.area_nos[0], b.area_nos[0]);
add_v3_v3v3(joined.area_nos[1], a.area_nos[1], b.area_nos[1]);
/* Weights. */
add_v2_v2v2_int(joined.count_no, a.count_no, b.count_no);
add_v2_v2v2_int(joined.count_co, a.count_co, b.count_co);
joined.area_nos[0] = a.area_nos[0] + b.area_nos[0];
joined.area_nos[1] = a.area_nos[1] + b.area_nos[1];
joined.count_no[0] = a.count_no[0] + b.count_no[0];
joined.count_no[1] = a.count_no[1] + b.count_no[1];
return joined;
}
@@ -2121,7 +2090,7 @@ void calc_area_center(const Brush &brush,
calc_area_normal_and_center_reduce);
/* For flatten center. */
for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) {
for (n = 0; n < anctd.area_cos.size(); n++) {
if (anctd.count_co[n] == 0) {
continue;
}
@@ -2167,7 +2136,7 @@ std::optional<float3> calc_area_normal(const Brush &brush, Object &ob, Span<PBVH
/* For area normal. */
float3 result;
for (int i = 0; i < ARRAY_SIZE(anctd.area_nos); i++) {
for (int i = 0; i < anctd.area_nos.size(); i++) {
if (normalize_v3_v3(result, anctd.area_nos[i]) != 0.0f) {
return result;
}
@@ -2201,7 +2170,7 @@ void calc_area_normal_and_center(const Brush &brush,
calc_area_normal_and_center_reduce);
/* For flatten center. */
for (n = 0; n < ARRAY_SIZE(anctd.area_cos); n++) {
for (n = 0; n < anctd.area_cos.size(); n++) {
if (anctd.count_co[n] == 0) {
continue;
}
@@ -2221,7 +2190,7 @@ void calc_area_normal_and_center(const Brush &brush,
}
/* For area normal. */
for (n = 0; n < ARRAY_SIZE(anctd.area_nos); n++) {
for (n = 0; n < anctd.area_nos.size(); n++) {
if (normalize_v3_v3(r_area_no, anctd.area_nos[n]) != 0.0f) {
break;
}