Files
2025-05-18 13:04:45 +08:00

66 lines
1.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "dna/LODConstraint.h"
#include "dna/utils/Extd.h"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4365 4987)
#endif
#include <cstddef>
#include <cstdint>
#include <numeric>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
namespace dna {
LODConstraint::LODConstraint(std::uint16_t maxLOD, std::uint16_t minLOD, MemoryResource* memRes) : lods{memRes} {
assert(maxLOD <= minLOD);
lods.resize(static_cast<std::size_t>(minLOD - maxLOD) + 1ul);
std::iota(lods.begin(), lods.end(), maxLOD);
}
LODConstraint::LODConstraint(ConstArrayView<std::uint16_t> lods_, MemoryResource* memRes) : lods{lods_.begin(), lods_.end(),
memRes} {
std::sort(lods.begin(), lods.end());
}
bool LODConstraint::hasImpactOn(std::uint16_t lodCount) const {
std::uint16_t lod = {};
for (auto it = lods.begin(); (it != lods.end()) && (lod < lodCount); ++it) {
lod = static_cast<std::uint16_t>(lod + static_cast<std::uint16_t>(lod == *it));
}
return (lod != lodCount);
}
std::uint16_t LODConstraint::getMaxLOD() const {
return (lods.empty() ? std::uint16_t{} : lods.front());
}
std::uint16_t LODConstraint::getMinLOD() const {
return (lods.empty() ? std::uint16_t{} : lods.back());
}
std::uint16_t LODConstraint::getLODCount() const {
return static_cast<std::uint16_t>(lods.size());
}
void LODConstraint::clampTo(std::uint16_t lodCount) {
extd::filter(lods, [lodCount](std::uint16_t lod, std::size_t /*unused*/) {
return lod < lodCount;
});
}
void LODConstraint::applyTo(Vector<std::uint16_t>& unconstrainedLODs) const {
extd::filter(unconstrainedLODs, extd::byPosition(lods));
}
void LODConstraint::applyTo(DynArray<std::uint16_t>& unconstrainedLODs) const {
extd::filter(unconstrainedLODs, extd::byPosition(lods));
}
} // namespace dna