Preserve chunk metadata in gaussian splat subset test
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <filesystem>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
#include <system_error>
|
||||
#include <vector>
|
||||
@@ -137,9 +138,42 @@ GaussianSplat* CreateGaussianSplatSubset(
|
||||
}
|
||||
}
|
||||
|
||||
const uint32_t subsetChunkCount =
|
||||
(subsetSplatCount + (kGaussianSplatChunkSize - 1u)) / kGaussianSplatChunkSize;
|
||||
std::vector<GaussianSplatChunkRecord> subsetChunks(subsetChunkCount);
|
||||
for (uint32_t chunkIndex = 0u; chunkIndex < subsetChunkCount; ++chunkIndex) {
|
||||
const uint32_t startIndex = chunkIndex * kGaussianSplatChunkSize;
|
||||
const uint32_t endIndex = std::min(startIndex + kGaussianSplatChunkSize, subsetSplatCount);
|
||||
|
||||
Vector3 minPosition(
|
||||
std::numeric_limits<float>::max(),
|
||||
std::numeric_limits<float>::max(),
|
||||
std::numeric_limits<float>::max());
|
||||
Vector3 maxPosition(
|
||||
-std::numeric_limits<float>::max(),
|
||||
-std::numeric_limits<float>::max(),
|
||||
-std::numeric_limits<float>::max());
|
||||
|
||||
for (uint32_t subsetIndex = startIndex; subsetIndex < endIndex; ++subsetIndex) {
|
||||
const Vector3& position = subsetPositions[subsetIndex].position;
|
||||
minPosition.x = std::min(minPosition.x, position.x);
|
||||
minPosition.y = std::min(minPosition.y, position.y);
|
||||
minPosition.z = std::min(minPosition.z, position.z);
|
||||
maxPosition.x = std::max(maxPosition.x, position.x);
|
||||
maxPosition.y = std::max(maxPosition.y, position.y);
|
||||
maxPosition.z = std::max(maxPosition.z, position.z);
|
||||
}
|
||||
|
||||
GaussianSplatChunkRecord chunk = {};
|
||||
chunk.posX = Vector2(minPosition.x, maxPosition.x);
|
||||
chunk.posY = Vector2(minPosition.y, maxPosition.y);
|
||||
chunk.posZ = Vector2(minPosition.z, maxPosition.z);
|
||||
subsetChunks[chunkIndex] = chunk;
|
||||
}
|
||||
|
||||
XCEngine::Containers::Array<GaussianSplatSection> sections;
|
||||
XCEngine::Containers::Array<XCEngine::Core::uint8> payload;
|
||||
sections.Reserve(shSection != nullptr && sh != nullptr ? 4u : 3u);
|
||||
sections.Reserve(shSection != nullptr && sh != nullptr ? 5u : 4u);
|
||||
|
||||
size_t payloadOffset = 0u;
|
||||
auto appendSection = [&](const GaussianSplatSection& sourceSection,
|
||||
@@ -181,13 +215,21 @@ GaussianSplat* CreateGaussianSplatSubset(
|
||||
subsetSplatCount,
|
||||
sizeof(GaussianSplatSHRecord));
|
||||
}
|
||||
GaussianSplatSection chunksSection = {};
|
||||
chunksSection.type = GaussianSplatSectionType::Chunks;
|
||||
chunksSection.format = GaussianSplatSectionFormat::ChunkFloat32;
|
||||
appendSection(
|
||||
chunksSection,
|
||||
subsetChunks.data(),
|
||||
subsetChunkCount,
|
||||
sizeof(GaussianSplatChunkRecord));
|
||||
|
||||
GaussianSplatMetadata metadata = source.GetMetadata();
|
||||
metadata.splatCount = subsetSplatCount;
|
||||
metadata.bounds = source.GetBounds();
|
||||
metadata.chunkCount = 0u;
|
||||
metadata.chunkCount = subsetChunkCount;
|
||||
metadata.cameraCount = 0u;
|
||||
metadata.chunkFormat = GaussianSplatSectionFormat::Unknown;
|
||||
metadata.chunkFormat = GaussianSplatSectionFormat::ChunkFloat32;
|
||||
metadata.cameraFormat = GaussianSplatSectionFormat::Unknown;
|
||||
|
||||
auto* gaussianSplat = new GaussianSplat();
|
||||
|
||||
Reference in New Issue
Block a user