Preserve chunk metadata in gaussian splat subset test

This commit is contained in:
2026-04-11 14:02:09 +08:00
parent 88a71a5426
commit c543ccf79c

View File

@@ -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();