diff --git a/Cesium3DTilesContent/include/Cesium3DTilesContent/ImplicitTilingUtilities.h b/Cesium3DTilesContent/include/Cesium3DTilesContent/ImplicitTilingUtilities.h index 760ecfaf8..61c8eda29 100644 --- a/Cesium3DTilesContent/include/Cesium3DTilesContent/ImplicitTilingUtilities.h +++ b/Cesium3DTilesContent/include/Cesium3DTilesContent/ImplicitTilingUtilities.h @@ -328,6 +328,19 @@ class ImplicitTilingUtilities { static CesiumGeospatial::S2CellBoundingVolume computeBoundingVolume( const CesiumGeospatial::S2CellBoundingVolume& rootBoundingVolume, const CesiumGeometry::QuadtreeTileID& tileID) noexcept; + + /** + * @brief Computes the denominator for a given implicit tile level. + * + * Divide the root tile's geometric error by this value to get the standard + * geometric error for tiles on the level. Or divide each component of a + * bounding volume by this factor to get the size of the bounding volume along + * that axis for tiles of this level. + * + * @param level The tile level. + * @return The denominator for the level. + */ + static double computeLevelDenominator(uint32_t level) noexcept; }; } // namespace Cesium3DTilesContent diff --git a/Cesium3DTilesContent/src/ImplicitTilingUtilities.cpp b/Cesium3DTilesContent/src/ImplicitTilingUtilities.cpp index 95257a97e..cce56d434 100644 --- a/Cesium3DTilesContent/src/ImplicitTilingUtilities.cpp +++ b/Cesium3DTilesContent/src/ImplicitTilingUtilities.cpp @@ -156,7 +156,7 @@ CesiumGeospatial::GlobeRectangle subdivideRectangle( CesiumGeospatial::BoundingRegion ImplicitTilingUtilities::computeBoundingVolume( const CesiumGeospatial::BoundingRegion& rootBoundingVolume, const CesiumGeometry::QuadtreeTileID& tileID) noexcept { - double denominator = static_cast(1 << tileID.level); + double denominator = computeLevelDenominator(tileID.level); return CesiumGeospatial::BoundingRegion{ subdivideRectangle( rootBoundingVolume.getRectangle(), @@ -169,7 +169,7 @@ CesiumGeospatial::BoundingRegion ImplicitTilingUtilities::computeBoundingVolume( CesiumGeospatial::BoundingRegion ImplicitTilingUtilities::computeBoundingVolume( const CesiumGeospatial::BoundingRegion& rootBoundingVolume, const CesiumGeometry::OctreeTileID& tileID) noexcept { - double denominator = static_cast(1 << tileID.level); + double denominator = computeLevelDenominator(tileID.level); double heightSize = (rootBoundingVolume.getMaximumHeight() - rootBoundingVolume.getMinimumHeight()) / denominator; @@ -195,7 +195,7 @@ ImplicitTilingUtilities::computeBoundingVolume( const glm::dmat3& halfAxes = rootBoundingVolume.getHalfAxes(); const glm::dvec3& center = rootBoundingVolume.getCenter(); - double denominator = static_cast(1 << tileID.level); + double denominator = computeLevelDenominator(tileID.level); glm::dvec3 min = center - halfAxes[0] - halfAxes[1] - halfAxes[2]; glm::dvec3 xDim = halfAxes[0] * 2.0 / denominator; @@ -216,7 +216,7 @@ ImplicitTilingUtilities::computeBoundingVolume( const glm::dmat3& halfAxes = rootBoundingVolume.getHalfAxes(); const glm::dvec3& center = rootBoundingVolume.getCenter(); - double denominator = static_cast(1 << tileID.level); + double denominator = computeLevelDenominator(tileID.level); glm::dvec3 min = center - halfAxes[0] - halfAxes[1] - halfAxes[2]; glm::dvec3 xDim = halfAxes[0] * 2.0 / denominator; @@ -245,6 +245,11 @@ ImplicitTilingUtilities::computeBoundingVolume( rootBoundingVolume.getMaximumHeight()); } +double +ImplicitTilingUtilities::computeLevelDenominator(uint32_t level) noexcept { + return static_cast(1 << level); +} + QuadtreeChildren::iterator::iterator( const CesiumGeometry::QuadtreeTileID& parentTileID, bool isEnd) noexcept