Mesh: Replace auto smooth with node group #108014

Merged
Hans Goudey merged 149 commits from HooglyBoogly/blender:refactor-mesh-corner-normals-lazy into main 2023-10-20 16:54:20 +02:00
3 changed files with 25 additions and 25 deletions
Showing only changes of commit fc775c17d9 - Show all commits

View File

@ -317,21 +317,20 @@ eAttrDomain Mesh::normal_domain_all_info() const
const VArray<bool> sharp_faces = *attributes.lookup_or_default<bool>(
"sharp_face", ATTR_DOMAIN_FACE, false);
const array_utils::BoolArrayMix face_mix = array_utils::booleans_mix_calc(sharp_faces);
if (face_mix == array_utils::BoolArrayMix::AllTrue) {
const array_utils::BooleanMix face_mix = array_utils::booleans_mix_calc(sharp_faces);
if (face_mix == array_utils::BooleanMix::AllTrue) {
return ATTR_DOMAIN_FACE;
}
const VArray<bool> sharp_edges = *attributes.lookup_or_default<bool>(
"sharp_edge", ATTR_DOMAIN_EDGE, false);
const array_utils::BoolArrayMix edge_mix = array_utils::booleans_mix_calc(sharp_edges);
if (edge_mix == array_utils::BoolArrayMix::AllTrue) {
const array_utils::BooleanMix edge_mix = array_utils::booleans_mix_calc(sharp_edges);
if (edge_mix == array_utils::BooleanMix::AllTrue) {
return ATTR_DOMAIN_FACE;
}
if (edge_mix == array_utils::BoolArrayMix::AllFalse &&
face_mix == array_utils::BoolArrayMix::AllFalse)
{
if (edge_mix == array_utils::BooleanMix::AllFalse &&
face_mix == array_utils::BooleanMix::AllFalse) {
return ATTR_DOMAIN_POINT;
}

View File

@ -140,14 +140,15 @@ inline void gather(const VArray<T> &src,
}
void invert_booleans(MutableSpan<bool> span);
enum class BoolArrayMix {
enum class BooleanMix {
None,
AllFalse,
AllTrue,
Mixed,
};
BoolArrayMix booleans_mix_calc(const VArray<bool> &varray, IndexRange range_to_check);
inline BoolArrayMix booleans_mix_calc(const VArray<bool> &varray)
BooleanMix booleans_mix_calc(const VArray<bool> &varray, IndexRange range_to_check);
inline BooleanMix booleans_mix_calc(const VArray<bool> &varray)
{
return booleans_mix_calc(varray, varray.index_range());
}

View File

@ -52,23 +52,23 @@ void invert_booleans(MutableSpan<bool> span)
});
}
BoolArrayMix booleans_mix_calc(const VArray<bool> &varray, const IndexRange range_to_check)
BooleanMix booleans_mix_calc(const VArray<bool> &varray, const IndexRange range_to_check)
{
if (varray.is_empty()) {
return BoolArrayMix::None;
return BooleanMix::None;
}
const CommonVArrayInfo info = varray.common_info();
if (info.type == CommonVArrayInfo::Type::Single) {
return *static_cast<const bool *>(info.data) ? BoolArrayMix::AllTrue : BoolArrayMix::AllFalse;
return *static_cast<const bool *>(info.data) ? BooleanMix::AllTrue : BooleanMix::AllFalse;
}
if (info.type == CommonVArrayInfo::Type::Span) {
const Span<bool> span(static_cast<const bool *>(info.data), varray.size());
return threading::parallel_reduce(
range_to_check,
4096,
BoolArrayMix::None,
[&](const IndexRange range, const BoolArrayMix init) {
if (init == BoolArrayMix::Mixed) {
BooleanMix::None,
[&](const IndexRange range, const BooleanMix init) {
if (init == BooleanMix::Mixed) {
return init;
}
@ -76,31 +76,31 @@ BoolArrayMix booleans_mix_calc(const VArray<bool> &varray, const IndexRange rang
const bool first = slice.first();
for (const bool value : slice.drop_front(1)) {
if (value != first) {
return BoolArrayMix::Mixed;
return BooleanMix::Mixed;
}
}
return first ? BoolArrayMix::AllTrue : BoolArrayMix::AllFalse;
return first ? BooleanMix::AllTrue : BooleanMix::AllFalse;
},
[&](BoolArrayMix a, BoolArrayMix b) { return (a == b) ? a : BoolArrayMix::Mixed; });
[&](BooleanMix a, BooleanMix b) { return (a == b) ? a : BooleanMix::Mixed; });
}
return threading::parallel_reduce(
range_to_check,
2048,
BoolArrayMix::None,
[&](const IndexRange range, const BoolArrayMix init) {
if (init == BoolArrayMix::Mixed) {
BooleanMix::None,
[&](const IndexRange range, const BooleanMix init) {
if (init == BooleanMix::Mixed) {
return init;
}
/* Alternatively, this could use #materialize to retrieve many values at once. */
const bool first = varray[range.first()];
for (const int64_t i : range.drop_front(1)) {
if (varray[i] != first) {
return BoolArrayMix::Mixed;
return BooleanMix::Mixed;
}
}
return first ? BoolArrayMix::AllTrue : BoolArrayMix::AllFalse;
return first ? BooleanMix::AllTrue : BooleanMix::AllFalse;
},
[&](BoolArrayMix a, BoolArrayMix b) { return (a == b) ? a : BoolArrayMix::Mixed; });
[&](BooleanMix a, BooleanMix b) { return (a == b) ? a : BooleanMix::Mixed; });
}
} // namespace blender::array_utils