From 8da5554accedae062a06785d5a3af42be51075f5 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 22 Apr 2026 16:19:00 -0400 Subject: [PATCH 01/21] First sketches of vector tiles overlay --- .../VectorTilesRasterOverlay.h | 39 ++++ .../src/VectorTilesRasterOverlay.cpp | 216 ++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h create mode 100644 Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h new file mode 100644 index 0000000000..a93b7868b4 --- /dev/null +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h @@ -0,0 +1,39 @@ +#include +#include + +namespace Cesium3DTilesSelection { +class TilesetContentManager; + +/** + * @brief A raster overlay made from rasterizing a \ref + * CesiumVectorData::GeoJsonDocument. + */ +class CESIUMRASTEROVERLAYS_API VectorTilesRasterOverlay final + : public CesiumRasterOverlays::RasterOverlay { + +public: + /** + * @brief Creates a new EmbeddedTilesetRasterOverlayTest. + * + * @param asyncSystem The async system to use. + * @param name The user-given name of this polygon layer. + * @param document The GeoJSON document to use for the overlay. + * @param vectorOverlayOptions Options to configure this + * GeoJsonDocumentRasterOverlay. + * @param overlayOptions Options to use for this RasterOverlay. + */ + VectorTilesRasterOverlay( + const std::string& name, + const std::string& url, // todo: accept factory instead of url + const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions = {}); + + virtual ~VectorTilesRasterOverlay() override; + + virtual CesiumAsync::Future createTileProvider( + const CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters& + parameters) const override; + +private: + std::string _url; +}; +} // namespace Cesium3DTilesSelection \ No newline at end of file diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp new file mode 100644 index 0000000000..3baddd3922 --- /dev/null +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -0,0 +1,216 @@ +#include "Cesium3DTilesSelection/BoundingVolume.h" +#include "Cesium3DTilesSelection/TileLoadRequester.h" +#include "Cesium3DTilesSelection/TileLoadTask.h" +#include "Cesium3DTilesSelection/TilesetSharedAssetSystem.h" +#include "Cesium3DTilesSelection/ViewState.h" +#include "CesiumGeometry/QuadtreeTileID.h" +#include "CesiumGeospatial/Ellipsoid.h" +#include "CesiumGeospatial/GeographicProjection.h" +#include "CesiumGeospatial/GlobeRectangle.h" +#include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" +#include "CesiumRasterOverlays/RasterOverlay.h" +#include "CesiumRasterOverlays/RasterOverlayTile.h" +#include "CesiumRasterOverlays/RasterOverlayTileProvider.h" +#include "CesiumUtility/IntrusivePointer.h" +#include "TilesetContentManager.h" + +#include +#include +#include +#include + +using namespace CesiumRasterOverlays; +using namespace CesiumUtility; + +namespace Cesium3DTilesSelection { +namespace { +struct SharedTileSelectionState +{ + std::vector mainThreadLoadQueue; + std::vector workerThreadLoadQueue; + std::vector> previouslySelectedTiles; + + std::mutex mutex; +}; + +class VectorTilesLoadRequester : public TileLoadRequester { + virtual double getWeight() const override { return this->_weight; } + + virtual bool hasMoreTilesToLoadInWorkerThread() const override { + std::lock_guard lock(this->_pSharedTileSelectionState->mutex); + return !this->_pSharedTileSelectionState->workerThreadLoadQueue.empty(); + } + + const Tile* getNextTileToLoadInWorkerThread() override { + std::lock_guard lock(this->_pSharedTileSelectionState->mutex); + CESIUM_ASSERT(!this->_pSharedTileSelectionState->workerThreadLoadQueue.empty()); + if (this->_pSharedTileSelectionState->workerThreadLoadQueue.empty()) + return nullptr; + + Tile* pResult = this->_pSharedTileSelectionState->workerThreadLoadQueue.back().pTile; + this->_pSharedTileSelectionState->workerThreadLoadQueue.pop_back(); + return pResult; + } + + bool hasMoreTilesToLoadInMainThread() const override { + std::lock_guard lock(this->_pSharedTileSelectionState->mutex); + return !this->_pSharedTileSelectionState->mainThreadLoadQueue.empty(); + } + + const Tile* getNextTileToLoadInMainThread() override { + std::lock_guard lock(this->_pSharedTileSelectionState->mutex); + CESIUM_ASSERT(!this->_pSharedTileSelectionState->mainThreadLoadQueue.empty()); + if (this->_pSharedTileSelectionState->mainThreadLoadQueue.empty()) + return nullptr; + + Tile* pResult = this->_pSharedTileSelectionState->mainThreadLoadQueue.back().pTile; + this->_pSharedTileSelectionState->mainThreadLoadQueue.pop_back(); + return pResult; + } + + VectorTilesLoadRequester(std::shared_ptr pSharedTileSelectionState) + : _weight(1.0), _pSharedTileSelectionState(std::move(pSharedTileSelectionState)) {} + +private: + float _weight = 1.0; + std::shared_ptr _pSharedTileSelectionState; +}; + +class VectorTilesRasterOverlayTileProvider final + : public RasterOverlayTileProvider { +private: + CesiumUtility::IntrusivePointer + _pTilesetContentManager; + + std::shared_ptr _pSharedTileSelectionState = std::make_shared(); + +public: + VectorTilesRasterOverlayTileProvider( + const IntrusivePointer& pCreator, + const CreateRasterOverlayTileProviderParameters& parameters, + const std::string& url) + : RasterOverlayTileProvider( + pCreator, + parameters, + CesiumGeospatial::GeographicProjection( + CesiumGeospatial::Ellipsoid::WGS84), + projectRectangleSimple( + CesiumGeospatial::GeographicProjection( + CesiumGeospatial::Ellipsoid::WGS84), + CesiumGeospatial::GlobeRectangle::MAXIMUM)){ + const TilesetExternals externals{ + parameters.externals.pAssetAccessor, + nullptr, + parameters.externals.asyncSystem, + parameters.externals.pCreditSystem, + parameters.externals.pLogger, + nullptr, + TilesetSharedAssetSystem::getDefault(), + nullptr}; + + this->_pTilesetContentManager = + TilesetContentManager::createFromUrl(externals, TilesetOptions{}, url); + } + + virtual CesiumAsync::Future + loadTileImage(const RasterOverlayTile& overlayTile) override { + const RasterOverlayOptions& options = this->getOwner().getOptions(); + glm::ivec2 textureSize = glm::min( + glm::ivec2( + overlayTile.getTargetScreenPixels() / + options.maximumScreenSpaceError), + glm::ivec2(options.maximumTextureSize)); + + const CesiumGeospatial::GlobeRectangle tileRectangle = + CesiumGeospatial::unprojectRectangleSimple( + this->getProjection(), + overlayTile.getRectangle()); + const CesiumGeospatial::Ellipsoid& ellipsoid = + CesiumGeospatial::Ellipsoid::WGS84; + + // Check if previously selected tiles cover this area + std::lock_guard lock(this->_pSharedTileSelectionState->mutex); + bool isCovered = false; + if (this->_pSharedTileSelectionState) { + for (const auto& selectedTile : this->_pSharedTileSelectionState->previouslySelectedTiles) { + if (selectedTile.first.computeIntersection(tileRectangle)) { + // could be covered by multiple tiles? assume quadtree i guess... + isCovered = true; + break; + } + } + } + + if (isCovered) { + // This tile is already covered by previously selected tiles... + // todo: check screenspace error + // todo: actually render the tile + return this->getAsyncSystem() + .createResolvedFuture( + LoadedRasterOverlayImage{}); + } + + Tile* pCoveringTile = nullptr; + Tile* pRoot = this->_pTilesetContentManager->getRootTile(); + + if (pRoot) { + std::queue tilesToCheck; + tilesToCheck.push(pRoot); + + while (!tilesToCheck.empty() && !pCoveringTile) { + Tile* pCurrentTile = tilesToCheck.front(); + tilesToCheck.pop(); + + if (!pCurrentTile) { continue; } + + // Check if this tile covers the target rectangle + const BoundingVolume& boundingVolume = pCurrentTile->getBoundingVolume(); + const std::optional& boundingRegion = estimateGlobeRectangle(boundingVolume); + + if (boundingRegion && boundingRegion->computeIntersection(tileRectangle)) { + pCoveringTile = pCurrentTile; + break; + } + + if(pCurrentTile->getState() < TileLoadState::ContentLoaded) { + // tile is not loaded, add to load queue and skip it for now + this->_pSharedTileSelectionState->workerThreadLoadQueue.push_back(TileLoadTask{pCurrentTile, TileLoadPriorityGroup::Normal, 1.0}); + continue; + } + + // Add children to the queue + std::span children = pCurrentTile->getChildren(); + for (Tile& child : children) { + tilesToCheck.push(&child); + } + } + } + + return this->getAsyncSystem() + .createResolvedFuture( + LoadedRasterOverlayImage{}); + } +}; +} // namespace + +VectorTilesRasterOverlay::VectorTilesRasterOverlay( + const std::string& name, + const std::string& url, + const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions) + : CesiumRasterOverlays::RasterOverlay(name, overlayOptions), _url(url) {} + +CesiumAsync::Future +VectorTilesRasterOverlay::createTileProvider( + const CreateRasterOverlayTileProviderParameters& parameters) const { + + IntrusivePointer thiz = this; + return parameters.externals.asyncSystem + .createResolvedFuture( + IntrusivePointer( + new VectorTilesRasterOverlayTileProvider( + thiz, + parameters, + this->_url))); +} + +} // namespace Cesium3DTilesSelection \ No newline at end of file From 30bbd164a1480c639485471c21dfb2a312db14e7 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 29 Apr 2026 15:04:18 -0400 Subject: [PATCH 02/21] Basic tile selection that doesn't yet work... --- CMakeLists.txt | 3 +- Cesium3DTilesSelection/CMakeLists.txt | 1 + .../VectorTilesRasterOverlay.h | 2 +- .../src/VectorTilesRasterOverlay.cpp | 368 +++++++++++++----- .../test/TestVectorTilesRasterOverlay.cpp | 74 ++++ .../ActivatedRasterOverlay.h | 3 + .../RasterOverlayTileProvider.h | 4 + .../src/ActivatedRasterOverlay.cpp | 10 + vcpkg.json | 3 +- 9 files changed, 362 insertions(+), 106 deletions(-) create mode 100644 Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 85c751aa99..0f7e837edd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,7 +128,7 @@ set(PACKAGES_PUBLIC asyncplusplus expected-lite fmt glm rapidjson spdlog stb ada set(PACKAGES_PRIVATE abseil draco ktx[core] modp-base64 meshoptimizer openssl s2geometry sqlite3 tinyxml2 libwebp zlib-ng picosha2 - earcut-hpp libmorton zstd spz zlib + earcut-hpp libmorton zstd spz zlib concurrentqueue ) # asmjit needed by blend2d on non-iOS platforms (iOS and Wasm don't support JIT) @@ -394,6 +394,7 @@ find_package(tinyxml2 CONFIG REQUIRED) find_package(unofficial-sqlite3 CONFIG REQUIRED) find_package(WebP CONFIG REQUIRED) find_package(zlib-ng CONFIG REQUIRED) +find_package(concurrentqueue CONFIG REQUIRED) # asmjit should not be included with iOS or Wasm builds as they don't support JIT compilation. if(NOT CESIUM_TARGET_WASM AND NOT IOS AND NOT VCPKG_CMAKE_SYSTEM_NAME MATCHES "iOS") diff --git a/Cesium3DTilesSelection/CMakeLists.txt b/Cesium3DTilesSelection/CMakeLists.txt index 26ca91fcac..385aaca2e2 100644 --- a/Cesium3DTilesSelection/CMakeLists.txt +++ b/Cesium3DTilesSelection/CMakeLists.txt @@ -59,4 +59,5 @@ target_link_libraries(Cesium3DTilesSelection nonstd::expected-lite PRIVATE tinyxml2::tinyxml2 + concurrentqueue::concurrentqueue ) diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h index a93b7868b4..f8f7cde00d 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h @@ -27,7 +27,7 @@ class CESIUMRASTEROVERLAYS_API VectorTilesRasterOverlay final const std::string& url, // todo: accept factory instead of url const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions = {}); - virtual ~VectorTilesRasterOverlay() override; + virtual ~VectorTilesRasterOverlay() override = default; virtual CesiumAsync::Future createTileProvider( const CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters& diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 3baddd3922..da998bebdc 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -1,22 +1,27 @@ -#include "Cesium3DTilesSelection/BoundingVolume.h" -#include "Cesium3DTilesSelection/TileLoadRequester.h" -#include "Cesium3DTilesSelection/TileLoadTask.h" -#include "Cesium3DTilesSelection/TilesetSharedAssetSystem.h" -#include "Cesium3DTilesSelection/ViewState.h" -#include "CesiumGeometry/QuadtreeTileID.h" -#include "CesiumGeospatial/Ellipsoid.h" -#include "CesiumGeospatial/GeographicProjection.h" -#include "CesiumGeospatial/GlobeRectangle.h" -#include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" -#include "CesiumRasterOverlays/RasterOverlay.h" -#include "CesiumRasterOverlays/RasterOverlayTile.h" -#include "CesiumRasterOverlays/RasterOverlayTileProvider.h" -#include "CesiumUtility/IntrusivePointer.h" #include "TilesetContentManager.h" +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include #include -#include +#include #include using namespace CesiumRasterOverlays; @@ -24,52 +29,56 @@ using namespace CesiumUtility; namespace Cesium3DTilesSelection { namespace { -struct SharedTileSelectionState -{ - std::vector mainThreadLoadQueue; - std::vector workerThreadLoadQueue; - std::vector> previouslySelectedTiles; +struct LoadRequest { + CesiumAsync::Promise promise; + std::set requestedTileIds; +}; + +struct SharedTileSelectionState { + moodycamel::ConcurrentQueue> + workerThreadLoadQueue; + // Does not need to be concurrent because it is only accessed by the + // TilesetContentManager and the methods calling the TilesetContentManager. + std::vector, uint64_t>> + tilesWaitingForWorker; + std::mutex loadRequestsMutex; + std::vector loadRequests; - std::mutex mutex; + std::atomic _nextId; }; class VectorTilesLoadRequester : public TileLoadRequester { - virtual double getWeight() const override { return this->_weight; } + virtual double getWeight() const override { return this->_weight; } virtual bool hasMoreTilesToLoadInWorkerThread() const override { - std::lock_guard lock(this->_pSharedTileSelectionState->mutex); - return !this->_pSharedTileSelectionState->workerThreadLoadQueue.empty(); + return this->_pSharedTileSelectionState->workerThreadLoadQueue + .size_approx() > 0; } const Tile* getNextTileToLoadInWorkerThread() override { - std::lock_guard lock(this->_pSharedTileSelectionState->mutex); - CESIUM_ASSERT(!this->_pSharedTileSelectionState->workerThreadLoadQueue.empty()); - if (this->_pSharedTileSelectionState->workerThreadLoadQueue.empty()) + std::pair taskAndId; + if (!this->_pSharedTileSelectionState->workerThreadLoadQueue.try_dequeue( + taskAndId)) { return nullptr; + } - Tile* pResult = this->_pSharedTileSelectionState->workerThreadLoadQueue.back().pTile; - this->_pSharedTileSelectionState->workerThreadLoadQueue.pop_back(); - return pResult; + this->_pSharedTileSelectionState->tilesWaitingForWorker.emplace_back( + taskAndId.first.pTile, + taskAndId.second); + return taskAndId.first.pTile; } bool hasMoreTilesToLoadInMainThread() const override { - std::lock_guard lock(this->_pSharedTileSelectionState->mutex); - return !this->_pSharedTileSelectionState->mainThreadLoadQueue.empty(); + // No main thread loading for vector tiles. + return false; } - const Tile* getNextTileToLoadInMainThread() override { - std::lock_guard lock(this->_pSharedTileSelectionState->mutex); - CESIUM_ASSERT(!this->_pSharedTileSelectionState->mainThreadLoadQueue.empty()); - if (this->_pSharedTileSelectionState->mainThreadLoadQueue.empty()) - return nullptr; - - Tile* pResult = this->_pSharedTileSelectionState->mainThreadLoadQueue.back().pTile; - this->_pSharedTileSelectionState->mainThreadLoadQueue.pop_back(); - return pResult; - } + const Tile* getNextTileToLoadInMainThread() override { return nullptr; } - VectorTilesLoadRequester(std::shared_ptr pSharedTileSelectionState) - : _weight(1.0), _pSharedTileSelectionState(std::move(pSharedTileSelectionState)) {} + VectorTilesLoadRequester( + std::shared_ptr pSharedTileSelectionState) + : _weight(1.0), + _pSharedTileSelectionState(std::move(pSharedTileSelectionState)) {} private: float _weight = 1.0; @@ -79,10 +88,160 @@ class VectorTilesLoadRequester : public TileLoadRequester { class VectorTilesRasterOverlayTileProvider final : public RasterOverlayTileProvider { private: + using TraversalState = + CesiumUtility::TreeTraversalState; + CesiumUtility::IntrusivePointer _pTilesetContentManager; + TilesetOptions _options; + + std::shared_ptr _pSharedTileSelectionState = + std::make_shared(); + +private: + struct LoadTileImageInformation { + CesiumGeospatial::GlobeRectangle tileRectangle; + glm::ivec2 textureSize; + std::vector tileLoadTasks; + std::vector tilesToRender; + }; + + CesiumAsync::Future addLoadRequest( + const CesiumAsync::AsyncSystem& asyncSystem, + const std::vector& tasks) { + std::set requestedTileIds; + for (const TileLoadTask& task : tasks) { + uint64_t id = this->_pSharedTileSelectionState->_nextId++; + this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( + {task, id}); + requestedTileIds.insert(id); + } + + LoadRequest request{ + asyncSystem.createPromise(), + std::move(requestedTileIds)}; + CesiumAsync::Future future = request.promise.getFuture(); + + this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + this->_pSharedTileSelectionState->loadRequests.emplace_back( + std::move(request)); + this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + + return future; + } + + bool meetsSse(const Tile& tile, LoadTileImageInformation& loadInfo) { + // TODO: is this SSE calculation actually correct? + const double geometricError = tile.getGeometricError(); + const double pixelsPerMeter = (double)loadInfo.textureSize.y / + (loadInfo.tileRectangle.computeHeight() * + this->_options.ellipsoid.getRadii().x); + + return (geometricError * pixelsPerMeter) < + this->_options.maximumScreenSpaceError; + } + + void visit(Tile& tile, LoadTileImageInformation& loadInfo) { + if (tile.isRenderContent() && meetsSse(tile, loadInfo)) { + if (tile.getState() < TileLoadState::ContentLoaded) { + loadInfo.tileLoadTasks.emplace_back( + &tile, + TileLoadPriorityGroup::Normal); + } + loadInfo.tilesToRender.emplace_back(&tile); + } else { + for (Tile& child : tile.getChildren()) { + this->visitIfNeeded(child, loadInfo); + } + } + } + + void visitIfNeeded(Tile& tile, LoadTileImageInformation& loadInfo) { + this->_pTilesetContentManager->updateTileContent(tile, _options); + + const std::optional rectangle = + estimateGlobeRectangle( + tile.getBoundingVolume(), + this->_options.ellipsoid); + if (!rectangle) { + // Invalid bounding rect, nothing to do with this. + return; + } - std::shared_ptr _pSharedTileSelectionState = std::make_shared(); + if (rectangle->computeIntersection(loadInfo.tileRectangle)) { + this->visit(tile, loadInfo); + } + } + + CesiumAsync::Future findAndLoadTiles( + const CesiumGeospatial::GlobeRectangle& tileRectangle, + const glm::ivec2& textureSize) { + LoadTileImageInformation loadInfo{tileRectangle, textureSize, {}, {}}; + Tile* pRootTile = this->_pTilesetContentManager->getRootTile(); + + if (pRootTile == nullptr) { + return this->getAsyncSystem() + .createResolvedFuture(std::move(loadInfo)); + } + + visitIfNeeded(*pRootTile, loadInfo); + + if (!loadInfo.tileLoadTasks.empty()) { + // Add load request and re-run this function when all those tiles are + // loaded. We need to re-run since some of those tiles might have been + // external content and now we need to check their children. + return this + ->addLoadRequest(this->getAsyncSystem(), loadInfo.tileLoadTasks) + .thenImmediately([this, tileRectangle, textureSize]() mutable { + return this->findAndLoadTiles(tileRectangle, textureSize); + }); + } + + return this->getAsyncSystem() + .createResolvedFuture(std::move(loadInfo)); + } + + CesiumAsync::Future loadTileImageFromTileset( + const CesiumGeometry::Rectangle& rectangle, + const CesiumGeospatial::GlobeRectangle& tileRectangle, + const glm::ivec2& textureSize) { + return this->findAndLoadTiles(tileRectangle, textureSize) + .thenInWorkerThread( + [textureSize, rectangle](LoadTileImageInformation&& loadInfo) { + // part 4 - rasterizing the tile + LoadedRasterOverlayImage result; + if (loadInfo.tilesToRender.empty()) { + // No tiles to render, so return an empty image. + result.rectangle = rectangle; + result.moreDetailAvailable = false; + result.pImage.emplace(); + result.pImage->width = 1; + result.pImage->height = 1; + result.pImage->channels = 4; + result.pImage->bytesPerChannel = 1; + result.pImage->pixelData = { + std::byte{0x00}, + std::byte{0x00}, + std::byte{0x00}, + std::byte{0x00}}; + } else { + result.moreDetailAvailable = true; + result.pImage.emplace(); + result.pImage->width = textureSize.x; + result.pImage->height = textureSize.y; + result.pImage->channels = 4; + result.pImage->bytesPerChannel = 1; + result.pImage->pixelData.resize( + (size_t)(result.pImage->width * result.pImage->height * + result.pImage->channels * + result.pImage->bytesPerChannel), + std::byte{0}); + // TODO: rasterize here + } + + return result; + }); + } public: VectorTilesRasterOverlayTileProvider( @@ -97,7 +256,8 @@ class VectorTilesRasterOverlayTileProvider final projectRectangleSimple( CesiumGeospatial::GeographicProjection( CesiumGeospatial::Ellipsoid::WGS84), - CesiumGeospatial::GlobeRectangle::MAXIMUM)){ + CesiumGeospatial::GlobeRectangle::MAXIMUM)), + _options() { const TilesetExternals externals{ parameters.externals.pAssetAccessor, nullptr, @@ -125,71 +285,73 @@ class VectorTilesRasterOverlayTileProvider final CesiumGeospatial::unprojectRectangleSimple( this->getProjection(), overlayTile.getRectangle()); - const CesiumGeospatial::Ellipsoid& ellipsoid = - CesiumGeospatial::Ellipsoid::WGS84; - - // Check if previously selected tiles cover this area - std::lock_guard lock(this->_pSharedTileSelectionState->mutex); - bool isCovered = false; - if (this->_pSharedTileSelectionState) { - for (const auto& selectedTile : this->_pSharedTileSelectionState->previouslySelectedTiles) { - if (selectedTile.first.computeIntersection(tileRectangle)) { - // could be covered by multiple tiles? assume quadtree i guess... - isCovered = true; - break; - } - } - } - if (isCovered) { - // This tile is already covered by previously selected tiles... - // todo: check screenspace error - // todo: actually render the tile - return this->getAsyncSystem() - .createResolvedFuture( - LoadedRasterOverlayImage{}); + // part 1 - selecting from scratch + if (this->_pTilesetContentManager->getRootTile() == nullptr) { + return this->_pTilesetContentManager->getRootTileAvailableEvent() + .thenInWorkerThread([this, + rectangle = overlayTile.getRectangle(), + tileRectangle, + textureSize]() mutable { + return this->loadTileImageFromTileset( + rectangle, + tileRectangle, + textureSize); + }); } - Tile* pCoveringTile = nullptr; - Tile* pRoot = this->_pTilesetContentManager->getRootTile(); - - if (pRoot) { - std::queue tilesToCheck; - tilesToCheck.push(pRoot); - - while (!tilesToCheck.empty() && !pCoveringTile) { - Tile* pCurrentTile = tilesToCheck.front(); - tilesToCheck.pop(); - - if (!pCurrentTile) { continue; } - - // Check if this tile covers the target rectangle - const BoundingVolume& boundingVolume = pCurrentTile->getBoundingVolume(); - const std::optional& boundingRegion = estimateGlobeRectangle(boundingVolume); - - if (boundingRegion && boundingRegion->computeIntersection(tileRectangle)) { - pCoveringTile = pCurrentTile; - break; - } + return loadTileImageFromTileset( + overlayTile.getRectangle(), + tileRectangle, + textureSize); + } - if(pCurrentTile->getState() < TileLoadState::ContentLoaded) { - // tile is not loaded, add to load queue and skip it for now - this->_pSharedTileSelectionState->workerThreadLoadQueue.push_back(TileLoadTask{pCurrentTile, TileLoadPriorityGroup::Normal, 1.0}); - continue; - } - - // Add children to the queue - std::span children = pCurrentTile->getChildren(); - for (Tile& child : children) { - tilesToCheck.push(&child); + // TODO: how does this get called? + virtual void tick() override { + this->_pTilesetContentManager->processWorkerThreadLoadRequests( + this->_options); + + // Check and resolve load requests if possible. + this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + for (const std::pair, uint64_t>& pair : + this->_pSharedTileSelectionState->tilesWaitingForWorker) { + if (pair.first->getState() < TileLoadState::ContentLoaded) { + continue; + } + + for (LoadRequest& request : + this->_pSharedTileSelectionState->loadRequests) { + if (request.requestedTileIds.erase(pair.second) > 0) { + if (request.requestedTileIds.empty()) { + request.promise.resolve(); + } } } } - - return this->getAsyncSystem() - .createResolvedFuture( - LoadedRasterOverlayImage{}); + + // Erase completed load requests. + this->_pSharedTileSelectionState->loadRequests.erase( + std::remove_if( + this->_pSharedTileSelectionState->loadRequests.begin(), + this->_pSharedTileSelectionState->loadRequests.end(), + [](const LoadRequest& request) { + return request.requestedTileIds.empty(); + }), + this->_pSharedTileSelectionState->loadRequests.end()); + this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + + // Erase tiles waiting for worker that are done. + this->_pSharedTileSelectionState->tilesWaitingForWorker.erase( + std::remove_if( + this->_pSharedTileSelectionState->tilesWaitingForWorker.begin(), + this->_pSharedTileSelectionState->tilesWaitingForWorker.end(), + [](const std::pair, uint64_t>& pair) { + return pair.first->getState() >= TileLoadState::ContentLoaded; + }), + this->_pSharedTileSelectionState->tilesWaitingForWorker.end()); } + + virtual bool isTickable() override { return true; } }; } // namespace diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp new file mode 100644 index 0000000000..4c5fa0ebb1 --- /dev/null +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -0,0 +1,74 @@ +#include "Cesium3DTilesContent/ImplicitTilingUtilities.h" +#include "CesiumAsync/IAssetAccessor.h" +#include "CesiumGeometry/QuadtreeTileID.h" +#include "CesiumGeometry/QuadtreeTilingScheme.h" +#include "CesiumGeometry/Rectangle.h" +#include "CesiumGeospatial/GlobeRectangle.h" +#include "CesiumNativeTests/FileAccessor.h" +#include "CesiumNativeTests/SimpleTaskProcessor.h" +#include "CesiumRasterOverlays/ActivatedRasterOverlay.h" +#include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" +#include "CesiumRasterOverlays/RasterOverlayExternals.h" +#include "CesiumRasterOverlays/RasterOverlayTile.h" +#include "CesiumUtility/IntrusivePointer.h" +#include + +#include + +using Cesium3DTilesSelection::VectorTilesRasterOverlay; +using CesiumAsync::AsyncSystem; +using CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters; +using CesiumRasterOverlays::RasterOverlayOptions; +using CesiumUtility::IntrusivePointer; + +TEST_CASE("Test VectorTilesRasterOverlay") { + const glm::dvec2 imageSize(256, 256); + + const CesiumGeospatial::BoundingRegion& tileRegion = Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( + CesiumGeospatial::BoundingRegion{ + CesiumGeospatial::GlobeRectangle{-3.141592653589793, -1.5707963267948966, 0.0, 1.5707963267948966}, + 0, + 0.005, + CesiumGeospatial::Ellipsoid::WGS84}, + CesiumGeometry::QuadtreeTileID(10, 582, 752), + CesiumGeospatial::Ellipsoid::WGS84); + const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = tileRegion.getRectangle(); + + std::shared_ptr pAssetAccessor = std::make_shared(CesiumNativeTests::FileAccessor{}); + AsyncSystem asyncSystem{ + std::make_shared()}; + + CreateRasterOverlayTileProviderParameters parameters{ + {pAssetAccessor, nullptr, asyncSystem}}; + IntrusivePointer pOverlay; + pOverlay.emplace( + "overlay0", + "file:////mnt/d/Dev/vector/data/patterns-newyork-segments/" + "patterns-newyork-segments_part_1/tileset.json", + RasterOverlayOptions{}); + + IntrusivePointer pActivated = pOverlay->activate( + CesiumRasterOverlays::RasterOverlayExternals{ + .pAssetAccessor = pAssetAccessor, + .pPrepareRendererResources = nullptr, + .asyncSystem = asyncSystem, + .pCreditSystem = nullptr, + .pLogger = spdlog::default_logger()}, + CesiumGeospatial::Ellipsoid::WGS84); + + pActivated->getReadyEvent().waitInMainThread(); + + REQUIRE(pActivated->getTileProvider() != nullptr); + CesiumGeospatial::GeographicProjection projection(CesiumGeospatial::Ellipsoid::WGS84); + const CesiumGeometry::Rectangle tileRectangle = projection.project(tileGlobeRectangle); + + IntrusivePointer pTile = + pActivated->getTile(tileRectangle, imageSize); + pActivated->loadTile(*pTile); + while (pTile->getState() != CesiumRasterOverlays::RasterOverlayTile::LoadState::Loaded) { + asyncSystem.dispatchMainThreadTasks(); + pActivated->tick(); + } + + REQUIRE(pTile->getImage()->width > 1); +} \ No newline at end of file diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h index 7807aefe2c..b077fd5a6c 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h @@ -259,6 +259,8 @@ class CESIUMRASTEROVERLAYS_API ActivatedRasterOverlay */ bool loadTileThrottled(RasterOverlayTile& tile); + void tick(); + private: CesiumAsync::Future doLoad(RasterOverlayTile& tile, bool isThrottledLoad); @@ -299,6 +301,7 @@ class CESIUMRASTEROVERLAYS_API ActivatedRasterOverlay CesiumAsync::Promise _readyPromise; CesiumAsync::SharedFuture _readyEvent; + bool _isTickable = false; }; } // namespace CesiumRasterOverlays diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h index e9154acb97..e73c32b473 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h @@ -263,6 +263,10 @@ class CESIUMRASTEROVERLAYS_API RasterOverlayTileProvider virtual void addCredits(CesiumUtility::CreditReferencer& creditReferencer) noexcept; + virtual bool isTickable() { return false; } + + virtual void tick() {} + protected: /** * @brief Loads an image from a URL and optionally some request headers. diff --git a/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp b/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp index 4ef111cf30..3abf7c7819 100644 --- a/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp @@ -78,6 +78,10 @@ void ActivatedRasterOverlay::setTileProvider( bool hadValue = this->_pTileProvider != nullptr; this->_pTileProvider = pTileProvider; + if(this->_pTileProvider != nullptr) { + this->_isTickable = this->_pTileProvider->isTickable(); + } + if (!hadValue && this->_pTileProvider != nullptr) { this->_readyPromise.resolve(); } @@ -343,6 +347,12 @@ void ActivatedRasterOverlay::finalizeTileLoad(bool isThrottledLoad) noexcept { } } +void ActivatedRasterOverlay::tick() { + if (this->_pTileProvider != nullptr && this->_isTickable) { + this->_pTileProvider->tick(); + } +} + RasterOverlayTileLoadResult::RasterOverlayTileLoadResult( const CesiumUtility::IntrusivePointer& pActivated_, const CesiumUtility::IntrusivePointer& pTile_) noexcept diff --git a/vcpkg.json b/vcpkg.json index 03ad1fbde3..0daf6482fa 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -48,7 +48,8 @@ "platform": "!ios&!wasm32" }, "spz", - "zlib" + "zlib", + "concurrentqueue" ] } From 5f06efd0a57f443f10915c236b45a2e7bf669a58 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 1 May 2026 10:51:35 -0400 Subject: [PATCH 03/21] It works... I think --- .../src/VectorTilesRasterOverlay.cpp | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index da998bebdc..dd2e481ffe 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -75,6 +75,7 @@ class VectorTilesLoadRequester : public TileLoadRequester { const Tile* getNextTileToLoadInMainThread() override { return nullptr; } +public: VectorTilesLoadRequester( std::shared_ptr pSharedTileSelectionState) : _weight(1.0), @@ -97,6 +98,7 @@ class VectorTilesRasterOverlayTileProvider final std::shared_ptr _pSharedTileSelectionState = std::make_shared(); + VectorTilesLoadRequester _loadRequester{_pSharedTileSelectionState}; private: struct LoadTileImageInformation { @@ -122,10 +124,11 @@ class VectorTilesRasterOverlayTileProvider final std::move(requestedTileIds)}; CesiumAsync::Future future = request.promise.getFuture(); - this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + // TODO: fix mutex + //this->_pSharedTileSelectionState->loadRequestsMutex.lock(); this->_pSharedTileSelectionState->loadRequests.emplace_back( std::move(request)); - this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + //this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); return future; } @@ -142,12 +145,12 @@ class VectorTilesRasterOverlayTileProvider final } void visit(Tile& tile, LoadTileImageInformation& loadInfo) { - if (tile.isRenderContent() && meetsSse(tile, loadInfo)) { - if (tile.getState() < TileLoadState::ContentLoaded) { - loadInfo.tileLoadTasks.emplace_back( - &tile, - TileLoadPriorityGroup::Normal); - } + if(tile.getState() < TileLoadState::ContentLoaded) { + loadInfo.tileLoadTasks.emplace_back(&tile, TileLoadPriorityGroup::Normal); + return; + } + + if (tile.isRenderContent() && (meetsSse(tile, loadInfo) || tile.getChildren().empty())) { loadInfo.tilesToRender.emplace_back(&tile); } else { for (Tile& child : tile.getChildren()) { @@ -270,6 +273,7 @@ class VectorTilesRasterOverlayTileProvider final this->_pTilesetContentManager = TilesetContentManager::createFromUrl(externals, TilesetOptions{}, url); + this->_pTilesetContentManager->registerTileRequester(this->_loadRequester); } virtual CesiumAsync::Future @@ -312,10 +316,15 @@ class VectorTilesRasterOverlayTileProvider final this->_options); // Check and resolve load requests if possible. - this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + //this->_pSharedTileSelectionState->loadRequestsMutex.lock(); for (const std::pair, uint64_t>& pair : this->_pSharedTileSelectionState->tilesWaitingForWorker) { - if (pair.first->getState() < TileLoadState::ContentLoaded) { + TileLoadState state = pair.first->getState(); + if(state == TileLoadState::FailedTemporarily) { + this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( + {TileLoadTask{pair.first.get(), TileLoadPriorityGroup::Urgent, 1.0}, + pair.second}); + } else if (state < TileLoadState::ContentLoaded) { continue; } @@ -329,6 +338,16 @@ class VectorTilesRasterOverlayTileProvider final } } + // Erase restarted waiting tiles. + this->_pSharedTileSelectionState->tilesWaitingForWorker.erase( + std::remove_if( + this->_pSharedTileSelectionState->tilesWaitingForWorker.begin(), + this->_pSharedTileSelectionState->tilesWaitingForWorker.end(), + [](const std::pair, uint64_t>& pair) { + return pair.first->getState() == TileLoadState::FailedTemporarily; + }), + this->_pSharedTileSelectionState->tilesWaitingForWorker.end()); + // Erase completed load requests. this->_pSharedTileSelectionState->loadRequests.erase( std::remove_if( @@ -338,7 +357,7 @@ class VectorTilesRasterOverlayTileProvider final return request.requestedTileIds.empty(); }), this->_pSharedTileSelectionState->loadRequests.end()); - this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + //this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); // Erase tiles waiting for worker that are done. this->_pSharedTileSelectionState->tilesWaitingForWorker.erase( From 4a94e9ee2ad7d93dc81a9d3b8c74b4ba1f2e4c45 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 6 May 2026 11:47:02 -0400 Subject: [PATCH 04/21] It's rasterizing something! --- .../VectorTilesRasterOverlay.h | 3 + .../src/VectorTilesRasterOverlay.cpp | 325 +++++++++++++++--- .../test/TestVectorTilesRasterOverlay.cpp | 4 + CesiumVectorData/CMakeLists.txt | 1 + .../CesiumVectorData/VectorRasterizer.h | 11 + CesiumVectorData/src/VectorRasterizer.cpp | 39 ++- 6 files changed, 336 insertions(+), 47 deletions(-) diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h index f8f7cde00d..c9603e2e54 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h @@ -1,3 +1,4 @@ +#include "CesiumVectorData/VectorStyle.h" #include #include @@ -25,6 +26,7 @@ class CESIUMRASTEROVERLAYS_API VectorTilesRasterOverlay final VectorTilesRasterOverlay( const std::string& name, const std::string& url, // todo: accept factory instead of url + const CesiumVectorData::VectorStyle& defaultStyle = {}, const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions = {}); virtual ~VectorTilesRasterOverlay() override = default; @@ -35,5 +37,6 @@ class CESIUMRASTEROVERLAYS_API VectorTilesRasterOverlay final private: std::string _url; + CesiumVectorData::VectorStyle _defaultStyle; }; } // namespace Cesium3DTilesSelection \ No newline at end of file diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index dd2e481ffe..d07c9cb43a 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -1,3 +1,12 @@ +#include "Cesium3DTilesSelection/IPrepareRendererResources.h" +#include "Cesium3DTilesSelection/TileLoadResult.h" +#include "CesiumGeospatial/Cartographic.h" +#include "CesiumGltf/AccessorView.h" +#include "CesiumGltf/MeshPrimitive.h" +#include "CesiumGltfContent/GltfUtilities.h" +#include "CesiumUtility/ErrorList.h" +#include "CesiumVectorData/VectorRasterizer.h" +#include "CesiumVectorData/VectorStyle.h" #include "TilesetContentManager.h" #include @@ -18,6 +27,7 @@ #include #include +#include #include #include @@ -29,6 +39,92 @@ using namespace CesiumUtility; namespace Cesium3DTilesSelection { namespace { +struct VectorRenderContent { + CesiumVectorData::VectorStyle style; + + std::vector points; + std::vector> polylines; + std::vector>> + polygons; +}; + +CesiumUtility::Result vectorizeModel( + CesiumGltf::Model& model, + const CesiumGeospatial::Ellipsoid& ellipsoid, + const glm::dmat4x4& gltfTransform, + const CesiumVectorData::VectorStyle& defaultStyle) { + + glm::dmat4x4 rootTransform = + CesiumGltfContent::GltfUtilities::applyRtcCenter(model, gltfTransform); + rootTransform = CesiumGltfContent::GltfUtilities::applyGltfUpAxisTransform( + model, + rootTransform); + + CesiumUtility::ErrorList errors; + + VectorRenderContent* content = new VectorRenderContent(); + content->style = defaultStyle; + + model.forEachPrimitiveInScene( + -1, + [content, rootTransform, &errors, &ellipsoid]( + const CesiumGltf::Model& model, + const CesiumGltf::Node& /*node*/, + const CesiumGltf::Mesh& /*mesh*/, + CesiumGltf::MeshPrimitive& primitive, + const glm::dmat4& nodeTransform) mutable { + const CesiumGltf::AccessorView positionView( + model, + primitive.attributes.at("POSITION")); + if (positionView.status() != CesiumGltf::AccessorViewStatus::Valid) { + errors.emplaceError( + "Cannot create valid position accessor for primitive."); + return; + } + + if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::POINTS) { + for (int64_t i = 0; i < positionView.size(); i++) { + const glm::vec3 position = positionView[i]; + const glm::dvec4 transformedPosition = + rootTransform * nodeTransform * glm::dvec4(position, 1.0); + content->points.emplace_back( + ellipsoid + .cartesianToCartographic(glm::dvec3(transformedPosition)) + .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0})); + } + return; + } + + if (primitive.mode >= CesiumGltf::MeshPrimitive::Mode::LINES && + primitive.mode <= CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { + if (primitive.mode != CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { + errors.emplaceWarning(fmt::format( + "Line primitives should have the LINE_STRIP (mode 3) mode, " + "found line with mode {}.", + primitive.mode)); + return; + } + std::vector polyline; + for (int64_t i = 0; i < positionView.size(); i++) { + const glm::vec3 position = positionView[i]; + const glm::dvec4 transformedPosition = + rootTransform * nodeTransform * glm::dvec4(position, 1.0); + polyline.emplace_back( + ellipsoid + .cartesianToCartographic(glm::dvec3(transformedPosition)) + .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0})); + } + content->polylines.emplace_back(std::move(polyline)); + } + + if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::TRIANGLES) { + // TODO: figure out what's going on with that polygon extension + } + }); + + return {content, errors}; +} + struct LoadRequest { CesiumAsync::Promise promise; std::set requestedTileIds; @@ -86,6 +182,105 @@ class VectorTilesLoadRequester : public TileLoadRequester { std::shared_ptr _pSharedTileSelectionState; }; +class VectorTilesPrepareRendererResources : public IPrepareRendererResources { +public: + virtual CesiumAsync::Future + prepareInLoadThread( + const CesiumAsync::AsyncSystem& asyncSystem, + TileLoadResult&& tileLoadResult, + const glm::dmat4& transform, + const std::any& /*rendererOptions*/) override { + CesiumGltf::Model* pModel = + std::get_if(&tileLoadResult.contentKind); + if (pModel == nullptr) { + return asyncSystem.createResolvedFuture( + TileLoadResultAndRenderResources{std::move(tileLoadResult), nullptr}); + } + + Result vectorizationResult = vectorizeModel( + *pModel, + tileLoadResult.ellipsoid, + transform, + this->defaultStyle); + if (vectorizationResult.errors.hasErrors()) { + if (vectorizationResult.value) { + delete *vectorizationResult.value; + } + + vectorizationResult.errors.log( + this->pLogger, + "Errors when vectorizing model:"); + return asyncSystem.createResolvedFuture( + TileLoadResultAndRenderResources{std::move(tileLoadResult), nullptr}); + } + + return asyncSystem.createResolvedFuture(TileLoadResultAndRenderResources{ + std::move(tileLoadResult), + vectorizationResult.value ? *vectorizationResult.value : nullptr}); + } + + void* prepareInMainThread(Tile& /*tile*/, void* pLoadThreadResult) override { + // No main thread preparation for vector tiles. + return pLoadThreadResult; + } + + void free( + Tile& /*tile*/, + void* pLoadThreadResult, + void* pMainThreadResult) noexcept override { + if (pLoadThreadResult != nullptr) { + VectorRenderContent* pContent = + static_cast(pLoadThreadResult); + delete pContent; + } + + if (pMainThreadResult != nullptr) { + VectorRenderContent* pContent = + static_cast(pMainThreadResult); + delete pContent; + } + } + + void attachRasterInMainThread( + const Tile& /*tile*/, + int32_t /*overlayTextureCoordinateID*/, + const CesiumRasterOverlays::RasterOverlayTile& /*rasterTile*/, + void* /*pMainThreadRendererResources*/, + const glm::dvec2& /*translation*/, + const glm::dvec2& /*scale*/) override {} + + void detachRasterInMainThread( + const Tile& /*tile*/, + int32_t /*overlayTextureCoordinateID*/, + const CesiumRasterOverlays::RasterOverlayTile& /*rasterTile*/, + void* /*pMainThreadRendererResources*/) noexcept override {} + + virtual void* prepareRasterInLoadThread( + CesiumGltf::ImageAsset& /*image*/, + const std::any& /*rendererOptions*/) override { + return nullptr; + } + + virtual void* prepareRasterInMainThread( + RasterOverlayTile& /*rasterTile*/, + void* /*pLoadThreadResult*/) override { + return nullptr; + } + + virtual void freeRaster( + const RasterOverlayTile& /*rasterTile*/, + void* /*pLoadThreadResult*/, + void* /*pMainThreadResult*/) noexcept override {} + + VectorTilesPrepareRendererResources( + std::shared_ptr pLogger, + CesiumVectorData::VectorStyle defaultStyle) + : defaultStyle(std::move(defaultStyle)), pLogger(std::move(pLogger)) {} + + CesiumVectorData::VectorStyle defaultStyle; + std::shared_ptr pLogger; +}; + class VectorTilesRasterOverlayTileProvider final : public RasterOverlayTileProvider { private: @@ -99,6 +294,8 @@ class VectorTilesRasterOverlayTileProvider final std::shared_ptr _pSharedTileSelectionState = std::make_shared(); VectorTilesLoadRequester _loadRequester{_pSharedTileSelectionState}; + std::shared_ptr + _pPrepareRendererResources; private: struct LoadTileImageInformation { @@ -125,10 +322,10 @@ class VectorTilesRasterOverlayTileProvider final CesiumAsync::Future future = request.promise.getFuture(); // TODO: fix mutex - //this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + // this->_pSharedTileSelectionState->loadRequestsMutex.lock(); this->_pSharedTileSelectionState->loadRequests.emplace_back( std::move(request)); - //this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + // this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); return future; } @@ -145,12 +342,13 @@ class VectorTilesRasterOverlayTileProvider final } void visit(Tile& tile, LoadTileImageInformation& loadInfo) { - if(tile.getState() < TileLoadState::ContentLoaded) { + if (tile.getState() < TileLoadState::ContentLoaded) { loadInfo.tileLoadTasks.emplace_back(&tile, TileLoadPriorityGroup::Normal); return; } - if (tile.isRenderContent() && (meetsSse(tile, loadInfo) || tile.getChildren().empty())) { + if (tile.isRenderContent() && + (meetsSse(tile, loadInfo) || tile.getChildren().empty())) { loadInfo.tilesToRender.emplace_back(&tile); } else { for (Tile& child : tile.getChildren()) { @@ -209,48 +407,78 @@ class VectorTilesRasterOverlayTileProvider final const CesiumGeospatial::GlobeRectangle& tileRectangle, const glm::ivec2& textureSize) { return this->findAndLoadTiles(tileRectangle, textureSize) - .thenInWorkerThread( - [textureSize, rectangle](LoadTileImageInformation&& loadInfo) { - // part 4 - rasterizing the tile - LoadedRasterOverlayImage result; - if (loadInfo.tilesToRender.empty()) { - // No tiles to render, so return an empty image. - result.rectangle = rectangle; - result.moreDetailAvailable = false; - result.pImage.emplace(); - result.pImage->width = 1; - result.pImage->height = 1; - result.pImage->channels = 4; - result.pImage->bytesPerChannel = 1; - result.pImage->pixelData = { - std::byte{0x00}, - std::byte{0x00}, - std::byte{0x00}, - std::byte{0x00}}; - } else { - result.moreDetailAvailable = true; - result.pImage.emplace(); - result.pImage->width = textureSize.x; - result.pImage->height = textureSize.y; - result.pImage->channels = 4; - result.pImage->bytesPerChannel = 1; - result.pImage->pixelData.resize( - (size_t)(result.pImage->width * result.pImage->height * - result.pImage->channels * - result.pImage->bytesPerChannel), - std::byte{0}); - // TODO: rasterize here + .thenInWorkerThread([textureSize, + rectangle, + tileRectangle, + ellipsoid = this->_options.ellipsoid]( + LoadTileImageInformation&& loadInfo) { + // part 4 - rasterizing the tile + LoadedRasterOverlayImage result; + if (loadInfo.tilesToRender.empty()) { + // No tiles to render, so return an empty image. + result.rectangle = rectangle; + result.moreDetailAvailable = false; + result.pImage.emplace(); + result.pImage->width = 1; + result.pImage->height = 1; + result.pImage->channels = 4; + result.pImage->bytesPerChannel = 1; + result.pImage->pixelData = { + std::byte{0x00}, + std::byte{0x00}, + std::byte{0x00}, + std::byte{0x00}}; + } else { + result.moreDetailAvailable = true; + result.pImage.emplace(); + result.pImage->width = textureSize.x; + result.pImage->height = textureSize.y; + result.pImage->channels = 4; + result.pImage->bytesPerChannel = 1; + result.pImage->pixelData.resize( + (size_t)(result.pImage->width * result.pImage->height * + result.pImage->channels * + result.pImage->bytesPerChannel), + std::byte{0}); + CesiumVectorData::VectorRasterizer rasterizer( + tileRectangle, + result.pImage, + 0, + ellipsoid); + + for (const Tile::ConstPointer& pTile : loadInfo.tilesToRender) { + const TileRenderContent* pRenderContent = + pTile->getContent().getRenderContent(); + if (pRenderContent == nullptr) { + continue; + } + + const VectorRenderContent* pVectorContent = + static_cast( + pRenderContent->getRenderResources()); + if (pVectorContent == nullptr) { + continue; } - return result; - }); + for (const std::vector& polyline : + pVectorContent->polylines) { + rasterizer.drawPolyline(polyline, pVectorContent->style.line); + } + } + + rasterizer.finalize(); + } + + return result; + }); } public: VectorTilesRasterOverlayTileProvider( const IntrusivePointer& pCreator, const CreateRasterOverlayTileProviderParameters& parameters, - const std::string& url) + const std::string& url, + const CesiumVectorData::VectorStyle& defaultStyle) : RasterOverlayTileProvider( pCreator, parameters, @@ -260,10 +488,13 @@ class VectorTilesRasterOverlayTileProvider final CesiumGeospatial::GeographicProjection( CesiumGeospatial::Ellipsoid::WGS84), CesiumGeospatial::GlobeRectangle::MAXIMUM)), - _options() { + _options(), + _pPrepareRendererResources( + std::make_shared( + parameters.externals.pLogger, defaultStyle)) { const TilesetExternals externals{ parameters.externals.pAssetAccessor, - nullptr, + this->_pPrepareRendererResources, parameters.externals.asyncSystem, parameters.externals.pCreditSystem, parameters.externals.pLogger, @@ -314,13 +545,15 @@ class VectorTilesRasterOverlayTileProvider final virtual void tick() override { this->_pTilesetContentManager->processWorkerThreadLoadRequests( this->_options); + this->_pTilesetContentManager->processMainThreadLoadRequests( + this->_options); // Check and resolve load requests if possible. - //this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + // this->_pSharedTileSelectionState->loadRequestsMutex.lock(); for (const std::pair, uint64_t>& pair : this->_pSharedTileSelectionState->tilesWaitingForWorker) { TileLoadState state = pair.first->getState(); - if(state == TileLoadState::FailedTemporarily) { + if (state == TileLoadState::FailedTemporarily) { this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( {TileLoadTask{pair.first.get(), TileLoadPriorityGroup::Urgent, 1.0}, pair.second}); @@ -357,7 +590,7 @@ class VectorTilesRasterOverlayTileProvider final return request.requestedTileIds.empty(); }), this->_pSharedTileSelectionState->loadRequests.end()); - //this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + // this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); // Erase tiles waiting for worker that are done. this->_pSharedTileSelectionState->tilesWaitingForWorker.erase( @@ -377,8 +610,9 @@ class VectorTilesRasterOverlayTileProvider final VectorTilesRasterOverlay::VectorTilesRasterOverlay( const std::string& name, const std::string& url, + const CesiumVectorData::VectorStyle& defaultStyle, const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions) - : CesiumRasterOverlays::RasterOverlay(name, overlayOptions), _url(url) {} + : CesiumRasterOverlays::RasterOverlay(name, overlayOptions), _url(url), _defaultStyle(defaultStyle) {} CesiumAsync::Future VectorTilesRasterOverlay::createTileProvider( @@ -391,7 +625,8 @@ VectorTilesRasterOverlay::createTileProvider( new VectorTilesRasterOverlayTileProvider( thiz, parameters, - this->_url))); + this->_url, + this->_defaultStyle))); } } // namespace Cesium3DTilesSelection \ No newline at end of file diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp index 4c5fa0ebb1..fd11a711f7 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -6,11 +6,13 @@ #include "CesiumGeospatial/GlobeRectangle.h" #include "CesiumNativeTests/FileAccessor.h" #include "CesiumNativeTests/SimpleTaskProcessor.h" +#include "CesiumNativeTests/writeTga.h" #include "CesiumRasterOverlays/ActivatedRasterOverlay.h" #include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" #include "CesiumRasterOverlays/RasterOverlayExternals.h" #include "CesiumRasterOverlays/RasterOverlayTile.h" #include "CesiumUtility/IntrusivePointer.h" +#include "CesiumVectorData/VectorStyle.h" #include #include @@ -45,6 +47,7 @@ TEST_CASE("Test VectorTilesRasterOverlay") { "overlay0", "file:////mnt/d/Dev/vector/data/patterns-newyork-segments/" "patterns-newyork-segments_part_1/tileset.json", + CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, RasterOverlayOptions{}); IntrusivePointer pActivated = pOverlay->activate( @@ -71,4 +74,5 @@ TEST_CASE("Test VectorTilesRasterOverlay") { } REQUIRE(pTile->getImage()->width > 1); + CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), "vector-tile-test.tga"); } \ No newline at end of file diff --git a/CesiumVectorData/CMakeLists.txt b/CesiumVectorData/CMakeLists.txt index f7733760ad..2ccb424991 100644 --- a/CesiumVectorData/CMakeLists.txt +++ b/CesiumVectorData/CMakeLists.txt @@ -55,6 +55,7 @@ target_link_libraries(CesiumVectorData CesiumGeospatial CesiumAsync CesiumGltf + CesiumGltfContent PRIVATE blend2d::blend2d ${CESIUM_VECTOR_DATA_ASMJIT_DEPENDENCY} diff --git a/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h b/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h index 6163db7bfd..095e89b0bf 100644 --- a/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h +++ b/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h @@ -5,8 +5,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -78,6 +80,15 @@ class VectorRasterizer { void drawPolyline(const std::vector& points, const LineStyle& style); + /** + * @brief Draws a polyline (a set of multiple line segments) to the canvas. + * + * @param points The set of points making up the polyline. + * @param style The \ref LineStyle to use when drawing the polyline. + */ + void + drawPolyline(const std::vector& points, const LineStyle& style); + /** * @brief Rasterizes a `GeoJsonObject` to the canvas. * diff --git a/CesiumVectorData/src/VectorRasterizer.cpp b/CesiumVectorData/src/VectorRasterizer.cpp index 130f4eab4b..dd211c6b1f 100644 --- a/CesiumVectorData/src/VectorRasterizer.cpp +++ b/CesiumVectorData/src/VectorRasterizer.cpp @@ -1,3 +1,10 @@ +#include "CesiumGltf/AccessorView.h" +#include "CesiumGltf/Mesh.h" +#include "CesiumGltf/MeshPrimitive.h" +#include "CesiumGltf/Node.h" +#include "CesiumGltfContent/GltfUtilities.h" +#include "CesiumUtility/ExtensibleObject.h" + #include #include #include @@ -19,6 +26,7 @@ #include #include #include +#include #include #include @@ -220,6 +228,33 @@ void VectorRasterizer::drawPolyline( BLRgba32(style.getColor(seedForObject(points, 31)).toRgba32())); } +void VectorRasterizer::drawPolyline( + const std::vector& points, + const LineStyle& style) { + if (this->_finalized) { + return; + } + + std::vector vertices; + vertices.reserve(points.size()); + + for (const CesiumGeospatial::Cartographic& vertex : points) { + BLPoint point = radiansToPoint( + vertex.longitude, + vertex.latitude, + this->_bounds, + this->_context); + vertices.emplace_back(point); + } + + setStrokeWidth(this->_context, style, this->_ellipsoid, this->_bounds); + + this->_context.strokePolyline( + vertices.data(), + vertices.size(), + BLRgba32(style.getColor(seedForObject(points, 31)).toRgba32())); +} + void VectorRasterizer::drawGeoJsonObject( const GeoJsonObject& geoJsonObject, const VectorStyle& style) { @@ -275,8 +310,8 @@ VectorRasterizer::finalize() { // We need to swap the channels to fix the values. // Blend2D provides BLPixelConverter for these sorts of operations, which // should be faster because it has SIMD support. But the current - // implementation seems to perform well as-is, likely thanks to the compiler's - // vectorization. + // implementation seems to perform well as-is, likely thanks to the + // compiler's vectorization. std::byte* pData = this->_mipLevel == 0 ? this->_imageAsset->pixelData.data() From 997680e19808ab9614a4672df44febbc72ea08e1 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 6 May 2026 12:13:00 -0400 Subject: [PATCH 05/21] Primitive restart support --- .../src/VectorTilesRasterOverlay.cpp | 45 ++++++++++++++----- .../include/CesiumGltf/AccessorUtility.h | 38 ++++++++++++++++ 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index d07c9cb43a..3e6e6538a2 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -1,6 +1,7 @@ #include "Cesium3DTilesSelection/IPrepareRendererResources.h" #include "Cesium3DTilesSelection/TileLoadResult.h" #include "CesiumGeospatial/Cartographic.h" +#include "CesiumGltf/AccessorUtility.h" #include "CesiumGltf/AccessorView.h" #include "CesiumGltf/MeshPrimitive.h" #include "CesiumGltfContent/GltfUtilities.h" @@ -76,6 +77,10 @@ CesiumUtility::Result vectorizeModel( const CesiumGltf::AccessorView positionView( model, primitive.attributes.at("POSITION")); + const CesiumGltf::IndexAccessorType indicesView = CesiumGltf::getIndexAccessorView(model, primitive); + const int64_t numIndices = std::visit(CesiumGltf::NumIndicesFromAccessor{}, indicesView); + const int64_t maxIndex = std::visit(CesiumGltf::MaxIndexValueFromAccessor{}, indicesView); + if (positionView.status() != CesiumGltf::AccessorViewStatus::Valid) { errors.emplaceError( "Cannot create valid position accessor for primitive."); @@ -95,18 +100,33 @@ CesiumUtility::Result vectorizeModel( return; } - if (primitive.mode >= CesiumGltf::MeshPrimitive::Mode::LINES && - primitive.mode <= CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { - if (primitive.mode != CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { - errors.emplaceWarning(fmt::format( - "Line primitives should have the LINE_STRIP (mode 3) mode, " - "found line with mode {}.", - primitive.mode)); + if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { + if(numIndices < 2) { + errors.emplaceError("Primitive mode LINE_STRIP requires at least two indices."); return; } + std::vector polyline; - for (int64_t i = 0; i < positionView.size(); i++) { - const glm::vec3 position = positionView[i]; + for (int64_t i = 0; i < numIndices; i++) { + const int64_t idx = std::visit(CesiumGltf::IndexFromAccessor{i}, indicesView); + if(idx == maxIndex) { + // Primitive restart. + if(polyline.size() >= 2) { + content->polylines.emplace_back(std::move(polyline)); + polyline.clear(); + } else { + errors.emplaceError("Primitive restart index encountered but current polyline has less than 2 points."); + } + + continue; + } + + if(idx < 0 || idx >= positionView.size()) { + errors.emplaceError(fmt::format("Index {} out of bounds for position accessor size {}", idx, positionView.size())); + return; + } + + const glm::vec3 position = positionView[idx]; const glm::dvec4 transformedPosition = rootTransform * nodeTransform * glm::dvec4(position, 1.0); polyline.emplace_back( @@ -114,7 +134,12 @@ CesiumUtility::Result vectorizeModel( .cartesianToCartographic(glm::dvec3(transformedPosition)) .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0})); } - content->polylines.emplace_back(std::move(polyline)); + + if(polyline.size() >= 2) { + content->polylines.emplace_back(std::move(polyline)); + } else if(polyline.size() == 1) { + errors.emplaceWarning("LINE_STRIP primitive ended with a single point unassigned to a line."); + } } if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::TRIANGLES) { diff --git a/CesiumGltf/include/CesiumGltf/AccessorUtility.h b/CesiumGltf/include/CesiumGltf/AccessorUtility.h index 3cc23a96cc..e8ea544798 100644 --- a/CesiumGltf/include/CesiumGltf/AccessorUtility.h +++ b/CesiumGltf/include/CesiumGltf/AccessorUtility.h @@ -154,6 +154,44 @@ typedef std::variant< IndexAccessorType getIndexAccessorView(const Model& model, const MeshPrimitive& primitive); +/** + * Visitor that returns the number of indices contained in an IndexAccessorType + * variant. + */ +struct NumIndicesFromAccessor { + /** + * @brief Attempts to obtain a number of indices from an empty + * IndexAccessorType, resulting in 0. + */ + int64_t operator()(std::monostate) { return 0; } + + /** + * @brief Attempts to obtain a number of indices from an \ref AccessorView. + */ + template int64_t operator()(const AccessorView& value) { + return value.size(); + } +}; + +/** + * @brief Returns the maximum possible index value for the given + * IndexAccessorType. + */ +struct MaxIndexValueFromAccessor { + /** + * @brief Attempts to obtain a maximum index value from an empty + * IndexAccessorType, resulting in -1. + */ + int64_t operator()(std::monostate) { return -1; } + + /** + * @brief Attempts to obtain a maximum index value from an \ref AccessorView. + */ + template int64_t operator()(const AccessorView& /*value*/) { + return static_cast(std::numeric_limits::max()); + } +}; + /** * Visitor that retrieves the vertex indices from the given accessor type * corresponding to a given face index. These indices are returned as an array From c22f0b92ad151e28765c6369e66e5a4eb31e6e35 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 6 May 2026 13:58:02 -0400 Subject: [PATCH 06/21] Fix mutex, add tick --- Cesium3DTilesSelection/src/Tileset.cpp | 6 + .../src/VectorTilesRasterOverlay.cpp | 125 ++++++++++-------- 2 files changed, 75 insertions(+), 56 deletions(-) diff --git a/Cesium3DTilesSelection/src/Tileset.cpp b/Cesium3DTilesSelection/src/Tileset.cpp index 4afc47a0f4..5b3d9cac83 100644 --- a/Cesium3DTilesSelection/src/Tileset.cpp +++ b/Cesium3DTilesSelection/src/Tileset.cpp @@ -1,3 +1,4 @@ +#include "CesiumRasterOverlays/ActivatedRasterOverlay.h" #include "TilesetContentManager.h" #include "TilesetHeightQuery.h" @@ -472,6 +473,11 @@ void Tileset::loadTiles() { this->_pTilesetContentManager->processWorkerThreadLoadRequests( this->_options); this->_pTilesetContentManager->processMainThreadLoadRequests(this->_options); + for (const IntrusivePointer& pOverlay : + this->_pTilesetContentManager->getRasterOverlayCollection() + .getActivatedOverlays()) { + pOverlay->tick(); + } } void Tileset::registerLoadRequester(TileLoadRequester& requester) { diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 3e6e6538a2..c6d95344cf 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -77,9 +77,12 @@ CesiumUtility::Result vectorizeModel( const CesiumGltf::AccessorView positionView( model, primitive.attributes.at("POSITION")); - const CesiumGltf::IndexAccessorType indicesView = CesiumGltf::getIndexAccessorView(model, primitive); - const int64_t numIndices = std::visit(CesiumGltf::NumIndicesFromAccessor{}, indicesView); - const int64_t maxIndex = std::visit(CesiumGltf::MaxIndexValueFromAccessor{}, indicesView); + const CesiumGltf::IndexAccessorType indicesView = + CesiumGltf::getIndexAccessorView(model, primitive); + const int64_t numIndices = + std::visit(CesiumGltf::NumIndicesFromAccessor{}, indicesView); + const int64_t maxIndex = + std::visit(CesiumGltf::MaxIndexValueFromAccessor{}, indicesView); if (positionView.status() != CesiumGltf::AccessorViewStatus::Valid) { errors.emplaceError( @@ -101,28 +104,34 @@ CesiumUtility::Result vectorizeModel( } if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { - if(numIndices < 2) { - errors.emplaceError("Primitive mode LINE_STRIP requires at least two indices."); + if (numIndices < 2) { + errors.emplaceError( + "Primitive mode LINE_STRIP requires at least two indices."); return; } std::vector polyline; for (int64_t i = 0; i < numIndices; i++) { - const int64_t idx = std::visit(CesiumGltf::IndexFromAccessor{i}, indicesView); - if(idx == maxIndex) { + const int64_t idx = + std::visit(CesiumGltf::IndexFromAccessor{i}, indicesView); + if (idx == maxIndex) { // Primitive restart. - if(polyline.size() >= 2) { + if (polyline.size() >= 2) { content->polylines.emplace_back(std::move(polyline)); polyline.clear(); } else { - errors.emplaceError("Primitive restart index encountered but current polyline has less than 2 points."); + errors.emplaceError("Primitive restart index encountered but " + "current polyline has less than 2 points."); } continue; } - if(idx < 0 || idx >= positionView.size()) { - errors.emplaceError(fmt::format("Index {} out of bounds for position accessor size {}", idx, positionView.size())); + if (idx < 0 || idx >= positionView.size()) { + errors.emplaceError(fmt::format( + "Index {} out of bounds for position accessor size {}", + idx, + positionView.size())); return; } @@ -135,10 +144,11 @@ CesiumUtility::Result vectorizeModel( .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0})); } - if(polyline.size() >= 2) { + if (polyline.size() >= 2) { content->polylines.emplace_back(std::move(polyline)); - } else if(polyline.size() == 1) { - errors.emplaceWarning("LINE_STRIP primitive ended with a single point unassigned to a line."); + } else if (polyline.size() == 1) { + errors.emplaceWarning("LINE_STRIP primitive ended with a single " + "point unassigned to a line."); } } @@ -346,11 +356,9 @@ class VectorTilesRasterOverlayTileProvider final std::move(requestedTileIds)}; CesiumAsync::Future future = request.promise.getFuture(); - // TODO: fix mutex - // this->_pSharedTileSelectionState->loadRequestsMutex.lock(); + std::scoped_lock lock(this->_pSharedTileSelectionState->loadRequestsMutex); this->_pSharedTileSelectionState->loadRequests.emplace_back( std::move(request)); - // this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); return future; } @@ -516,7 +524,8 @@ class VectorTilesRasterOverlayTileProvider final _options(), _pPrepareRendererResources( std::make_shared( - parameters.externals.pLogger, defaultStyle)) { + parameters.externals.pLogger, + defaultStyle)) { const TilesetExternals externals{ parameters.externals.pAssetAccessor, this->_pPrepareRendererResources, @@ -574,48 +583,49 @@ class VectorTilesRasterOverlayTileProvider final this->_options); // Check and resolve load requests if possible. - // this->_pSharedTileSelectionState->loadRequestsMutex.lock(); - for (const std::pair, uint64_t>& pair : - this->_pSharedTileSelectionState->tilesWaitingForWorker) { - TileLoadState state = pair.first->getState(); - if (state == TileLoadState::FailedTemporarily) { - this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( - {TileLoadTask{pair.first.get(), TileLoadPriorityGroup::Urgent, 1.0}, - pair.second}); - } else if (state < TileLoadState::ContentLoaded) { - continue; - } + std::vector> promisesToResolve; + { + std::scoped_lock lock( + this->_pSharedTileSelectionState->loadRequestsMutex); + for (const std::pair, uint64_t>& pair : + this->_pSharedTileSelectionState->tilesWaitingForWorker) { + TileLoadState state = pair.first->getState(); + if (state == TileLoadState::FailedTemporarily) { + this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( + {TileLoadTask{ + pair.first.get(), + TileLoadPriorityGroup::Urgent, + 1.0}, + pair.second}); + } else if (state < TileLoadState::ContentLoaded) { + continue; + } - for (LoadRequest& request : - this->_pSharedTileSelectionState->loadRequests) { - if (request.requestedTileIds.erase(pair.second) > 0) { - if (request.requestedTileIds.empty()) { - request.promise.resolve(); + for (LoadRequest& request : + this->_pSharedTileSelectionState->loadRequests) { + if (request.requestedTileIds.erase(pair.second) > 0) { + if (request.requestedTileIds.empty()) { + // Keep list of promises to resolve until after we've unlocked the mutex. + promisesToResolve.emplace_back(std::move(request.promise)); + } } } } - } - // Erase restarted waiting tiles. - this->_pSharedTileSelectionState->tilesWaitingForWorker.erase( - std::remove_if( - this->_pSharedTileSelectionState->tilesWaitingForWorker.begin(), - this->_pSharedTileSelectionState->tilesWaitingForWorker.end(), - [](const std::pair, uint64_t>& pair) { - return pair.first->getState() == TileLoadState::FailedTemporarily; - }), - this->_pSharedTileSelectionState->tilesWaitingForWorker.end()); + // Erase completed load requests. + this->_pSharedTileSelectionState->loadRequests.erase( + std::remove_if( + this->_pSharedTileSelectionState->loadRequests.begin(), + this->_pSharedTileSelectionState->loadRequests.end(), + [](const LoadRequest& request) { + return request.requestedTileIds.empty(); + }), + this->_pSharedTileSelectionState->loadRequests.end()); + } - // Erase completed load requests. - this->_pSharedTileSelectionState->loadRequests.erase( - std::remove_if( - this->_pSharedTileSelectionState->loadRequests.begin(), - this->_pSharedTileSelectionState->loadRequests.end(), - [](const LoadRequest& request) { - return request.requestedTileIds.empty(); - }), - this->_pSharedTileSelectionState->loadRequests.end()); - // this->_pSharedTileSelectionState->loadRequestsMutex.unlock(); + for(CesiumAsync::Promise& promise : promisesToResolve) { + promise.resolve(); + } // Erase tiles waiting for worker that are done. this->_pSharedTileSelectionState->tilesWaitingForWorker.erase( @@ -623,7 +633,8 @@ class VectorTilesRasterOverlayTileProvider final this->_pSharedTileSelectionState->tilesWaitingForWorker.begin(), this->_pSharedTileSelectionState->tilesWaitingForWorker.end(), [](const std::pair, uint64_t>& pair) { - return pair.first->getState() >= TileLoadState::ContentLoaded; + return pair.first->getState() >= TileLoadState::ContentLoaded || + pair.first->getState() == TileLoadState::FailedTemporarily; }), this->_pSharedTileSelectionState->tilesWaitingForWorker.end()); } @@ -637,7 +648,9 @@ VectorTilesRasterOverlay::VectorTilesRasterOverlay( const std::string& url, const CesiumVectorData::VectorStyle& defaultStyle, const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions) - : CesiumRasterOverlays::RasterOverlay(name, overlayOptions), _url(url), _defaultStyle(defaultStyle) {} + : CesiumRasterOverlays::RasterOverlay(name, overlayOptions), + _url(url), + _defaultStyle(defaultStyle) {} CesiumAsync::Future VectorTilesRasterOverlay::createTileProvider( From 7be22627ee7c266b67d1eb15b0fd17f1dd0ce75d Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 8 May 2026 11:23:58 -0400 Subject: [PATCH 07/21] Formatting --- .../VectorTilesRasterOverlay.h | 1 + .../src/VectorTilesRasterOverlay.cpp | 16 ++- .../test/TestVectorTilesRasterOverlay.cpp | 63 ++++++----- .../src/ActivatedRasterOverlay.cpp | 4 +- .../CesiumVectorData/VectorRasterizer.h | 25 ++++- .../include/CesiumVectorData/VectorStyle.h | 20 ++++ CesiumVectorData/src/VectorRasterizer.cpp | 100 +++++++++++++++++- 7 files changed, 195 insertions(+), 34 deletions(-) diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h index c9603e2e54..20add6f95a 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h @@ -1,4 +1,5 @@ #include "CesiumVectorData/VectorStyle.h" + #include #include diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index c6d95344cf..7a0cb5b79e 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -356,7 +356,8 @@ class VectorTilesRasterOverlayTileProvider final std::move(requestedTileIds)}; CesiumAsync::Future future = request.promise.getFuture(); - std::scoped_lock lock(this->_pSharedTileSelectionState->loadRequestsMutex); + std::scoped_lock lock( + this->_pSharedTileSelectionState->loadRequestsMutex); this->_pSharedTileSelectionState->loadRequests.emplace_back( std::move(request)); @@ -426,7 +427,7 @@ class VectorTilesRasterOverlayTileProvider final // external content and now we need to check their children. return this ->addLoadRequest(this->getAsyncSystem(), loadInfo.tileLoadTasks) - .thenImmediately([this, tileRectangle, textureSize]() mutable { + .thenInWorkerThread([this, tileRectangle, textureSize]() mutable { return this->findAndLoadTiles(tileRectangle, textureSize); }); } @@ -497,6 +498,12 @@ class VectorTilesRasterOverlayTileProvider final pVectorContent->polylines) { rasterizer.drawPolyline(polyline, pVectorContent->style.line); } + + if (!pVectorContent->points.empty()) { + rasterizer.drawPoints( + pVectorContent->points, + pVectorContent->style.point); + } } rasterizer.finalize(); @@ -605,7 +612,8 @@ class VectorTilesRasterOverlayTileProvider final this->_pSharedTileSelectionState->loadRequests) { if (request.requestedTileIds.erase(pair.second) > 0) { if (request.requestedTileIds.empty()) { - // Keep list of promises to resolve until after we've unlocked the mutex. + // Keep list of promises to resolve until after we've unlocked the + // mutex. promisesToResolve.emplace_back(std::move(request.promise)); } } @@ -623,7 +631,7 @@ class VectorTilesRasterOverlayTileProvider final this->_pSharedTileSelectionState->loadRequests.end()); } - for(CesiumAsync::Promise& promise : promisesToResolve) { + for (CesiumAsync::Promise& promise : promisesToResolve) { promise.resolve(); } diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp index fd11a711f7..936d0adf58 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -13,6 +13,7 @@ #include "CesiumRasterOverlays/RasterOverlayTile.h" #include "CesiumUtility/IntrusivePointer.h" #include "CesiumVectorData/VectorStyle.h" + #include #include @@ -25,18 +26,26 @@ using CesiumUtility::IntrusivePointer; TEST_CASE("Test VectorTilesRasterOverlay") { const glm::dvec2 imageSize(256, 256); - - const CesiumGeospatial::BoundingRegion& tileRegion = Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( - CesiumGeospatial::BoundingRegion{ - CesiumGeospatial::GlobeRectangle{-3.141592653589793, -1.5707963267948966, 0.0, 1.5707963267948966}, - 0, - 0.005, - CesiumGeospatial::Ellipsoid::WGS84}, - CesiumGeometry::QuadtreeTileID(10, 582, 752), - CesiumGeospatial::Ellipsoid::WGS84); - const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = tileRegion.getRectangle(); - std::shared_ptr pAssetAccessor = std::make_shared(CesiumNativeTests::FileAccessor{}); + const CesiumGeospatial::BoundingRegion& tileRegion = + Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( + CesiumGeospatial::BoundingRegion{ + CesiumGeospatial::GlobeRectangle{ + -3.141592653589793, + -1.5707963267948966, + 0.0, + 1.5707963267948966}, + 0, + 0.005, + CesiumGeospatial::Ellipsoid::WGS84}, + CesiumGeometry::QuadtreeTileID(10, 582, 752), + CesiumGeospatial::Ellipsoid::WGS84); + const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = + tileRegion.getRectangle(); + + std::shared_ptr pAssetAccessor = + std::make_shared( + CesiumNativeTests::FileAccessor{}); AsyncSystem asyncSystem{ std::make_shared()}; @@ -50,29 +59,35 @@ TEST_CASE("Test VectorTilesRasterOverlay") { CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, RasterOverlayOptions{}); - IntrusivePointer pActivated = pOverlay->activate( - CesiumRasterOverlays::RasterOverlayExternals{ - .pAssetAccessor = pAssetAccessor, - .pPrepareRendererResources = nullptr, - .asyncSystem = asyncSystem, - .pCreditSystem = nullptr, - .pLogger = spdlog::default_logger()}, - CesiumGeospatial::Ellipsoid::WGS84); + IntrusivePointer pActivated = + pOverlay->activate( + CesiumRasterOverlays::RasterOverlayExternals{ + .pAssetAccessor = pAssetAccessor, + .pPrepareRendererResources = nullptr, + .asyncSystem = asyncSystem, + .pCreditSystem = nullptr, + .pLogger = spdlog::default_logger()}, + CesiumGeospatial::Ellipsoid::WGS84); pActivated->getReadyEvent().waitInMainThread(); REQUIRE(pActivated->getTileProvider() != nullptr); - CesiumGeospatial::GeographicProjection projection(CesiumGeospatial::Ellipsoid::WGS84); - const CesiumGeometry::Rectangle tileRectangle = projection.project(tileGlobeRectangle); + CesiumGeospatial::GeographicProjection projection( + CesiumGeospatial::Ellipsoid::WGS84); + const CesiumGeometry::Rectangle tileRectangle = + projection.project(tileGlobeRectangle); IntrusivePointer pTile = pActivated->getTile(tileRectangle, imageSize); pActivated->loadTile(*pTile); - while (pTile->getState() != CesiumRasterOverlays::RasterOverlayTile::LoadState::Loaded) { + while (pTile->getState() != + CesiumRasterOverlays::RasterOverlayTile::LoadState::Loaded) { asyncSystem.dispatchMainThreadTasks(); pActivated->tick(); } - + REQUIRE(pTile->getImage()->width > 1); - CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), "vector-tile-test.tga"); + CesiumNativeTests::writeImageToTgaFile( + *pTile->getImage(), + "vector-tile-test.tga"); } \ No newline at end of file diff --git a/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp b/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp index 3abf7c7819..ec34f63c98 100644 --- a/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp @@ -78,10 +78,10 @@ void ActivatedRasterOverlay::setTileProvider( bool hadValue = this->_pTileProvider != nullptr; this->_pTileProvider = pTileProvider; - if(this->_pTileProvider != nullptr) { + if (this->_pTileProvider != nullptr) { this->_isTickable = this->_pTileProvider->isTickable(); } - + if (!hadValue && this->_pTileProvider != nullptr) { this->_readyPromise.resolve(); } diff --git a/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h b/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h index 095e89b0bf..f5195e31ff 100644 --- a/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h +++ b/CesiumVectorData/include/CesiumVectorData/VectorRasterizer.h @@ -3,9 +3,9 @@ #include "VectorStyle.h" #include +#include #include #include -#include #include #include #include @@ -86,8 +86,29 @@ class VectorRasterizer { * @param points The set of points making up the polyline. * @param style The \ref LineStyle to use when drawing the polyline. */ + void drawPolyline( + const std::vector& points, + const LineStyle& style); + + /** + * @brief Draws a set of points to the canvas. + * + * @param points The set of points to draw. The coordinates should be + * specified in degrees. + * @param style The \ref PointStyle to use when drawing the points. + */ void - drawPolyline(const std::vector& points, const LineStyle& style); + drawPoints(const std::vector& points, const PointStyle& style); + + /** + * @brief Draws a set of points to the canvas. + * + * @param points The set of points to draw. + * @param style The \ref PointStyle to use when drawing the points. + */ + void drawPoints( + const std::vector& points, + const PointStyle& style); /** * @brief Rasterizes a `GeoJsonObject` to the canvas. diff --git a/CesiumVectorData/include/CesiumVectorData/VectorStyle.h b/CesiumVectorData/include/CesiumVectorData/VectorStyle.h index 93f2edc876..71fc659fef 100644 --- a/CesiumVectorData/include/CesiumVectorData/VectorStyle.h +++ b/CesiumVectorData/include/CesiumVectorData/VectorStyle.h @@ -94,6 +94,22 @@ struct PolygonStyle { std::optional outline; }; +/** @brief The style used to draw a point. */ +struct PointStyle { + /** @brief The radius of the point in pixels. */ + double radius = 1.0; + /** + * @brief The color used to fill this point. If `std::nullopt`, the point + * will not be filled. + */ + std::optional fill; + /** + * @brief The style used to outline this point. If `std::nullopt`, the + * point will not be outlined. + */ + std::optional outline; +}; + /** * @brief Style information to use when drawing vector data. */ @@ -106,6 +122,10 @@ struct VectorStyle { * @brief The style to use when drawing polygons. */ PolygonStyle polygon; + /** + * @brief The style to use when drawing points. + */ + PointStyle point; /** * @brief Default constructor for VectorStyle. diff --git a/CesiumVectorData/src/VectorRasterizer.cpp b/CesiumVectorData/src/VectorRasterizer.cpp index dd211c6b1f..eee2f33a5b 100644 --- a/CesiumVectorData/src/VectorRasterizer.cpp +++ b/CesiumVectorData/src/VectorRasterizer.cpp @@ -255,6 +255,98 @@ void VectorRasterizer::drawPolyline( BLRgba32(style.getColor(seedForObject(points, 31)).toRgba32())); } +namespace { +void drawPointsImpl( + BLContext& context, + const CesiumGeospatial::Ellipsoid& ellipsoid, + const GlobeRectangle& bounds, + const std::vector& vertices, + const std::vector& seeds, + const PointStyle& style) { + if (style.fill) { + for (size_t i = 0; i < vertices.size(); i++) { + context.fillCircle( + BLCircle(vertices[i].x, vertices[i].y, style.radius), + BLRgba32(style.fill->getColor(seeds[i]).toRgba32())); + } + } + + if (style.outline) { + setStrokeWidth(context, *style.outline, ellipsoid, bounds); + + for (size_t i = 0; i < vertices.size(); i++) { + context.strokeCircle( + BLCircle(vertices[i].x, vertices[i].y, style.radius), + BLRgba32(style.outline->getColor(seeds[i] ^ 31).toRgba32())); + } + } +} +} // namespace + +void VectorRasterizer::drawPoints( + const std::vector& points, + const PointStyle& style) { + if (this->_finalized) { + return; + } + + std::vector vertices; + vertices.reserve(points.size()); + + std::vector seeds; + seeds.reserve(points.size()); + + for (const glm::dvec3& vertex : points) { + BLPoint point = radiansToPoint( + CesiumUtility::Math::degreesToRadians(vertex.x), + CesiumUtility::Math::degreesToRadians(vertex.y), + this->_bounds, + this->_context); + vertices.emplace_back(point); + seeds.emplace_back(seedForObject(vertex, 17)); + } + + drawPointsImpl( + this->_context, + this->_ellipsoid, + this->_bounds, + vertices, + seeds, + style); +} + +void VectorRasterizer::drawPoints( + const std::vector& points, + const PointStyle& style) { + if (this->_finalized) { + return; + } + + std::vector vertices; + vertices.reserve(points.size()); + + std::vector seeds; + seeds.reserve(points.size()); + + for (const CesiumGeospatial::Cartographic& vertex : points) { + BLPoint point = radiansToPoint( + vertex.longitude, + vertex.latitude, + this->_bounds, + this->_context); + vertices.emplace_back(point); + seeds.emplace_back(seedForObject(vertex, 17)); + } + + drawPointsImpl( + this->_context, + this->_ellipsoid, + this->_bounds, + vertices, + seeds, + style); +} + void VectorRasterizer::drawGeoJsonObject( const GeoJsonObject& geoJsonObject, const VectorStyle& style) { @@ -278,8 +370,12 @@ void VectorRasterizer::drawGeoJsonObject( rasterizer.drawPolygon(polygon, style.polygon); } } - void operator()(const GeoJsonPoint& /*catchAll*/) {} - void operator()(const GeoJsonMultiPoint& /*catchAll*/) {} + void operator()(const GeoJsonPoint& point) { + rasterizer.drawPoints({point.coordinates}, style.point); + } + void operator()(const GeoJsonMultiPoint& points) { + rasterizer.drawPoints(points.coordinates, style.point); + } void operator()(const GeoJsonFeature& /*catchAll*/) {} void operator()(const GeoJsonFeatureCollection& /*catchAll*/) {} void operator()(const GeoJsonGeometryCollection& /*catchAll*/) {} From 99da4ebee11fcbbf2314f5ff161708896f690706 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 8 May 2026 11:32:17 -0400 Subject: [PATCH 08/21] Remove concurrentqueue --- CMakeLists.txt | 3 +- Cesium3DTilesSelection/CMakeLists.txt | 1 - .../src/VectorTilesRasterOverlay.cpp | 35 ++++++++++--------- vcpkg.json | 3 +- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a8733cf9b..f16184f392 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,7 +128,7 @@ set(PACKAGES_PUBLIC asyncplusplus expected-lite fmt glm rapidjson spdlog stb ada set(PACKAGES_PRIVATE abseil draco ktx[core] modp-base64 meshoptimizer openssl s2geometry sqlite3 tinyxml2 libwebp zlib-ng picosha2 - earcut-hpp libmorton zstd spz zlib concurrentqueue + earcut-hpp libmorton zstd spz zlib ) # asmjit needed by blend2d on non-iOS platforms (iOS and Wasm don't support JIT) @@ -394,7 +394,6 @@ find_package(tinyxml2 CONFIG REQUIRED) find_package(unofficial-sqlite3 CONFIG REQUIRED) find_package(WebP CONFIG REQUIRED) find_package(zlib-ng CONFIG REQUIRED) -find_package(concurrentqueue CONFIG REQUIRED) # asmjit should not be included with iOS or Wasm builds as they don't support JIT compilation. if(NOT CESIUM_TARGET_WASM AND NOT IOS AND NOT VCPKG_CMAKE_SYSTEM_NAME MATCHES "iOS") diff --git a/Cesium3DTilesSelection/CMakeLists.txt b/Cesium3DTilesSelection/CMakeLists.txt index 2620f1625c..f710dff595 100644 --- a/Cesium3DTilesSelection/CMakeLists.txt +++ b/Cesium3DTilesSelection/CMakeLists.txt @@ -60,5 +60,4 @@ target_link_libraries(Cesium3DTilesSelection nonstd::expected-lite PRIVATE tinyxml2::tinyxml2 - concurrentqueue::concurrentqueue ) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 7a0cb5b79e..1f53ea0b49 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -27,7 +27,6 @@ #include #include -#include #include #include @@ -166,8 +165,7 @@ struct LoadRequest { }; struct SharedTileSelectionState { - moodycamel::ConcurrentQueue> - workerThreadLoadQueue; + std::vector> workerThreadLoadQueue; // Does not need to be concurrent because it is only accessed by the // TilesetContentManager and the methods calling the TilesetContentManager. std::vector, uint64_t>> @@ -182,21 +180,23 @@ class VectorTilesLoadRequester : public TileLoadRequester { virtual double getWeight() const override { return this->_weight; } virtual bool hasMoreTilesToLoadInWorkerThread() const override { - return this->_pSharedTileSelectionState->workerThreadLoadQueue - .size_approx() > 0; + return !this->_pSharedTileSelectionState->workerThreadLoadQueue.empty(); } const Tile* getNextTileToLoadInWorkerThread() override { - std::pair taskAndId; - if (!this->_pSharedTileSelectionState->workerThreadLoadQueue.try_dequeue( - taskAndId)) { + if (this->_pSharedTileSelectionState->workerThreadLoadQueue.empty()) { return nullptr; } + std::pair& taskAndId = + this->_pSharedTileSelectionState->workerThreadLoadQueue.back(); + this->_pSharedTileSelectionState->tilesWaitingForWorker.emplace_back( taskAndId.first.pTile, taskAndId.second); - return taskAndId.first.pTile; + const Tile::Pointer pTile = taskAndId.first.pTile; + this->_pSharedTileSelectionState->workerThreadLoadQueue.pop_back(); + return pTile; } bool hasMoreTilesToLoadInMainThread() const override { @@ -346,8 +346,9 @@ class VectorTilesRasterOverlayTileProvider final std::set requestedTileIds; for (const TileLoadTask& task : tasks) { uint64_t id = this->_pSharedTileSelectionState->_nextId++; - this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( - {task, id}); + this->_pSharedTileSelectionState->workerThreadLoadQueue.emplace_back( + task, + id); requestedTileIds.insert(id); } @@ -598,12 +599,12 @@ class VectorTilesRasterOverlayTileProvider final this->_pSharedTileSelectionState->tilesWaitingForWorker) { TileLoadState state = pair.first->getState(); if (state == TileLoadState::FailedTemporarily) { - this->_pSharedTileSelectionState->workerThreadLoadQueue.enqueue( - {TileLoadTask{ - pair.first.get(), - TileLoadPriorityGroup::Urgent, - 1.0}, - pair.second}); + this->_pSharedTileSelectionState->workerThreadLoadQueue.emplace_back( + TileLoadTask{ + pair.first.get(), + TileLoadPriorityGroup::Urgent, + 1.0}, + pair.second); } else if (state < TileLoadState::ContentLoaded) { continue; } diff --git a/vcpkg.json b/vcpkg.json index 0daf6482fa..03ad1fbde3 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -48,8 +48,7 @@ "platform": "!ios&!wasm32" }, "spz", - "zlib", - "concurrentqueue" + "zlib" ] } From 9f152d1b7d0ab7b4c08861d20f138f11a8105e6b Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 8 May 2026 12:20:59 -0400 Subject: [PATCH 09/21] Actual test dataset --- .../src/VectorTilesRasterOverlay.cpp | 50 ++++++++---------- .../test/TestVectorTilesRasterOverlay.cpp | 34 ++++++------ .../ViennaStreets/0/subtrees/0/0/0.subtree | Bin 0 -> 376 bytes .../test/data/ViennaStreets/0/tiles/0/0/0.glb | Bin 0 -> 1607532 bytes .../test/data/ViennaStreets/0/tiles/1/0/0.glb | Bin 0 -> 666376 bytes .../test/data/ViennaStreets/0/tiles/1/0/1.glb | Bin 0 -> 960756 bytes .../test/data/ViennaStreets/0/tiles/1/1/0.glb | Bin 0 -> 510352 bytes .../test/data/ViennaStreets/0/tiles/1/1/1.glb | Bin 0 -> 776100 bytes .../test/data/ViennaStreets/rasterized.tga | Bin 0 -> 65554 bytes .../test/data/ViennaStreets/tileset.json | 38 +++++++++++++ 10 files changed, 76 insertions(+), 46 deletions(-) create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/0/subtrees/0/0/0.subtree create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/0/0/0.glb create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/0.glb create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/1.glb create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/0.glb create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/1.glb create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/rasterized.tga create mode 100644 Cesium3DTilesSelection/test/data/ViennaStreets/tileset.json diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 1f53ea0b49..623444b5c7 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -161,19 +161,16 @@ CesiumUtility::Result vectorizeModel( struct LoadRequest { CesiumAsync::Promise promise; - std::set requestedTileIds; + std::set requestedTiles; }; struct SharedTileSelectionState { - std::vector> workerThreadLoadQueue; + std::vector workerThreadLoadQueue; // Does not need to be concurrent because it is only accessed by the // TilesetContentManager and the methods calling the TilesetContentManager. - std::vector, uint64_t>> - tilesWaitingForWorker; + std::vector tilesWaitingForWorker; std::mutex loadRequestsMutex; std::vector loadRequests; - - std::atomic _nextId; }; class VectorTilesLoadRequester : public TileLoadRequester { @@ -188,13 +185,12 @@ class VectorTilesLoadRequester : public TileLoadRequester { return nullptr; } - std::pair& taskAndId = + TileLoadTask& task = this->_pSharedTileSelectionState->workerThreadLoadQueue.back(); this->_pSharedTileSelectionState->tilesWaitingForWorker.emplace_back( - taskAndId.first.pTile, - taskAndId.second); - const Tile::Pointer pTile = taskAndId.first.pTile; + task.pTile); + const Tile::Pointer pTile = task.pTile; this->_pSharedTileSelectionState->workerThreadLoadQueue.pop_back(); return pTile; } @@ -343,18 +339,16 @@ class VectorTilesRasterOverlayTileProvider final CesiumAsync::Future addLoadRequest( const CesiumAsync::AsyncSystem& asyncSystem, const std::vector& tasks) { - std::set requestedTileIds; + std::set requestedTiles; for (const TileLoadTask& task : tasks) { - uint64_t id = this->_pSharedTileSelectionState->_nextId++; this->_pSharedTileSelectionState->workerThreadLoadQueue.emplace_back( - task, - id); - requestedTileIds.insert(id); + task); + requestedTiles.insert(task.pTile); } LoadRequest request{ asyncSystem.createPromise(), - std::move(requestedTileIds)}; + std::move(requestedTiles)}; CesiumAsync::Future future = request.promise.getFuture(); std::scoped_lock lock( @@ -595,24 +589,22 @@ class VectorTilesRasterOverlayTileProvider final { std::scoped_lock lock( this->_pSharedTileSelectionState->loadRequestsMutex); - for (const std::pair, uint64_t>& pair : + for (const Tile::Pointer& pTile : this->_pSharedTileSelectionState->tilesWaitingForWorker) { - TileLoadState state = pair.first->getState(); + TileLoadState state = pTile->getState(); if (state == TileLoadState::FailedTemporarily) { this->_pSharedTileSelectionState->workerThreadLoadQueue.emplace_back( - TileLoadTask{ - pair.first.get(), - TileLoadPriorityGroup::Urgent, - 1.0}, - pair.second); + pTile.get(), + TileLoadPriorityGroup::Urgent, + 1.0); } else if (state < TileLoadState::ContentLoaded) { continue; } for (LoadRequest& request : this->_pSharedTileSelectionState->loadRequests) { - if (request.requestedTileIds.erase(pair.second) > 0) { - if (request.requestedTileIds.empty()) { + if (request.requestedTiles.erase(pTile) > 0) { + if (request.requestedTiles.empty()) { // Keep list of promises to resolve until after we've unlocked the // mutex. promisesToResolve.emplace_back(std::move(request.promise)); @@ -627,7 +619,7 @@ class VectorTilesRasterOverlayTileProvider final this->_pSharedTileSelectionState->loadRequests.begin(), this->_pSharedTileSelectionState->loadRequests.end(), [](const LoadRequest& request) { - return request.requestedTileIds.empty(); + return request.requestedTiles.empty(); }), this->_pSharedTileSelectionState->loadRequests.end()); } @@ -641,9 +633,9 @@ class VectorTilesRasterOverlayTileProvider final std::remove_if( this->_pSharedTileSelectionState->tilesWaitingForWorker.begin(), this->_pSharedTileSelectionState->tilesWaitingForWorker.end(), - [](const std::pair, uint64_t>& pair) { - return pair.first->getState() >= TileLoadState::ContentLoaded || - pair.first->getState() == TileLoadState::FailedTemporarily; + [](const Tile::Pointer& pTile) { + return pTile->getState() >= TileLoadState::ContentLoaded || + pTile->getState() == TileLoadState::FailedTemporarily; }), this->_pSharedTileSelectionState->tilesWaitingForWorker.end()); } diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp index 936d0adf58..1a59bb4964 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -6,6 +6,7 @@ #include "CesiumGeospatial/GlobeRectangle.h" #include "CesiumNativeTests/FileAccessor.h" #include "CesiumNativeTests/SimpleTaskProcessor.h" +#include "CesiumNativeTests/checkFilesEqual.h" #include "CesiumNativeTests/writeTga.h" #include "CesiumRasterOverlays/ActivatedRasterOverlay.h" #include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" @@ -25,23 +26,21 @@ using CesiumRasterOverlays::RasterOverlayOptions; using CesiumUtility::IntrusivePointer; TEST_CASE("Test VectorTilesRasterOverlay") { + const std::filesystem::path dataPath = std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR); + const std::filesystem::path inputPath = dataPath / "ViennaStreets" / "tileset.json"; + const std::filesystem::path referencePath = dataPath / "ViennaStreets" / "rasterized.tga"; + const std::filesystem::path tempOutPath = std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "vector-tile-test.tga"; + const glm::dvec2 imageSize(256, 256); - const CesiumGeospatial::BoundingRegion& tileRegion = - Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( - CesiumGeospatial::BoundingRegion{ - CesiumGeospatial::GlobeRectangle{ - -3.141592653589793, - -1.5707963267948966, - 0.0, - 1.5707963267948966}, - 0, - 0.005, - CesiumGeospatial::Ellipsoid::WGS84}, - CesiumGeometry::QuadtreeTileID(10, 582, 752), - CesiumGeospatial::Ellipsoid::WGS84); + // A rough rectangle around the Albertgarten in Vienna, as an arbitrary + // testing area. const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = - tileRegion.getRectangle(); + CesiumGeospatial::GlobeRectangle{ + 0.2852306824588304, + 0.8414742026919637, + 0.28529452339585826, + 0.8415167430037157}; std::shared_ptr pAssetAccessor = std::make_shared( @@ -54,8 +53,7 @@ TEST_CASE("Test VectorTilesRasterOverlay") { IntrusivePointer pOverlay; pOverlay.emplace( "overlay0", - "file:////mnt/d/Dev/vector/data/patterns-newyork-segments/" - "patterns-newyork-segments_part_1/tileset.json", + "file:///" + inputPath.string(), CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, RasterOverlayOptions{}); @@ -89,5 +87,7 @@ TEST_CASE("Test VectorTilesRasterOverlay") { REQUIRE(pTile->getImage()->width > 1); CesiumNativeTests::writeImageToTgaFile( *pTile->getImage(), - "vector-tile-test.tga"); + tempOutPath); + + CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); } \ No newline at end of file diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/subtrees/0/0/0.subtree b/Cesium3DTilesSelection/test/data/ViennaStreets/0/subtrees/0/0/0.subtree new file mode 100644 index 0000000000000000000000000000000000000000..17fd2398cbbafe3b97100354318e372ed0b371ec GIT binary patch literal 376 zcmb7=PYc2@48`XsarC@{;t=i4yWm0aB7)saU7%K2Gi6A>yXpR^c+ng}%KPQ@wXVu& z6mc~zijHCCdWfvj8cHYRp68li4fafhkjuG0B%QiLxOYTD3prtl;f>Y~XgKz}>C7j+ z^C0$Yx@dRbV7`dZ!0M*Zs05~enU)UsM&I>fBEkC$~ WFH81tq-==neH_Q*_8Wfg|ME}Dcw1lq literal 0 HcmV?d00001 diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/0/0/0.glb b/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/0/0/0.glb new file mode 100644 index 0000000000000000000000000000000000000000..e01c6f5ce19492926a1c4c816aecd6e357357153 GIT binary patch literal 1607532 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ν^@HMJuW~qJ&S2*vOQbD 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Ν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 Au>b%7 literal 0 HcmV?d00001 diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/1.glb b/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/1.glb new file mode 100644 index 0000000000000000000000000000000000000000..396d3fe64d7ee9cbbcb1e5ccc2d8e3f2794bdd7c GIT binary patch literal 960756 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 OEKirl@>q>E;r{^y$(Jht literal 0 HcmV?d00001 diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/0.glb b/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/0.glb new file mode 100644 index 0000000000000000000000000000000000000000..97460b1ef0be066a93a8dbfc64f7e9f9a61faadd GIT binary patch literal 510352 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 z49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C z$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyU zfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih z49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C z$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyU zfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih z49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C z$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyU zfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih z49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C z$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyU zfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih z49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C z$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyU zfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih z49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C$bbyUfDFih49I{C z$bbyUfDFih49I{C$bbyUfDFih49I{C$bbwCUjxBGp4S(=B#$X1N$3)gHe4T4A~d`h z!JF)PmJNwVNs#9_F(uN?y`J^ou6OZFc@?EYc9mmb&SL1fds&O}E zmJ)H7he=2IC3!B-kdE>qdDZwcWrjC;!8_EA;!WZCf>k4|Njl297;+7qWyX;Cj$|&+&#*wak^i2Q0? zOqt6UNElzxswlRq~@OAeb?hl*dsb-{pSNmIsJi9wZ*e!{l2YAs)x0 zKdL2d6v-dTrYTmx^cWnel`9;nc-!JKN2_m+2K{Rr;vL zYLxYc)u|uH8sskv)?~YewFZE->0=;RhkjhvC0#G;QP*XC(*0or+Sg)3$_*RU!N$~a z*@SeIP02HSAcoDz>kS{Iel0eq+_D96!FU z@=@y6;$xIo;}psab3#rfG^9cr2n~&O(nLLjAH!VoEX~AwqJ=t^G;zbnL*@}i$&lyL zO4^bo?vf+j8``KJ$0x|QLef@#XFnwkbuzOol_wotcLd~>hwTBxy3t|`VcsH=aCl@ z5JvGnO*sT1-ua{>1f&h#XDS4Q_26AVeF!3W7m^P_4BlrcgCNBF9O)Val-0t!i1rYK zc%LWT0|Dg*@8Yfmq+PsAD0c{mTf8q&79k*Q@h+v@At3JJT}HV>K-|UqBIO|gp~btL ze20Lz#k+#CIti#}@UE;75E{HMbrKM-hWBOaIRwO`cvn#ef)MX&(p3n^uZ4FFZTm?; zdxLjvCjs%^;9W;s2nGS~disVS#QO?q2x9QQN?8m6c~QI@s2dUx8oVX(1msu4`xI z@$RD?1R>rJNQVT32JeTxBcQ&E_aoXv5QA5u41y|nKc*al5bu7{br4X;;w_~O1TlCI zPzFH{ct4?DNI+N%??LK@1cVmvA@T=-fIfSJ_b~h65D>R`Kc%b(0?Om?9-%D+4&Kkm ziy z6?Gf};s)=@`U$9O@Sf@+6}*=ycL<1Eyq76+2#D9hdxiQCgm`}>U4wwKIJ`g64uTNx&!iy;@%}R_aE9s2uNGJ_b3ku2o2tU;|a)*;=NDZ8U&Q}7Vm%b84?h> za3X^1Il7Z1&k_)KDUmjKEA>p0I<*KWua^>aUA&dqen^tgB_KTzl;~$L@K#~ptB@q$ z5LBT=zQJ3yLXt2_K%Su#;;lwqNDdGI{TNCi-sKOuu5^;mKVJAuA zaRlUBO2l2fjcD(XByI>CO2ngh8`I7qNxT{XWtI~0-r#M*cB+shzc&QbuSJRSDBh-Q zzXnOl3_*kv>7MXDK;MuI2?#AE;&FJJ(FT$c0@8+31n+~?hh!B3@}rcsZU`cjNL#$EX#+`z zfVfMEbbs(Z#5N)%NxKB3t5KrN;BC{DBxys?10~9<;cZKwknAM^^(`gh1~1W_BzaK+ z@+>9d7H>P+M@W+HD*1@-5!Z^a05l1e94y#N+UGp`Qpz(uTmHM7$Q>uJjWjN!leK z?NTCL4R1I48$^=y?Gli-l!&`{yR$D2N#ZU6>3S$pFAnd+^dFKWv;@SXl*o(XjiNmy zLjpoWDa0F1IV58U$a5)?Hh5zOjwF3W3CN35BG2HBt)C=y4M7b`l*QqVV>=E>;w}Mc zLn(qco^~NgLQ6p0r9`?K-URw^ND{9`Kv|R$c|GCn!8RO{#0`N%iMYYrvy&uoOF-PE zM7k%uz32;)F$Cnflt{aH6KPuqN$T{LfHng~iN5-Sw>OV7BuQup97@Cu-aZwQgqDD~ zp%minOC3m7As|0Wi9CxpiT03m2#6a>F?jn?KO{+L35Z82kr&0=pY|b1!YBcGhSCt? z9l$<8(jg$;8%oqScn5ZpBpydVzNJLm;2kt{B-vIy1k`gWk*)_X$zusg681zu9YZOC zH<^AQS%ZMGI7;NZcvI*rLXxy02q_U(!#kMvkPHb34W$U)RO&&}At2rxO4K)ahg2s? znI$0ZQX*~frqKr^9RlKpQUvc%>efM$I(;FaouL%sO=o)%lBDAZ$TyT6yu)bkkRR7jj&>1} zqzyrY5^0NfJnce~gqDD~r9?c6cLMDoS%rXnmlA1e84?g0N)f!1s0T@hfViO) z;+;$#NJa=q*P=wZ!TV@elB5kmNQuzmeT=%03<(GgB?s>m>Oe9iAT*R};LV{8Btrs1 zLn(rHD)k(a#QQ=(yC@~{3|^`_Ny?%Gu literal 0 HcmV?d00001 diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/rasterized.tga b/Cesium3DTilesSelection/test/data/ViennaStreets/rasterized.tga new file mode 100644 index 0000000000000000000000000000000000000000..ec6fcd252ba45f1b7128f33d3563ed757f17f16b GIT binary patch literal 65554 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 Z9bI*wK<`TTUKh^6_I&HFU-t?3{SPOb> Date: Fri, 8 May 2026 12:28:05 -0400 Subject: [PATCH 10/21] Improved (?) tick behavior --- .../RasterOverlayCollection.h | 5 ++++ .../src/RasterOverlayCollection.cpp | 23 ++++++++++++++++++- .../src/VectorTilesRasterOverlay.cpp | 2 +- .../test/TestVectorTilesRasterOverlay.cpp | 16 +++++++------ .../ActivatedRasterOverlay.h | 3 ++- .../RasterOverlayTileProvider.h | 2 +- .../src/ActivatedRasterOverlay.cpp | 9 ++++---- 7 files changed, 45 insertions(+), 15 deletions(-) diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/RasterOverlayCollection.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/RasterOverlayCollection.h index 34d2cef8ba..f7678a05a7 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/RasterOverlayCollection.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/RasterOverlayCollection.h @@ -229,6 +229,8 @@ class CESIUM3DTILESSELECTION_API RasterOverlayCollection final { */ size_t size() const noexcept; + void tick() noexcept; + private: struct GetOverlayFunctor { CesiumUtility::IntrusivePointer @@ -244,6 +246,9 @@ class CESIUM3DTILESSELECTION_API RasterOverlayCollection final { std::vector> _activatedOverlays; + std::vector> + _tickableOverlays; CESIUM_TRACE_DECLARE_TRACK_SET(_loadingSlots, "Raster Overlay Loading Slot") }; diff --git a/Cesium3DTilesSelection/src/RasterOverlayCollection.cpp b/Cesium3DTilesSelection/src/RasterOverlayCollection.cpp index 12626d6c5b..c7e8f22b7e 100644 --- a/Cesium3DTilesSelection/src/RasterOverlayCollection.cpp +++ b/Cesium3DTilesSelection/src/RasterOverlayCollection.cpp @@ -31,7 +31,8 @@ RasterOverlayCollection::RasterOverlayCollection( : _loadedTiles(loadedTiles), _externals{externals}, _ellipsoid(ellipsoid), - _activatedOverlays() {} + _activatedOverlays(), + _tickableOverlays() {} RasterOverlayCollection::~RasterOverlayCollection() noexcept { for (int64_t i = static_cast(this->_activatedOverlays.size()) - 1; @@ -64,6 +65,10 @@ void RasterOverlayCollection::add( .pLogger = this->_externals.pLogger}, this->_ellipsoid)); + if (this->_activatedOverlays.back()->isTickable()) { + this->_tickableOverlays.emplace_back(this->_activatedOverlays.back()); + } + CesiumRasterOverlays::RasterOverlayTile* pPlaceholderTile = this->_activatedOverlays.back()->getPlaceholderTile(); @@ -151,6 +156,16 @@ void RasterOverlayCollection::remove( } this->_activatedOverlays.erase(it); + + it = std::find( + this->_tickableOverlays.begin(), + this->_tickableOverlays.end(), + pActivated); + if (it == this->_tickableOverlays.end()) { + return; + } + + this->_tickableOverlays.erase(it); } std::vector @@ -259,4 +274,10 @@ size_t RasterOverlayCollection::size() const noexcept { return this->_activatedOverlays.size(); } +void RasterOverlayCollection::tick() noexcept { + for (const auto& pOverlay : this->_tickableOverlays) { + pOverlay->tick(); + } +} + } // namespace Cesium3DTilesSelection diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 623444b5c7..ebf353d3b1 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -640,7 +640,7 @@ class VectorTilesRasterOverlayTileProvider final this->_pSharedTileSelectionState->tilesWaitingForWorker.end()); } - virtual bool isTickable() override { return true; } + virtual bool isTickable() const noexcept override { return true; } }; } // namespace diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp index 1a59bb4964..1f79c29929 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -26,10 +26,14 @@ using CesiumRasterOverlays::RasterOverlayOptions; using CesiumUtility::IntrusivePointer; TEST_CASE("Test VectorTilesRasterOverlay") { - const std::filesystem::path dataPath = std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR); - const std::filesystem::path inputPath = dataPath / "ViennaStreets" / "tileset.json"; - const std::filesystem::path referencePath = dataPath / "ViennaStreets" / "rasterized.tga"; - const std::filesystem::path tempOutPath = std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "vector-tile-test.tga"; + const std::filesystem::path dataPath = + std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR); + const std::filesystem::path inputPath = + dataPath / "ViennaStreets" / "tileset.json"; + const std::filesystem::path referencePath = + dataPath / "ViennaStreets" / "rasterized.tga"; + const std::filesystem::path tempOutPath = + std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "vector-tile-test.tga"; const glm::dvec2 imageSize(256, 256); @@ -85,9 +89,7 @@ TEST_CASE("Test VectorTilesRasterOverlay") { } REQUIRE(pTile->getImage()->width > 1); - CesiumNativeTests::writeImageToTgaFile( - *pTile->getImage(), - tempOutPath); + CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), tempOutPath); CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); } \ No newline at end of file diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h index b077fd5a6c..f5b499fa78 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/ActivatedRasterOverlay.h @@ -261,6 +261,8 @@ class CESIUMRASTEROVERLAYS_API ActivatedRasterOverlay void tick(); + bool isTickable() const noexcept; + private: CesiumAsync::Future doLoad(RasterOverlayTile& tile, bool isThrottledLoad); @@ -301,7 +303,6 @@ class CESIUMRASTEROVERLAYS_API ActivatedRasterOverlay CesiumAsync::Promise _readyPromise; CesiumAsync::SharedFuture _readyEvent; - bool _isTickable = false; }; } // namespace CesiumRasterOverlays diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h b/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h index e73c32b473..6c9501804e 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h +++ b/CesiumRasterOverlays/include/CesiumRasterOverlays/RasterOverlayTileProvider.h @@ -263,7 +263,7 @@ class CESIUMRASTEROVERLAYS_API RasterOverlayTileProvider virtual void addCredits(CesiumUtility::CreditReferencer& creditReferencer) noexcept; - virtual bool isTickable() { return false; } + virtual bool isTickable() const noexcept { return false; } virtual void tick() {} diff --git a/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp b/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp index ec34f63c98..94a0b30c09 100644 --- a/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp +++ b/CesiumRasterOverlays/src/ActivatedRasterOverlay.cpp @@ -78,9 +78,6 @@ void ActivatedRasterOverlay::setTileProvider( bool hadValue = this->_pTileProvider != nullptr; this->_pTileProvider = pTileProvider; - if (this->_pTileProvider != nullptr) { - this->_isTickable = this->_pTileProvider->isTickable(); - } if (!hadValue && this->_pTileProvider != nullptr) { this->_readyPromise.resolve(); @@ -348,11 +345,15 @@ void ActivatedRasterOverlay::finalizeTileLoad(bool isThrottledLoad) noexcept { } void ActivatedRasterOverlay::tick() { - if (this->_pTileProvider != nullptr && this->_isTickable) { + if (this->_pTileProvider != nullptr) { this->_pTileProvider->tick(); } } +bool ActivatedRasterOverlay::isTickable() const noexcept { + return this->_pTileProvider != nullptr && this->_pTileProvider->isTickable(); +} + RasterOverlayTileLoadResult::RasterOverlayTileLoadResult( const CesiumUtility::IntrusivePointer& pActivated_, const CesiumUtility::IntrusivePointer& pTile_) noexcept From 537b6086686f1e4fa30ab9d4dcf0f7300848f8cd Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 8 May 2026 14:18:50 -0400 Subject: [PATCH 11/21] Fix I forgot to commit --- Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index ebf353d3b1..527ea6586f 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -443,9 +443,9 @@ class VectorTilesRasterOverlayTileProvider final LoadTileImageInformation&& loadInfo) { // part 4 - rasterizing the tile LoadedRasterOverlayImage result; + result.rectangle = rectangle; if (loadInfo.tilesToRender.empty()) { // No tiles to render, so return an empty image. - result.rectangle = rectangle; result.moreDetailAvailable = false; result.pImage.emplace(); result.pImage->width = 1; From 224f7a52cb33fed5ff58e224831dc4a7e3d2b485 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 8 May 2026 14:33:34 -0400 Subject: [PATCH 12/21] Add additional constructor to VectorStyle --- .../include/CesiumVectorData/VectorStyle.h | 10 +++++++++- CesiumVectorData/src/VectorStyle.cpp | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CesiumVectorData/include/CesiumVectorData/VectorStyle.h b/CesiumVectorData/include/CesiumVectorData/VectorStyle.h index 71fc659fef..5f97c70251 100644 --- a/CesiumVectorData/include/CesiumVectorData/VectorStyle.h +++ b/CesiumVectorData/include/CesiumVectorData/VectorStyle.h @@ -133,10 +133,18 @@ struct VectorStyle { VectorStyle() = default; /** - * @brief Initializes style information for all types. + * @brief Initializes style information for point and polygon types. */ VectorStyle(const LineStyle& lineStyle, const PolygonStyle& polygonStyle); + /** + * @brief Initializes style information for all types. + */ + VectorStyle( + const LineStyle& lineStyle, + const PolygonStyle& polygonStyle, + const PointStyle& pointStyle); + /** * @brief Initializes all styles to the given color. */ diff --git a/CesiumVectorData/src/VectorStyle.cpp b/CesiumVectorData/src/VectorStyle.cpp index 9a85d2b92b..dfe26f8e95 100644 --- a/CesiumVectorData/src/VectorStyle.cpp +++ b/CesiumVectorData/src/VectorStyle.cpp @@ -33,4 +33,9 @@ VectorStyle::VectorStyle( const LineStyle& lineStyle, const PolygonStyle& polygonStyle) : line(lineStyle), polygon(polygonStyle) {} +VectorStyle::VectorStyle( + const LineStyle& lineStyle, + const PolygonStyle& polygonStyle, + const PointStyle& pointStyle) + : line(lineStyle), polygon(polygonStyle), point(pointStyle) {} } // namespace CesiumVectorData \ No newline at end of file From 0e0d06aaa5e93c9063f9a214fa35b2e8737c6800 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 8 May 2026 16:27:11 -0400 Subject: [PATCH 13/21] thenInWorkerThread crashes... not sure why --- Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 527ea6586f..6787a0ecb5 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -422,7 +422,7 @@ class VectorTilesRasterOverlayTileProvider final // external content and now we need to check their children. return this ->addLoadRequest(this->getAsyncSystem(), loadInfo.tileLoadTasks) - .thenInWorkerThread([this, tileRectangle, textureSize]() mutable { + .thenImmediately([this, tileRectangle, textureSize]() mutable { return this->findAndLoadTiles(tileRectangle, textureSize); }); } From 693eecd4e60a3d64e693ce3b1e4284ff8011b2b0 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 12 May 2026 14:44:09 -0400 Subject: [PATCH 14/21] Algorithm for finding edge loops for triangulated polygon. Problem is that the dataset I'm using has a bunch of polygons in one primitive... --- .../src/VectorTilesRasterOverlay.cpp | 178 +++++++++++++++++- .../test/TestVectorTilesRasterOverlay.cpp | 82 ++++++++ .../CesiumGeospatial/CartographicPolygon.h | 11 ++ CesiumGeospatial/src/CartographicPolygon.cpp | 5 + 4 files changed, 268 insertions(+), 8 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 6787a0ecb5..1a23d05e23 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -1,6 +1,7 @@ #include "Cesium3DTilesSelection/IPrepareRendererResources.h" #include "Cesium3DTilesSelection/TileLoadResult.h" #include "CesiumGeospatial/Cartographic.h" +#include "CesiumGeospatial/CartographicPolygon.h" #include "CesiumGltf/AccessorUtility.h" #include "CesiumGltf/AccessorView.h" #include "CesiumGltf/MeshPrimitive.h" @@ -29,6 +30,7 @@ #include +#include #include #include #include @@ -44,10 +46,108 @@ struct VectorRenderContent { std::vector points; std::vector> polylines; - std::vector>> - polygons; + std::vector polygons; }; +/** + * @brief Calculates the rings of a polygon from the triangles of a glTF + * TRIANGLES primitive. This only works if triangles have consistent winding + * order (which they should!). + * + * Consider the following: + * 0 3 + * /----------/ + * / \ / + * / \ / + * / \ / + * / \ / + * /---------\/ + * 1 2 + * + * Following CCW winding order, the triangles would be {0, 1, 2} and {0, 2, 3}. + * We can break this down into edges: (0, 1), (1, 2), (2, 0), (0, 2), (2, 3), + * and (3, 0). We can see that (0, 2) and (2, 0) are interior edges as they are + * shared by two triangles in opposite directions. Eliminating (0, 2) and (2, 0) + * and connecting the edges starting from (0, 1), we get (0, 1, 2, 3, + * 0) as our ring. + * + * This works for polygons with holes, though we have to account for multiple rings. + */ +CesiumUtility::Result>> calculateRingsFromTriangles( + const CesiumGltf::IndexAccessorType& indicesAccessor, + int64_t offset, + int64_t length) { + std::set> edges; + // Build edges from triangles. + for (int64_t i = offset; i < offset + length; i += 3) { + int64_t idx0 = + std::visit(CesiumGltf::IndexFromAccessor{i}, indicesAccessor); + int64_t idx1 = + std::visit(CesiumGltf::IndexFromAccessor{i + 1}, indicesAccessor); + int64_t idx2 = + std::visit(CesiumGltf::IndexFromAccessor{i + 2}, indicesAccessor); + + edges.emplace(idx0, idx1); + edges.emplace(idx1, idx2); + edges.emplace(idx2, idx0); + } + + if(edges.empty()) { + return {ErrorList::error("No edges found in the input triangles.")}; + } + + std::vector> boundaryEdges; + + // Remove edges that are shared by two triangles, leaving only the boundary + // edges. + while (!edges.empty()) { + const std::pair edge = *edges.begin(); + if (edges.contains({edge.second, edge.first})) { + edges.erase(edge); + edges.erase({edge.second, edge.first}); + } else { + boundaryEdges.emplace_back(edge); + edges.erase(edge); + } + } + + if(boundaryEdges.empty()) { + return {ErrorList::error("No boundary edges found in the input triangles.")}; + } + + std::vector> rings; + + while(!boundaryEdges.empty()) { + std::pair edge = boundaryEdges.back(); + boundaryEdges.pop_back(); + + std::vector ring{edge.first, edge.second}; + while (ring.back() != edge.first) { + auto it = std::find_if( + boundaryEdges.begin(), + boundaryEdges.end(), + [&ring](const std::pair& e) { + return e.first == ring.back(); + }); + + if (it == boundaryEdges.end()) { + // This should never happen if the input triangles are valid. + return {ErrorList::error(fmt::format( + "Invalid triangle mesh - cannot find next edge for vertex {} in " + "ring.", + ring.back()))}; + } + + ring.push_back(it->second); + boundaryEdges.erase(it); + } + + rings.push_back(ring); + } + + return {rings}; +} + CesiumUtility::Result vectorizeModel( CesiumGltf::Model& model, const CesiumGeospatial::Ellipsoid& ellipsoid, @@ -100,9 +200,8 @@ CesiumUtility::Result vectorizeModel( .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0})); } return; - } - - if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { + } else if ( + primitive.mode == CesiumGltf::MeshPrimitive::Mode::LINE_STRIP) { if (numIndices < 2) { errors.emplaceError( "Primitive mode LINE_STRIP requires at least two indices."); @@ -149,10 +248,68 @@ CesiumUtility::Result vectorizeModel( errors.emplaceWarning("LINE_STRIP primitive ended with a single " "point unassigned to a line."); } - } + } else if ( + primitive.mode == CesiumGltf::MeshPrimitive::Mode::TRIANGLES) { + if (numIndices < 3) { + errors.emplaceError( + "Primitive mode TRIANGLES requires at least three indices."); + return; + } + + int64_t startIndex = 0; + while(startIndex < numIndices) { + int64_t endIndex = numIndices - 1; + for(int64_t i = startIndex; i < endIndex; i++) { + const int64_t idx = + std::visit(CesiumGltf::IndexFromAccessor{i}, indicesView); + if (idx == maxIndex) { + endIndex = i; + break; + } + } + + if(endIndex == startIndex) { + break; + } - if (primitive.mode == CesiumGltf::MeshPrimitive::Mode::TRIANGLES) { - // TODO: figure out what's going on with that polygon extension + std::vector vertices; + vertices.reserve(static_cast(endIndex - startIndex)); + + std::vector indices; + indices.reserve(static_cast(endIndex - startIndex)); + + CesiumUtility::Result>> ringsResult = + calculateRingsFromTriangles(indicesView, startIndex, endIndex - startIndex); + if (ringsResult.errors.hasErrors()) { + errors.merge(ringsResult.errors); + return; + } + + for(const std::vector& ring : *ringsResult.value) { + for(const int64_t& idx : ring) { + indices.emplace_back(static_cast(idx)); + const glm::vec3 position = positionView[idx]; + const glm::dvec4 transformedPosition = + rootTransform * nodeTransform * glm::dvec4(position, 1.0); + const CesiumGeospatial::Cartographic cartographicPosition = + ellipsoid + .cartesianToCartographic(glm::dvec3(transformedPosition)) + .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); + vertices.emplace_back( + cartographicPosition.longitude, + cartographicPosition.latitude); + } + } + + content->polygons.emplace_back( + std::move(vertices), + std::move(indices)); + } + } else { + errors.emplaceWarning(fmt::format( + "Ignoring primitive with mode {} - only POINTS (0), LINE_STRIP " + "(3), and TRIANGLES (4) are supported.", + primitive.mode)); } }); @@ -489,6 +646,11 @@ class VectorTilesRasterOverlayTileProvider final continue; } + for (const CesiumGeospatial::CartographicPolygon& polygon : + pVectorContent->polygons) { + rasterizer.drawPolygon(polygon, pVectorContent->style.polygon); + } + for (const std::vector& polyline : pVectorContent->polylines) { rasterizer.drawPolyline(polyline, pVectorContent->style.line); diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp index 1f79c29929..4b11e9ae99 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -10,6 +10,7 @@ #include "CesiumNativeTests/writeTga.h" #include "CesiumRasterOverlays/ActivatedRasterOverlay.h" #include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" +#include "CesiumRasterOverlays/RasterOverlay.h" #include "CesiumRasterOverlays/RasterOverlayExternals.h" #include "CesiumRasterOverlays/RasterOverlayTile.h" #include "CesiumUtility/IntrusivePointer.h" @@ -92,4 +93,85 @@ TEST_CASE("Test VectorTilesRasterOverlay") { CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), tempOutPath); CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); +} + +TEST_CASE("Test VectorTilesRasterOverlay polygons") { + /*const std::filesystem::path dataPath = + std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR);*/ + const std::filesystem::path inputPath = "/mnt/d/Dev/vector/data/nyc_poly/tileset.json"; + /*const std::filesystem::path referencePath = + dataPath / "ViennaStreets" / "rasterized.tga";*/ + const std::filesystem::path tempOutPath = + std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "vector-poly-test.tga"; + + const glm::dvec2 imageSize(2048, 2048); + + // A rough rectangle around the Albertgarten in Vienna, as an arbitrary + // testing area. + const CesiumGeospatial::BoundingRegion& tileRegion = + Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( + CesiumGeospatial::BoundingRegion{ + CesiumGeospatial::GlobeRectangle{ + -1.2960028825865837, + 0.7068309334853016, + -1.2863087490444578, + 0.7141023380205147}, + 0, + 0.005, + CesiumGeospatial::Ellipsoid::WGS84}, + CesiumGeometry::QuadtreeTileID(3, 5, 3), + CesiumGeospatial::Ellipsoid::WGS84); + const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = + tileRegion.getRectangle(); + + + std::shared_ptr pAssetAccessor = + std::make_shared( + CesiumNativeTests::FileAccessor{}); + AsyncSystem asyncSystem{ + std::make_shared()}; + + CreateRasterOverlayTileProviderParameters parameters{ + {pAssetAccessor, nullptr, asyncSystem}}; + RasterOverlayOptions options; + options.maximumScreenSpaceError = 1.0; + + IntrusivePointer pOverlay; + pOverlay.emplace( + "overlay0", + "file:///" + inputPath.string(), + CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, + options); + + IntrusivePointer pActivated = + pOverlay->activate( + CesiumRasterOverlays::RasterOverlayExternals{ + .pAssetAccessor = pAssetAccessor, + .pPrepareRendererResources = nullptr, + .asyncSystem = asyncSystem, + .pCreditSystem = nullptr, + .pLogger = spdlog::default_logger()}, + CesiumGeospatial::Ellipsoid::WGS84); + + pActivated->getReadyEvent().waitInMainThread(); + + REQUIRE(pActivated->getTileProvider() != nullptr); + CesiumGeospatial::GeographicProjection projection( + CesiumGeospatial::Ellipsoid::WGS84); + const CesiumGeometry::Rectangle tileRectangle = + projection.project(tileGlobeRectangle); + + IntrusivePointer pTile = + pActivated->getTile(tileRectangle, imageSize); + pActivated->loadTile(*pTile); + while (pTile->getState() != + CesiumRasterOverlays::RasterOverlayTile::LoadState::Loaded) { + asyncSystem.dispatchMainThreadTasks(); + pActivated->tick(); + } + + REQUIRE(pTile->getImage()->width > 1); + CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), tempOutPath); + + //CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); } \ No newline at end of file diff --git a/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h b/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h index 9417162f9d..0c572091f6 100644 --- a/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h +++ b/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h @@ -32,6 +32,17 @@ class CESIUMGEOSPATIAL_API CartographicPolygon final { */ CartographicPolygon(const std::vector& polygon); + /** + * @brief Constructs a 2D polygon that can be rasterized onto {@link Cesium3DTilesSelection::Tileset} + * objects. + * + * @param vertices An array of longitude-latitude points in radians defining + * the perimeter of the 2D polygon. + * @param indices An array of indices representing a triangle decomposition of + * the polygon. The indices are in reference to the `vertices` array. + */ + CartographicPolygon(std::vector&& vertices, std::vector&& indices); + /** * @brief Returns the longitude-latitude vertices that define the * perimeter of the selected polygon. diff --git a/CesiumGeospatial/src/CartographicPolygon.cpp b/CesiumGeospatial/src/CartographicPolygon.cpp index 0e963d0b12..603bc5d321 100644 --- a/CesiumGeospatial/src/CartographicPolygon.cpp +++ b/CesiumGeospatial/src/CartographicPolygon.cpp @@ -122,6 +122,11 @@ CartographicPolygon::CartographicPolygon(const std::vector& polygon) _indices(triangulatePolygon(polygon)), _boundingRectangle(computeBoundingRectangle(polygon)) {} +CartographicPolygon::CartographicPolygon(std::vector&& polygon, std::vector&& indices) + : _vertices(std::move(polygon)), + _indices(std::move(indices)), + _boundingRectangle(computeBoundingRectangle(this->_vertices)) {} + /*static*/ bool CartographicPolygon::rectangleIsWithinPolygons( const CesiumGeospatial::GlobeRectangle& rectangle, const std::vector& cartographicPolygons) noexcept { From 94a0b9e212f2ee0080e659ed00d4db1fe68dd517 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 12 May 2026 15:09:32 -0400 Subject: [PATCH 15/21] More efficient edge algorithm, still no match for this many polygons --- .../src/VectorTilesRasterOverlay.cpp | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 1a23d05e23..856989f676 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -78,6 +78,7 @@ CesiumUtility::Result>> calculateRingsFromTrian int64_t offset, int64_t length) { std::set> edges; + int64_t minIndex = std::numeric_limits::max(); // Build edges from triangles. for (int64_t i = offset; i < offset + length; i += 3) { int64_t idx0 = @@ -90,13 +91,18 @@ CesiumUtility::Result>> calculateRingsFromTrian edges.emplace(idx0, idx1); edges.emplace(idx1, idx2); edges.emplace(idx2, idx0); + minIndex = std::min({minIndex, idx0, idx1, idx2}); } if(edges.empty()) { return {ErrorList::error("No edges found in the input triangles.")}; } - std::vector> boundaryEdges; + // Vector of edge destinations indexed by edge source (after subtracting minIndex to save space). + std::vector boundaryEdges; + boundaryEdges.resize(static_cast(length), 0); + + std::vector edgesAssigned(static_cast(length), true); // Remove edges that are shared by two triangles, leaving only the boundary // edges. @@ -106,40 +112,34 @@ CesiumUtility::Result>> calculateRingsFromTrian edges.erase(edge); edges.erase({edge.second, edge.first}); } else { - boundaryEdges.emplace_back(edge); + boundaryEdges[static_cast(edge.first - minIndex)] = edge.second - minIndex; edges.erase(edge); + // Mark this edge as unassigned so we can use it as a starting point for ring construction later. + edgesAssigned[static_cast(edge.first - minIndex)] = false; } } - if(boundaryEdges.empty()) { - return {ErrorList::error("No boundary edges found in the input triangles.")}; - } - std::vector> rings; while(!boundaryEdges.empty()) { - std::pair edge = boundaryEdges.back(); - boundaryEdges.pop_back(); - - std::vector ring{edge.first, edge.second}; - while (ring.back() != edge.first) { - auto it = std::find_if( - boundaryEdges.begin(), - boundaryEdges.end(), - [&ring](const std::pair& e) { - return e.first == ring.back(); - }); - - if (it == boundaryEdges.end()) { - // This should never happen if the input triangles are valid. - return {ErrorList::error(fmt::format( - "Invalid triangle mesh - cannot find next edge for vertex {} in " - "ring.", - ring.back()))}; + int64_t edgeSrcIndex = -1; + for(int64_t i = 0; i < length; i++) { + if(!edgesAssigned[static_cast(i)]) { + edgeSrcIndex = i; + break; } + } + + if(edgeSrcIndex == -1) { + break; + } + + edgesAssigned[static_cast(edgeSrcIndex)] = true; - ring.push_back(it->second); - boundaryEdges.erase(it); + std::vector ring{edgeSrcIndex + minIndex, boundaryEdges[static_cast(edgeSrcIndex)] + minIndex}; + while (ring.back() != edgeSrcIndex + minIndex) { + ring.push_back(boundaryEdges[static_cast(ring.back() - minIndex)] + minIndex); + edgesAssigned[static_cast(ring.back() - minIndex)] = true; } rings.push_back(ring); @@ -304,6 +304,7 @@ CesiumUtility::Result vectorizeModel( content->polygons.emplace_back( std::move(vertices), std::move(indices)); + startIndex = endIndex; } } else { errors.emplaceWarning(fmt::format( From 8e70bfbcaf0817822a89a5c582ba721ccf8d48bd Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 12 May 2026 15:45:58 -0400 Subject: [PATCH 16/21] Generate EXT_mesh_polygon --- .../src/VectorTilesRasterOverlay.cpp | 56 +++++--- .../test/TestVectorTilesRasterOverlay.cpp | 18 +-- .../CesiumGeospatial/CartographicPolygon.h | 4 +- CesiumGeospatial/src/CartographicPolygon.cpp | 4 +- .../CesiumGltf/ExtensionExtMeshPolygon.h | 63 +++++++++ .../ExtensionKhrGaussianSplatting.h | 24 ++-- .../ExtensionExtMeshPolygonReader.h | 76 +++++++++++ .../src/ExtensionExtMeshPolygonJsonHandler.h | 50 +++++++ .../generated/src/GeneratedJsonHandlers.cpp | 129 ++++++++++++++++++ .../src/registerReaderExtensions.cpp | 4 + .../generated/src/ModelJsonWriter.cpp | 36 +++++ .../generated/src/ModelJsonWriter.h | 14 ++ .../src/registerWriterExtensions.cpp | 4 + tools/generate-classes/glTF.json | 10 ++ 14 files changed, 444 insertions(+), 48 deletions(-) create mode 100644 CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h create mode 100644 CesiumGltfReader/generated/include/CesiumGltfReader/ExtensionExtMeshPolygonReader.h create mode 100644 CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 856989f676..8ecd47f197 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -71,9 +71,11 @@ struct VectorRenderContent { * and connecting the edges starting from (0, 1), we get (0, 1, 2, 3, * 0) as our ring. * - * This works for polygons with holes, though we have to account for multiple rings. + * This works for polygons with holes, though we have to account for multiple + * rings. */ -CesiumUtility::Result>> calculateRingsFromTriangles( +CesiumUtility::Result>> +calculateRingsFromTriangles( const CesiumGltf::IndexAccessorType& indicesAccessor, int64_t offset, int64_t length) { @@ -94,11 +96,12 @@ CesiumUtility::Result>> calculateRingsFromTrian minIndex = std::min({minIndex, idx0, idx1, idx2}); } - if(edges.empty()) { + if (edges.empty()) { return {ErrorList::error("No edges found in the input triangles.")}; } - // Vector of edge destinations indexed by edge source (after subtracting minIndex to save space). + // Vector of edge destinations indexed by edge source (after subtracting + // minIndex to save space). std::vector boundaryEdges; boundaryEdges.resize(static_cast(length), 0); @@ -112,33 +115,39 @@ CesiumUtility::Result>> calculateRingsFromTrian edges.erase(edge); edges.erase({edge.second, edge.first}); } else { - boundaryEdges[static_cast(edge.first - minIndex)] = edge.second - minIndex; + boundaryEdges[static_cast(edge.first - minIndex)] = + edge.second - minIndex; edges.erase(edge); - // Mark this edge as unassigned so we can use it as a starting point for ring construction later. + // Mark this edge as unassigned so we can use it as a starting point for + // ring construction later. edgesAssigned[static_cast(edge.first - minIndex)] = false; } } std::vector> rings; - while(!boundaryEdges.empty()) { + while (!boundaryEdges.empty()) { int64_t edgeSrcIndex = -1; - for(int64_t i = 0; i < length; i++) { - if(!edgesAssigned[static_cast(i)]) { + for (int64_t i = 0; i < length; i++) { + if (!edgesAssigned[static_cast(i)]) { edgeSrcIndex = i; break; } } - if(edgeSrcIndex == -1) { + if (edgeSrcIndex == -1) { break; } edgesAssigned[static_cast(edgeSrcIndex)] = true; - std::vector ring{edgeSrcIndex + minIndex, boundaryEdges[static_cast(edgeSrcIndex)] + minIndex}; + std::vector ring{ + edgeSrcIndex + minIndex, + boundaryEdges[static_cast(edgeSrcIndex)] + minIndex}; while (ring.back() != edgeSrcIndex + minIndex) { - ring.push_back(boundaryEdges[static_cast(ring.back() - minIndex)] + minIndex); + ring.push_back( + boundaryEdges[static_cast(ring.back() - minIndex)] + + minIndex); edgesAssigned[static_cast(ring.back() - minIndex)] = true; } @@ -257,9 +266,9 @@ CesiumUtility::Result vectorizeModel( } int64_t startIndex = 0; - while(startIndex < numIndices) { + while (startIndex < numIndices) { int64_t endIndex = numIndices - 1; - for(int64_t i = startIndex; i < endIndex; i++) { + for (int64_t i = startIndex; i < endIndex; i++) { const int64_t idx = std::visit(CesiumGltf::IndexFromAccessor{i}, indicesView); if (idx == maxIndex) { @@ -268,7 +277,7 @@ CesiumUtility::Result vectorizeModel( } } - if(endIndex == startIndex) { + if (endIndex == startIndex) { break; } @@ -278,23 +287,28 @@ CesiumUtility::Result vectorizeModel( std::vector indices; indices.reserve(static_cast(endIndex - startIndex)); - CesiumUtility::Result>> ringsResult = - calculateRingsFromTriangles(indicesView, startIndex, endIndex - startIndex); + CesiumUtility::Result>> + ringsResult = calculateRingsFromTriangles( + indicesView, + startIndex, + endIndex - startIndex); if (ringsResult.errors.hasErrors()) { errors.merge(ringsResult.errors); return; } - for(const std::vector& ring : *ringsResult.value) { - for(const int64_t& idx : ring) { + for (const std::vector& ring : *ringsResult.value) { + for (const int64_t& idx : ring) { indices.emplace_back(static_cast(idx)); const glm::vec3 position = positionView[idx]; const glm::dvec4 transformedPosition = rootTransform * nodeTransform * glm::dvec4(position, 1.0); const CesiumGeospatial::Cartographic cartographicPosition = ellipsoid - .cartesianToCartographic(glm::dvec3(transformedPosition)) - .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); + .cartesianToCartographic( + glm::dvec3(transformedPosition)) + .value_or( + CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); vertices.emplace_back( cartographicPosition.longitude, cartographicPosition.latitude); diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp index 4b11e9ae99..e6e89252df 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp @@ -98,7 +98,8 @@ TEST_CASE("Test VectorTilesRasterOverlay") { TEST_CASE("Test VectorTilesRasterOverlay polygons") { /*const std::filesystem::path dataPath = std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR);*/ - const std::filesystem::path inputPath = "/mnt/d/Dev/vector/data/nyc_poly/tileset.json"; + const std::filesystem::path inputPath = + "/mnt/d/Dev/vector/data/nyc_poly/tileset.json"; /*const std::filesystem::path referencePath = dataPath / "ViennaStreets" / "rasterized.tga";*/ const std::filesystem::path tempOutPath = @@ -108,13 +109,13 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { // A rough rectangle around the Albertgarten in Vienna, as an arbitrary // testing area. - const CesiumGeospatial::BoundingRegion& tileRegion = + const CesiumGeospatial::BoundingRegion& tileRegion = Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( CesiumGeospatial::BoundingRegion{ CesiumGeospatial::GlobeRectangle{ -1.2960028825865837, - 0.7068309334853016, - -1.2863087490444578, + 0.7068309334853016, + -1.2863087490444578, 0.7141023380205147}, 0, 0.005, @@ -124,7 +125,6 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = tileRegion.getRectangle(); - std::shared_ptr pAssetAccessor = std::make_shared( CesiumNativeTests::FileAccessor{}); @@ -133,9 +133,9 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { CreateRasterOverlayTileProviderParameters parameters{ {pAssetAccessor, nullptr, asyncSystem}}; - RasterOverlayOptions options; - options.maximumScreenSpaceError = 1.0; - + RasterOverlayOptions options; + options.maximumScreenSpaceError = 1.0; + IntrusivePointer pOverlay; pOverlay.emplace( "overlay0", @@ -173,5 +173,5 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { REQUIRE(pTile->getImage()->width > 1); CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), tempOutPath); - //CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); + // CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); } \ No newline at end of file diff --git a/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h b/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h index 0c572091f6..39785b1a9d 100644 --- a/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h +++ b/CesiumGeospatial/include/CesiumGeospatial/CartographicPolygon.h @@ -41,7 +41,9 @@ class CESIUMGEOSPATIAL_API CartographicPolygon final { * @param indices An array of indices representing a triangle decomposition of * the polygon. The indices are in reference to the `vertices` array. */ - CartographicPolygon(std::vector&& vertices, std::vector&& indices); + CartographicPolygon( + std::vector&& vertices, + std::vector&& indices); /** * @brief Returns the longitude-latitude vertices that define the diff --git a/CesiumGeospatial/src/CartographicPolygon.cpp b/CesiumGeospatial/src/CartographicPolygon.cpp index 603bc5d321..6c49d1da27 100644 --- a/CesiumGeospatial/src/CartographicPolygon.cpp +++ b/CesiumGeospatial/src/CartographicPolygon.cpp @@ -122,7 +122,9 @@ CartographicPolygon::CartographicPolygon(const std::vector& polygon) _indices(triangulatePolygon(polygon)), _boundingRectangle(computeBoundingRectangle(polygon)) {} -CartographicPolygon::CartographicPolygon(std::vector&& polygon, std::vector&& indices) +CartographicPolygon::CartographicPolygon( + std::vector&& polygon, + std::vector&& indices) : _vertices(std::move(polygon)), _indices(std::move(indices)), _boundingRectangle(computeBoundingRectangle(this->_vertices)) {} diff --git a/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h b/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h new file mode 100644 index 0000000000..310cd2f694 --- /dev/null +++ b/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h @@ -0,0 +1,63 @@ +// This file was generated by generate-classes. +// DO NOT EDIT THIS FILE! +#pragma once + +#include +#include + +namespace CesiumGltf { +/** + * @brief glTF extension adding an encoding of polygon primitive topology + */ +struct CESIUMGLTF_API ExtensionExtMeshPolygon final + : public CesiumUtility::ExtensibleObject { + /** + * @brief The original name of this type. + */ + static constexpr const char* TypeName = "ExtensionExtMeshPolygon"; + /** @brief The official name of the extension. This should be the same as its + * key in the `extensions` object. */ + static constexpr const char* ExtensionName = "EXT_mesh_polygon"; + + /** + * @brief Integer number of polygons encoded in the mesh primitive. + */ + double count = double(); + + /** + * @brief Index of an accessor containing indices of the polygons' exterior + * and interior loops. The accessor MUST have SCALAR type and an unsigned + * integer component type. + */ + double loopIndices = double(); + + /** + * @brief Index of an accessor containing one integer offset per polygon in + * the primitive, indicating the first index of the first linear ring + * associated with that polygon. + */ + double loopIndicesOffsets = double(); + + /** + * @brief Index of an accessor containing one integer offset per polygon in + * the primitive, indicating the first index of the first triangle associated + * with that polygon. + */ + double indicesOffsets = double(); + + /** + * @brief Calculates the size in bytes of this object, including the contents + * of all collections, pointers, and strings. This will NOT include the size + * of any extensions attached to the object. Calling this method may be slow + * as it requires traversing the object's entire structure. + */ + int64_t getSizeBytes() const { + int64_t accum = 0; + accum += int64_t(sizeof(ExtensionExtMeshPolygon)); + accum += CesiumUtility::ExtensibleObject::getSizeBytes() - + int64_t(sizeof(CesiumUtility::ExtensibleObject)); + + return accum; + } +}; +} // namespace CesiumGltf diff --git a/CesiumGltf/generated/include/CesiumGltf/ExtensionKhrGaussianSplatting.h b/CesiumGltf/generated/include/CesiumGltf/ExtensionKhrGaussianSplatting.h index 40f83fddf1..01d5a3c83a 100644 --- a/CesiumGltf/generated/include/CesiumGltf/ExtensionKhrGaussianSplatting.h +++ b/CesiumGltf/generated/include/CesiumGltf/ExtensionKhrGaussianSplatting.h @@ -22,8 +22,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final static constexpr const char* ExtensionName = "KHR_gaussian_splatting"; /** - * @brief Known values for Property specifying parameters regarding the kernel - * used to generate the Gaussians. + * @brief Known values for The kernel used to generate the Gaussians. */ struct Kernel { /** @brief `ellipse` */ @@ -31,8 +30,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final }; /** - * @brief Known values for Property specifying the color space of the - * spherical harmonics. + * @brief Known values for The color space of the reconstructed color values. */ struct ColorSpace { /** @brief `srgb_rec709_display` */ @@ -43,9 +41,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final }; /** - * @brief Known values for Optional property specifying how to project the - * Gaussians to achieve a perspective correct value. This property defaults to - * perspective. + * @brief Known values for The projection method for rendering the Gaussians. */ struct Projection { /** @brief `perspective` */ @@ -53,8 +49,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final }; /** - * @brief Known values for Optional property specifying how to sort the - * Gaussians during rendering. This property defaults to cameraDistance. + * @brief Known values for The sorting method for rendering the Gaussians. */ struct SortingMethod { /** @brief `cameraDistance` */ @@ -62,8 +57,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final }; /** - * @brief Property specifying parameters regarding the kernel used to generate - * the Gaussians. + * @brief The kernel used to generate the Gaussians. * * Known values are defined in {@link Kernel}. * @@ -71,7 +65,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final std::string kernel = Kernel::ellipse; /** - * @brief Property specifying the color space of the spherical harmonics. + * @brief The color space of the reconstructed color values. * * Known values are defined in {@link ColorSpace}. * @@ -79,8 +73,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final std::string colorSpace = ColorSpace::srgb_rec709_display; /** - * @brief Optional property specifying how to project the Gaussians to achieve - * a perspective correct value. This property defaults to perspective. + * @brief The projection method for rendering the Gaussians. * * Known values are defined in {@link Projection}. * @@ -88,8 +81,7 @@ struct CESIUMGLTF_API ExtensionKhrGaussianSplatting final std::string projection = Projection::perspective; /** - * @brief Optional property specifying how to sort the Gaussians during - * rendering. This property defaults to cameraDistance. + * @brief The sorting method for rendering the Gaussians. * * Known values are defined in {@link SortingMethod}. * diff --git a/CesiumGltfReader/generated/include/CesiumGltfReader/ExtensionExtMeshPolygonReader.h b/CesiumGltfReader/generated/include/CesiumGltfReader/ExtensionExtMeshPolygonReader.h new file mode 100644 index 0000000000..489d60350a --- /dev/null +++ b/CesiumGltfReader/generated/include/CesiumGltfReader/ExtensionExtMeshPolygonReader.h @@ -0,0 +1,76 @@ +// This file was generated by generate-classes. +// DO NOT EDIT THIS FILE! +#pragma once + +#include +#include +#include +#include + +#include + +#include +#include + +namespace CesiumGltf { +struct ExtensionExtMeshPolygon; +} // namespace CesiumGltf + +namespace CesiumGltfReader { + +/** + * @brief Reads \ref CesiumGltf::ExtensionExtMeshPolygon + * "ExtensionExtMeshPolygon" instances from JSON. + */ +class CESIUMGLTFREADER_API ExtensionExtMeshPolygonReader { +public: + /** + * @brief Constructs a new instance. + */ + ExtensionExtMeshPolygonReader(); + + /** + * @brief Gets the options controlling how the JSON is read. + */ + CesiumJsonReader::JsonReaderOptions& getOptions(); + + /** + * @brief Gets the options controlling how the JSON is read. + */ + const CesiumJsonReader::JsonReaderOptions& getOptions() const; + + /** + * @brief Reads an instance of ExtensionExtMeshPolygon from a byte buffer. + * + * @param data The buffer from which to read the instance. + * @return The result of reading the instance. + */ + CesiumJsonReader::ReadJsonResult + readFromJson(const std::span& data) const; + + /** + * @brief Reads an instance of ExtensionExtMeshPolygon from a + * rapidJson::Value. + * + * @param value The value from which to read the instance. + * @return The result of reading the instance. + */ + CesiumJsonReader::ReadJsonResult + readFromJson(const rapidjson::Value& value) const; + + /** + * @brief Reads an array of instances of ExtensionExtMeshPolygon from a + * rapidJson::Value. + * + * @param value The value from which to read the array of instances. + * @return The result of reading the array of instances. + */ + CesiumJsonReader::ReadJsonResult< + std::vector> + readArrayFromJson(const rapidjson::Value& value) const; + +private: + CesiumJsonReader::JsonReaderOptions _options; +}; + +} // namespace CesiumGltfReader diff --git a/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h b/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h new file mode 100644 index 0000000000..802bc36c48 --- /dev/null +++ b/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h @@ -0,0 +1,50 @@ +// This file was generated by generate-classes. +// DO NOT EDIT THIS FILE! +#pragma once + +#include +#include +#include + +namespace CesiumJsonReader { +class JsonReaderOptions; +} // namespace CesiumJsonReader + +namespace CesiumGltfReader { +class ExtensionExtMeshPolygonJsonHandler + : public CesiumJsonReader::ExtensibleObjectJsonHandler, + public CesiumJsonReader::IExtensionJsonHandler { +public: + using ValueType = CesiumGltf::ExtensionExtMeshPolygon; + + static constexpr const char* ExtensionName = "EXT_mesh_polygon"; + + explicit ExtensionExtMeshPolygonJsonHandler( + const CesiumJsonReader::JsonReaderOptions& options) noexcept; + void reset( + IJsonHandler* pParentHandler, + CesiumGltf::ExtensionExtMeshPolygon* pObject); + + IJsonHandler* readObjectKey(const std::string_view& str) override; + + void reset( + IJsonHandler* pParentHandler, + CesiumUtility::ExtensibleObject& o, + const std::string_view& extensionName) override; + + IJsonHandler& getHandler() override { return *this; } + +protected: + IJsonHandler* readObjectKeyExtensionExtMeshPolygon( + const std::string& objectType, + const std::string_view& str, + CesiumGltf::ExtensionExtMeshPolygon& o); + +private: + CesiumGltf::ExtensionExtMeshPolygon* _pObject = nullptr; + CesiumJsonReader::DoubleJsonHandler _count; + CesiumJsonReader::DoubleJsonHandler _loopIndices; + CesiumJsonReader::DoubleJsonHandler _loopIndicesOffsets; + CesiumJsonReader::DoubleJsonHandler _indicesOffsets; +}; +} // namespace CesiumGltfReader diff --git a/CesiumGltfReader/generated/src/GeneratedJsonHandlers.cpp b/CesiumGltfReader/generated/src/GeneratedJsonHandlers.cpp index 77f4458cb3..12e3fe0462 100644 --- a/CesiumGltfReader/generated/src/GeneratedJsonHandlers.cpp +++ b/CesiumGltfReader/generated/src/GeneratedJsonHandlers.cpp @@ -3367,6 +3367,135 @@ ExtensionExtMeshPrimitiveEdgeVisibilityReader::readArrayFromJson( return CesiumJsonReader::JsonReader::readJson(value, handler); } +} // namespace CesiumGltfReader +// This file was generated by generate-classes. +// DO NOT EDIT THIS FILE! +// NOLINTBEGIN(readability-duplicate-include) +#include "ExtensionExtMeshPolygonJsonHandler.h" +#include "registerReaderExtensions.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +// NOLINTEND(readability-duplicate-include) + +namespace CesiumGltfReader { + +ExtensionExtMeshPolygonJsonHandler::ExtensionExtMeshPolygonJsonHandler( + const CesiumJsonReader::JsonReaderOptions& options) noexcept + : CesiumJsonReader::ExtensibleObjectJsonHandler(options), + _count(), + _loopIndices(), + _loopIndicesOffsets(), + _indicesOffsets() {} + +void ExtensionExtMeshPolygonJsonHandler::reset( + CesiumJsonReader::IJsonHandler* pParentHandler, + CesiumGltf::ExtensionExtMeshPolygon* pObject) { + CesiumJsonReader::ExtensibleObjectJsonHandler::reset(pParentHandler, pObject); + this->_pObject = pObject; +} + +CesiumJsonReader::IJsonHandler* +ExtensionExtMeshPolygonJsonHandler::readObjectKey(const std::string_view& str) { + CESIUM_ASSERT(this->_pObject); + return this->readObjectKeyExtensionExtMeshPolygon( + CesiumGltf::ExtensionExtMeshPolygon::TypeName, + str, + *this->_pObject); +} + +void ExtensionExtMeshPolygonJsonHandler::reset( + CesiumJsonReader::IJsonHandler* pParentHandler, + CesiumUtility::ExtensibleObject& o, + const std::string_view& extensionName) { + std::any& value = + o.extensions.emplace(extensionName, CesiumGltf::ExtensionExtMeshPolygon()) + .first->second; + this->reset( + pParentHandler, + &std::any_cast(value)); +} + +CesiumJsonReader::IJsonHandler* +ExtensionExtMeshPolygonJsonHandler::readObjectKeyExtensionExtMeshPolygon( + const std::string& objectType, + const std::string_view& str, + CesiumGltf::ExtensionExtMeshPolygon& o) { + using namespace std::string_literals; + + if ("count"s == str) { + return property("count", this->_count, o.count); + } + if ("loopIndices"s == str) { + return property("loopIndices", this->_loopIndices, o.loopIndices); + } + if ("loopIndicesOffsets"s == str) { + return property( + "loopIndicesOffsets", + this->_loopIndicesOffsets, + o.loopIndicesOffsets); + } + if ("indicesOffsets"s == str) { + return property("indicesOffsets", this->_indicesOffsets, o.indicesOffsets); + } + + return this->readObjectKeyExtensibleObject(objectType, str, *this->_pObject); +} + +ExtensionExtMeshPolygonReader::ExtensionExtMeshPolygonReader() { + registerReaderExtensions(this->_options); +} + +CesiumJsonReader::JsonReaderOptions& +ExtensionExtMeshPolygonReader::getOptions() { + return this->_options; +} + +const CesiumJsonReader::JsonReaderOptions& +ExtensionExtMeshPolygonReader::getOptions() const { + return this->_options; +} + +CesiumJsonReader::ReadJsonResult +ExtensionExtMeshPolygonReader::readFromJson( + const std::span& data) const { + ExtensionExtMeshPolygonJsonHandler handler(this->_options); + return CesiumJsonReader::JsonReader::readJson(data, handler); +} + +CesiumJsonReader::ReadJsonResult +ExtensionExtMeshPolygonReader::readFromJson( + const rapidjson::Value& value) const { + ExtensionExtMeshPolygonJsonHandler handler(this->_options); + return CesiumJsonReader::JsonReader::readJson(value, handler); +} + +CesiumJsonReader::ReadJsonResult< + std::vector> +ExtensionExtMeshPolygonReader::readArrayFromJson( + const rapidjson::Value& value) const { + CesiumJsonReader::ArrayJsonHandler< + CesiumGltf::ExtensionExtMeshPolygon, + ExtensionExtMeshPolygonJsonHandler> + handler(this->_options); + return CesiumJsonReader::JsonReader::readJson(value, handler); +} + } // namespace CesiumGltfReader // This file was generated by generate-classes. // DO NOT EDIT THIS FILE! diff --git a/CesiumGltfReader/generated/src/registerReaderExtensions.cpp b/CesiumGltfReader/generated/src/registerReaderExtensions.cpp index d6e4becf56..b5089a4829 100644 --- a/CesiumGltfReader/generated/src/registerReaderExtensions.cpp +++ b/CesiumGltfReader/generated/src/registerReaderExtensions.cpp @@ -13,6 +13,7 @@ #include "ExtensionExtInstanceFeaturesJsonHandler.h" #include "ExtensionExtMeshFeaturesJsonHandler.h" #include "ExtensionExtMeshGpuInstancingJsonHandler.h" +#include "ExtensionExtMeshPolygonJsonHandler.h" #include "ExtensionExtMeshPrimitiveEdgeVisibilityJsonHandler.h" #include "ExtensionExtPrimitiveVoxelsJsonHandler.h" #include "ExtensionExtStructuralMetadataJsonHandler.h" @@ -91,6 +92,9 @@ void registerReaderExtensions(CesiumJsonReader::JsonReaderOptions& options) { options.registerExtension< CesiumGltf::MeshPrimitive, ExtensionExtMeshPrimitiveEdgeVisibilityJsonHandler>(); + options.registerExtension< + CesiumGltf::MeshPrimitive, + ExtensionExtMeshPolygonJsonHandler>(); options.registerExtension< CesiumGltf::Node, ExtensionExtInstanceFeaturesJsonHandler>(); diff --git a/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp b/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp index 240404a464..06bd5951dd 100644 --- a/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp +++ b/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -237,6 +238,11 @@ void writeJson( CesiumJsonWriter::JsonWriter& jsonWriter, const CesiumJsonWriter::ExtensionWriterContext& context); +void writeJson( + const CesiumGltf::ExtensionExtMeshPolygon& obj, + CesiumJsonWriter::JsonWriter& jsonWriter, + const CesiumJsonWriter::ExtensionWriterContext& context); + void writeJson( const CesiumGltf::LineString& obj, CesiumJsonWriter::JsonWriter& jsonWriter, @@ -1268,6 +1274,29 @@ void writeJson( jsonWriter.EndObject(); } +void writeJson( + const CesiumGltf::ExtensionExtMeshPolygon& obj, + CesiumJsonWriter::JsonWriter& jsonWriter, + const CesiumJsonWriter::ExtensionWriterContext& context) { + jsonWriter.StartObject(); + + jsonWriter.Key("count"); + writeJson(obj.count, jsonWriter, context); + + jsonWriter.Key("loopIndices"); + writeJson(obj.loopIndices, jsonWriter, context); + + jsonWriter.Key("loopIndicesOffsets"); + writeJson(obj.loopIndicesOffsets, jsonWriter, context); + + jsonWriter.Key("indicesOffsets"); + writeJson(obj.indicesOffsets, jsonWriter, context); + + writeExtensibleObject(obj, jsonWriter, context); + + jsonWriter.EndObject(); +} + void writeJson( const CesiumGltf::LineString& obj, CesiumJsonWriter::JsonWriter& jsonWriter, @@ -3028,6 +3057,13 @@ void ExtensionExtMeshPrimitiveEdgeVisibilityJsonWriter::write( writeJson(obj, jsonWriter, context); } +void ExtensionExtMeshPolygonJsonWriter::write( + const CesiumGltf::ExtensionExtMeshPolygon& obj, + CesiumJsonWriter::JsonWriter& jsonWriter, + const CesiumJsonWriter::ExtensionWriterContext& context) { + writeJson(obj, jsonWriter, context); +} + void LineStringJsonWriter::write( const CesiumGltf::LineString& obj, CesiumJsonWriter::JsonWriter& jsonWriter, diff --git a/CesiumGltfWriter/generated/src/ModelJsonWriter.h b/CesiumGltfWriter/generated/src/ModelJsonWriter.h index 0c56af0650..1d07980f02 100644 --- a/CesiumGltfWriter/generated/src/ModelJsonWriter.h +++ b/CesiumGltfWriter/generated/src/ModelJsonWriter.h @@ -37,6 +37,7 @@ struct ExtensionExtPrimitiveVoxels; struct ExtensionKhrGaussianSplatting; struct ExtensionKhrGaussianSplattingCompressionSpz2; struct ExtensionExtMeshPrimitiveEdgeVisibility; +struct ExtensionExtMeshPolygon; struct LineString; struct Padding; struct Shape; @@ -447,6 +448,19 @@ struct ExtensionExtMeshPrimitiveEdgeVisibilityJsonWriter { const CesiumJsonWriter::ExtensionWriterContext& context); }; +struct ExtensionExtMeshPolygonJsonWriter { + using ValueType = CesiumGltf::ExtensionExtMeshPolygon; + + /** @brief The official name of the extension. This should be the same as its + * key in the `extensions` object. */ + static constexpr const char* ExtensionName = "EXT_mesh_polygon"; + + static void write( + const CesiumGltf::ExtensionExtMeshPolygon& obj, + CesiumJsonWriter::JsonWriter& jsonWriter, + const CesiumJsonWriter::ExtensionWriterContext& context); +}; + struct LineStringJsonWriter { using ValueType = CesiumGltf::LineString; diff --git a/CesiumGltfWriter/generated/src/registerWriterExtensions.cpp b/CesiumGltfWriter/generated/src/registerWriterExtensions.cpp index 26a2cb2fd2..7e1d6d5aac 100644 --- a/CesiumGltfWriter/generated/src/registerWriterExtensions.cpp +++ b/CesiumGltfWriter/generated/src/registerWriterExtensions.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -96,6 +97,9 @@ void registerWriterExtensions( context.registerExtension< CesiumGltf::MeshPrimitive, ExtensionExtMeshPrimitiveEdgeVisibilityJsonWriter>(); + context.registerExtension< + CesiumGltf::MeshPrimitive, + ExtensionExtMeshPolygonJsonWriter>(); context.registerExtension< CesiumGltf::Node, ExtensionExtInstanceFeaturesJsonWriter>(); diff --git a/tools/generate-classes/glTF.json b/tools/generate-classes/glTF.json index a688029a89..d5d6dd600f 100644 --- a/tools/generate-classes/glTF.json +++ b/tools/generate-classes/glTF.json @@ -177,6 +177,9 @@ }, "EXT_mesh_primitive_edge_visibility glTF Mesh Primitive Extension": { "overrideName": "ExtensionExtMeshPrimitiveEdgeVisibility" + }, + "EXT_mesh_polygon glTF Mesh Primitive Extension": { + "overrideName": "ExtensionExtMeshPolygon" } }, "extensions": [ @@ -322,6 +325,13 @@ "attachTo": [ "mesh.primitive" ] + }, + { + "extensionName": "EXT_mesh_polygon", + "schema": "Vendor/EXT_mesh_polygon/EXT_mesh_polygon.schema.json", + "attachTo": [ + "mesh.primitive" + ] } ] } From 2a1446ff2e2200a15ed785a419748a1584c9ce55 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Tue, 12 May 2026 16:57:35 -0400 Subject: [PATCH 17/21] Working with EXT_mesh_polygon --- .../src/VectorTilesRasterOverlay.cpp | 102 ++++++++---------- .../CesiumGltf/ExtensionExtMeshPolygon.h | 10 +- .../include/CesiumGltf/AccessorUtility.h | 5 + CesiumGltf/src/AccessorUtility.cpp | 9 +- .../src/ExtensionExtMeshPolygonJsonHandler.h | 10 +- .../generated/src/ModelJsonWriter.cpp | 24 +++-- 6 files changed, 85 insertions(+), 75 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 8ecd47f197..148166da49 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -4,6 +4,7 @@ #include "CesiumGeospatial/CartographicPolygon.h" #include "CesiumGltf/AccessorUtility.h" #include "CesiumGltf/AccessorView.h" +#include "CesiumGltf/ExtensionExtMeshPolygon.h" #include "CesiumGltf/MeshPrimitive.h" #include "CesiumGltfContent/GltfUtilities.h" #include "CesiumUtility/ErrorList.h" @@ -74,7 +75,7 @@ struct VectorRenderContent { * This works for polygons with holes, though we have to account for multiple * rings. */ -CesiumUtility::Result>> +/*CesiumUtility::Result>> calculateRingsFromTriangles( const CesiumGltf::IndexAccessorType& indicesAccessor, int64_t offset, @@ -155,7 +156,7 @@ calculateRingsFromTriangles( } return {rings}; -} +}*/ CesiumUtility::Result vectorizeModel( CesiumGltf::Model& model, @@ -258,67 +259,58 @@ CesiumUtility::Result vectorizeModel( "point unassigned to a line."); } } else if ( - primitive.mode == CesiumGltf::MeshPrimitive::Mode::TRIANGLES) { - if (numIndices < 3) { - errors.emplaceError( - "Primitive mode TRIANGLES requires at least three indices."); + primitive.mode >= CesiumGltf::MeshPrimitive::Mode::TRIANGLES && + primitive.mode <= CesiumGltf::MeshPrimitive::Mode::TRIANGLE_FAN) { + const CesiumGltf::ExtensionExtMeshPolygon* pPolygonExtension = + primitive.getExtension(); + if (pPolygonExtension == nullptr) { + errors.emplaceWarning( + fmt::format("Polygons found but no EXT_mesh_polygon extension " + "present on primitive. Skipping polygon.")); return; } - int64_t startIndex = 0; - while (startIndex < numIndices) { - int64_t endIndex = numIndices - 1; - for (int64_t i = startIndex; i < endIndex; i++) { - const int64_t idx = - std::visit(CesiumGltf::IndexFromAccessor{i}, indicesView); - if (idx == maxIndex) { - endIndex = i; - break; - } - } - - if (endIndex == startIndex) { - break; - } - + CesiumGltf::IndexAccessorType loopIndicesView = + CesiumGltf::getIndexAccessorView( + model, + pPolygonExtension->loopIndices); + + CesiumGltf::IndexAccessorType loopIndicesOffsetsView = + CesiumGltf::getIndexAccessorView( + model, + pPolygonExtension->loopIndicesOffsets); + const int64_t numPolygons = std::visit( + CesiumGltf::NumIndicesFromAccessor{}, + loopIndicesOffsetsView); + const int64_t maxPolygonIndex = std::visit( + CesiumGltf::MaxIndexValueFromAccessor{}, + loopIndicesView); + content->polygons.reserve( + content->polygons.size() + static_cast(numPolygons)); + + for(int64_t i = 0; i < numPolygons; i++) { + const int64_t loopIndicesOffset = + std::visit(CesiumGltf::IndexFromAccessor{i}, loopIndicesOffsetsView); + const int64_t nextLoopIndicesOffset = i + 1 < numPolygons ? std::visit(CesiumGltf::IndexFromAccessor{i + 1}, loopIndicesOffsetsView) : numPolygons - 1; std::vector vertices; - vertices.reserve(static_cast(endIndex - startIndex)); - std::vector indices; - indices.reserve(static_cast(endIndex - startIndex)); - - CesiumUtility::Result>> - ringsResult = calculateRingsFromTriangles( - indicesView, - startIndex, - endIndex - startIndex); - if (ringsResult.errors.hasErrors()) { - errors.merge(ringsResult.errors); - return; - } - - for (const std::vector& ring : *ringsResult.value) { - for (const int64_t& idx : ring) { - indices.emplace_back(static_cast(idx)); - const glm::vec3 position = positionView[idx]; - const glm::dvec4 transformedPosition = - rootTransform * nodeTransform * glm::dvec4(position, 1.0); - const CesiumGeospatial::Cartographic cartographicPosition = - ellipsoid - .cartesianToCartographic( - glm::dvec3(transformedPosition)) - .value_or( - CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); - vertices.emplace_back( - cartographicPosition.longitude, - cartographicPosition.latitude); + for(int64_t i = loopIndicesOffset; i < nextLoopIndicesOffset; i++) { + int64_t loopIndex = std::visit(CesiumGltf::IndexFromAccessor{i}, loopIndicesView); + if(loopIndex == maxPolygonIndex) { + continue; } + + const glm::vec3 position = positionView[loopIndex]; + const glm::dvec4 transformedPosition = + rootTransform * nodeTransform * glm::dvec4(position, 1.0); + const CesiumGeospatial::Cartographic cartographic = ellipsoid + .cartesianToCartographic(glm::dvec3(transformedPosition)) + .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); + vertices.emplace_back(cartographic.longitude, cartographic.latitude); } - content->polygons.emplace_back( - std::move(vertices), - std::move(indices)); - startIndex = endIndex; + std::vector indices; + content->polygons.emplace_back(std::move(vertices), std::move(indices)); } } else { errors.emplaceWarning(fmt::format( diff --git a/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h b/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h index 310cd2f694..40abe2d26f 100644 --- a/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h +++ b/CesiumGltf/generated/include/CesiumGltf/ExtensionExtMeshPolygon.h @@ -5,6 +5,8 @@ #include #include +#include + namespace CesiumGltf { /** * @brief glTF extension adding an encoding of polygon primitive topology @@ -22,28 +24,28 @@ struct CESIUMGLTF_API ExtensionExtMeshPolygon final /** * @brief Integer number of polygons encoded in the mesh primitive. */ - double count = double(); + int32_t count = -1; /** * @brief Index of an accessor containing indices of the polygons' exterior * and interior loops. The accessor MUST have SCALAR type and an unsigned * integer component type. */ - double loopIndices = double(); + int32_t loopIndices = -1; /** * @brief Index of an accessor containing one integer offset per polygon in * the primitive, indicating the first index of the first linear ring * associated with that polygon. */ - double loopIndicesOffsets = double(); + int32_t loopIndicesOffsets = -1; /** * @brief Index of an accessor containing one integer offset per polygon in * the primitive, indicating the first index of the first triangle associated * with that polygon. */ - double indicesOffsets = double(); + int32_t indicesOffsets = -1; /** * @brief Calculates the size in bytes of this object, including the contents diff --git a/CesiumGltf/include/CesiumGltf/AccessorUtility.h b/CesiumGltf/include/CesiumGltf/AccessorUtility.h index e8ea544798..a18589035c 100644 --- a/CesiumGltf/include/CesiumGltf/AccessorUtility.h +++ b/CesiumGltf/include/CesiumGltf/AccessorUtility.h @@ -154,6 +154,11 @@ typedef std::variant< IndexAccessorType getIndexAccessorView(const Model& model, const MeshPrimitive& primitive); +/** + * Retrieves an indices accessor view of the accessor at the given index. + */ +IndexAccessorType getIndexAccessorView(const Model& model, int32_t index); + /** * Visitor that returns the number of indices contained in an IndexAccessorType * variant. diff --git a/CesiumGltf/src/AccessorUtility.cpp b/CesiumGltf/src/AccessorUtility.cpp index db5443b87b..8cb84c29fb 100644 --- a/CesiumGltf/src/AccessorUtility.cpp +++ b/CesiumGltf/src/AccessorUtility.cpp @@ -117,12 +117,15 @@ FeatureIdAccessorType getFeatureIdAccessorView( IndexAccessorType getIndexAccessorView(const Model& model, const MeshPrimitive& primitive) { - if (primitive.indices < 0) { + return getIndexAccessorView(model, primitive.indices); +} + +IndexAccessorType getIndexAccessorView(const Model& model, int32_t index) { + if (index < 0) { return IndexAccessorType(); } - const Accessor* pAccessor = - model.getSafe(&model.accessors, primitive.indices); + const Accessor* pAccessor = model.getSafe(&model.accessors, index); if (!pAccessor || pAccessor->type != Accessor::Type::SCALAR || pAccessor->normalized) { return AccessorView(); diff --git a/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h b/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h index 802bc36c48..2c54d88757 100644 --- a/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h +++ b/CesiumGltfReader/generated/src/ExtensionExtMeshPolygonJsonHandler.h @@ -3,8 +3,8 @@ #pragma once #include -#include #include +#include namespace CesiumJsonReader { class JsonReaderOptions; @@ -42,9 +42,9 @@ class ExtensionExtMeshPolygonJsonHandler private: CesiumGltf::ExtensionExtMeshPolygon* _pObject = nullptr; - CesiumJsonReader::DoubleJsonHandler _count; - CesiumJsonReader::DoubleJsonHandler _loopIndices; - CesiumJsonReader::DoubleJsonHandler _loopIndicesOffsets; - CesiumJsonReader::DoubleJsonHandler _indicesOffsets; + CesiumJsonReader::IntegerJsonHandler _count; + CesiumJsonReader::IntegerJsonHandler _loopIndices; + CesiumJsonReader::IntegerJsonHandler _loopIndicesOffsets; + CesiumJsonReader::IntegerJsonHandler _indicesOffsets; }; } // namespace CesiumGltfReader diff --git a/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp b/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp index 06bd5951dd..04426b4ccd 100644 --- a/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp +++ b/CesiumGltfWriter/generated/src/ModelJsonWriter.cpp @@ -1280,17 +1280,25 @@ void writeJson( const CesiumJsonWriter::ExtensionWriterContext& context) { jsonWriter.StartObject(); - jsonWriter.Key("count"); - writeJson(obj.count, jsonWriter, context); + if (obj.count > -1) { + jsonWriter.Key("count"); + writeJson(obj.count, jsonWriter, context); + } - jsonWriter.Key("loopIndices"); - writeJson(obj.loopIndices, jsonWriter, context); + if (obj.loopIndices > -1) { + jsonWriter.Key("loopIndices"); + writeJson(obj.loopIndices, jsonWriter, context); + } - jsonWriter.Key("loopIndicesOffsets"); - writeJson(obj.loopIndicesOffsets, jsonWriter, context); + if (obj.loopIndicesOffsets > -1) { + jsonWriter.Key("loopIndicesOffsets"); + writeJson(obj.loopIndicesOffsets, jsonWriter, context); + } - jsonWriter.Key("indicesOffsets"); - writeJson(obj.indicesOffsets, jsonWriter, context); + if (obj.indicesOffsets > -1) { + jsonWriter.Key("indicesOffsets"); + writeJson(obj.indicesOffsets, jsonWriter, context); + } writeExtensibleObject(obj, jsonWriter, context); From f7ac37d3a6845125b1e95fa7945bd8eb1a2544c0 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 13 May 2026 11:20:09 -0400 Subject: [PATCH 18/21] Fix duplicate variable name --- Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 148166da49..9b6795c605 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -294,8 +294,8 @@ CesiumUtility::Result vectorizeModel( const int64_t nextLoopIndicesOffset = i + 1 < numPolygons ? std::visit(CesiumGltf::IndexFromAccessor{i + 1}, loopIndicesOffsetsView) : numPolygons - 1; std::vector vertices; - for(int64_t i = loopIndicesOffset; i < nextLoopIndicesOffset; i++) { - int64_t loopIndex = std::visit(CesiumGltf::IndexFromAccessor{i}, loopIndicesView); + for(int64_t j = loopIndicesOffset; j < nextLoopIndicesOffset; j++) { + int64_t loopIndex = std::visit(CesiumGltf::IndexFromAccessor{j}, loopIndicesView); if(loopIndex == maxPolygonIndex) { continue; } From 03dad836ad19177b643a1e11fef6e7d1bbf5f251 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Wed, 13 May 2026 11:49:27 -0400 Subject: [PATCH 19/21] Use raw pointer instead of intrusive pointer for requestedTiles set --- Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp index 9b6795c605..35b444b425 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp @@ -325,7 +325,7 @@ CesiumUtility::Result vectorizeModel( struct LoadRequest { CesiumAsync::Promise promise; - std::set requestedTiles; + std::set requestedTiles; }; struct SharedTileSelectionState { @@ -503,11 +503,11 @@ class VectorTilesRasterOverlayTileProvider final CesiumAsync::Future addLoadRequest( const CesiumAsync::AsyncSystem& asyncSystem, const std::vector& tasks) { - std::set requestedTiles; + std::set requestedTiles; for (const TileLoadTask& task : tasks) { this->_pSharedTileSelectionState->workerThreadLoadQueue.emplace_back( task); - requestedTiles.insert(task.pTile); + requestedTiles.insert(&*task.pTile); } LoadRequest request{ @@ -772,7 +772,7 @@ class VectorTilesRasterOverlayTileProvider final for (LoadRequest& request : this->_pSharedTileSelectionState->loadRequests) { - if (request.requestedTiles.erase(pTile) > 0) { + if (request.requestedTiles.erase(&*pTile) > 0) { if (request.requestedTiles.empty()) { // Keep list of promises to resolve until after we've unlocked the // mutex. From 11c4120cab54218468008991de00d242cff4e30a Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Thu, 14 May 2026 16:29:34 -0400 Subject: [PATCH 20/21] Reorganize into new library --- CHANGES.md | 5 + CMakeLists.txt | 1 + Cesium3DTilesSelection/CMakeLists.txt | 1 - .../RasterOverlayUpsampler.h | 0 .../TilesetContentManager.h | 4 +- Cesium3DTilesSelection/src/GltfModifier.cpp | 4 +- .../src/RasterOverlayUpsampler.cpp | 4 +- Cesium3DTilesSelection/src/Tile.cpp | 3 +- .../src/TileLoadRequester.cpp | 3 +- Cesium3DTilesSelection/src/Tileset.cpp | 4 +- .../src/TilesetContentLoader.cpp | 3 +- .../src/TilesetContentManager.cpp | 5 +- .../src/TilesetHeightQuery.cpp | 2 +- .../test/TestGltfModifier.cpp | 2 +- .../test/TestTilesetContentManager.cpp | 2 +- CesiumNativeTests/CMakeLists.txt | 1 + CesiumVectorOverlays/CMakeLists.txt | 55 ++++++ .../GeoJsonDocumentRasterOverlay.h | 16 +- .../include/CesiumVectorOverlays/Library.h | 18 ++ .../VectorTilesRasterOverlay.h | 13 +- .../src/GeoJsonDocumentRasterOverlay.cpp | 7 +- .../src/VectorTilesRasterOverlay.cpp | 176 ++++-------------- .../test/TestGeoJsonDocumentRasterOverlay.cpp | 21 ++- .../test/TestVectorTilesRasterOverlay.cpp | 45 ++--- .../ViennaStreets/0/subtrees/0/0/0.subtree | Bin .../test/data/ViennaStreets/0/tiles/0/0/0.glb | Bin .../test/data/ViennaStreets/0/tiles/1/0/0.glb | Bin .../test/data/ViennaStreets/0/tiles/1/0/1.glb | Bin .../test/data/ViennaStreets/0/tiles/1/1/0.glb | Bin .../test/data/ViennaStreets/0/tiles/1/1/1.glb | Bin .../test/data/ViennaStreets/rasterized.tga | Bin .../test/data/ViennaStreets/tileset.json | 0 .../test/data/equator-antimeridian.tga | Bin .../test/data/equator-meridian-meters.tga | Bin .../test/data/equator-meridian.tga | Bin .../test/data/equator.geojson | 0 .../test/data/vienna-streets.geojson | 0 README.md | 1 + doc/CMakeLists.txt | 1 + 39 files changed, 189 insertions(+), 208 deletions(-) rename Cesium3DTilesSelection/{src => include/Cesium3DTilesSelection}/RasterOverlayUpsampler.h (100%) rename Cesium3DTilesSelection/{src => include/Cesium3DTilesSelection}/TilesetContentManager.h (99%) create mode 100644 CesiumVectorOverlays/CMakeLists.txt rename {CesiumRasterOverlays/include/CesiumRasterOverlays => CesiumVectorOverlays/include/CesiumVectorOverlays}/GeoJsonDocumentRasterOverlay.h (86%) create mode 100644 CesiumVectorOverlays/include/CesiumVectorOverlays/Library.h rename {Cesium3DTilesSelection/include/Cesium3DTilesSelection => CesiumVectorOverlays/include/CesiumVectorOverlays}/VectorTilesRasterOverlay.h (82%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/src/GeoJsonDocumentRasterOverlay.cpp (99%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/src/VectorTilesRasterOverlay.cpp (83%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/test/TestGeoJsonDocumentRasterOverlay.cpp (96%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/TestVectorTilesRasterOverlay.cpp (83%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/0/subtrees/0/0/0.subtree (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/0/tiles/0/0/0.glb (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/0/tiles/1/0/0.glb (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/0/tiles/1/0/1.glb (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/0/tiles/1/1/0.glb (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/0/tiles/1/1/1.glb (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/rasterized.tga (100%) rename {Cesium3DTilesSelection => CesiumVectorOverlays}/test/data/ViennaStreets/tileset.json (100%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/test/data/equator-antimeridian.tga (100%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/test/data/equator-meridian-meters.tga (100%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/test/data/equator-meridian.tga (100%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/test/data/equator.geojson (100%) rename {CesiumRasterOverlays => CesiumVectorOverlays}/test/data/vienna-streets.geojson (100%) diff --git a/CHANGES.md b/CHANGES.md index 90cbc6a8f3..cfebdda7a8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,10 +2,15 @@ ### ? - ? +##### Breaking Changes :mega: + +- `CesiumRasterOverlays::GeoJsonDocumentRasterOverlay` has been moved to the `CesiumVectorOverlays` library and namespace. + ##### Additions :tada: - Added support for [`EXT_mesh_primitive_edge_visibility`](https://github.com/KhronosGroup/glTF/pull/2479) in `CesiumGltf`, `CesiumGltfReader`, and `CesiumGltfWriter`. - Added support for [`3DTILES_content_conditional`](https://github.com/CesiumGS/3d-tiles/pull/834) in `Cesium3DTiles`, `Cesium3DTilesReader`, and `Cesium3DTilesWriter`. +- Added `CesiumVectorOverlays::VectorTilesRasterOverlay` supporting vector data loaded from 3D Tiles tilesets. ### v0.60.0 - 2026-05-01 diff --git a/CMakeLists.txt b/CMakeLists.txt index f16184f392..16e90cd1ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -437,6 +437,7 @@ add_subdirectory(CesiumIonClient) add_subdirectory(CesiumITwinClient) add_subdirectory(CesiumQuantizedMeshTerrain) add_subdirectory(CesiumVectorData) +add_subdirectory(CesiumVectorOverlays) if(NOT CESIUM_DISABLE_CURL) add_subdirectory(CesiumCurl) diff --git a/Cesium3DTilesSelection/CMakeLists.txt b/Cesium3DTilesSelection/CMakeLists.txt index f710dff595..26ca91fcac 100644 --- a/Cesium3DTilesSelection/CMakeLists.txt +++ b/Cesium3DTilesSelection/CMakeLists.txt @@ -52,7 +52,6 @@ target_link_libraries(Cesium3DTilesSelection CesiumQuantizedMeshTerrain CesiumRasterOverlays CesiumUtility - CesiumVectorData spdlog::spdlog # PRIVATE libmorton::libmorton diff --git a/Cesium3DTilesSelection/src/RasterOverlayUpsampler.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/RasterOverlayUpsampler.h similarity index 100% rename from Cesium3DTilesSelection/src/RasterOverlayUpsampler.h rename to Cesium3DTilesSelection/include/Cesium3DTilesSelection/RasterOverlayUpsampler.h diff --git a/Cesium3DTilesSelection/src/TilesetContentManager.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h similarity index 99% rename from Cesium3DTilesSelection/src/TilesetContentManager.h rename to Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h index 9d14ae76f2..485bd35536 100644 --- a/Cesium3DTilesSelection/src/TilesetContentManager.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h @@ -1,9 +1,8 @@ #pragma once -#include "RasterOverlayUpsampler.h" - #include #include +#include #include #include #include @@ -18,6 +17,7 @@ #include + namespace Cesium3DTilesSelection { /** diff --git a/Cesium3DTilesSelection/src/GltfModifier.cpp b/Cesium3DTilesSelection/src/GltfModifier.cpp index df640725e9..3cb1352966 100644 --- a/Cesium3DTilesSelection/src/GltfModifier.cpp +++ b/Cesium3DTilesSelection/src/GltfModifier.cpp @@ -1,5 +1,3 @@ -#include "TilesetContentManager.h" - #include #include #include @@ -7,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +19,7 @@ #include #include + namespace Cesium3DTilesSelection { GltfModifier::GltfModifier() diff --git a/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp b/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp index dcffc7c670..718ca5f8aa 100644 --- a/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp +++ b/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp @@ -1,6 +1,5 @@ -#include "RasterOverlayUpsampler.h" - #include +#include #include #include #include @@ -23,6 +22,7 @@ #include #include + using namespace CesiumRasterOverlays; namespace Cesium3DTilesSelection { diff --git a/Cesium3DTilesSelection/src/Tile.cpp b/Cesium3DTilesSelection/src/Tile.cpp index 36a05b34b3..3384d66478 100644 --- a/Cesium3DTilesSelection/src/Tile.cpp +++ b/Cesium3DTilesSelection/src/Tile.cpp @@ -1,5 +1,4 @@ -#include "TilesetContentManager.h" - +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TileLoadRequester.cpp b/Cesium3DTilesSelection/src/TileLoadRequester.cpp index b1535f4b6d..3dd0523fd8 100644 --- a/Cesium3DTilesSelection/src/TileLoadRequester.cpp +++ b/Cesium3DTilesSelection/src/TileLoadRequester.cpp @@ -1,5 +1,4 @@ -#include "TilesetContentManager.h" - +#include #include #include diff --git a/Cesium3DTilesSelection/src/Tileset.cpp b/Cesium3DTilesSelection/src/Tileset.cpp index 5b3d9cac83..e157a74a70 100644 --- a/Cesium3DTilesSelection/src/Tileset.cpp +++ b/Cesium3DTilesSelection/src/Tileset.cpp @@ -1,7 +1,7 @@ -#include "CesiumRasterOverlays/ActivatedRasterOverlay.h" -#include "TilesetContentManager.h" #include "TilesetHeightQuery.h" +#include +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TilesetContentLoader.cpp b/Cesium3DTilesSelection/src/TilesetContentLoader.cpp index 09782d740a..30e9f12a65 100644 --- a/Cesium3DTilesSelection/src/TilesetContentLoader.cpp +++ b/Cesium3DTilesSelection/src/TilesetContentLoader.cpp @@ -1,5 +1,4 @@ -#include "TilesetContentManager.h" - +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TilesetContentManager.cpp b/Cesium3DTilesSelection/src/TilesetContentManager.cpp index 41835d3b09..f8356ea9b3 100644 --- a/Cesium3DTilesSelection/src/TilesetContentManager.cpp +++ b/Cesium3DTilesSelection/src/TilesetContentManager.cpp @@ -1,10 +1,9 @@ -#include "TilesetContentManager.h" - #include "LayerJsonTerrainLoader.h" -#include "RasterOverlayUpsampler.h" #include "TileContentLoadInfo.h" #include "TilesetJsonLoader.h" +#include +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp b/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp index b30601d056..7522a1056b 100644 --- a/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp +++ b/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp @@ -1,6 +1,6 @@ #include "TilesetHeightQuery.h" -#include "TilesetContentManager.h" +#include #include #include diff --git a/Cesium3DTilesSelection/test/TestGltfModifier.cpp b/Cesium3DTilesSelection/test/TestGltfModifier.cpp index f2e729345c..762872b943 100644 --- a/Cesium3DTilesSelection/test/TestGltfModifier.cpp +++ b/Cesium3DTilesSelection/test/TestGltfModifier.cpp @@ -1,5 +1,5 @@ #include "MockTilesetContentManager.h" -#include "TilesetContentManager.h" +#include #include #include diff --git a/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp b/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp index d8fffa7b29..faaa518197 100644 --- a/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp +++ b/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp @@ -1,8 +1,8 @@ #include "SimplePrepareRendererResource.h" #include "TestTilesetJsonLoader.h" -#include "TilesetContentManager.h" #include "TilesetJsonLoader.h" +#include #include #include #include diff --git a/CesiumNativeTests/CMakeLists.txt b/CesiumNativeTests/CMakeLists.txt index c98fd05a1f..6c0071c506 100644 --- a/CesiumNativeTests/CMakeLists.txt +++ b/CesiumNativeTests/CMakeLists.txt @@ -20,6 +20,7 @@ set(cesium_native_targets CesiumIonClient CesiumITwinClient CesiumVectorData + CesiumVectorOverlays CesiumQuantizedMeshTerrain CesiumRasterOverlays CesiumUtility diff --git a/CesiumVectorOverlays/CMakeLists.txt b/CesiumVectorOverlays/CMakeLists.txt new file mode 100644 index 0000000000..93ff8e6b9d --- /dev/null +++ b/CesiumVectorOverlays/CMakeLists.txt @@ -0,0 +1,55 @@ +add_library(CesiumVectorOverlays "") + +configure_cesium_library(CesiumVectorOverlays) + +cesium_glob_files(CESIUM_VECTOR_OVERLAYS_SOURCES + ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) +cesium_glob_files(CESIUM_VECTOR_OVERLAYS_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/src/*.h) +cesium_glob_files(CESIUM_VECTOR_OVERLAYS_PUBLIC_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/include/CesiumVectorOverlays/*.h) +cesium_glob_files(CESIUM_VECTOR_OVERLAYS_TEST_SOURCES test/*.cpp) +cesium_glob_files(CESIUM_VECTOR_OVERLAYS_TEST_HEADERS test/*.h) + +set_target_properties(CesiumVectorOverlays + PROPERTIES + TEST_SOURCES "${CESIUM_VECTOR_OVERLAYS_TEST_SOURCES}" + TEST_HEADERS "${CESIUM_VECTOR_OVERLAYS_TEST_HEADERS}" + TEST_DATA_DIR ${CMAKE_CURRENT_LIST_DIR}/test/data +) + +set_target_properties(CesiumVectorOverlays + PROPERTIES + PUBLIC_HEADER "${CESIUM_VECTOR_OVERLAYS_PUBLIC_HEADERS}" +) + +target_sources( + CesiumVectorOverlays + PRIVATE + ${CESIUM_VECTOR_OVERLAYS_SOURCES} + ${CESIUM_VECTOR_OVERLAYS_HEADERS} + ${CESIUM_VECTOR_OVERLAYS_PUBLIC_HEADERS} +) + +cesium_target_include_directories( + TARGET + CesiumVectorOverlays + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/src +) + +target_link_libraries(CesiumVectorOverlays + PUBLIC + CesiumUtility + CesiumGeometry + CesiumGeospatial + CesiumAsync + CesiumGltf + CesiumGltfContent + CesiumVectorData + Cesium3DTilesSelection + CesiumRasterOverlays +) diff --git a/CesiumRasterOverlays/include/CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h b/CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h similarity index 86% rename from CesiumRasterOverlays/include/CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h rename to CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h index 896e85480a..b420cc9f41 100644 --- a/CesiumRasterOverlays/include/CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h +++ b/CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h @@ -1,10 +1,10 @@ #pragma once +#include "Library.h" #include #include #include #include -#include #include #include #include @@ -18,7 +18,7 @@ #include #include -namespace CesiumRasterOverlays { +namespace CesiumVectorOverlays { /** * @brief A set of options for configuring a GeoJsonDocumentRasterOverlay. @@ -45,8 +45,8 @@ struct GeoJsonDocumentRasterOverlayOptions { * @brief A raster overlay made from rasterizing a \ref * CesiumVectorData::GeoJsonDocument. */ -class CESIUMRASTEROVERLAYS_API GeoJsonDocumentRasterOverlay final - : public RasterOverlay { +class CESIUMVECTOROVERLAYS_API GeoJsonDocumentRasterOverlay final + : public CesiumRasterOverlays::RasterOverlay { public: /** @@ -64,7 +64,7 @@ class CESIUMRASTEROVERLAYS_API GeoJsonDocumentRasterOverlay final const std::string& name, const std::shared_ptr& document, const GeoJsonDocumentRasterOverlayOptions& vectorOverlayOptions, - const RasterOverlayOptions& overlayOptions = {}); + const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions = {}); /** * @brief Creates a new GeoJsonDocumentRasterOverlay from a future. @@ -81,12 +81,12 @@ class CESIUMRASTEROVERLAYS_API GeoJsonDocumentRasterOverlay final CesiumAsync::Future>&& documentFuture, const GeoJsonDocumentRasterOverlayOptions& vectorOverlayOptions, - const RasterOverlayOptions& overlayOptions = {}); + const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions = {}); virtual ~GeoJsonDocumentRasterOverlay() override; virtual CesiumAsync::Future createTileProvider( - const CreateRasterOverlayTileProviderParameters& parameters) + const CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters& parameters) const override; private: @@ -94,4 +94,4 @@ class CESIUMRASTEROVERLAYS_API GeoJsonDocumentRasterOverlay final _documentFuture; GeoJsonDocumentRasterOverlayOptions _options; }; -} // namespace CesiumRasterOverlays +} // namespace CesiumVectorOverlays diff --git a/CesiumVectorOverlays/include/CesiumVectorOverlays/Library.h b/CesiumVectorOverlays/include/CesiumVectorOverlays/Library.h new file mode 100644 index 0000000000..ab240be335 --- /dev/null +++ b/CesiumVectorOverlays/include/CesiumVectorOverlays/Library.h @@ -0,0 +1,18 @@ +#pragma once + +/** + * @brief Raster overlays for displaying vector data. + * + * @mermaid-interactive{dependencies/CesiumVectorOverlays} + */ +namespace CesiumVectorOverlays {} + +#if defined(_WIN32) && defined(CESIUM_SHARED) +#ifdef CESIUMVECTOROVERLAYS_BUILDING +#define CESIUMVECTOROVERLAYS_API __declspec(dllexport) +#else +#define CESIUMVECTOROVERLAYS_API __declspec(dllimport) +#endif +#else +#define CESIUMVECTOROVERLAYS_API +#endif diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h b/CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h similarity index 82% rename from Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h rename to CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h index 20add6f95a..df189afac9 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/VectorTilesRasterOverlay.h +++ b/CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h @@ -1,16 +1,13 @@ -#include "CesiumVectorData/VectorStyle.h" - -#include +#include "Library.h" +#include #include -namespace Cesium3DTilesSelection { -class TilesetContentManager; - +namespace CesiumVectorOverlays { /** * @brief A raster overlay made from rasterizing a \ref * CesiumVectorData::GeoJsonDocument. */ -class CESIUMRASTEROVERLAYS_API VectorTilesRasterOverlay final +class CESIUMVECTOROVERLAYS_API VectorTilesRasterOverlay final : public CesiumRasterOverlays::RasterOverlay { public: @@ -40,4 +37,4 @@ class CESIUMRASTEROVERLAYS_API VectorTilesRasterOverlay final std::string _url; CesiumVectorData::VectorStyle _defaultStyle; }; -} // namespace Cesium3DTilesSelection \ No newline at end of file +} // namespace CesiumVectorOverlays \ No newline at end of file diff --git a/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp b/CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp similarity index 99% rename from CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp rename to CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp index c718f68aee..590ca5d8cf 100644 --- a/CesiumRasterOverlays/src/GeoJsonDocumentRasterOverlay.cpp +++ b/CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp @@ -12,8 +12,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -47,11 +47,12 @@ using namespace CesiumGeometry; using namespace CesiumGeospatial; using namespace CesiumUtility; using namespace CesiumVectorData; +using namespace CesiumRasterOverlays; // We won't generate any quadtree nodes past this depth. const uint32_t DEPTH_LIMIT = 8; -namespace CesiumRasterOverlays { +namespace CesiumVectorOverlays { namespace { /** diff --git a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp b/CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp similarity index 83% rename from Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp rename to CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp index 35b444b425..c5781d5874 100644 --- a/Cesium3DTilesSelection/src/VectorTilesRasterOverlay.cpp +++ b/CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp @@ -1,33 +1,32 @@ -#include "Cesium3DTilesSelection/IPrepareRendererResources.h" -#include "Cesium3DTilesSelection/TileLoadResult.h" -#include "CesiumGeospatial/Cartographic.h" -#include "CesiumGeospatial/CartographicPolygon.h" -#include "CesiumGltf/AccessorUtility.h" -#include "CesiumGltf/AccessorView.h" -#include "CesiumGltf/ExtensionExtMeshPolygon.h" -#include "CesiumGltf/MeshPrimitive.h" -#include "CesiumGltfContent/GltfUtilities.h" -#include "CesiumUtility/ErrorList.h" -#include "CesiumVectorData/VectorRasterizer.h" -#include "CesiumVectorData/VectorStyle.h" -#include "TilesetContentManager.h" - #include +#include #include +#include #include +#include #include -#include +#include #include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include #include #include #include #include +#include #include #include +#include +#include #include @@ -37,10 +36,11 @@ #include #include +using namespace Cesium3DTilesSelection; using namespace CesiumRasterOverlays; using namespace CesiumUtility; -namespace Cesium3DTilesSelection { +namespace CesiumVectorOverlays { namespace { struct VectorRenderContent { CesiumVectorData::VectorStyle style; @@ -50,114 +50,6 @@ struct VectorRenderContent { std::vector polygons; }; -/** - * @brief Calculates the rings of a polygon from the triangles of a glTF - * TRIANGLES primitive. This only works if triangles have consistent winding - * order (which they should!). - * - * Consider the following: - * 0 3 - * /----------/ - * / \ / - * / \ / - * / \ / - * / \ / - * /---------\/ - * 1 2 - * - * Following CCW winding order, the triangles would be {0, 1, 2} and {0, 2, 3}. - * We can break this down into edges: (0, 1), (1, 2), (2, 0), (0, 2), (2, 3), - * and (3, 0). We can see that (0, 2) and (2, 0) are interior edges as they are - * shared by two triangles in opposite directions. Eliminating (0, 2) and (2, 0) - * and connecting the edges starting from (0, 1), we get (0, 1, 2, 3, - * 0) as our ring. - * - * This works for polygons with holes, though we have to account for multiple - * rings. - */ -/*CesiumUtility::Result>> -calculateRingsFromTriangles( - const CesiumGltf::IndexAccessorType& indicesAccessor, - int64_t offset, - int64_t length) { - std::set> edges; - int64_t minIndex = std::numeric_limits::max(); - // Build edges from triangles. - for (int64_t i = offset; i < offset + length; i += 3) { - int64_t idx0 = - std::visit(CesiumGltf::IndexFromAccessor{i}, indicesAccessor); - int64_t idx1 = - std::visit(CesiumGltf::IndexFromAccessor{i + 1}, indicesAccessor); - int64_t idx2 = - std::visit(CesiumGltf::IndexFromAccessor{i + 2}, indicesAccessor); - - edges.emplace(idx0, idx1); - edges.emplace(idx1, idx2); - edges.emplace(idx2, idx0); - minIndex = std::min({minIndex, idx0, idx1, idx2}); - } - - if (edges.empty()) { - return {ErrorList::error("No edges found in the input triangles.")}; - } - - // Vector of edge destinations indexed by edge source (after subtracting - // minIndex to save space). - std::vector boundaryEdges; - boundaryEdges.resize(static_cast(length), 0); - - std::vector edgesAssigned(static_cast(length), true); - - // Remove edges that are shared by two triangles, leaving only the boundary - // edges. - while (!edges.empty()) { - const std::pair edge = *edges.begin(); - if (edges.contains({edge.second, edge.first})) { - edges.erase(edge); - edges.erase({edge.second, edge.first}); - } else { - boundaryEdges[static_cast(edge.first - minIndex)] = - edge.second - minIndex; - edges.erase(edge); - // Mark this edge as unassigned so we can use it as a starting point for - // ring construction later. - edgesAssigned[static_cast(edge.first - minIndex)] = false; - } - } - - std::vector> rings; - - while (!boundaryEdges.empty()) { - int64_t edgeSrcIndex = -1; - for (int64_t i = 0; i < length; i++) { - if (!edgesAssigned[static_cast(i)]) { - edgeSrcIndex = i; - break; - } - } - - if (edgeSrcIndex == -1) { - break; - } - - edgesAssigned[static_cast(edgeSrcIndex)] = true; - - std::vector ring{ - edgeSrcIndex + minIndex, - boundaryEdges[static_cast(edgeSrcIndex)] + minIndex}; - while (ring.back() != edgeSrcIndex + minIndex) { - ring.push_back( - boundaryEdges[static_cast(ring.back() - minIndex)] + - minIndex); - edgesAssigned[static_cast(ring.back() - minIndex)] = true; - } - - rings.push_back(ring); - } - - return {rings}; -}*/ - CesiumUtility::Result vectorizeModel( CesiumGltf::Model& model, const CesiumGeospatial::Ellipsoid& ellipsoid, @@ -288,29 +180,41 @@ CesiumUtility::Result vectorizeModel( content->polygons.reserve( content->polygons.size() + static_cast(numPolygons)); - for(int64_t i = 0; i < numPolygons; i++) { - const int64_t loopIndicesOffset = - std::visit(CesiumGltf::IndexFromAccessor{i}, loopIndicesOffsetsView); - const int64_t nextLoopIndicesOffset = i + 1 < numPolygons ? std::visit(CesiumGltf::IndexFromAccessor{i + 1}, loopIndicesOffsetsView) : numPolygons - 1; + for (int64_t i = 0; i < numPolygons; i++) { + const int64_t loopIndicesOffset = std::visit( + CesiumGltf::IndexFromAccessor{i}, + loopIndicesOffsetsView); + const int64_t nextLoopIndicesOffset = + i + 1 < numPolygons ? std::visit( + CesiumGltf::IndexFromAccessor{i + 1}, + loopIndicesOffsetsView) + : numPolygons - 1; std::vector vertices; - for(int64_t j = loopIndicesOffset; j < nextLoopIndicesOffset; j++) { - int64_t loopIndex = std::visit(CesiumGltf::IndexFromAccessor{j}, loopIndicesView); - if(loopIndex == maxPolygonIndex) { + for (int64_t j = loopIndicesOffset; j < nextLoopIndicesOffset; + j++) { + int64_t loopIndex = + std::visit(CesiumGltf::IndexFromAccessor{j}, loopIndicesView); + if (loopIndex == maxPolygonIndex) { continue; } const glm::vec3 position = positionView[loopIndex]; const glm::dvec4 transformedPosition = rootTransform * nodeTransform * glm::dvec4(position, 1.0); - const CesiumGeospatial::Cartographic cartographic = ellipsoid - .cartesianToCartographic(glm::dvec3(transformedPosition)) - .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); - vertices.emplace_back(cartographic.longitude, cartographic.latitude); + const CesiumGeospatial::Cartographic cartographic = + ellipsoid + .cartesianToCartographic(glm::dvec3(transformedPosition)) + .value_or(CesiumGeospatial::Cartographic{0.0, 0.0, 0.0}); + vertices.emplace_back( + cartographic.longitude, + cartographic.latitude); } std::vector indices; - content->polygons.emplace_back(std::move(vertices), std::move(indices)); + content->polygons.emplace_back( + std::move(vertices), + std::move(indices)); } } else { errors.emplaceWarning(fmt::format( diff --git a/CesiumRasterOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp b/CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp similarity index 96% rename from CesiumRasterOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp rename to CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp index fdf74525d8..328cc7f243 100644 --- a/CesiumRasterOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp +++ b/CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -26,6 +26,7 @@ using namespace CesiumAsync; using namespace CesiumGeospatial; using namespace CesiumUtility; using namespace CesiumRasterOverlays; +using namespace CesiumVectorOverlays; using namespace CesiumVectorData; const size_t BENCHMARK_ITERATIONS = 100000; @@ -149,7 +150,7 @@ TEST_CASE( std::make_shared()); const std::filesystem::path testDataPath = - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "vienna-streets.geojson"; Result docResult = GeoJsonDocument::fromGeoJson(readFile(testDataPath)); @@ -243,7 +244,7 @@ TEST_CASE( TEST_CASE("GeoJsonDocumentRasterOverlay can render lines with bounding box " "height set by pixels") { const std::filesystem::path testDataPath = - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator.geojson"; GeoJsonDocumentRasterOverlayOptions options{ @@ -273,14 +274,14 @@ TEST_CASE("GeoJsonDocumentRasterOverlay can render lines with bounding box " CesiumNativeTests::checkFilesEqual( std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "out-equator-meridian.tga", - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator-meridian.tga"); } TEST_CASE("GeoJsonDocumentRasterOverlay can render lines with bounding box " "height set by meters") { const std::filesystem::path testDataPath = - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator.geojson"; GeoJsonDocumentRasterOverlayOptions options{ @@ -321,14 +322,14 @@ TEST_CASE("GeoJsonDocumentRasterOverlay can render lines with bounding box " CesiumNativeTests::checkFilesEqual( std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "out-equator-meridian-meters.tga", - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator-meridian-meters.tga"); } TEST_CASE("GeoJsonDocumentRasterOverlay can correctly rasterize line strings " "wrapping around the earth") { const std::filesystem::path testDataPath = - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator.geojson"; GeoJsonDocumentRasterOverlayOptions options{ @@ -357,7 +358,7 @@ TEST_CASE("GeoJsonDocumentRasterOverlay can correctly rasterize line strings " CesiumNativeTests::checkFilesEqual( std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "out-equator-antimeridian-1.tga", - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator-antimeridian.tga"); } @@ -377,7 +378,7 @@ TEST_CASE("GeoJsonDocumentRasterOverlay can correctly rasterize line strings " CesiumNativeTests::checkFilesEqual( std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "out-equator-antimeridian-2.tga", - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator-antimeridian.tga"); } @@ -397,7 +398,7 @@ TEST_CASE("GeoJsonDocumentRasterOverlay can correctly rasterize line strings " CesiumNativeTests::checkFilesEqual( std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "out-equator-antimeridian-3.tga", - std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) / + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR) / "equator-antimeridian.tga"); } } diff --git a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp b/CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp similarity index 83% rename from Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp rename to CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp index e6e89252df..057adba53d 100644 --- a/Cesium3DTilesSelection/test/TestVectorTilesRasterOverlay.cpp +++ b/CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp @@ -1,26 +1,27 @@ -#include "Cesium3DTilesContent/ImplicitTilingUtilities.h" -#include "CesiumAsync/IAssetAccessor.h" -#include "CesiumGeometry/QuadtreeTileID.h" -#include "CesiumGeometry/QuadtreeTilingScheme.h" -#include "CesiumGeometry/Rectangle.h" -#include "CesiumGeospatial/GlobeRectangle.h" -#include "CesiumNativeTests/FileAccessor.h" -#include "CesiumNativeTests/SimpleTaskProcessor.h" -#include "CesiumNativeTests/checkFilesEqual.h" -#include "CesiumNativeTests/writeTga.h" -#include "CesiumRasterOverlays/ActivatedRasterOverlay.h" -#include "CesiumRasterOverlays/CreateRasterOverlayTileProviderParameters.h" -#include "CesiumRasterOverlays/RasterOverlay.h" -#include "CesiumRasterOverlays/RasterOverlayExternals.h" -#include "CesiumRasterOverlays/RasterOverlayTile.h" -#include "CesiumUtility/IntrusivePointer.h" -#include "CesiumVectorData/VectorStyle.h" - -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -using Cesium3DTilesSelection::VectorTilesRasterOverlay; +using CesiumVectorOverlays::VectorTilesRasterOverlay; using CesiumAsync::AsyncSystem; using CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters; using CesiumRasterOverlays::RasterOverlayOptions; @@ -28,7 +29,7 @@ using CesiumUtility::IntrusivePointer; TEST_CASE("Test VectorTilesRasterOverlay") { const std::filesystem::path dataPath = - std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR); + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR); const std::filesystem::path inputPath = dataPath / "ViennaStreets" / "tileset.json"; const std::filesystem::path referencePath = @@ -97,7 +98,7 @@ TEST_CASE("Test VectorTilesRasterOverlay") { TEST_CASE("Test VectorTilesRasterOverlay polygons") { /*const std::filesystem::path dataPath = - std::filesystem::path(Cesium3DTilesSelection_TEST_DATA_DIR);*/ + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR);*/ const std::filesystem::path inputPath = "/mnt/d/Dev/vector/data/nyc_poly/tileset.json"; /*const std::filesystem::path referencePath = diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/subtrees/0/0/0.subtree b/CesiumVectorOverlays/test/data/ViennaStreets/0/subtrees/0/0/0.subtree similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/0/subtrees/0/0/0.subtree rename to CesiumVectorOverlays/test/data/ViennaStreets/0/subtrees/0/0/0.subtree diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/0/0/0.glb b/CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/0/0/0.glb similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/0/0/0.glb rename to CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/0/0/0.glb diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/0.glb b/CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/0/0.glb similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/0.glb rename to CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/0/0.glb diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/1.glb b/CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/0/1.glb similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/0/1.glb rename to CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/0/1.glb diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/0.glb b/CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/1/0.glb similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/0.glb rename to CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/1/0.glb diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/1.glb b/CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/1/1.glb similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/0/tiles/1/1/1.glb rename to CesiumVectorOverlays/test/data/ViennaStreets/0/tiles/1/1/1.glb diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/rasterized.tga b/CesiumVectorOverlays/test/data/ViennaStreets/rasterized.tga similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/rasterized.tga rename to CesiumVectorOverlays/test/data/ViennaStreets/rasterized.tga diff --git a/Cesium3DTilesSelection/test/data/ViennaStreets/tileset.json b/CesiumVectorOverlays/test/data/ViennaStreets/tileset.json similarity index 100% rename from Cesium3DTilesSelection/test/data/ViennaStreets/tileset.json rename to CesiumVectorOverlays/test/data/ViennaStreets/tileset.json diff --git a/CesiumRasterOverlays/test/data/equator-antimeridian.tga b/CesiumVectorOverlays/test/data/equator-antimeridian.tga similarity index 100% rename from CesiumRasterOverlays/test/data/equator-antimeridian.tga rename to CesiumVectorOverlays/test/data/equator-antimeridian.tga diff --git a/CesiumRasterOverlays/test/data/equator-meridian-meters.tga b/CesiumVectorOverlays/test/data/equator-meridian-meters.tga similarity index 100% rename from CesiumRasterOverlays/test/data/equator-meridian-meters.tga rename to CesiumVectorOverlays/test/data/equator-meridian-meters.tga diff --git a/CesiumRasterOverlays/test/data/equator-meridian.tga b/CesiumVectorOverlays/test/data/equator-meridian.tga similarity index 100% rename from CesiumRasterOverlays/test/data/equator-meridian.tga rename to CesiumVectorOverlays/test/data/equator-meridian.tga diff --git a/CesiumRasterOverlays/test/data/equator.geojson b/CesiumVectorOverlays/test/data/equator.geojson similarity index 100% rename from CesiumRasterOverlays/test/data/equator.geojson rename to CesiumVectorOverlays/test/data/equator.geojson diff --git a/CesiumRasterOverlays/test/data/vienna-streets.geojson b/CesiumVectorOverlays/test/data/vienna-streets.geojson similarity index 100% rename from CesiumRasterOverlays/test/data/vienna-streets.geojson rename to CesiumVectorOverlays/test/data/vienna-streets.geojson diff --git a/README.md b/README.md index 3e1a65e32c..890e1bb831 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ Cesium Native powers Cesium's runtime integrations for [Cesium for Unreal](https | **CesiumRasterOverlays** | Classes for raster overlays, which allow draping massive 2D textures over a model. | | **CesiumUtility** | Utility functions for JSON parsing, URI processing, credits, etc. | | **CesiumVectorData** | Classes for loading vector data such as GeoJSON. | +| **CesiumVectorOverlays** | Raster overlays for displaying vector data. | ## 📗License diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 015439bfe2..eb36a9d1e1 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -23,6 +23,7 @@ if(DOXYGEN_FOUND) ../CesiumClientCommon/include ../CesiumIonClient/include ../CesiumITwinClient/include + ../CesiumVectorOverlays/include ../CesiumVectorData/include ../CesiumJsonReader/include ../CesiumJsonWriter/include From 1eac54c41e6ee47f2e3c33079b7c08472e88673c Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Fri, 15 May 2026 15:15:02 -0400 Subject: [PATCH 21/21] Real test data for polygons, ion vector tiles loading, format --- .../TilesetContentManager.h | 1 - Cesium3DTilesSelection/src/GltfModifier.cpp | 1 - .../src/RasterOverlayUpsampler.cpp | 1 - Cesium3DTilesSelection/src/Tile.cpp | 2 +- .../src/TileLoadRequester.cpp | 2 +- Cesium3DTilesSelection/src/Tileset.cpp | 4 +- .../src/TilesetContentLoader.cpp | 2 +- .../src/TilesetContentManager.cpp | 4 +- .../src/TilesetHeightQuery.cpp | 3 +- .../test/TestGltfModifier.cpp | 2 +- .../test/TestTilesetContentManager.cpp | 2 +- .../GeoJsonDocumentRasterOverlay.h | 5 +- .../VectorTilesRasterOverlay.h | 61 ++++- .../src/GeoJsonDocumentRasterOverlay.cpp | 6 +- .../src/VectorTilesRasterOverlay.cpp | 67 +++-- .../test/TestGeoJsonDocumentRasterOverlay.cpp | 2 +- .../test/TestVectorTilesRasterOverlay.cpp | 47 ++-- .../data/switzerland/0/subtrees/0/0/0.subtree | Bin 0 -> 552 bytes .../test/data/switzerland/0/tiles/0/0/0.gltf | 248 ++++++++++++++++++ .../test/data/switzerland/0/tiles/0/0/0_0.bin | Bin 0 -> 1028 bytes .../test/data/switzerland/0/tiles/1/0/0.gltf | 248 ++++++++++++++++++ .../test/data/switzerland/0/tiles/1/0/0_0.bin | Bin 0 -> 468 bytes .../test/data/switzerland/0/tiles/1/0/1.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/1/0/1_0.bin | Bin 0 -> 324 bytes .../test/data/switzerland/0/tiles/1/1/0.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/1/1/0_0.bin | Bin 0 -> 404 bytes .../test/data/switzerland/0/tiles/1/1/1.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/1/1/1_0.bin | Bin 0 -> 440 bytes .../test/data/switzerland/0/tiles/2/0/0.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/0/0_0.bin | Bin 0 -> 300 bytes .../test/data/switzerland/0/tiles/2/0/1.gltf | 248 ++++++++++++++++++ .../test/data/switzerland/0/tiles/2/0/1_0.bin | Bin 0 -> 424 bytes .../test/data/switzerland/0/tiles/2/0/2.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/0/2_0.bin | Bin 0 -> 244 bytes .../test/data/switzerland/0/tiles/2/0/3.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/0/3_0.bin | Bin 0 -> 200 bytes .../test/data/switzerland/0/tiles/2/1/0.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/1/0_0.bin | Bin 0 -> 280 bytes .../test/data/switzerland/0/tiles/2/1/1.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/1/1_0.bin | Bin 0 -> 200 bytes .../test/data/switzerland/0/tiles/2/1/2.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/1/2_0.bin | Bin 0 -> 200 bytes .../test/data/switzerland/0/tiles/2/1/3.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/1/3_0.bin | Bin 0 -> 280 bytes .../test/data/switzerland/0/tiles/2/2/0.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/2/0_0.bin | Bin 0 -> 280 bytes .../test/data/switzerland/0/tiles/2/2/1.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/2/1_0.bin | Bin 0 -> 280 bytes .../test/data/switzerland/0/tiles/2/2/2.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/2/2_0.bin | Bin 0 -> 200 bytes .../test/data/switzerland/0/tiles/2/2/3.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/2/3_0.bin | Bin 0 -> 280 bytes .../test/data/switzerland/0/tiles/2/3/1.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/3/1_0.bin | Bin 0 -> 244 bytes .../test/data/switzerland/0/tiles/2/3/2.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/3/2_0.bin | Bin 0 -> 324 bytes .../test/data/switzerland/0/tiles/2/3/3.gltf | 163 ++++++++++++ .../test/data/switzerland/0/tiles/2/3/3_0.bin | Bin 0 -> 244 bytes .../test/data/switzerland/rasterized.tga | Bin 0 -> 65554 bytes .../test/data/switzerland/tileset.json | 37 +++ 60 files changed, 3694 insertions(+), 70 deletions(-) create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/subtrees/0/0/0.subtree create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/0/0/0.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/0/0/0_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/0/0.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/0/0_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/0/1.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/0/1_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/1.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/1_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/3.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/3_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/1.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/1_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/3.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/3_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/0.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/0_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/2.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/2_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/3.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/3_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/2.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/2_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/3.gltf create mode 100644 CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/3_0.bin create mode 100644 CesiumVectorOverlays/test/data/switzerland/rasterized.tga create mode 100644 CesiumVectorOverlays/test/data/switzerland/tileset.json diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h index 485bd35536..ea55913d05 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetContentManager.h @@ -17,7 +17,6 @@ #include - namespace Cesium3DTilesSelection { /** diff --git a/Cesium3DTilesSelection/src/GltfModifier.cpp b/Cesium3DTilesSelection/src/GltfModifier.cpp index 3cb1352966..235bf7099d 100644 --- a/Cesium3DTilesSelection/src/GltfModifier.cpp +++ b/Cesium3DTilesSelection/src/GltfModifier.cpp @@ -19,7 +19,6 @@ #include #include - namespace Cesium3DTilesSelection { GltfModifier::GltfModifier() diff --git a/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp b/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp index 718ca5f8aa..4b9bd783a3 100644 --- a/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp +++ b/Cesium3DTilesSelection/src/RasterOverlayUpsampler.cpp @@ -22,7 +22,6 @@ #include #include - using namespace CesiumRasterOverlays; namespace Cesium3DTilesSelection { diff --git a/Cesium3DTilesSelection/src/Tile.cpp b/Cesium3DTilesSelection/src/Tile.cpp index 3384d66478..b5214c0e5e 100644 --- a/Cesium3DTilesSelection/src/Tile.cpp +++ b/Cesium3DTilesSelection/src/Tile.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -7,6 +6,7 @@ #include #include #include +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TileLoadRequester.cpp b/Cesium3DTilesSelection/src/TileLoadRequester.cpp index 3dd0523fd8..c67d27e371 100644 --- a/Cesium3DTilesSelection/src/TileLoadRequester.cpp +++ b/Cesium3DTilesSelection/src/TileLoadRequester.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include diff --git a/Cesium3DTilesSelection/src/Tileset.cpp b/Cesium3DTilesSelection/src/Tileset.cpp index e157a74a70..f0049dc328 100644 --- a/Cesium3DTilesSelection/src/Tileset.cpp +++ b/Cesium3DTilesSelection/src/Tileset.cpp @@ -1,7 +1,5 @@ #include "TilesetHeightQuery.h" -#include -#include #include #include #include @@ -16,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +28,7 @@ #include #include #include +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TilesetContentLoader.cpp b/Cesium3DTilesSelection/src/TilesetContentLoader.cpp index 30e9f12a65..ec64c02b9c 100644 --- a/Cesium3DTilesSelection/src/TilesetContentLoader.cpp +++ b/Cesium3DTilesSelection/src/TilesetContentLoader.cpp @@ -1,7 +1,7 @@ -#include #include #include #include +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TilesetContentManager.cpp b/Cesium3DTilesSelection/src/TilesetContentManager.cpp index f8356ea9b3..f3a8e70036 100644 --- a/Cesium3DTilesSelection/src/TilesetContentManager.cpp +++ b/Cesium3DTilesSelection/src/TilesetContentManager.cpp @@ -2,8 +2,6 @@ #include "TileContentLoadInfo.h" #include "TilesetJsonLoader.h" -#include -#include #include #include #include @@ -11,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp b/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp index 7522a1056b..033c43077d 100644 --- a/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp +++ b/Cesium3DTilesSelection/src/TilesetHeightQuery.cpp @@ -1,13 +1,12 @@ #include "TilesetHeightQuery.h" -#include - #include #include #include #include #include #include +#include #include #include #include diff --git a/Cesium3DTilesSelection/test/TestGltfModifier.cpp b/Cesium3DTilesSelection/test/TestGltfModifier.cpp index 762872b943..90144bf482 100644 --- a/Cesium3DTilesSelection/test/TestGltfModifier.cpp +++ b/Cesium3DTilesSelection/test/TestGltfModifier.cpp @@ -1,5 +1,4 @@ #include "MockTilesetContentManager.h" -#include #include #include @@ -7,6 +6,7 @@ #include #include #include +#include #include #include #include diff --git a/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp b/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp index faaa518197..b03043c3ce 100644 --- a/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp +++ b/Cesium3DTilesSelection/test/TestTilesetContentManager.cpp @@ -2,7 +2,6 @@ #include "TestTilesetJsonLoader.h" #include "TilesetJsonLoader.h" -#include #include #include #include @@ -11,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h b/CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h index b420cc9f41..acd1e7f119 100644 --- a/CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h +++ b/CesiumVectorOverlays/include/CesiumVectorOverlays/GeoJsonDocumentRasterOverlay.h @@ -1,6 +1,7 @@ #pragma once #include "Library.h" + #include #include #include @@ -86,8 +87,8 @@ class CESIUMVECTOROVERLAYS_API GeoJsonDocumentRasterOverlay final virtual ~GeoJsonDocumentRasterOverlay() override; virtual CesiumAsync::Future createTileProvider( - const CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters& parameters) - const override; + const CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters& + parameters) const override; private: CesiumAsync::Future> diff --git a/CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h b/CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h index df189afac9..796dd427ab 100644 --- a/CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h +++ b/CesiumVectorOverlays/include/CesiumVectorOverlays/VectorTilesRasterOverlay.h @@ -1,8 +1,26 @@ #include "Library.h" -#include + +#include #include +#include namespace CesiumVectorOverlays { + +/** + * @brief Options for constructing a \ref VectorTilesRasterOverlay. + */ +struct VectorTilesRasterOverlayOptions { + /** + * @brief The default style to use for features in the vector tileset when no + * other style is specified. + */ + CesiumVectorData::VectorStyle defaultStyle; + /** + * @brief HTTP headers to attach to requests made for this tileset. + */ + std::vector requestHeaders; +}; + /** * @brief A raster overlay made from rasterizing a \ref * CesiumVectorData::GeoJsonDocument. @@ -12,19 +30,42 @@ class CESIUMVECTOROVERLAYS_API VectorTilesRasterOverlay final public: /** - * @brief Creates a new EmbeddedTilesetRasterOverlayTest. + * @brief Parameters for loading a vector tiles tileset from ion. + */ + struct TilesetFromIon { + /** + * @brief The Ion asset ID. + */ + uint32_t ionAssetID; + /** + * @brief The Ion access token. + */ + std::string ionAccessToken; + /** + * @brief The Ion asset endpoint URL. + */ + std::string ionAssetEndpointUrl = "https://api.cesium.com/"; + }; + + /** + * @brief A source for a tileset, which can be either a URL or an Ion asset. + */ + using TilesetSource = std::variant; + + /** + * @brief Creates a new VectorTilesRasterOverlay. * * @param asyncSystem The async system to use. - * @param name The user-given name of this polygon layer. - * @param document The GeoJSON document to use for the overlay. - * @param vectorOverlayOptions Options to configure this - * GeoJsonDocumentRasterOverlay. + * @param name The user-given name of this layer. + * @param source The source of the tileset. + * @param vectorOptions Options to configure this + * VectorTilesRasterOverlay. * @param overlayOptions Options to use for this RasterOverlay. */ VectorTilesRasterOverlay( const std::string& name, - const std::string& url, // todo: accept factory instead of url - const CesiumVectorData::VectorStyle& defaultStyle = {}, + const TilesetSource& source, + const VectorTilesRasterOverlayOptions& vectorOptions = {}, const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions = {}); virtual ~VectorTilesRasterOverlay() override = default; @@ -34,7 +75,7 @@ class CESIUMVECTOROVERLAYS_API VectorTilesRasterOverlay final parameters) const override; private: - std::string _url; - CesiumVectorData::VectorStyle _defaultStyle; + VectorTilesRasterOverlayOptions _vectorOptions; + TilesetSource _source; }; } // namespace CesiumVectorOverlays \ No newline at end of file diff --git a/CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp b/CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp index 590ca5d8cf..3b3aed8bb9 100644 --- a/CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp +++ b/CesiumVectorOverlays/src/GeoJsonDocumentRasterOverlay.cpp @@ -12,8 +12,6 @@ #include #include #include -#include -#include #include #include #include @@ -26,6 +24,8 @@ #include #include #include +#include +#include #include #include @@ -851,4 +851,4 @@ GeoJsonDocumentRasterOverlay::createTileProvider( }); } -} // namespace CesiumRasterOverlays +} // namespace CesiumVectorOverlays diff --git a/CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp b/CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp index c5781d5874..b8fe844db7 100644 --- a/CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp +++ b/CesiumVectorOverlays/src/VectorTilesRasterOverlay.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -27,6 +26,7 @@ #include #include #include +#include #include @@ -171,9 +171,7 @@ CesiumUtility::Result vectorizeModel( CesiumGltf::getIndexAccessorView( model, pPolygonExtension->loopIndicesOffsets); - const int64_t numPolygons = std::visit( - CesiumGltf::NumIndicesFromAccessor{}, - loopIndicesOffsetsView); + const int64_t numPolygons = pPolygonExtension->count; const int64_t maxPolygonIndex = std::visit( CesiumGltf::MaxIndexValueFromAccessor{}, loopIndicesView); @@ -188,7 +186,9 @@ CesiumUtility::Result vectorizeModel( i + 1 < numPolygons ? std::visit( CesiumGltf::IndexFromAccessor{i + 1}, loopIndicesOffsetsView) - : numPolygons - 1; + : std::visit( + CesiumGltf::NumIndicesFromAccessor{}, + loopIndicesView); std::vector vertices; for (int64_t j = loopIndicesOffset; j < nextLoopIndicesOffset; @@ -585,8 +585,8 @@ class VectorTilesRasterOverlayTileProvider final VectorTilesRasterOverlayTileProvider( const IntrusivePointer& pCreator, const CreateRasterOverlayTileProviderParameters& parameters, - const std::string& url, - const CesiumVectorData::VectorStyle& defaultStyle) + const VectorTilesRasterOverlay::TilesetSource& source, + const VectorTilesRasterOverlayOptions& vectorOptions) : RasterOverlayTileProvider( pCreator, parameters, @@ -600,7 +600,16 @@ class VectorTilesRasterOverlayTileProvider final _pPrepareRendererResources( std::make_shared( parameters.externals.pLogger, - defaultStyle)) { + vectorOptions.defaultStyle)) { + const RasterOverlayOptions& overlayOptions = + (parameters.pOwner ? parameters.pOwner : pCreator)->getOptions(); + this->_options.ellipsoid = overlayOptions.ellipsoid; + this->_options.maximumScreenSpaceError = + overlayOptions.maximumScreenSpaceError; + this->_options.maximumSimultaneousTileLoads = + static_cast(overlayOptions.maximumSimultaneousTileLoads); + this->_options.requestHeaders = vectorOptions.requestHeaders; + const TilesetExternals externals{ parameters.externals.pAssetAccessor, this->_pPrepareRendererResources, @@ -611,8 +620,29 @@ class VectorTilesRasterOverlayTileProvider final TilesetSharedAssetSystem::getDefault(), nullptr}; - this->_pTilesetContentManager = - TilesetContentManager::createFromUrl(externals, TilesetOptions{}, url); + struct TilesetContentManagerVisitor { + const TilesetExternals& externals; + const TilesetOptions& options; + + IntrusivePointer + operator()(const std::string& url) { + return TilesetContentManager::createFromUrl(externals, options, url); + } + + IntrusivePointer + operator()(const VectorTilesRasterOverlay::TilesetFromIon& ion) { + return TilesetContentManager::createFromCesiumIon( + externals, + options, + ion.ionAssetID, + ion.ionAccessToken, + ion.ionAssetEndpointUrl); + } + }; + + this->_pTilesetContentManager = std::visit( + TilesetContentManagerVisitor{externals, this->_options}, + source); this->_pTilesetContentManager->registerTileRequester(this->_loadRequester); } @@ -719,26 +749,25 @@ class VectorTilesRasterOverlayTileProvider final VectorTilesRasterOverlay::VectorTilesRasterOverlay( const std::string& name, - const std::string& url, - const CesiumVectorData::VectorStyle& defaultStyle, + const TilesetSource& source, + const VectorTilesRasterOverlayOptions& vectorOptions, const CesiumRasterOverlays::RasterOverlayOptions& overlayOptions) : CesiumRasterOverlays::RasterOverlay(name, overlayOptions), - _url(url), - _defaultStyle(defaultStyle) {} + _vectorOptions(vectorOptions), + _source(source) {} CesiumAsync::Future VectorTilesRasterOverlay::createTileProvider( const CreateRasterOverlayTileProviderParameters& parameters) const { - IntrusivePointer thiz = this; return parameters.externals.asyncSystem .createResolvedFuture( IntrusivePointer( new VectorTilesRasterOverlayTileProvider( - thiz, + this, parameters, - this->_url, - this->_defaultStyle))); + this->_source, + this->_vectorOptions))); } -} // namespace Cesium3DTilesSelection \ No newline at end of file +} // namespace CesiumVectorOverlays \ No newline at end of file diff --git a/CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp b/CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp index 328cc7f243..6a8107864d 100644 --- a/CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp +++ b/CesiumVectorOverlays/test/TestGeoJsonDocumentRasterOverlay.cpp @@ -9,10 +9,10 @@ #include #include #include -#include #include #include #include +#include #include #include diff --git a/CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp b/CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp index 057adba53d..3ad44610c6 100644 --- a/CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp +++ b/CesiumVectorOverlays/test/TestVectorTilesRasterOverlay.cpp @@ -3,9 +3,9 @@ #include #include #include -#include -#include #include +#include +#include #include #include #include @@ -21,13 +21,13 @@ #include -using CesiumVectorOverlays::VectorTilesRasterOverlay; using CesiumAsync::AsyncSystem; using CesiumRasterOverlays::CreateRasterOverlayTileProviderParameters; using CesiumRasterOverlays::RasterOverlayOptions; using CesiumUtility::IntrusivePointer; +using CesiumVectorOverlays::VectorTilesRasterOverlay; -TEST_CASE("Test VectorTilesRasterOverlay") { +TEST_CASE("Test VectorTilesRasterOverlay polylines") { const std::filesystem::path dataPath = std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR); const std::filesystem::path inputPath = @@ -35,7 +35,8 @@ TEST_CASE("Test VectorTilesRasterOverlay") { const std::filesystem::path referencePath = dataPath / "ViennaStreets" / "rasterized.tga"; const std::filesystem::path tempOutPath = - std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "vector-tile-test.tga"; + std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / + "vector-tile-polylines.tga"; const glm::dvec2 imageSize(256, 256); @@ -60,7 +61,9 @@ TEST_CASE("Test VectorTilesRasterOverlay") { pOverlay.emplace( "overlay0", "file:///" + inputPath.string(), - CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, + CesiumVectorOverlays::VectorTilesRasterOverlayOptions{ + CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, + {}}, RasterOverlayOptions{}); IntrusivePointer pActivated = @@ -97,16 +100,17 @@ TEST_CASE("Test VectorTilesRasterOverlay") { } TEST_CASE("Test VectorTilesRasterOverlay polygons") { - /*const std::filesystem::path dataPath = - std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR);*/ + const std::filesystem::path dataPath = + std::filesystem::path(CesiumVectorOverlays_TEST_DATA_DIR); const std::filesystem::path inputPath = - "/mnt/d/Dev/vector/data/nyc_poly/tileset.json"; - /*const std::filesystem::path referencePath = - dataPath / "ViennaStreets" / "rasterized.tga";*/ + dataPath / "switzerland" / "tileset.json"; + const std::filesystem::path referencePath = + dataPath / "switzerland" / "rasterized.tga"; const std::filesystem::path tempOutPath = - std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / "vector-poly-test.tga"; + std::filesystem::path(CESIUM_NATIVE_TEMP_DIR) / + "vector-tile-polygons.tga"; - const glm::dvec2 imageSize(2048, 2048); + const glm::dvec2 imageSize(256, 256); // A rough rectangle around the Albertgarten in Vienna, as an arbitrary // testing area. @@ -114,14 +118,14 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { Cesium3DTilesContent::ImplicitTilingUtilities::computeBoundingVolume( CesiumGeospatial::BoundingRegion{ CesiumGeospatial::GlobeRectangle{ - -1.2960028825865837, - 0.7068309334853016, - -1.2863087490444578, - 0.7141023380205147}, + 0.10511435661024317, + 0.7989584641142331, + 0.18225951525130435, + 0.8348054325550944}, 0, 0.005, CesiumGeospatial::Ellipsoid::WGS84}, - CesiumGeometry::QuadtreeTileID(3, 5, 3), + CesiumGeometry::QuadtreeTileID(1, 0, 0), CesiumGeospatial::Ellipsoid::WGS84); const CesiumGeospatial::GlobeRectangle& tileGlobeRectangle = tileRegion.getRectangle(); @@ -135,13 +139,14 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { CreateRasterOverlayTileProviderParameters parameters{ {pAssetAccessor, nullptr, asyncSystem}}; RasterOverlayOptions options; - options.maximumScreenSpaceError = 1.0; IntrusivePointer pOverlay; pOverlay.emplace( "overlay0", "file:///" + inputPath.string(), - CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, + CesiumVectorOverlays::VectorTilesRasterOverlayOptions{ + CesiumVectorData::VectorStyle{CesiumUtility::Color(255, 0, 0, 255)}, + {}}, options); IntrusivePointer pActivated = @@ -174,5 +179,5 @@ TEST_CASE("Test VectorTilesRasterOverlay polygons") { REQUIRE(pTile->getImage()->width > 1); CesiumNativeTests::writeImageToTgaFile(*pTile->getImage(), tempOutPath); - // CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); + CesiumNativeTests::checkFilesEqual(tempOutPath, referencePath); } \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/subtrees/0/0/0.subtree b/CesiumVectorOverlays/test/data/switzerland/0/subtrees/0/0/0.subtree new file mode 100644 index 0000000000000000000000000000000000000000..466d7186d0b683acac37868323090e0584a6271e GIT binary patch literal 552 zcmb7?%}T>S5XYzJO{5PXXxMWOX&R*F=3Vh1co7Ln-PnZ~A=xTbLVOTGAIG;ydntH| zM`^7P5qE>G!x68@W|on?k$U{xT_(5uU> zr@BIl=eHf0Qk#1Z+Kk*^)_E&0#H>)v z0;HLNm|NAFw~_br{KM`s(xdptM$<90K&>F9$`Q66)52OYD&RCY9_ z&C26$Ce!iXAIy(B%x3bC|GfBEp5NvpH`1QDvl%rW-!8iOh-mFR_d70~$2m_X9y$J` z*?m@=-|;X8fg?N0_qlB?+<1K5BHbf0OMQ+VyR!TEl1COt_UM=%-^tQ@{6)IJ5!Srk z<7v)YkM;XLI^4SD>hXX^nd8gvw;XBOeepQoFL^homB~jQu(}_=+27-?kuPzCyVd`A z^U=fZIcYUVJc1`5yOp@!J;p@!h`-A-mt~n(+++1;Xb?h)S~bKPSn zF?vio_~r<5_zX3+Phx3tVqRV<$lahcq=Fj*!+PMHyG!4{H56=D<~V zB-xW~OyZ_k1wZC0X6xkk{ za3TLV>%5#}@2ch;_Rr2d{x6Nwoz-K{;ipHvj-TSxcE7P<%VA`DDP{X4mKG=G<)wnm q0r}Y{*v}PaCMZmT%QH)=Qj2mD^HN~K4BSALvjJ7KIhkAIXsab&K_r9%lv#E&=lUvT^OM)xptRo~GU z2kYG2KW;v_ucF$`;0vewiqJQQJfHNtt9;;aPxN6rf?@%QoZ#}zlB(3AoW#5oxK3^$ O%h|&f&IkDm9{>Qmv^Bv1 literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0.gltf new file mode 100644 index 0000000000..98813975ff --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 21, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 10, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "max": [99187.6171875, 51083.171875, -9.111007690429688], + "min": [-69046.234375, -38319.22265625, -974.8004150390625] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 9, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "0_0.bin", + "byteLength": 404 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 84, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 88, + "byteLength": 40 + }, { + "buffer": 0, + "byteOffset": 128, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 136, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 144, + "byteLength": 108 + }, { + "buffer": 0, + "byteOffset": 256, + "byteLength": 72 + }, { + "buffer": 0, + "byteOffset": 328, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 344, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 352, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 360, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 368, + "byteLength": 36 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 9, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.1586035378654843, 0.0, -0.9873423508472388, 0.0, -0.7144309482207674, 0.690230152557063, 0.11476391734961425, 0.0, 0.6814934614513388, 0.7235898952452652, -0.10947294413698315, 0.0, 4354296.393426199, 4592315.111855932, -699460.3364473367, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/1/1/0_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..ed47faee771b537c6a6cb95b01393b84845ba61c GIT binary patch literal 404 zcmZQ%fB+641;Xq=%m&4*K$-=JnSq!Ih#7$xqy{7p6Nia`#9?AUCK!O^K>9%XL2@AT zKzc!TfYkp70w9F~&hI?vuG8)AZne4iNcWVT?qQn>+{C<1kI0uz? zW$I#wzV2~!|Lo3ly#4N^!|!gbasM4Cc3jlg?8vIVRqj5)w#U=GosS#}nR9&EPTS*- zi?xp&|3340oQ{&abei;$mtDQbul6XqKl0-^QhGo3xTbZzyWbO`BNz^$P$0NGv!p7u XC?_#51#S{Ikmc;*3g?5uhgbjrfA~kU literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0.gltf new file mode 100644 index 0000000000..9ba7a9cbd3 --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 9, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 8, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 7, + "type": "VEC3", + "max": [45092.48046875, 12190.2099609375, -13.150993347167969], + "min": [-40426.2265625, -36790.65234375, -265.3970947265625] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 7, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "0_0.bin", + "byteLength": 300 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 36, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 40, + "byteLength": 32 + }, { + "buffer": 0, + "byteOffset": 72, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 80, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 88, + "byteLength": 84 + }, { + "buffer": 0, + "byteOffset": 176, + "byteLength": 56 + }, { + "buffer": 0, + "byteOffset": 232, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 248, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 256, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 264, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 272, + "byteLength": 28 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 7, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.11401954914563536, 0.0, -0.9934785062660522, 0.0, -0.7168398718616209, 0.6923670980460026, 0.08227028414179788, 0.0, 0.6878518303545038, 0.7215454258349623, -0.07894338436247712, 0.0, 4394878.586488654, 4579294.294776257, -504391.4607318632, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/0_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..1666c53ee2f81f3ee22d31ccd7f8b72bf179ca70 GIT binary patch literal 300 zcmZQ$U|?VcViq7~24W^4W`wdqG%^73LGmDVAoU=9Y(V@U2!Ip{;MuR|e!arZtqekL{LsA}6>!v!p7uC?_#51+J4D$a3~@h4VrF G!Uq7{|1t^y literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1.gltf new file mode 100644 index 0000000000..e61a534ff2 --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1.gltf @@ -0,0 +1,248 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 18, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 9, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 1, + "type": "VEC3", + "max": [6867.89111328125, 1602.935791015625, -3.8928141593933105], + "min": [6867.89111328125, 1602.935791015625, -3.8928141593933105] + }, { + "bufferView": 16, + "componentType": 5126, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 6, + "componentType": 5126, + "count": 8, + "type": "VEC3", + "max": [44934.78125, 33390.08203125, -6.413372993469238], + "min": [-40169.8359375, -23850.353515625, -242.5794219970703] + }, { + "bufferView": 17, + "componentType": 5126, + "count": 8, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "1_0.bin", + "byteLength": 424 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 72, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 72, + "byteLength": 36 + }, { + "buffer": 0, + "byteOffset": 112, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 120, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 128, + "byteLength": 12 + }, { + "buffer": 0, + "byteOffset": 144, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 152, + "byteLength": 96 + }, { + "buffer": 0, + "byteOffset": 248, + "byteLength": 64 + }, { + "buffer": 0, + "byteOffset": 312, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 320, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 328, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 336, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 344, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 360, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 368, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 376, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 384, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 392, + "byteLength": 32 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "mode": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 1, + "attribute": 0, + "propertyTable": 0 + }] + } + } + }, { + "attributes": { + "_FEATURE_ID_0": 7, + "POSITION": 6 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 8, + "attribute": 0, + "propertyTable": 1 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.11397460211319871, 0.0, -0.9934836637172945, 0.0, -0.720707232736441, 0.6882913051365256, 0.08268109792957277, 0.0, 0.6838061675317936, 0.7254344072853576, -0.07844772764090975, 0.0, 4369112.2934561875, 4604062.773495539, -501234.04482698743, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + }, + "vector_point": { + "name": "vector_point", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_point", + "class": "vector_point", + "count": 1, + "properties": { + "_id": { + "values": 10, + "stringOffsets": 11 + }, + "name": { + "values": 8, + "stringOffsets": 9 + } + } + }, { + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 14, + "stringOffsets": 15 + }, + "name": { + "values": 12, + "stringOffsets": 13 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/1_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c55d1a10ebb26f3f613d468a17c99fb7a5ee286 GIT binary patch literal 424 zcmZQ%fB<$N1;T7V%nHRUK$;nfnSeAS5QEf!Jbr;QJau1zSbofM@zB>!=&ST5@ybiBEKHGI`$gX3S z8CHj^EJBZVTwppDWp(y|fh6zo^roH1isOV1UwbKYe3}2wW7b7lhedP5kEd@t;8qf? zdf4>j$72SPOzzPfN{5l{B8TmhSX!KzmzN6C%K^kb!G5kVb3lF%F3&8fN-fGs%u9g@ TGjIc0&K_`O;BbOV5?}xT7HvQW literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2.gltf new file mode 100644 index 0000000000..d61a758887 --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 9, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 5, + "type": "VEC3", + "max": [26108.681640625, 23549.765625, -32.14739227294922], + "min": [-49352.8125, -33532.9765625, -278.1030578613281] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 5, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "2_0.bin", + "byteLength": 244 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 36, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 40, + "byteLength": 24 + }, { + "buffer": 0, + "byteOffset": 64, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 72, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 80, + "byteLength": 60 + }, { + "buffer": 0, + "byteOffset": 144, + "byteLength": 40 + }, { + "buffer": 0, + "byteOffset": 184, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 200, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 208, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 216, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 224, + "byteLength": 20 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 5, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.11815435504334383, 0.0, -0.9929952408668892, 0.0, -0.7274828656776483, 0.6806436420522631, 0.08656161204175233, 0.0, 0.6758758972842038, 0.7326146548724167, -0.08042101054103774, 0.0, 4318594.482147623, 4649796.656598669, -513860.21275030077, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/0/2_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..10d495f24520fe254f090718268f064c680ca13b GIT binary patch literal 244 zcmZQ%fB+UC#SFwuK+FimFfkw(3_#)_d5}7g+cU+UpV1#Tri92xFK)%;m1qnANhH5uG_n542RMf4j;MIwcTwMzuqAfg9vbf c%QH)=Qj2mD^HSg{xq&Qa4_7!J- zv!n8keVUN!#yp4T(7HddZq+k)xazq~If$Ye3n#cdv!p7uC?_#51un}CWI21d!ucTg GpaTE_TOU{e literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0.gltf new file mode 100644 index 0000000000..004bedaf0c --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 7, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 6, + "type": "VEC3", + "max": [46968.9296875, 29776.17578125, -46.734718322753906], + "min": [-38636.8359375, -27415.23046875, -241.14227294921875] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 6, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "0_0.bin", + "byteLength": 280 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 48, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 48, + "byteLength": 28 + }, { + "buffer": 0, + "byteOffset": 80, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 88, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 96, + "byteLength": 72 + }, { + "buffer": 0, + "byteOffset": 168, + "byteLength": 48 + }, { + "buffer": 0, + "byteOffset": 216, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 232, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 240, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 248, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 256, + "byteLength": 24 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 6, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.13269007930091703, 0.0, -0.9911575772071344, 0.0, -0.7132691529966403, 0.6943551978049597, 0.09548808650659515, 0.0, 0.6882154155775443, 0.7196324473515876, -0.09213404625974402, 0.0, 4397160.915851431, 4567111.267709436, -588664.8541468867, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/0_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..c80c0ea6c59db0defaf411488266dc5391e9575a GIT binary patch literal 280 zcmZQ%fB;q?1;Q*q%nZd$K$;PXL2@8*5CDmR`l-9eLgaiw q?Bg&tP|b0e8Whb~IKkzaB~__KIf;2Ga9M63%h|&f&Ih>%9RL6XIw5`l literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2.gltf new file mode 100644 index 0000000000..8f1b06b718 --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 5, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [42174.671875, 28689.7421875, -201.1509552001953], + "min": [-42174.671875, -28392.14453125, -202.47071838378906] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 4, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "2_0.bin", + "byteLength": 200 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 24, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 24, + "byteLength": 20 + }, { + "buffer": 0, + "byteOffset": 48, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 56, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 64, + "byteLength": 48 + }, { + "buffer": 0, + "byteOffset": 112, + "byteLength": 32 + }, { + "buffer": 0, + "byteOffset": 144, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 160, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 168, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 176, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 184, + "byteLength": 16 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 4, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.13364274095011183, 0.0, -0.9910295746300114, 0.0, -0.7255078715498803, 0.6812241543458747, 0.09783649551629783, 0.0, 0.6751132839090814, 0.7320748947585541, -0.09104066318820472, 0.0, 4313710.211392141, 4646358.539507289, -581714.2808580255, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/1/2_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b7ed1ea95f6982998a3e4ef55240799b828580b GIT binary patch literal 200 zcmZQ%fBvrom{>%!e*jTK%X p_Hh^+sOC6K4T@$goZ#}zlB(3AoW#5oxGXo2DcDITMw!4U3j!9rux{@fXxRRo=rH`o_EM)_QM+ozwSSLOw_UNsK<8C xL&xL}AA5hJ#7#%P;}C|y1O$T1GfS#ci*ge4Qs64Nfh=baS2!Q$AGiP#0{}ylGO7Ro literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1.gltf new file mode 100644 index 0000000000..705b585098 --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 7, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 6, + "type": "VEC3", + "max": [33316.95703125, 33205.85546875, -40.15726089477539], + "min": [-51756.14453125, -24071.16796875, -292.2671203613281] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 6, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "1_0.bin", + "byteLength": 280 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 48, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 48, + "byteLength": 28 + }, { + "buffer": 0, + "byteOffset": 80, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 88, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 96, + "byteLength": 72 + }, { + "buffer": 0, + "byteOffset": 168, + "byteLength": 48 + }, { + "buffer": 0, + "byteOffset": 216, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 232, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 240, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 248, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 256, + "byteLength": 24 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 6, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.15478506069611894, 0.0, -0.9879481691795876, 0.0, -0.7167169957433879, 0.688264205573533, 0.11229038845246785, 0.0, 0.679969361808215, 0.7254601183567801, -0.10653301683466533, 0.0, 4344597.944820786, 4604226.529050906, -680682.3248103786, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/2/1_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..634cf09d8bb7d4e2c67ddd02cdaeca5ce5de2f45 GIT binary patch literal 280 zcmZQ%fB;q?1;Q*q%nZa#K+FilFmad|PzWpzk_U-_)PvOg2Ld340S=fkx=#b*&^GPE zUsaggyTTQY9dh1xD9C!bTZH%XqnryB4)wO?xrOoVIac(v?vSdE*YUENUB`H0>JDeR sc^tpJmC@Z$Y0_Z~g9!)(muHq#r55ER=B2<@asye;9vrom{>%!e*jTK%X p_Hh^+sOC6K4T@$goZ#}zlB(3AoW#5oxGXo2f_A2Ld340c-@^+_xlcb`3o2 zeV9?+-CbSj__4Dgb%)an{vDIlIB~46mF@6CroYF0zCCkYv2D#EN1xNjE_FY46`PTA usCBo>F&p!*Ze~1d4q+HfKp?n0v!p7uC?_#51+J1C$a3~@h4Vq~#{~c$8!dJK literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1.gltf b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1.gltf new file mode 100644 index 0000000000..e434a381db --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1.gltf @@ -0,0 +1,163 @@ +{ + "extensionsUsed": ["EXT_mesh_features", "EXT_structural_metadata", "EXT_mesh_polygon"], + "accessors": [{ + "bufferView": 0, + "componentType": 5125, + "count": 9, + "type": "SCALAR" + }, { + "bufferView": 1, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, { + "bufferView": 2, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 3, + "componentType": 5125, + "count": 1, + "type": "SCALAR" + }, { + "bufferView": 4, + "componentType": 5126, + "count": 5, + "type": "VEC3", + "max": [41827.92578125, 26806.783203125, -61.17095947265625], + "min": [-41493.96484375, -27694.400390625, -193.32501220703125] + }, { + "bufferView": 10, + "componentType": 5126, + "count": 5, + "type": "SCALAR" + }], + "asset": { + "version": "2.0" + }, + "buffers": [{ + "uri": "1_0.bin", + "byteLength": 244 + }], + "bufferViews": [{ + "buffer": 0, + "byteLength": 36, + "target": 34963 + }, { + "buffer": 0, + "byteOffset": 40, + "byteLength": 24 + }, { + "buffer": 0, + "byteOffset": 64, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 72, + "byteLength": 4 + }, { + "buffer": 0, + "byteOffset": 80, + "byteLength": 60 + }, { + "buffer": 0, + "byteOffset": 144, + "byteLength": 40 + }, { + "buffer": 0, + "byteOffset": 184, + "byteLength": 11 + }, { + "buffer": 0, + "byteOffset": 200, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 208, + "byteLength": 3 + }, { + "buffer": 0, + "byteOffset": 216, + "byteLength": 8 + }, { + "buffer": 0, + "byteOffset": 224, + "byteLength": 20 + }], + "meshes": [{ + "primitives": [{ + "attributes": { + "_FEATURE_ID_0": 5, + "POSITION": 4 + }, + "indices": 0, + "extensions": { + "EXT_mesh_features": { + "featureIds": [{ + "featureCount": 5, + "attribute": 0, + "propertyTable": 0 + }] + }, + "EXT_mesh_polygon": { + "count": 1, + "loopIndices": 1, + "loopIndicesOffsets": 2, + "indicesOffsets": 3 + } + } + }] + }], + "nodes": [{ + "matrix": [-0.17154025724543065, 0.0, -0.9851771110537291, 0.0, -0.7153798634785025, 0.6875432736342824, 0.12456282675715831, 0.0, 0.6773518960434457, 0.726143406552903, -0.11794135002659029, 0.0, 4327888.321725694, 4608578.460416425, -753577.2681972428, 1.0], + "mesh": 0 + }], + "scene": 0, + "scenes": [{ + "nodes": [0] + }], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "id": "schema_id", + "name": "schema_name", + "description": "description_vector", + "version": "version", + "classes": { + "vector_polygon": { + "name": "vector_polygon", + "description": "description", + "properties": { + "_id": { + "name": "_id", + "description": "attribute description", + "type": "STRING" + }, + "name": { + "name": "name", + "description": "attribute description", + "type": "STRING" + } + } + } + } + }, + "propertyTables": [{ + "name": "vector_polygon", + "class": "vector_polygon", + "count": 1, + "properties": { + "_id": { + "values": 8, + "stringOffsets": 9 + }, + "name": { + "values": 6, + "stringOffsets": 7 + } + } + }] + } + } +} \ No newline at end of file diff --git a/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1_0.bin b/CesiumVectorOverlays/test/data/switzerland/0/tiles/2/3/1_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..73ff5fd77f370d2a9eee37cc710c260f8249108d GIT binary patch literal 244 zcmZQ%fB+UC1;Wfg%ml@ZP%$6{1|U924x|R8_CF8+DHP!SR^j;ll#6b&O>GaqO;&cF zn0wL9B-rurgCm0O6aH`>TW3FGe<1uGbnZqas5#R)u bXO>i@7Ud-7rNC8k16j@tROLy3O>7WQFg58J%>w`xUn`LeJNJNsn(=gblI z9N2sD@79gz;?Y~8-%~ogIf&#k%;i;#$DM9{+l-of29Yv82qcMgg-a#%3ko_vPJkS zJ-Ef-zipfF=f+*x3;w%y34f&rw;23uYJ@*G?#f>9-?K;fD?PZy;J+6&M-;{Pgeh{r#LDaoF(f9BE=Vz+iVNVDA&z$j>$L-rhSYt>9dEW3>?{s_?{Lh{9 zr#wh|#}1u~Wp2mG&HGgFq&pNTM+NGFUMWhPHAo8*|jw%~u` zhW`1F=KRTw>&RDKf3=^CgqlEGGmsg8~ES9pMF~V_7P#-_-un8zdaId zl<&#;f`3y}^8Y7l_wF6h^y%4Bk6kZw&-JxWWMSev_&<82SBCTFiTd=3u`}@r`;C43 zrkB47dnJu{t-=54)A(bF8lmrg)heRAJQKuQrg7v*>iiSSBj3&G1^%h_`@^&0@Zl|) znLILOiaC44H`3D*{NKLyz6O1C9XgmK?VXnN2Yc%ugfD~thY#`jzj#4}HDQAcJ9oyH zAqd+gkLd63FJEHXA3H|Wt5=ZZqj^bxaEw8aeu?^z=R5eoqD8@T|3Alj_j02_kb2ve z7x-h}PwWAg>#%;k@DJKQz#q?FHiUltq(3+p{B2;b%5d?bv;jf-0P4R@Vg7vK&zXPM zuF@aOnLpa1!-u5}2+9X+YyZK2@?_!9nLpkodi6?tAP66@vHqhCz`TJV?B||`t^7xh z6#hZ@rmg(Z2Hd?XKH#?x*vx<3I^oZmzw`(D@BcQ}f7}BuT<~85zw4OI>D$hK-aO&& zr~lZ_U;2an^?%#>;~sG6kiQ!ES-)&g+XeoUCJBGP{Ky6V=nqcyj=Epka7fn${*JE^pK2hJk@_w+X zb_Z*4;-2bSz#Mc_8gNc$@nYA=N6R~RuJF&+Zx0-BlRZj}HD|tl6(7jd2X5UW>e$g; z{wTTZSCN_jfBIy{Jilzc4|CHq^?%OSnOwIiTZY+OFa5#k`#<_m!xUuCQhgt|a>brG zzNUPzuu$KA&TT%{SvS3An<<9brX&5qsp~*~Cq)Z%g!fPneL}ZuxIa0qkcGrnTiaZHn0@pY#;KSds2N zXExRK#Il?{%VS(ek7{~n4IJq9JmM!$abg-*JU_cKZd_aIhNiBS67R#?K5pFDNYuHrYs$J)-h~V8eHOr;Y(s{) zqou1QwRPNh_H0)bb+6pEjT`UY?Vg6Nm)MqZ0CP4~)=apPRfEq?ZlsIHC( z>)Vu+$a_4w^c;*EpFHW`GvUXNM0jT%_nWdZqTao8X|3e#rGTk%<6pm`V~@D6R8$ZZ z6iDB_m)0`dp@9f%4wRP@_3s}hJO2T%^ypCl literal 0 HcmV?d00001 diff --git a/CesiumVectorOverlays/test/data/switzerland/tileset.json b/CesiumVectorOverlays/test/data/switzerland/tileset.json new file mode 100644 index 0000000000..612b4bc7d6 --- /dev/null +++ b/CesiumVectorOverlays/test/data/switzerland/tileset.json @@ -0,0 +1,37 @@ +{ + "asset": { + "version": "1.1" + }, + "geometricError": 157423.360580457, + "root": { + "boundingVolume": { + "region": [0.10511435661024317, 0.7989584641142331, 0.18225951525130435, 0.8348054325550944, 0.0, 0.005] + }, + "geometricError": 78711.6802902285, + "refine": "REPLACE", + "children": [{ + "boundingVolume": { + "region": [0.10511435661024317, 0.7989584641142331, 0.18225951525130435, 0.8348054325550944, 0.0, 0.005] + }, + "geometricError": 39355.84014511425, + "refine": "REPLACE", + "content": { + "uri": "0/tiles/{level}/{x}/{y}.gltf", + "extensions": { + "3DTILES_content_gltf_vector": { + "vector": true + } + } + }, + "implicitTiling": { + "subdivisionScheme": "QUADTREE", + "subtreeLevels": 2, + "availableLevels": 2, + "subtrees": { + "uri": "0/subtrees/{level}/{x}/{y}.subtree" + } + } + }] + }, + "extensionsUsed": ["3DTILES_content_gltf_vector"] +} \ No newline at end of file