dna/LODMapping.cpp dna/LODMapping.h dna/LODConstraint.h dna/TypeDefs.h dna/utils/Extd.h algorithm cassert cstddef cstdint dna //CopyrightEpicGames,Inc.AllRightsReserved. #include"dna/LODMapping.h" #include"dna/LODConstraint.h" #include"dna/TypeDefs.h" #include"dna/utils/Extd.h" #ifdef_MSC_VER #pragmawarning(push) #pragmawarning(disable:43654987) #endif #include<algorithm> #include<cassert> #include<cstddef> #include<cstdint> #ifdef_MSC_VER #pragmawarning(pop) #endif namespacedna{ LODMapping::LODMapping(MemoryResource*memRes_): lods{memRes_}, indices{memRes_}{ } std::uint16_tLODMapping::getLODCount()const{ returnstatic_cast<std::uint16_t>(lods.size()); } voidLODMapping::resetIndices(){ indices.clear(); } voidLODMapping::resetLODs(){ lods.clear(); } voidLODMapping::reset(){ lods.clear(); indices.clear(); } voidLODMapping::setLODCount(std::uint16_tlodCount){ reset(); lods.resize(lodCount); indices.resize(lodCount); } voidLODMapping::discardLODs(constLODConstraint&lodConstraint){ lodConstraint.applyTo(lods); cleanupIndices(); } voidLODMapping::cleanupIndices(){ for(std::size_ti=indices.size();i>0ul;--i){ constautoidx=(i-1ul); if(std::find(lods.begin(),lods.end(),idx)==lods.end()){ indices.erase(extd::advanced(indices.begin(),idx)); for(auto&l2i:lods){ if(l2i>idx){ --l2i; } } } } } ConstArrayView<std::uint16_t>LODMapping::getIndices(std::uint16_tlod)const{ if(lod>=lods.size()){ return{}; } assert(lods[lod]<indices.size()); constautoit=extd::advanced(indices.cbegin(),lods[lod]); return(it==indices.cend()?ConstArrayView<std::uint16_t>{}:ConstArrayView<std::uint16_t>{it->data(),it->size()}); } std::uint16_tLODMapping::getIndexListCount()const{ returnstatic_cast<std::uint16_t>(indices.size()); } voidLODMapping::clearIndices(std::uint16_tindex){ if(index<indices.size()){ indices[index].clear(); }else{ indices.resize(index+1ul); } } voidLODMapping::addIndices(std::uint16_tindex,conststd::uint16_t*source,std::uint16_tcount){ if(index>=indices.size()){ indices.resize(index+1ul); } indices[index].reserve(count); indices[index].insert(indices[index].end(),source,source+count); } voidLODMapping::mapIndices(std::function<std::uint16_t(std::uint16_t)>mapper){ for(auto&row:indices){ for(auto&value:row){ value=mapper(value); } } } voidLODMapping::filterIndices(std::function<bool(std::uint16_t)>filterer){ for(auto&row:indices){ for(autoit=row.begin();it!=row.end();){ if(filterer(*it)){ ++it; }else{ it=row.erase(it); } } } } voidLODMapping::associateLODWithIndices(std::uint16_tlod,std::uint16_tindex){ if(lod>=lods.size()){ lods.resize(lod+1ul); } if(index>=indices.size()){ indices.resize(index+1ul); } lods[lod]=index; } UnorderedSet<std::uint16_t>LODMapping::getCombinedDistinctIndices(MemoryResource*memRes)const{ UnorderedSet<std::uint16_t>distinctIndices{memRes}; for(constauto&row:indices){ distinctIndices.insert(row.begin(),row.end()); } returndistinctIndices; } }//namespacedna