From c543ccf79ca4305befc1939c1f6b55028f183f1a Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sat, 11 Apr 2026 14:02:09 +0800 Subject: [PATCH] Preserve chunk metadata in gaussian splat subset test --- .../integration/gaussian_splat_scene/main.cpp | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/tests/Rendering/integration/gaussian_splat_scene/main.cpp b/tests/Rendering/integration/gaussian_splat_scene/main.cpp index fa6c7e01..f770b214 100644 --- a/tests/Rendering/integration/gaussian_splat_scene/main.cpp +++ b/tests/Rendering/integration/gaussian_splat_scene/main.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -137,9 +138,42 @@ GaussianSplat* CreateGaussianSplatSubset( } } + const uint32_t subsetChunkCount = + (subsetSplatCount + (kGaussianSplatChunkSize - 1u)) / kGaussianSplatChunkSize; + std::vector 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::max(), + std::numeric_limits::max(), + std::numeric_limits::max()); + Vector3 maxPosition( + -std::numeric_limits::max(), + -std::numeric_limits::max(), + -std::numeric_limits::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 sections; XCEngine::Containers::Array 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();