From f4f7772f487962ba494d9073b96c333bd2a6afb8 Mon Sep 17 00:00:00 2001 From: David Lively Date: Wed, 8 Oct 2025 14:00:45 -0500 Subject: [PATCH 1/7] Added rowPitch field to ImageAssetMipPosition struct. This is used when flipping textures in Unity. --- CesiumGltf/include/CesiumGltf/ImageAsset.h | 6 ++++++ CesiumGltfReader/src/ImageDecoder.cpp | 19 ++++++++++++++----- .../src/GeoJsonDocumentRasterOverlay.cpp | 6 ++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/CesiumGltf/include/CesiumGltf/ImageAsset.h b/CesiumGltf/include/CesiumGltf/ImageAsset.h index aab21b9c9..d8b46a390 100644 --- a/CesiumGltf/include/CesiumGltf/ImageAsset.h +++ b/CesiumGltf/include/CesiumGltf/ImageAsset.h @@ -23,6 +23,12 @@ struct CESIUMGLTF_API ImageAssetMipPosition { * @brief The size in bytes of this mip. */ size_t byteSize; + + /** + * @brief The pitch (or stride) between rows of a texture image level in + * bytes. + */ + size_t rowPitch; }; /** diff --git a/CesiumGltfReader/src/ImageDecoder.cpp b/CesiumGltfReader/src/ImageDecoder.cpp index 9d653dcaf..d3e5a2df2 100644 --- a/CesiumGltfReader/src/ImageDecoder.cpp +++ b/CesiumGltfReader/src/ImageDecoder.cpp @@ -28,6 +28,8 @@ #define STB_IMAGE_RESIZE_STATIC #include +#include + namespace CesiumGltfReader { using namespace CesiumGltf; @@ -231,8 +233,10 @@ ImageReaderResult ImageDecoder::readImage( &imageOffset); ktx_size_t imageSize = ktxTexture_GetImageSize(ktxTexture(pTexture), level); + ktx_uint32_t rowPitch = + ktxTexture_GetRowPitch(ktxTexture(pTexture), level); - image.mipPositions[level] = {imageOffset, imageSize}; + image.mipPositions[level] = {imageOffset, imageSize, rowPitch}; } } else { CESIUM_ASSERT(pTexture->numLevels == 1); @@ -390,13 +394,16 @@ std::optional ImageDecoder::generateMipMaps(ImageAsset& image) { totalPixelCount += mipWidth * mipHeight; } + const size_t imageRowPitch = + static_cast(image.width * image.channels * image.bytesPerChannel); // Byte size of the base image. - const size_t imageByteSize = static_cast( - image.width * image.height * image.channels * image.bytesPerChannel); + const size_t imageByteSize = + imageRowPitch * static_cast(image.height); image.mipPositions.resize(mipCount); image.mipPositions[0].byteOffset = 0; image.mipPositions[0].byteSize = imageByteSize; + image.mipPositions[0].rowPitch = imageRowPitch; image.pixelData.resize(static_cast( totalPixelCount * image.channels * image.bytesPerChannel)); @@ -421,11 +428,13 @@ std::optional ImageDecoder::generateMipMaps(ImageAsset& image) { mipHeight >>= 1; } - byteSize = static_cast( - mipWidth * mipHeight * image.channels * image.bytesPerChannel); + size_t rowPitch = + static_cast(mipWidth * image.channels * image.bytesPerChannel); + byteSize = rowPitch * static_cast(mipHeight); image.mipPositions[mipIndex].byteOffset = byteOffset; image.mipPositions[mipIndex].byteSize = byteSize; + image.mipPositions[mipIndex].rowPitch = rowPitch; if (!ImageDecoder::unsafeResize( &image.pixelData[lastByteOffset], diff --git a/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp b/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp index 9f35a2441..28155d168 100644 --- a/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp @@ -601,11 +601,13 @@ class CESIUMRASTEROVERLAYS_API GeoJsonDocumentRasterOverlayTileProvider final for (uint32_t i = 0; i < mipLevels; i++) { const int32_t width = std::max(textureSize.x >> i, 1); const int32_t height = std::max(textureSize.y >> i, 1); + const int32_t rowPitch = width * result.pImage->channels * + result.pImage->bytesPerChannel; result.pImage->mipPositions.emplace_back( CesiumGltf::ImageAssetMipPosition{ totalSize, - (size_t)(width * height * result.pImage->channels * - result.pImage->bytesPerChannel)}); + (size_t)(rowPitch * height), + (size_t)rowPitch}); totalSize += result.pImage->mipPositions[i].byteSize; } result.pImage->pixelData.resize(totalSize, std::byte{0}); From c6e725dec742f8faec48f6d19e764f2afe2b2ac8 Mon Sep 17 00:00:00 2001 From: David Lively Date: Wed, 8 Oct 2025 14:17:48 -0500 Subject: [PATCH 2/7] Fixed a test --- CesiumVectorData/test/TestVectorRasterizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CesiumVectorData/test/TestVectorRasterizer.cpp b/CesiumVectorData/test/TestVectorRasterizer.cpp index 0c84b40cd..08550176b 100644 --- a/CesiumVectorData/test/TestVectorRasterizer.cpp +++ b/CesiumVectorData/test/TestVectorRasterizer.cpp @@ -250,7 +250,7 @@ TEST_CASE("VectorRasterizer::rasterize") { for (size_t i = 0; i < 4; i++) { int32_t width = 256 >> i; int32_t height = 256 >> i; - asset->mipPositions[i] = {totalSize, (size_t)(width * height * 4)}; + asset->mipPositions[i] = {totalSize, (size_t)(width * height * 4), (size_t)(width * 4)}; totalSize += asset->mipPositions[i].byteSize; } From c5a55b8e3d4b7087cf0ea1f90e75d14a45d0cfc3 Mon Sep 17 00:00:00 2001 From: David Lively Date: Wed, 8 Oct 2025 14:19:08 -0500 Subject: [PATCH 3/7] Formatting --- CesiumVectorData/test/TestVectorRasterizer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CesiumVectorData/test/TestVectorRasterizer.cpp b/CesiumVectorData/test/TestVectorRasterizer.cpp index 08550176b..1b8a340be 100644 --- a/CesiumVectorData/test/TestVectorRasterizer.cpp +++ b/CesiumVectorData/test/TestVectorRasterizer.cpp @@ -250,7 +250,10 @@ TEST_CASE("VectorRasterizer::rasterize") { for (size_t i = 0; i < 4; i++) { int32_t width = 256 >> i; int32_t height = 256 >> i; - asset->mipPositions[i] = {totalSize, (size_t)(width * height * 4), (size_t)(width * 4)}; + asset->mipPositions[i] = { + totalSize, + (size_t)(width * height * 4), + (size_t)(width * 4)}; totalSize += asset->mipPositions[i].byteSize; } From 00e164521e9783284930bb4a067fa7b0b0ce4349 Mon Sep 17 00:00:00 2001 From: David Lively Date: Wed, 8 Oct 2025 14:43:38 -0500 Subject: [PATCH 4/7] Removed unused #include --- CesiumGltfReader/src/ImageDecoder.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/CesiumGltfReader/src/ImageDecoder.cpp b/CesiumGltfReader/src/ImageDecoder.cpp index d3e5a2df2..75b2504e1 100644 --- a/CesiumGltfReader/src/ImageDecoder.cpp +++ b/CesiumGltfReader/src/ImageDecoder.cpp @@ -28,8 +28,6 @@ #define STB_IMAGE_RESIZE_STATIC #include -#include - namespace CesiumGltfReader { using namespace CesiumGltf; From 8be8f078104a55cf11504c0c91d1b48db05b3a3e Mon Sep 17 00:00:00 2001 From: David Lively Date: Mon, 13 Oct 2025 11:00:38 -0500 Subject: [PATCH 5/7] Update CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp Co-authored-by: Janine Liu <32226860+j9liu@users.noreply.github.com> --- CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp b/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp index 28155d168..37e6a3a7b 100644 --- a/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp @@ -606,8 +606,8 @@ class CESIUMRASTEROVERLAYS_API GeoJsonDocumentRasterOverlayTileProvider final result.pImage->mipPositions.emplace_back( CesiumGltf::ImageAssetMipPosition{ totalSize, - (size_t)(rowPitch * height), - (size_t)rowPitch}); + size_t(rowPitch * height), + size_t(rowPitch)}); totalSize += result.pImage->mipPositions[i].byteSize; } result.pImage->pixelData.resize(totalSize, std::byte{0}); From 492f30e9242d5af9704cb8896f8cc4c3fc95d237 Mon Sep 17 00:00:00 2001 From: David Lively Date: Mon, 13 Oct 2025 11:00:44 -0500 Subject: [PATCH 6/7] Update CesiumVectorData/test/TestVectorRasterizer.cpp Co-authored-by: Janine Liu <32226860+j9liu@users.noreply.github.com> --- CesiumVectorData/test/TestVectorRasterizer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CesiumVectorData/test/TestVectorRasterizer.cpp b/CesiumVectorData/test/TestVectorRasterizer.cpp index 1b8a340be..c1b26a521 100644 --- a/CesiumVectorData/test/TestVectorRasterizer.cpp +++ b/CesiumVectorData/test/TestVectorRasterizer.cpp @@ -252,8 +252,8 @@ TEST_CASE("VectorRasterizer::rasterize") { int32_t height = 256 >> i; asset->mipPositions[i] = { totalSize, - (size_t)(width * height * 4), - (size_t)(width * 4)}; + size_t(width * height * 4), + size_t(width * 4)}; totalSize += asset->mipPositions[i].byteSize; } From 3caef21cbd18971c428cdf67d2894e2c1828c843 Mon Sep 17 00:00:00 2001 From: David Lively Date: Mon, 13 Oct 2025 11:00:51 -0500 Subject: [PATCH 7/7] Update CesiumGltf/include/CesiumGltf/ImageAsset.h Co-authored-by: Janine Liu <32226860+j9liu@users.noreply.github.com> --- CesiumGltf/include/CesiumGltf/ImageAsset.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CesiumGltf/include/CesiumGltf/ImageAsset.h b/CesiumGltf/include/CesiumGltf/ImageAsset.h index d8b46a390..f61412cd5 100644 --- a/CesiumGltf/include/CesiumGltf/ImageAsset.h +++ b/CesiumGltf/include/CesiumGltf/ImageAsset.h @@ -25,8 +25,7 @@ struct CESIUMGLTF_API ImageAssetMipPosition { size_t byteSize; /** - * @brief The pitch (or stride) between rows of a texture image level in - * bytes. + * @brief The pitch (or stride) between rows of this mip in bytes. */ size_t rowPitch; };