1. getActiveMesh
MeshLayer::Ptr getActiveMesh(const MeshLayer& mesh_layer,
const BlockIndices& archived_blocks) {
auto active_mesh = std::make_shared<MeshLayer>(mesh_layer.blockSize());
const BlockIndexSet archived_set(archived_blocks.begin(), archived_blocks.end());
for (const auto& block : mesh_layer.updatedBlockIndices()) {
if (archived_set.count(block)) {
continue;
}
active_mesh->allocateBlock(block) = mesh_layer.getBlock(block);
}
return active_mesh;
}
전체 로직 요약
- 이 함수는 아카이브된 블록을 제외한 활성 블록들만 추출하여 새로운 메쉬 레이어로 반환하는 역할
메쉬 레이어 블록 크기 설정 및 초기화
auto active_mesh = std::make_shared<MeshLayer>(mesh_layer.blockSize());
- 새로운 메쉬 레이어(
active_mesh
)를 생성합니다. 이 레이어는 주어진 mesh_layer
와 같은 블록 크기(blockSize)를 사용
std::make_shared<MeshLayer>()
를 사용해 메모리 할당을 효율적으로 처리하며, 새로운 메쉬 레이어의 참조 포인터를 생성
아카이브된 블록 세트로 변환
const BlockIndexSet archived_set(archived_blocks.begin(), archived_blocks.end());
- 아카이브된 블록들(
archived_blocks
)을 세트(BlockIndexSet
)로 변환
BlockIndexSet
은 중복 없이 아카이브된 블록의 인덱스들을 저장하는 자료 구조로, 이후 블록들이 아카이브되었는지 확인하는 데 사용
- 세트(Set)를 사용하는 이유는 블록이 아카이브되었는지 빠르게 확인할 수 있기 때문
유효한 블록 처리
for (const auto& block : mesh_layer.updatedBlockIndices()) {
if (archived_set.count(block)) {
continue;
}
active_mesh->allocateBlock(block) = mesh_layer.getBlock(block);
}
mesh_layer.updatedBlockIndices()
는 업데이트된 블록들의 인덱스 목록을 반환
- 이 블록들 중에서 아카이브되지 않은 블록들만 필터링하여 처리
archived_set.count(block)
:
- 현재 블록(
block
)이 아카이브된 블록인지 확인
- 만약 아카이브된 블록이라면, 해당 블록은 처리하지 않고 건너뜁니다(
continue
).
active_mesh->allocateBlock(block)
: 아카이브되지 않은 블록이라면, 새로운 메쉬 레이어(active_mesh
)에 블록을 할당
mesh_layer.getBlock(block)
을 통해 기존 메쉬 레이어의 블록 데이터를 복사하여 활성 메쉬로 사용
결과 반환
return active_mesh;
- 아카이브되지 않은 블록들만 포함된 활성 메쉬(
active_mesh
)를 반환