// 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 #include #include #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(minLOD - maxLOD) + 1ul); std::iota(lods.begin(), lods.end(), maxLOD); } LODConstraint::LODConstraint(ConstArrayView 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(lod + static_cast(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(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& unconstrainedLODs) const { extd::filter(unconstrainedLODs, extd::byPosition(lods)); } void LODConstraint::applyTo(DynArray& unconstrainedLODs) const { extd::filter(unconstrainedLODs, extd::byPosition(lods)); } } // namespace dna