Preserve chunk metadata in gaussian splat subset test
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <limits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
#include <vector>
|
#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<GaussianSplatSection> sections;
|
||||||
XCEngine::Containers::Array<XCEngine::Core::uint8> payload;
|
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;
|
size_t payloadOffset = 0u;
|
||||||
auto appendSection = [&](const GaussianSplatSection& sourceSection,
|
auto appendSection = [&](const GaussianSplatSection& sourceSection,
|
||||||
@@ -181,13 +215,21 @@ GaussianSplat* CreateGaussianSplatSubset(
|
|||||||
subsetSplatCount,
|
subsetSplatCount,
|
||||||
sizeof(GaussianSplatSHRecord));
|
sizeof(GaussianSplatSHRecord));
|
||||||
}
|
}
|
||||||
|
GaussianSplatSection chunksSection = {};
|
||||||
|
chunksSection.type = GaussianSplatSectionType::Chunks;
|
||||||
|
chunksSection.format = GaussianSplatSectionFormat::ChunkFloat32;
|
||||||
|
appendSection(
|
||||||
|
chunksSection,
|
||||||
|
subsetChunks.data(),
|
||||||
|
subsetChunkCount,
|
||||||
|
sizeof(GaussianSplatChunkRecord));
|
||||||
|
|
||||||
GaussianSplatMetadata metadata = source.GetMetadata();
|
GaussianSplatMetadata metadata = source.GetMetadata();
|
||||||
metadata.splatCount = subsetSplatCount;
|
metadata.splatCount = subsetSplatCount;
|
||||||
metadata.bounds = source.GetBounds();
|
metadata.bounds = source.GetBounds();
|
||||||
metadata.chunkCount = 0u;
|
metadata.chunkCount = subsetChunkCount;
|
||||||
metadata.cameraCount = 0u;
|
metadata.cameraCount = 0u;
|
||||||
metadata.chunkFormat = GaussianSplatSectionFormat::Unknown;
|
metadata.chunkFormat = GaussianSplatSectionFormat::ChunkFloat32;
|
||||||
metadata.cameraFormat = GaussianSplatSectionFormat::Unknown;
|
metadata.cameraFormat = GaussianSplatSectionFormat::Unknown;
|
||||||
|
|
||||||
auto* gaussianSplat = new GaussianSplat();
|
auto* gaussianSplat = new GaussianSplat();
|
||||||
|
|||||||
Reference in New Issue
Block a user