hydra code - src/utils/mesh_utilities.cpp

About_work·2024년 10월 16일
0

lifelong scene graph

목록 보기
17/56

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)를 반환
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글