diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e7a2ee1..ba95ad6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,6 +197,7 @@ if(CESIUM_OMNI_ENABLE_TRACING) endif() set(CESIUM_OMNI_CXX_DEFINES ${CESIUM_OMNI_CXX_DEFINES} CESIUM_OMNI_VERSION="${PROJECT_VERSION}") +set(CESIUM_OMNI_CXX_DEFINES ${CESIUM_OMNI_CXX_DEFINES} CESIUM_DISABLE_DEFAULT_ELLIPSOID) # Add a define CESIUM_OMNI_GIT_HASH_ABBREVIATED execute_process( diff --git a/src/core/include/cesium/omniverse/OmniRasterOverlay.h b/src/core/include/cesium/omniverse/OmniRasterOverlay.h index f1b89de1..037063a1 100644 --- a/src/core/include/cesium/omniverse/OmniRasterOverlay.h +++ b/src/core/include/cesium/omniverse/OmniRasterOverlay.h @@ -44,11 +44,12 @@ class OmniRasterOverlay { protected: [[nodiscard]] virtual CesiumRasterOverlays::RasterOverlay* getRasterOverlay() const = 0; + [[nodiscard]] const CesiumGeospatial::Ellipsoid& getEllipsoid() const; + Context* _pContext; pxr::SdfPath _path; private: - [[nodiscard]] const CesiumGeospatial::Ellipsoid* getEllipsoid() const; void setRasterOverlayOptionsFromUsd(CesiumRasterOverlays::RasterOverlayOptions& options) const; }; } // namespace cesium::omniverse diff --git a/src/core/include/cesium/omniverse/OmniTileset.h b/src/core/include/cesium/omniverse/OmniTileset.h index b5014eba..809cdb58 100644 --- a/src/core/include/cesium/omniverse/OmniTileset.h +++ b/src/core/include/cesium/omniverse/OmniTileset.h @@ -54,7 +54,7 @@ class OmniTileset { [[nodiscard]] const pxr::SdfPath& getPath() const; [[nodiscard]] int64_t getTilesetId() const; [[nodiscard]] TilesetStatistics getStatistics() const; - [[nodiscard]] const CesiumGeospatial::Ellipsoid* getEllipsoid() const; + [[nodiscard]] const CesiumGeospatial::Ellipsoid& getEllipsoid() const; [[nodiscard]] TilesetSourceType getSourceType() const; [[nodiscard]] std::string getUrl() const; diff --git a/src/core/include/cesium/omniverse/UsdUtil.h b/src/core/include/cesium/omniverse/UsdUtil.h index 77afb253..fb6d3ffa 100644 --- a/src/core/include/cesium/omniverse/UsdUtil.h +++ b/src/core/include/cesium/omniverse/UsdUtil.h @@ -92,7 +92,8 @@ Cesium3DTilesSelection::ViewState computeViewState( const Context& context, const pxr::SdfPath& georeferencePath, const pxr::SdfPath& primPath, - const Viewport& viewport); + const Viewport& viewport, + const CesiumGeospatial::Ellipsoid& ellipsoid); bool primExists(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); bool isSchemaValid(const pxr::UsdSchemaBase& schema); diff --git a/src/core/src/OmniRasterOverlay.cpp b/src/core/src/OmniRasterOverlay.cpp index e553caa1..a7b0779b 100644 --- a/src/core/src/OmniRasterOverlay.cpp +++ b/src/core/src/OmniRasterOverlay.cpp @@ -116,14 +116,9 @@ FabricOverlayRenderMethod OmniRasterOverlay::getOverlayRenderMethod() const { CesiumRasterOverlays::RasterOverlayOptions OmniRasterOverlay::createRasterOverlayOptions() const { CesiumRasterOverlays::RasterOverlayOptions options; options.ktx2TranscodeTargets = GltfUtil::getKtx2TranscodeTargets(); + options.ellipsoid = getEllipsoid(); setRasterOverlayOptionsFromUsd(options); - const auto pEllipsoid = getEllipsoid(); - - if (pEllipsoid) { - options.ellipsoid = *pEllipsoid; - } - return options; } @@ -134,23 +129,16 @@ void OmniRasterOverlay::updateRasterOverlayOptions() const { } } -const CesiumGeospatial::Ellipsoid* OmniRasterOverlay::getEllipsoid() const { - std::optional maybeEllipsoid; - +const CesiumGeospatial::Ellipsoid& OmniRasterOverlay::getEllipsoid() const { const auto& tilesets = _pContext->getAssetRegistry().getTilesets(); for (const auto& pTileset : tilesets) { if (CppUtil::contains(pTileset->getRasterOverlayPaths(), _path)) { - const auto pEllipsoid = pTileset->getEllipsoid(); - if (!maybeEllipsoid) { - maybeEllipsoid = pEllipsoid; - } else if (*maybeEllipsoid != pEllipsoid) { - // If not all tilesets that reference this raster overlay use the same ellipsoid then set it to nullptr - return nullptr; - } + // Just use the first tileset's ellipsoid + return pTileset->getEllipsoid(); } } - return maybeEllipsoid.value_or(nullptr); + return CesiumGeospatial::Ellipsoid::WGS84; } void OmniRasterOverlay::setRasterOverlayOptionsFromUsd(CesiumRasterOverlays::RasterOverlayOptions& options) const { diff --git a/src/core/src/OmniTileMapServiceRasterOverlay.cpp b/src/core/src/OmniTileMapServiceRasterOverlay.cpp index b1cc01ad..6ff639ed 100644 --- a/src/core/src/OmniTileMapServiceRasterOverlay.cpp +++ b/src/core/src/OmniTileMapServiceRasterOverlay.cpp @@ -86,6 +86,8 @@ void OmniTileMapServiceRasterOverlay::reload() { tmsOptions.maximumLevel = getMaximumZoomLevel(); } + tmsOptions.ellipsoid = getEllipsoid(); + _pTileMapServiceRasterOverlay = new CesiumRasterOverlays::TileMapServiceRasterOverlay( rasterOverlayName, getUrl(), std::vector(), tmsOptions, options); } diff --git a/src/core/src/OmniTileset.cpp b/src/core/src/OmniTileset.cpp index 2abcd7fa..0aa8dd80 100644 --- a/src/core/src/OmniTileset.cpp +++ b/src/core/src/OmniTileset.cpp @@ -107,18 +107,18 @@ TilesetStatistics OmniTileset::getStatistics() const { return statistics; } -const CesiumGeospatial::Ellipsoid* OmniTileset::getEllipsoid() const { +const CesiumGeospatial::Ellipsoid& OmniTileset::getEllipsoid() const { const auto georeferencePath = getResolvedGeoreferencePath(); if (georeferencePath.IsEmpty()) { - return nullptr; + return CesiumGeospatial::Ellipsoid::WGS84; } const auto pGeoreference = _pContext->getAssetRegistry().getGeoreference(georeferencePath); if (!pGeoreference) { - return nullptr; + return CesiumGeospatial::Ellipsoid::WGS84; } - return &pGeoreference->getEllipsoid(); + return pGeoreference->getEllipsoid(); } TilesetSourceType OmniTileset::getSourceType() const { @@ -564,12 +564,7 @@ void OmniTileset::reload() { options.culledScreenSpaceError = getCulledScreenSpaceError(); options.mainThreadLoadingTimeLimit = getMainThreadLoadingTimeLimit(); options.showCreditsOnScreen = getShowCreditsOnScreen(); - - const auto pEllipsoid = getEllipsoid(); - - if (pEllipsoid) { - options.ellipsoid = *pEllipsoid; - } + options.ellipsoid = getEllipsoid(); options.loadErrorCallback = [this, tilesetPath, ionAssetId, name](const Cesium3DTilesSelection::TilesetLoadFailureDetails& error) { @@ -725,7 +720,8 @@ void OmniTileset::updateView(const gsl::span& viewports, bool wa _viewStates.clear(); for (const auto& viewport : viewports) { - _viewStates.push_back(UsdUtil::computeViewState(*_pContext, georeferencePath, _path, viewport)); + _viewStates.push_back( + UsdUtil::computeViewState(*_pContext, georeferencePath, _path, viewport, getEllipsoid())); } if (waitForLoadingTiles) { @@ -786,7 +782,8 @@ bool OmniTileset::updateExtent() { } const auto& boundingVolume = pRootTile->getBoundingVolume(); - const auto ecefObb = Cesium3DTilesSelection::getOrientedBoundingBoxFromBoundingVolume(boundingVolume); + const auto ecefObb = + Cesium3DTilesSelection::getOrientedBoundingBoxFromBoundingVolume(boundingVolume, getEllipsoid()); const auto georeferencePath = getResolvedGeoreferencePath(); const auto ecefToStageTransform = UsdUtil::computeEcefToStageTransform(*_pContext, georeferencePath); const auto primObb = ecefObb.transform(ecefToStageTransform); diff --git a/src/core/src/OmniWebMapServiceRasterOverlay.cpp b/src/core/src/OmniWebMapServiceRasterOverlay.cpp index 8f85f44a..1e9354e8 100644 --- a/src/core/src/OmniWebMapServiceRasterOverlay.cpp +++ b/src/core/src/OmniWebMapServiceRasterOverlay.cpp @@ -114,6 +114,7 @@ void OmniWebMapServiceRasterOverlay::reload() { wmsOptions.layers = layers; wmsOptions.tileWidth = tileWidth; wmsOptions.tileHeight = tileHeight; + wmsOptions.ellipsoid = getEllipsoid(); _pWebMapServiceRasterOverlay = new CesiumRasterOverlays::WebMapServiceRasterOverlay( rasterOverlayName, getBaseUrl(), std::vector(), wmsOptions, options); diff --git a/src/core/src/OmniWebMapTileServiceRasterOverlay.cpp b/src/core/src/OmniWebMapTileServiceRasterOverlay.cpp index 1c970039..efba0546 100644 --- a/src/core/src/OmniWebMapTileServiceRasterOverlay.cpp +++ b/src/core/src/OmniWebMapTileServiceRasterOverlay.cpp @@ -295,21 +295,22 @@ void OmniWebMapTileServiceRasterOverlay::reload() { wmtsOptions.maximumLevel = getMaximumZoomLevel(); } - CesiumGeospatial::Projection projection; + const auto& ellipsoid = getEllipsoid(); + + wmtsOptions.ellipsoid = ellipsoid; + const auto useWebMercatorProjection = getUseWebMercatorProjection(); if (useWebMercatorProjection) { - projection = CesiumGeospatial::WebMercatorProjection(); - wmtsOptions.projection = projection; + wmtsOptions.projection = CesiumGeospatial::WebMercatorProjection(ellipsoid); } else { - projection = CesiumGeospatial::GeographicProjection(); - wmtsOptions.projection = projection; + wmtsOptions.projection = CesiumGeospatial::GeographicProjection(ellipsoid); } if (getSpecifyTilingScheme()) { CesiumGeospatial::GlobeRectangle globeRectangle = CesiumGeospatial::GlobeRectangle::fromDegrees(getWest(), getSouth(), getEast(), getNorth()); CesiumGeometry::Rectangle coverageRectangle = - CesiumGeospatial::projectRectangleSimple(projection, globeRectangle); + CesiumGeospatial::projectRectangleSimple(wmtsOptions.projection.value(), globeRectangle); wmtsOptions.coverageRectangle = coverageRectangle; const auto rootTilesX = getRootTilesX(); const auto rootTilesY = getRootTilesY(); diff --git a/src/core/src/UsdUtil.cpp b/src/core/src/UsdUtil.cpp index 90e03d20..82aa0ec6 100644 --- a/src/core/src/UsdUtil.cpp +++ b/src/core/src/UsdUtil.cpp @@ -219,7 +219,8 @@ Cesium3DTilesSelection::ViewState computeViewState( const Context& context, const pxr::SdfPath& georeferencePath, const pxr::SdfPath& primPath, - const Viewport& viewport) { + const Viewport& viewport, + const CesiumGeospatial::Ellipsoid& ellipsoid) { const auto& viewMatrix = viewport.viewMatrix; const auto& projMatrix = viewport.projMatrix; const auto width = viewport.width; @@ -239,7 +240,7 @@ Cesium3DTilesSelection::ViewState computeViewState( const auto horizontalFov = 2.0 * glm::atan(glm::tan(verticalFov * 0.5) * aspect); return Cesium3DTilesSelection::ViewState::create( - cameraPosition, cameraFwd, cameraUp, glm::dvec2(width, height), horizontalFov, verticalFov); + cameraPosition, cameraFwd, cameraUp, glm::dvec2(width, height), horizontalFov, verticalFov, ellipsoid); } bool primExists(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) {