Cleanup: Sculpt: Move utilities to gather grids and BMesh normals

Turns out these functions are useful elsewhere too.
This commit is contained in:
Hans Goudey 2024-07-01 16:38:35 -04:00
parent 639acb2b5d
commit 52bd028bd8
3 changed files with 34 additions and 30 deletions

@ -90,23 +90,6 @@ static void calc_faces(const Sculpt &sd,
write_translations(sd, object, positions_eval, verts, translations, positions_orig);
}
static BLI_NOINLINE void gather_normals(const SubdivCCG &subdiv_ccg,
const Span<int> grids,
const MutableSpan<float3> normals)
{
const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
const Span<CCGElem *> elems = subdiv_ccg.grids;
BLI_assert(grids.size() * key.grid_area == normals.size());
for (const int i : grids.index_range()) {
CCGElem *elem = elems[grids[i]];
const int start = i * key.grid_area;
for (const int offset : IndexRange(key.grid_area)) {
normals[start + offset] = CCG_elem_offset_no(key, elem, offset);
}
}
}
static void calc_grids(const Sculpt &sd,
Object &object,
const Brush &brush,
@ -149,7 +132,7 @@ static void calc_grids(const Sculpt &sd,
tls.translations.reinitialize(grid_verts_num);
const MutableSpan<float3> translations = tls.translations;
gather_normals(subdiv_ccg, grids, translations);
gather_grids_normals(subdiv_ccg, grids, translations);
apply_scale(translations, scale);
scale_translations(translations, factors);
@ -157,16 +140,6 @@ static void calc_grids(const Sculpt &sd,
apply_translations(translations, grids, subdiv_ccg);
}
static BLI_NOINLINE void gather_normals(const Set<BMVert *, 0> &verts,
const MutableSpan<float3> normals)
{
int i = 0;
for (const BMVert *vert : verts) {
normals[i] = vert->no;
i++;
}
}
static void calc_bmesh(const Sculpt &sd,
Object &object,
const Brush &brush,
@ -206,7 +179,7 @@ static void calc_bmesh(const Sculpt &sd,
tls.translations.reinitialize(verts.size());
const MutableSpan<float3> translations = tls.translations;
gather_normals(verts, translations);
gather_bmesh_normals(verts, translations);
apply_scale(translations, scale);
scale_translations(translations, factors);

@ -65,9 +65,14 @@ void translations_from_offset_and_factors(const float3 &offset,
void gather_grids_positions(const SubdivCCG &subdiv_ccg,
Span<int> grids,
MutableSpan<float3> positions);
void gather_bmesh_positions(const Set<BMVert *, 0> &verts, MutableSpan<float3> positions);
/** Fill the output array with all normals in the grids referenced by the indices. */
void gather_grids_normals(const SubdivCCG &subdiv_ccg,
Span<int> grids,
MutableSpan<float3> normals);
void gather_bmesh_normals(const Set<BMVert *, 0> &verts, MutableSpan<float3> normals);
/**
* Calculate initial influence factors based on vertex visibility.
*/

@ -6645,6 +6645,32 @@ void gather_bmesh_positions(const Set<BMVert *, 0> &verts, const MutableSpan<flo
}
}
void gather_grids_normals(const SubdivCCG &subdiv_ccg,
const Span<int> grids,
const MutableSpan<float3> normals)
{
const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
const Span<CCGElem *> elems = subdiv_ccg.grids;
BLI_assert(grids.size() * key.grid_area == normals.size());
for (const int i : grids.index_range()) {
CCGElem *elem = elems[grids[i]];
const int start = i * key.grid_area;
for (const int offset : IndexRange(key.grid_area)) {
normals[start + offset] = CCG_elem_offset_no(key, elem, offset);
}
}
}
void gather_bmesh_normals(const Set<BMVert *, 0> &verts, const MutableSpan<float3> normals)
{
int i = 0;
for (const BMVert *vert : verts) {
normals[i] = vert->no;
i++;
}
}
void fill_factor_from_hide(const Mesh &mesh,
const Span<int> verts,
const MutableSpan<float> r_factors)