From 8e271f10e549854e9c1aec27098dec0bc3160094 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Fri, 3 Nov 2023 15:52:57 -0400 Subject: [PATCH 01/15] Add height references for 3D tiles --- Apps/SampleData/ClampToGround.czml | 51 +++-- .../gallery/Clamp Entities to Ground.html | 133 ++++++++++++ .../gallery/Clamp Model to Ground.html | 190 ++++++++++++++++++ .../Sandcastle/gallery/Clamp to 3D Tiles.html | 108 ---------- Apps/Sandcastle/gallery/Clamp to 3D Tiles.jpg | Bin 13200 -> 0 bytes .../development/Clamp to Ground Modes.html | 177 ++++++++++++++++ packages/engine/Source/DataSources/Entity.js | 6 +- .../DataSources/GroundGeometryUpdater.js | 8 +- .../Source/DataSources/ModelVisualizer.js | 119 +++-------- .../DataSources/TerrainOffsetProperty.js | 38 ++-- packages/engine/Source/Scene/Billboard.js | 40 ++-- .../Source/Scene/BillboardCollection.js | 6 +- packages/engine/Source/Scene/Cesium3DTile.js | 1 + .../engine/Source/Scene/Cesium3DTileset.js | 102 +++++++++- .../Source/Scene/Cesium3DTilesetTraversal.js | 2 + .../engine/Source/Scene/HeightReference.js | 61 +++++- .../engine/Source/Scene/LabelCollection.js | 4 +- packages/engine/Source/Scene/Model/Model.js | 46 ++--- .../engine/Source/Scene/QuadtreePrimitive.js | 2 +- packages/engine/Source/Scene/Scene.js | 136 ++++++++++--- .../engine/Source/Scene/TileBoundingS2Cell.js | 4 +- 21 files changed, 897 insertions(+), 337 deletions(-) create mode 100644 Apps/Sandcastle/gallery/Clamp Entities to Ground.html create mode 100644 Apps/Sandcastle/gallery/Clamp Model to Ground.html delete mode 100644 Apps/Sandcastle/gallery/Clamp to 3D Tiles.html delete mode 100644 Apps/Sandcastle/gallery/Clamp to 3D Tiles.jpg create mode 100644 Apps/Sandcastle/gallery/development/Clamp to Ground Modes.html diff --git a/Apps/SampleData/ClampToGround.czml b/Apps/SampleData/ClampToGround.czml index 9d5abaccd264..44734a3de77e 100644 --- a/Apps/SampleData/ClampToGround.czml +++ b/Apps/SampleData/ClampToGround.czml @@ -5,7 +5,7 @@ "clock": { "interval": "2018-07-19T15:18:00Z/2018-07-19T15:18:30Z", "currentTime": "2018-07-19T15:18:00Z", - "multiplier": 5, + "multiplier": 2, "range": "LOOP_STOP", "step": "SYSTEM_CLOCK_MULTIPLIER" } @@ -19,14 +19,22 @@ "interpolationAlgorithm": "LINEAR", "forwardExtrapolationType": "HOLD", "cartesian": [ - "2018-07-19T15:18:00Z", - 1216348.1632364073, - -4736348.958775471, - 4081284.5528982095, + "2018-07-19T15:18:00Z", + 1216327.3893347275, + -4736164.778028102, + 4081507.5209477833, + "2018-07-19T15:18:10Z", + 1216369.543258349, + -4736201.237448179, + 4081447.3732212726, + "2018-07-19T15:18:20Z", + 1216434.7507773656, + -4736241.372142024, + 4081386.1802605274, "2018-07-19T15:18:30Z", - 1216369.1229444197, - -4736377.467107148, - 4081240.888485707 + 1216525.7792628652, + -4736271.927759278, + 4081319.744558958 ] }, "orientation": { @@ -43,26 +51,29 @@ "polyline": { "positions": { "cartesian": [ - 1216348.1632364073, - -4736348.958775471, - 4081284.5528982095, - 1216369.1229444197, - -4736377.467107148, - 4081240.888485707 + 1216327.3893347275, + -4736164.778028102, + 4081507.5209477833, + 1216369.543258349, + -4736201.237448179, + 4081447.3732212726, + 1216434.7507773656, + -4736241.372142024, + 4081386.1802605274, + 1216525.7792628652, + -4736271.927759278, + 4081319.744558958 ] }, "material": { "polylineOutline": { "color": { - "rgba": [255, 255, 0, 255] + "rgba": [100, 149, 237, 140] }, - "outlineColor": { - "rgba": [0, 0, 0, 255] - }, - "outlineWidth": 2 + "outlineWidth": 0 } }, - "width": 10, + "width": 12, "clampToGround": true } } diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html new file mode 100644 index 000000000000..6d0edc1515cf --- /dev/null +++ b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html @@ -0,0 +1,133 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+
+
+
+
+
+
+ + + diff --git a/Apps/Sandcastle/gallery/Clamp Model to Ground.html b/Apps/Sandcastle/gallery/Clamp Model to Ground.html new file mode 100644 index 000000000000..b8db9567bd83 --- /dev/null +++ b/Apps/Sandcastle/gallery/Clamp Model to Ground.html @@ -0,0 +1,190 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+
+ + + diff --git a/Apps/Sandcastle/gallery/Clamp to 3D Tiles.html b/Apps/Sandcastle/gallery/Clamp to 3D Tiles.html deleted file mode 100644 index f86206cb91d0..000000000000 --- a/Apps/Sandcastle/gallery/Clamp to 3D Tiles.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - Cesium Demo - - - - - - -
-

Loading...

-
- - - diff --git a/Apps/Sandcastle/gallery/Clamp to 3D Tiles.jpg b/Apps/Sandcastle/gallery/Clamp to 3D Tiles.jpg deleted file mode 100644 index 8164f073a8e6ec1309fb11b1c4069d23ae966f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13200 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 diff --git a/Apps/Sandcastle/gallery/development/Clamp to Ground Modes.html b/Apps/Sandcastle/gallery/development/Clamp to Ground Modes.html new file mode 100644 index 000000000000..db8662736f2b --- /dev/null +++ b/Apps/Sandcastle/gallery/development/Clamp to Ground Modes.html @@ -0,0 +1,177 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+
+
+
+
+
+
+ + + diff --git a/packages/engine/Source/DataSources/Entity.js b/packages/engine/Source/DataSources/Entity.js index 352417581782..1181815fb6f4 100644 --- a/packages/engine/Source/DataSources/Entity.js +++ b/packages/engine/Source/DataSources/Entity.js @@ -13,7 +13,9 @@ import Quaternion from "../Core/Quaternion.js"; import Transforms from "../Core/Transforms.js"; import GroundPolylinePrimitive from "../Scene/GroundPolylinePrimitive.js"; import GroundPrimitive from "../Scene/GroundPrimitive.js"; -import HeightReference from "../Scene/HeightReference.js"; +import HeightReference, { + isHeightReferenceClamp, +} from "../Scene/HeightReference.js"; import BillboardGraphics from "./BillboardGraphics.js"; import BoxGraphics from "./BoxGraphics.js"; import ConstantPositionProperty from "./ConstantPositionProperty.js"; @@ -706,7 +708,7 @@ Entity.prototype.computeModelMatrixForHeightReference = function ( } const carto = ellipsoid.cartesianToCartographic(position, cartoScratch); - if (heightReference === HeightReference.CLAMP_TO_GROUND) { + if (isHeightReferenceClamp(heightReference)) { carto.height = heightOffset; } else { carto.height += heightOffset; diff --git a/packages/engine/Source/DataSources/GroundGeometryUpdater.js b/packages/engine/Source/DataSources/GroundGeometryUpdater.js index 5373bb70d37b..dbd2c247e504 100644 --- a/packages/engine/Source/DataSources/GroundGeometryUpdater.js +++ b/packages/engine/Source/DataSources/GroundGeometryUpdater.js @@ -5,7 +5,9 @@ import DeveloperError from "../Core/DeveloperError.js"; import GeometryOffsetAttribute from "../Core/GeometryOffsetAttribute.js"; import oneTimeWarning from "../Core/oneTimeWarning.js"; import GroundPrimitive from "../Scene/GroundPrimitive.js"; -import HeightReference from "../Scene/HeightReference.js"; +import HeightReference, { + isHeightReferenceClamp, +} from "../Scene/HeightReference.js"; import CallbackProperty from "./CallbackProperty.js"; import ConstantProperty from "./ConstantProperty.js"; import GeometryUpdater from "./GeometryUpdater.js"; @@ -164,7 +166,7 @@ GroundGeometryUpdater.getGeometryHeight = function (height, heightReference) { return; } - if (heightReference !== HeightReference.CLAMP_TO_GROUND) { + if (isHeightReferenceClamp(heightReference)) { return height; } return 0.0; @@ -186,7 +188,7 @@ GroundGeometryUpdater.getGeometryExtrudedHeight = function ( } return; } - if (extrudedHeightReference !== HeightReference.CLAMP_TO_GROUND) { + if (!isHeightReferenceClamp(extrudedHeightReference)) { return extrudedHeight; } diff --git a/packages/engine/Source/DataSources/ModelVisualizer.js b/packages/engine/Source/DataSources/ModelVisualizer.js index 5665c9dc5a7b..70e2ca6312e3 100644 --- a/packages/engine/Source/DataSources/ModelVisualizer.js +++ b/packages/engine/Source/DataSources/ModelVisualizer.js @@ -4,19 +4,22 @@ import Cartesian2 from "../Core/Cartesian2.js"; import Cartesian3 from "../Core/Cartesian3.js"; import Check from "../Core/Check.js"; import Color from "../Core/Color.js"; +import defaultValue from "../Core/defaultValue.js"; import defined from "../Core/defined.js"; import destroyObject from "../Core/destroyObject.js"; import DeveloperError from "../Core/DeveloperError.js"; +import Ellipsoid from "../Core/Ellipsoid.js"; import Matrix4 from "../Core/Matrix4.js"; import Resource from "../Core/Resource.js"; import ColorBlendMode from "../Scene/ColorBlendMode.js"; -import HeightReference from "../Scene/HeightReference.js"; +import HeightReference, { + isHeightReferenceClamp, +} from "../Scene/HeightReference.js"; import Model from "../Scene/Model/Model.js"; import ModelAnimationLoop from "../Scene/ModelAnimationLoop.js"; import ShadowMode from "../Scene/ShadowMode.js"; import BoundingSphereState from "./BoundingSphereState.js"; import Property from "./Property.js"; -import sampleTerrainMostDetailed from "../Core/sampleTerrainMostDetailed.js"; import Cartographic from "../Core/Cartographic.js"; const defaultScale = 1.0; @@ -172,9 +175,6 @@ ModelVisualizer.prototype.update = function (time) { articulationsScratch: {}, loadFailed: false, modelUpdated: false, - awaitingSampleTerrain: false, - clampedBoundingSphere: undefined, - sampleTerrainFailed: false, }; modelHash[entity.id] = modelData; @@ -399,9 +399,6 @@ ModelVisualizer.prototype.destroy = function () { return destroyObject(this); }; -// Used for testing. -ModelVisualizer._sampleTerrainMostDetailed = sampleTerrainMostDetailed; - const scratchPosition = new Cartesian3(); const scratchCartographic = new Cartographic(); /** @@ -445,106 +442,36 @@ ModelVisualizer.prototype.getBoundingSphere = function (entity, result) { const scene = this._scene; const globe = scene.globe; + const ellipsoid = defaultValue(globe?.ellipsoid, Ellipsoid.WGS84); - // cannot access a terrain provider if there is no globe; formally set to undefined - const terrainProvider = defined(globe) ? globe.terrainProvider : undefined; const hasHeightReference = model.heightReference !== HeightReference.NONE; - if (defined(globe) && hasHeightReference) { - const ellipsoid = globe.ellipsoid; + if (hasHeightReference) { const modelMatrix = model.modelMatrix; scratchPosition.x = modelMatrix[12]; scratchPosition.y = modelMatrix[13]; scratchPosition.z = modelMatrix[14]; - const cartoPosition = ellipsoid.cartesianToCartographic(scratchPosition); - - // For a terrain provider that does not have availability, like the EllipsoidTerrainProvider, - // we can directly assign the bounding sphere's center from model matrix's translation. - if (!defined(terrainProvider.availability)) { - // Regardless of what the original model's position is set to, for CLAMP_TO_GROUND, we reset it to 0 - // when computing the position to zoom/fly to. - if (model.heightReference === HeightReference.CLAMP_TO_GROUND) { - cartoPosition.height = 0; - } - - const scratchPosition = ellipsoid.cartographicToCartesian(cartoPosition); - BoundingSphere.clone(model.boundingSphere, result); - result.center = scratchPosition; - - return BoundingSphereState.DONE; - } + const cartoPosition = ellipsoid.cartesianToCartographic( + scratchPosition, + scratchCartographic + ); - // Otherwise, in the case of terrain providers with availability, - // since the model's bounding sphere may be clamped to a lower LOD tile if - // the camera is initially far away, we use sampleTerrainMostDetailed to estimate - // where the bounding sphere should be and set that as the target bounding sphere - // for the camera. - let clampedBoundingSphere = this._modelHash[entity.id] - .clampedBoundingSphere; - - // Check if the sample terrain function has failed. - const sampleTerrainFailed = this._modelHash[entity.id].sampleTerrainFailed; - if (sampleTerrainFailed) { - this._modelHash[entity.id].sampleTerrainFailed = false; - return BoundingSphereState.FAILED; + // Regardless of what the original model's position is set to, when clamping we reset it to 0 + // when computing the position to zoom/fly to. + if (isHeightReferenceClamp(model.heightReference)) { + cartoPosition.height = 0; } - if (!defined(clampedBoundingSphere)) { - clampedBoundingSphere = new BoundingSphere(); - - // Since this function is called per-frame, we set a flag when sampleTerrainMostDetailed - // is called and check for it to avoid calling it again. - const awaitingSampleTerrain = this._modelHash[entity.id] - .awaitingSampleTerrain; - if (!awaitingSampleTerrain) { - Cartographic.clone(cartoPosition, scratchCartographic); - this._modelHash[entity.id].awaitingSampleTerrain = true; - ModelVisualizer._sampleTerrainMostDetailed(terrainProvider, [ - scratchCartographic, - ]) - .then((result) => { - if (this.isDestroyed()) { - return; - } - - this._modelHash[entity.id].awaitingSampleTerrain = false; - - const updatedCartographic = result[0]; - if (model.heightReference === HeightReference.RELATIVE_TO_GROUND) { - updatedCartographic.height += cartoPosition.height; - } - ellipsoid.cartographicToCartesian( - updatedCartographic, - scratchPosition - ); - - // Update the bounding sphere with the updated position. - BoundingSphere.clone(model.boundingSphere, clampedBoundingSphere); - clampedBoundingSphere.center = scratchPosition; - - this._modelHash[ - entity.id - ].clampedBoundingSphere = BoundingSphere.clone( - clampedBoundingSphere - ); - }) - .catch((e) => { - if (this.isDestroyed()) { - return; - } - - this._modelHash[entity.id].sampleTerrainFailed = true; - this._modelHash[entity.id].awaitingSampleTerrain = false; - }); + const height = scene.getHeight(cartoPosition, model.heightReference); + if (defined(height)) { + if (isHeightReferenceClamp(model.heightReference)) { + cartoPosition.height = height; + } else { + cartoPosition.height += height; } - - // We will return the state as pending until the clamped bounding sphere is defined, - // which happens when the sampleTerrainMostDetailed promise returns. - return BoundingSphereState.PENDING; } - BoundingSphere.clone(clampedBoundingSphere, result); - // Reset the clamped bounding sphere. - this._modelHash[entity.id].clampedBoundingSphere = undefined; + BoundingSphere.clone(model.boundingSphere, result); + result.center = ellipsoid.cartographicToCartesian(cartoPosition); return BoundingSphereState.DONE; } diff --git a/packages/engine/Source/DataSources/TerrainOffsetProperty.js b/packages/engine/Source/DataSources/TerrainOffsetProperty.js index 17eab9c26406..10624d57d0cd 100644 --- a/packages/engine/Source/DataSources/TerrainOffsetProperty.js +++ b/packages/engine/Source/DataSources/TerrainOffsetProperty.js @@ -6,12 +6,12 @@ import destroyObject from "../Core/destroyObject.js"; import Event from "../Core/Event.js"; import Iso8601 from "../Core/Iso8601.js"; import CesiumMath from "../Core/Math.js"; -import HeightReference from "../Scene/HeightReference.js"; -import SceneMode from "../Scene/SceneMode.js"; +import HeightReference, { + isHeightReferenceRelative, +} from "../Scene/HeightReference.js"; import Property from "./Property.js"; const scratchPosition = new Cartesian3(); -const scratchCarto = new Cartographic(); /** * @private @@ -118,40 +118,32 @@ TerrainOffsetProperty.prototype._updateClamping = function () { const globe = scene.globe; const position = this._position; - if (!defined(globe) || Cartesian3.equals(position, Cartesian3.ZERO)) { + if (Cartesian3.equals(position, Cartesian3.ZERO)) { this._terrainHeight = 0; return; } const ellipsoid = globe.ellipsoid; - const surface = globe._surface; - - const that = this; const cartographicPosition = ellipsoid.cartesianToCartographic( position, this._cartographicPosition ); - const height = globe.getHeight(cartographicPosition); + + const height = scene.getHeight(cartographicPosition, this._heightReference); if (defined(height)) { this._terrainHeight = height; } else { this._terrainHeight = 0; } - function updateFunction(clampedPosition) { - if (scene.mode === SceneMode.SCENE3D) { - const carto = ellipsoid.cartesianToCartographic( - clampedPosition, - scratchCarto - ); - that._terrainHeight = carto.height; - } else { - that._terrainHeight = clampedPosition.x; - } - that.definitionChanged.raiseEvent(); - } - this._removeCallbackFunc = surface.updateHeight( + const updateFunction = (clampedPosition) => { + this._terrainHeight = clampedPosition.height; + this.definitionChanged.raiseEvent(); + }; + + this._removeCallbackFunc = scene.updateHeight( cartographicPosition, - updateFunction + updateFunction, + this._updateClamping ); }; @@ -174,7 +166,7 @@ TerrainOffsetProperty.prototype.getValue = function (time, result) { if ( heightReference === HeightReference.NONE && - extrudedHeightReference !== HeightReference.RELATIVE_TO_GROUND + !isHeightReferenceRelative(extrudedHeightReference) ) { this._position = Cartesian3.clone(Cartesian3.ZERO, this._position); return Cartesian3.clone(Cartesian3.ZERO, result); diff --git a/packages/engine/Source/Scene/Billboard.js b/packages/engine/Source/Scene/Billboard.js index b10b42d40aa8..8a52aa48cc9b 100644 --- a/packages/engine/Source/Scene/Billboard.js +++ b/packages/engine/Source/Scene/Billboard.js @@ -13,7 +13,9 @@ import DistanceDisplayCondition from "../Core/DistanceDisplayCondition.js"; import Matrix4 from "../Core/Matrix4.js"; import NearFarScalar from "../Core/NearFarScalar.js"; import Resource from "../Core/Resource.js"; -import HeightReference from "./HeightReference.js"; +import HeightReference, { + isHeightReferenceRelative, +} from "./HeightReference.js"; import HorizontalOrigin from "./HorizontalOrigin.js"; import SceneMode from "./SceneMode.js"; import SceneTransforms from "./SceneTransforms.js"; @@ -1056,8 +1058,6 @@ Billboard.prototype._updateClamping = function () { }; const scratchCartographic = new Cartographic(); -const scratchPosition = new Cartesian3(); - Billboard._updateClamping = function (collection, owner) { const scene = collection._scene; if (!defined(scene) || !defined(scene.globe)) { @@ -1073,7 +1073,6 @@ Billboard._updateClamping = function (collection, owner) { const globe = scene.globe; const ellipsoid = globe.ellipsoid; - const surface = globe._surface; const mode = scene.frameState.mode; @@ -1107,34 +1106,37 @@ Billboard._updateClamping = function (collection, owner) { } function updateFunction(clampedPosition) { - if (owner._heightReference === HeightReference.RELATIVE_TO_GROUND) { + owner._clampedPosition = ellipsoid.cartographicToCartesian( + clampedPosition, + owner._clampedPosition + ); + + if (isHeightReferenceRelative(owner._heightReference)) { if (owner._mode === SceneMode.SCENE3D) { - const clampedCart = ellipsoid.cartesianToCartographic( + clampedPosition.height += position.height; + ellipsoid.cartographicToCartesian( clampedPosition, - scratchCartographic + owner._clampedPosition ); - clampedCart.height += position.height; - ellipsoid.cartographicToCartesian(clampedCart, clampedPosition); } else { - clampedPosition.x += position.height; + owner._clampedPosition.x += position.height; } } - owner._clampedPosition = Cartesian3.clone( - clampedPosition, - owner._clampedPosition - ); } - owner._removeCallbackFunc = surface.updateHeight(position, updateFunction); + + owner._removeCallbackFunc = scene.updateHeight( + position, + updateFunction, + owner._heightReference + ); Cartographic.clone(position, scratchCartographic); - const height = globe.getHeight(position); + const height = scene.getHeight(position, owner._heightReference); if (defined(height)) { scratchCartographic.height = height; } - ellipsoid.cartographicToCartesian(scratchCartographic, scratchPosition); - - updateFunction(scratchPosition); + updateFunction(scratchCartographic); }; Billboard.prototype._loadImage = function () { diff --git a/packages/engine/Source/Scene/BillboardCollection.js b/packages/engine/Source/Scene/BillboardCollection.js index c0116eaabc6b..9bd1d3be1f9b 100644 --- a/packages/engine/Source/Scene/BillboardCollection.js +++ b/packages/engine/Source/Scene/BillboardCollection.js @@ -28,7 +28,7 @@ import BillboardCollectionVS from "../Shaders/BillboardCollectionVS.js"; import Billboard from "./Billboard.js"; import BlendingState from "./BlendingState.js"; import BlendOption from "./BlendOption.js"; -import HeightReference from "./HeightReference.js"; +import HeightReference, { isHeightReferenceClamp } from "./HeightReference.js"; import HorizontalOrigin from "./HorizontalOrigin.js"; import SceneMode from "./SceneMode.js"; import SDFSettings from "./SDFSettings.js"; @@ -1375,7 +1375,7 @@ function writeCompressedAttribute3( let disableDepthTestDistance = billboard.disableDepthTestDistance; const clampToGround = - billboard.heightReference === HeightReference.CLAMP_TO_GROUND && + isHeightReferenceClamp(billboard.heightReference) && frameState.context.depthTexture; if (!defined(disableDepthTestDistance)) { disableDepthTestDistance = clampToGround ? 5000.0 : 0.0; @@ -1448,7 +1448,7 @@ function writeTextureCoordinateBoundsOrLabelTranslate( vafWriters, billboard ) { - if (billboard.heightReference === HeightReference.CLAMP_TO_GROUND) { + if (isHeightReferenceClamp(billboard.heightReference)) { const scene = billboardCollection._scene; const context = frameState.context; const globeTranslucent = frameState.globeTranslucencyState.translucent; diff --git a/packages/engine/Source/Scene/Cesium3DTile.js b/packages/engine/Source/Scene/Cesium3DTile.js index 86efbeec1cf9..9acdc6e7e13a 100644 --- a/packages/engine/Source/Scene/Cesium3DTile.js +++ b/packages/engine/Source/Scene/Cesium3DTile.js @@ -470,6 +470,7 @@ function Cesium3DTile(tileset, baseResource, header, parent) { this._touchedFrame = 0; this._visitedFrame = 0; this._selectedFrame = 0; + this._wasSelectedLastFrame = false; this._requestedFrame = 0; this._ancestorWithContent = undefined; this._ancestorWithContentAvailable = undefined; diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index 0f30ce7c9252..ba00e39dd91d 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -251,6 +251,8 @@ function Cesium3DTileset(options) { ? Matrix4.clone(options.modelMatrix) : Matrix4.clone(Matrix4.IDENTITY); + this._addHeightCallbacks = []; + this._statistics = new Cesium3DTilesetStatistics(); this._statisticsLast = new Cesium3DTilesetStatistics(); this._statisticsPerPass = new Array(Cesium3DTilePass.NUMBER_OF_PASSES); @@ -2572,6 +2574,55 @@ function filterProcessingQueue(tileset) { tiles.length -= removeCount; } +const scratchUpdateHeightCartographic = new Cartographic(); +const scratchUpdateHeightCartographic2 = new Cartographic(); +const scratchUpdateHeightCartesian = new Cartesian3(); +function processUpdateHeight(tileset, tile, frameState) { + const heightCallbackData = tileset._addHeightCallbacks; + const boundingSphere = tile.boundingSphere; + + for (const callbackData of heightCallbackData) { + // No need to upadate if the tile was already visible last frame + if (callbackData.invoked || tile._wasSelectedLastFrame) { + continue; + } + + const ellipsoid = callbackData.ellipsoid; + const positionCartographic = Cartographic.clone( + callbackData.positionCartographic, + scratchUpdateHeightCartographic + ); + const centerCartographic = Cartographic.fromCartesian( + boundingSphere.center, + ellipsoid, + scratchUpdateHeightCartographic2 + ); + + // This can be undefined when the bounding sphere is at the origin + if (defined(centerCartographic)) { + positionCartographic.height = centerCartographic.height; + } + + const position = Cartographic.toCartesian( + positionCartographic, + ellipsoid, + scratchUpdateHeightCartesian + ); + if ( + Cartesian3.distance(position, boundingSphere.center) <= + boundingSphere.radius + ) { + frameState.afterRender.push(() => { + // Callback can be removed before it actually invoked at the end of the frame + if (defined(callbackData.callback)) { + callbackData.callback(positionCartographic); + } + callbackData.invoked = false; + }); + } + } +} + /** * Process tiles in the PROCESSING state so they will eventually move to the READY state. * @private @@ -2839,6 +2890,7 @@ function updateTiles(tileset, frameState, passOptions) { if (isRender) { tileVisible.raiseEvent(tile); } + processUpdateHeight(tileset, tile, frameState); tile.update(tileset, frameState, passOptions); statistics.incrementSelectionCounts(tile.content); ++statistics.selected; @@ -3405,10 +3457,11 @@ Cesium3DTileset.prototype.getHeight = function (cartographic, scene) { } const ray = scratchGetHeightRay; - ray.direction = ellipsoid.geodeticSurfaceNormalCartographic( + ray.direction = ellipsoid.cartographicToCartesian( cartographic, ray.direction ); + Cartesian3.normalize(ray.direction, ray.direction); const intersection = this.pick( ray, @@ -3426,6 +3479,53 @@ Cesium3DTileset.prototype.getHeight = function (cartographic, scene) { )?.height; }; +/** + * Calls the callback when a new tile is rendered that contains the given cartographic. The only parameter + * is the cartesian position on the tile. + * + * @private + * + * @param {Scene} scene The scene where visualization is taking place. + * @param {Cartographic} cartographic The cartographic position. + * @param {Function} callback The function to be called when a new tile is loaded. + * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to use. + * @returns {Function} The function to remove this callback from the quadtree. + */ +Cesium3DTileset.prototype.updateHeight = function ( + cartographic, + callback, + ellipsoid +) { + if (!defined(ellipsoid)) { + ellipsoid = Ellipsoid.WGS84; + } + + const object = { + positionCartographic: cartographic, + ellipsoid: ellipsoid, + callback: callback, + invoked: false, + }; + + const removeCallback = () => { + const addedCallbacks = this._addHeightCallbacks; + const length = addedCallbacks.length; + for (let i = 0; i < length; ++i) { + if (addedCallbacks[i] === object) { + addedCallbacks.splice(i, 1); + break; + } + } + + if (object.callback) { + object.callback = undefined; + } + }; + + this._addHeightCallbacks.push(object); + return removeCallback; +}; + const scratchSphereIntersection = new Interval(); /** diff --git a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js index 12561ba541eb..d8ad154f3dd8 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js @@ -79,6 +79,7 @@ Cesium3DTilesetTraversal.selectTile = function (tile, frameState) { return; } + tile._wasSelectedLastFrame = true; const { content, tileset } = tile; if (content.featurePropertiesDirty) { // A feature's property in this tile changed, the tile needs to be re-styled. @@ -88,6 +89,7 @@ Cesium3DTilesetTraversal.selectTile = function (tile, frameState) { } else if (tile._selectedFrame < frameState.frameNumber - 1) { // Tile is newly selected; it is selected this frame, but was not selected last frame. tileset._selectedTilesToStyle.push(tile); + tile._wasSelectedLastFrame = false; } tile._selectedFrame = frameState.frameNumber; tileset._selectedTiles.push(tile); diff --git a/packages/engine/Source/Scene/HeightReference.js b/packages/engine/Source/Scene/HeightReference.js index 809fe4c04943..8fa4e48a3bc9 100644 --- a/packages/engine/Source/Scene/HeightReference.js +++ b/packages/engine/Source/Scene/HeightReference.js @@ -12,17 +12,74 @@ const HeightReference = { NONE: 0, /** - * The position is clamped to the terrain. + * The position is clamped to the terrain and 3D Tiles. * @type {number} * @constant */ CLAMP_TO_GROUND: 1, /** - * The position height is the height above the terrain. + * The position height is the height above the terrain and 3D Tiles. * @type {number} * @constant */ RELATIVE_TO_GROUND: 2, + + /** + * The position is clamped to terain. + * @type {number} + * @constant + */ + CLAMP_TO_TERRAIN: 3, + + /** + * The position height is the height above terrain. + * @type {number} + * @constant + */ + RELATIVE_TO_TERRAIN: 4, + + /** + * The position is clamped to 3D Tiles. + * @type {number} + * @constant + */ + CLAMP_TO_3D_TILE: 5, + + /** + * The position height is the height above 3D Tiles. + * @type {number} + * @constant + */ + RELATIVE_TO_3D_TILE: 6, }; + export default Object.freeze(HeightReference); + +/** + * Returns true if the height should be offset relative to the surface + * @param {HeightReference} heightReference + * @returns true if the height should be offset relative to the surface + * @private + */ +export function isHeightReferenceClamp(heightReference) { + return ( + heightReference === HeightReference.CLAMP_TO_GROUND || + heightReference === HeightReference.CLAMP_TO_3D_TILE || + heightReference === HeightReference.CLAMP_TO_TERRAIN + ); +} + +/** + * Returns true if the height should be clamped to the surface + * @param {HeightReference} heightReference + * @returns true if the height should be clamped to the surface + * @private + */ +export function isHeightReferenceRelative(heightReference) { + return ( + heightReference === HeightReference.RELATIVE_TO_GROUND || + heightReference === HeightReference.RELATIVE_TO_3D_TILE || + heightReference === HeightReference.RELATIVE_TO_TERRAIN + ); +} diff --git a/packages/engine/Source/Scene/LabelCollection.js b/packages/engine/Source/Scene/LabelCollection.js index 314db367fba3..627ba87862cd 100644 --- a/packages/engine/Source/Scene/LabelCollection.js +++ b/packages/engine/Source/Scene/LabelCollection.js @@ -10,7 +10,7 @@ import writeTextToCanvas from "../Core/writeTextToCanvas.js"; import bitmapSDF from "bitmap-sdf"; import BillboardCollection from "./BillboardCollection.js"; import BlendOption from "./BlendOption.js"; -import HeightReference from "./HeightReference.js"; +import { isHeightReferenceClamp } from "./HeightReference.js"; import HorizontalOrigin from "./HorizontalOrigin.js"; import Label from "./Label.js"; import LabelStyle from "./LabelStyle.js"; @@ -510,7 +510,7 @@ function repositionAllGlyphs(label) { ); } - if (label.heightReference === HeightReference.CLAMP_TO_GROUND) { + if (isHeightReferenceClamp(label.heightReference)) { for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { glyph = glyphs[glyphIndex]; const billboard = glyph.billboard; diff --git a/packages/engine/Source/Scene/Model/Model.js b/packages/engine/Source/Scene/Model/Model.js index b62df02f594f..c3a80a8a073f 100644 --- a/packages/engine/Source/Scene/Model/Model.js +++ b/packages/engine/Source/Scene/Model/Model.js @@ -24,7 +24,9 @@ import Pass from "../../Renderer/Pass.js"; import ClippingPlaneCollection from "../ClippingPlaneCollection.js"; import ColorBlendMode from "../ColorBlendMode.js"; import GltfLoader from "../GltfLoader.js"; -import HeightReference from "../HeightReference.js"; +import HeightReference, { + isHeightReferenceRelative, +} from "../HeightReference.js"; import ImageBasedLighting from "../ImageBasedLighting.js"; import PointCloudShading from "../PointCloudShading.js"; import SceneMode from "../SceneMode.js"; @@ -2033,15 +2035,11 @@ function updateClamping(model) { } const scene = model._scene; - if ( - !defined(scene) || - !defined(scene.globe) || - model.heightReference === HeightReference.NONE - ) { + if (!defined(scene) || model.heightReference === HeightReference.NONE) { //>>includeStart('debug', pragmas.debug); if (model.heightReference !== HeightReference.NONE) { throw new DeveloperError( - "Height reference is not supported without a scene and globe." + "Height reference is not supported without a scene." ); } //>>includeEnd('debug'); @@ -2064,14 +2062,14 @@ function updateClamping(model) { } // Install callback to handle updating of terrain tiles - const surface = globe._surface; - model._removeUpdateHeightCallback = surface.updateHeight( + model._removeUpdateHeightCallback = scene.updateHeight( cartoPosition, - getUpdateHeightCallback(model, ellipsoid, cartoPosition) + getUpdateHeightCallback(model, ellipsoid, cartoPosition), + model.heightReference ); // Set the correct height now - const height = globe.getHeight(cartoPosition); + const height = scene.getHeight(cartoPosition, model.heightReference); if (defined(height)) { // Get callback with cartoPosition being the non-clamped position const callback = getUpdateHeightCallback(model, ellipsoid, cartoPosition); @@ -2079,8 +2077,7 @@ function updateClamping(model) { // Compute the clamped cartesian and call updateHeight callback Cartographic.clone(cartoPosition, scratchCartographic); scratchCartographic.height = height; - ellipsoid.cartographicToCartesian(scratchCartographic, scratchPosition); - callback(scratchPosition); + callback(scratchCartographic); } model._heightDirty = false; @@ -2337,24 +2334,25 @@ function scaleInPixels(positionWC, radius, frameState) { ); } -function getUpdateHeightCallback(model, ellipsoid, cartoPosition) { +const scratchUpdateHeightCartesian = new Cartesian3(); +function getUpdateHeightCallback(model, ellipsoid, originalPostition) { return function (clampedPosition) { - if (model.heightReference === HeightReference.RELATIVE_TO_GROUND) { - const clampedCart = ellipsoid.cartesianToCartographic( - clampedPosition, - scratchCartographic - ); - clampedCart.height += cartoPosition.height; - ellipsoid.cartographicToCartesian(clampedCart, clampedPosition); + if (isHeightReferenceRelative(model.heightReference)) { + clampedPosition.height += originalPostition.height; } + ellipsoid.cartographicToCartesian( + clampedPosition, + scratchUpdateHeightCartesian + ); + const clampedModelMatrix = model._clampedModelMatrix; // Modify clamped model matrix to use new height Matrix4.clone(model.modelMatrix, clampedModelMatrix); - clampedModelMatrix[12] = clampedPosition.x; - clampedModelMatrix[13] = clampedPosition.y; - clampedModelMatrix[14] = clampedPosition.z; + clampedModelMatrix[12] = scratchUpdateHeightCartesian.x; + clampedModelMatrix[13] = scratchUpdateHeightCartesian.y; + clampedModelMatrix[14] = scratchUpdateHeightCartesian.z; model._heightDirty = true; }; diff --git a/packages/engine/Source/Scene/QuadtreePrimitive.js b/packages/engine/Source/Scene/QuadtreePrimitive.js index 5b93f2cfad25..66ed2109ca30 100644 --- a/packages/engine/Source/Scene/QuadtreePrimitive.js +++ b/packages/engine/Source/Scene/QuadtreePrimitive.js @@ -274,7 +274,7 @@ QuadtreePrimitive.prototype.forEachRenderedTile = function (tileFunction) { * is the cartesian position on the tile. * * @param {Cartographic} cartographic The cartographic position. - * @param {Function} callback The function to be called when a new tile is loaded containing cartographic. + * @param {Function} callback The function to be called when a new tile is loaded containing the updated cartographic. * @returns {Function} The function to remove this callback from the quadtree. */ QuadtreePrimitive.prototype.updateHeight = function (cartographic, callback) { diff --git a/packages/engine/Source/Scene/Scene.js b/packages/engine/Source/Scene/Scene.js index 521cba34f5ab..59239949c591 100644 --- a/packages/engine/Source/Scene/Scene.js +++ b/packages/engine/Source/Scene/Scene.js @@ -18,6 +18,7 @@ import Event from "../Core/Event.js"; import GeographicProjection from "../Core/GeographicProjection.js"; import GeometryInstance from "../Core/GeometryInstance.js"; import GeometryPipeline from "../Core/GeometryPipeline.js"; +import HeightReference from "./HeightReference.js"; import Intersect from "../Core/Intersect.js"; import JulianDate from "../Core/JulianDate.js"; import CesiumMath from "../Core/Math.js"; @@ -515,7 +516,6 @@ function Scene(options) { }); /** - * When false, 3D Tiles will render normally. When true, classified 3D Tile geometry will render normally and * unclassified 3D Tile geometry will render with the color multiplied by {@link Scene#invertClassificationColor}. * @type {boolean} * @default false @@ -524,7 +524,6 @@ function Scene(options) { /** * The highlight color of unclassified 3D Tile geometry when {@link Scene#invertClassification} is true. - *

When the color's alpha is less than 1.0, the unclassified portions of the 3D Tiles will not blend correctly with the classified positions of the 3D Tiles.

*

Also, when the color's alpha is less than 1.0, the WEBGL_depth_texture and EXT_frag_depth WebGL extensions must be supported.

* @type {Color} * @default Color.WHITE @@ -2443,9 +2442,6 @@ function executeCommands(scene, passState) { picking || environmentState.renderTranslucentDepthForPick ) { - // Common/fastest path. Draw 3D Tiles and classification normally. - - // Draw 3D Tiles us.updatePass(Pass.CESIUM_3D_TILE); commands = frustumCommands.commands[Pass.CESIUM_3D_TILE]; length = frustumCommands.indices[Pass.CESIUM_3D_TILE]; @@ -2466,7 +2462,6 @@ function executeCommands(scene, passState) { ); } - // Draw classifications. Modifies 3D Tiles color. if (!environmentState.renderTranslucentDepthForPick) { us.updatePass(Pass.CESIUM_3D_TILE_CLASSIFICATION); commands = @@ -2483,7 +2478,6 @@ function executeCommands(scene, passState) { // Invert classification FBO (FBO2) : Invert_Color + Main_DepthStencil // // 1. Clear FBO2 color to vec4(0.0) for each frustum - // 2. Draw 3D Tiles to FBO2 // 3. Draw classification to FBO2 // 4. Fullscreen pass to FBO1, draw Invert_Color when: // * Main_DepthStencil has the stencil bit set > 0 (classified) @@ -2497,7 +2491,6 @@ function executeCommands(scene, passState) { // IsClassified FBO (FBO3): IsClassified_Color + Invert_DepthStencil // // 1. Clear FBO2 and FBO3 color to vec4(0.0), stencil to 0, and depth to 1.0 - // 2. Draw 3D Tiles to FBO2 // 3. Draw classification to FBO2 // 4. Fullscreen pass to FBO3, draw any color when // * Invert_DepthStencil has the stencil bit set > 0 (classified) @@ -2613,7 +2606,6 @@ function executeCommands(scene, passState) { invertClassification ); - // Classification for translucent 3D Tiles const has3DTilesClassificationCommands = frustumCommands.indices[Pass.CESIUM_3D_TILE_CLASSIFICATION] > 0; if ( @@ -3606,19 +3598,46 @@ Scene.prototype.disableCollisionDetectionForTileset = function (tileset) { }; function getGlobeHeight(scene) { - const globe = scene._globe; const camera = scene.camera; const cartographic = camera.positionCartographic; + return scene.getHeight(cartographic); +} + +/** + * Gets the height of the loaded surface ar the cartographic position. + * @param {Cartographic} cartographic The cartographic position. + * @param {HeightReference} [heightReference=CLAMP_TO_GROUND] Based on the height reference value, determines whether to ignore heights from 3D Tiles or terrain. + * @private + */ +Scene.prototype.getHeight = function (cartographic, heightReference) { + if (!defined(cartographic)) { + return undefined; + } + + const ignore3dTiles = + heightReference === HeightReference.CLAMP_TO_TERRAIN || + heightReference === HeightReference.RELATIVE_TO_TERRAIN; + + const ignoreTerrain = + heightReference === HeightReference.CLAMP_TO_3D_TILE || + heightReference === HeightReference.RELATIVE_TO_3D_TILE; let maxHeight = Number.NEGATIVE_INFINITY; - for (const tileset of scene._terrainTilesets) { - const result = tileset.getHeight(cartographic, scene); - if (result > maxHeight) { - maxHeight = result; + if (!ignore3dTiles) { + for (const tileset of this._terrainTilesets) { + if (!tileset.show) { + continue; + } + + const result = tileset.getHeight(cartographic, this); + if (result > maxHeight) { + maxHeight = result; + } } } - if (defined(globe) && globe.show && defined(cartographic)) { + const globe = this._globe; + if (!ignoreTerrain && defined(globe) && globe.show) { const result = globe.getHeight(cartographic); if (result > maxHeight) { maxHeight = result; @@ -3630,7 +3649,77 @@ function getGlobeHeight(scene) { } return undefined; -} +}; + +const updateHeightScratchCartographic = new Cartographic(); +/** + * Calls the callback when a new tile is rendered that contains the given cartographic. The only parameter + * is the cartesian position on the tile. + * + * @private + * + * @param {Cartographic} cartographic The cartographic position. + * @param {Function} callback The function to be called when a new tile is loaded containing the updated cartographic. + * @param {HeightReference} [heightReference=CLAMP_TO_GROUND] Based on the height reference value, determines whether to ignore heights from 3D Tiles or terrain. + * @returns {Function} The function to remove this callback from the quadtree. + */ +Scene.prototype.updateHeight = function ( + cartographic, + callback, + heightReference +) { + //>>includeStart('debug', pragmas.debug); + Check.typeOf.func("callback", callback); + //>>includeEnd('debug'); + + const callbackWrapper = () => { + Cartographic.clone(cartographic, updateHeightScratchCartographic); + + const height = this.getHeight(cartographic, heightReference); + if (defined(height)) { + updateHeightScratchCartographic.height = height; + callback(updateHeightScratchCartographic); + } + }; + + const ignore3dTiles = + heightReference === HeightReference.CLAMP_TO_TERRAIN || + heightReference === HeightReference.RELATIVE_TO_TERRAIN; + + const ignoreTerrain = + heightReference === HeightReference.CLAMP_TO_3D_TILE || + heightReference === HeightReference.RELATIVE_TO_3D_TILE; + + let terrainRemoveCallback; + if (!ignoreTerrain && defined(this.globe)) { + terrainRemoveCallback = this.globe._surface.updateHeight( + cartographic, + callbackWrapper + ); + } + + const tilesetRemoveCallbacks = []; + const ellipsoid = this.globe?.ellipsoid; + if (!ignore3dTiles) { + for (const tileset of this._terrainTilesets) { + const tilesetRemoveCallback = tileset.updateHeight( + cartographic, + callbackWrapper, + ellipsoid + ); + tilesetRemoveCallbacks.push(tilesetRemoveCallback); + } + } + + const removeCallback = () => { + terrainRemoveCallback = terrainRemoveCallback && terrainRemoveCallback(); + tilesetRemoveCallbacks.forEach((tilesetRemoveCallback) => + tilesetRemoveCallback() + ); + }; + + return removeCallback; +}; function isCameraUnderground(scene) { const camera = scene.camera; @@ -3958,7 +4047,6 @@ Scene.prototype.clampLineWidth = function (width) { * at a particular window coordinate or undefined if nothing is at the location. Other properties may * potentially be set depending on the type of primitive and may be used to further identify the picked object. *

- * When a feature of a 3D Tiles tileset is picked, pick returns a {@link Cesium3DTileFeature} object. *

* * @example @@ -4090,14 +4178,12 @@ function updateRequestRenderModeDeferCheckPass(scene) { * property that contains the intersected primitive. Other properties may be set depending on the type of primitive * and may be used to further identify the picked object. The ray must be given in world coordinates. *

- * This function only picks globe tiles and 3D Tiles that are rendered in the current view. Picks all other * primitives regardless of their visibility. *

* * @private * * @param {Ray} ray The ray. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {object} An object containing the object and position of the first intersection. * @@ -4114,7 +4200,6 @@ Scene.prototype.pickFromRay = function (ray, objectsToExclude, width) { * The primitives in the list are ordered by first intersection to last intersection. The ray must be given in * world coordinates. *

- * This function only picks globe tiles and 3D Tiles that are rendered in the current view. Picks all other * primitives regardless of their visibility. *

* @@ -4122,7 +4207,6 @@ Scene.prototype.pickFromRay = function (ray, objectsToExclude, width) { * * @param {Ray} ray The ray. * @param {number} [limit=Number.MAX_VALUE] If supplied, stop finding intersections after this many intersections. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Object[]} List of objects containing the object and position of each intersection. * @@ -4150,7 +4234,6 @@ Scene.prototype.drillPickFromRay = function ( * @private * * @param {Ray} ray The ray. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to an object containing the object and position of the first intersection. * @@ -4177,7 +4260,6 @@ Scene.prototype.pickFromRayMostDetailed = function ( * * @param {Ray} ray The ray. * @param {number} [limit=Number.MAX_VALUE] If supplied, stop finding intersections after this many intersections. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to a list of objects containing the object and position of each intersection. * @@ -4201,14 +4283,11 @@ Scene.prototype.drillPickFromRayMostDetailed = function ( /** * Returns the height of scene geometry at the given cartographic position or undefined if there was no * scene geometry to sample height from. The height of the input position is ignored. May be used to clamp objects to - * the globe, 3D Tiles, or primitives in the scene. *

- * This function only samples height from globe tiles and 3D Tiles that are rendered in the current view. Samples height * from all other primitives regardless of their visibility. *

* * @param {Cartographic} position The cartographic position to sample height from. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not sample height from. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {number} The height. This may be undefined if there was no scene geometry to sample height from. * @@ -4231,14 +4310,11 @@ Scene.prototype.sampleHeight = function (position, objectsToExclude, width) { /** * Clamps the given cartesian position to the scene geometry along the geodetic surface normal. Returns the * clamped position or undefined if there was no scene geometry to clamp to. May be used to clamp - * objects to the globe, 3D Tiles, or primitives in the scene. *

- * This function only clamps to globe tiles and 3D Tiles that are rendered in the current view. Clamps to * all other primitives regardless of their visibility. *

* * @param {Cartesian3} cartesian The cartesian position. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not clamp to. * @param {number} [width=0.1] Width of the intersection volume in meters. * @param {Cartesian3} [result] An optional object to return the clamped position. * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided. This may be undefined if there was no scene geometry to clamp to. @@ -4278,7 +4354,6 @@ Scene.prototype.clampToHeight = function ( * the height is set to undefined. * * @param {Cartographic[]} positions The cartographic positions to update with sampled heights. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not sample height from. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to the provided list of positions when the query has completed. * @@ -4318,7 +4393,6 @@ Scene.prototype.sampleHeightMostDetailed = function ( * can be sampled at that location, or another error occurs, the element in the array is set to undefined. * * @param {Cartesian3[]} cartesians The cartesian positions to update with clamped positions. - * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not clamp to. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to the provided list of positions when the query has completed. * diff --git a/packages/engine/Source/Scene/TileBoundingS2Cell.js b/packages/engine/Source/Scene/TileBoundingS2Cell.js index 872529473f43..307fa36c8e39 100644 --- a/packages/engine/Source/Scene/TileBoundingS2Cell.js +++ b/packages/engine/Source/Scene/TileBoundingS2Cell.js @@ -330,7 +330,7 @@ Object.defineProperties(TileBoundingS2Cell.prototype, { /** * The underlying bounding volume. * - * @memberof TileOrientedBoundingBox.prototype + * @memberof TileBoundingS2Cell.prototype * * @type {object} * @readonly @@ -343,7 +343,7 @@ Object.defineProperties(TileBoundingS2Cell.prototype, { /** * The underlying bounding sphere. * - * @memberof TileOrientedBoundingBox.prototype + * @memberof TileBoundingS2Cell.prototype * * @type {BoundingSphere} * @readonly From 3f35d9adf6821602303f91293df85cbf13e4633d Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Thu, 14 Dec 2023 13:40:26 -0500 Subject: [PATCH 02/15] Tweak API, fix unit tests --- .../Sandcastle/gallery/3D Tiles Interior.html | 4 +- .../gallery/Clamp Entities to Ground.html | 1 - .../gallery/Clamp Model to Ground.html | 3 - CHANGES.md | 4 +- Specs/createGlobe.js | 10 +- .../DataSources/GroundGeometryUpdater.js | 2 +- packages/engine/Source/Scene/Billboard.js | 7 +- .../engine/Source/Scene/Cesium3DTileset.js | 23 +- packages/engine/Source/Scene/Model/Model.js | 3 +- packages/engine/Source/Scene/Scene.js | 51 ++- .../createGooglePhotorealistic3DTileset.js | 4 - .../Specs/DataSources/ModelVisualizerSpec.js | 339 +++++++++--------- .../Specs/Scene/BillboardCollectionSpec.js | 151 ++++++-- .../engine/Specs/Scene/LabelCollectionSpec.js | 119 ++++-- .../engine/Specs/Scene/Model/ModelSpec.js | 56 +-- 15 files changed, 459 insertions(+), 318 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Interior.html b/Apps/Sandcastle/gallery/3D Tiles Interior.html index 38c63747e69e..3fa0c0ea077e 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Interior.html +++ b/Apps/Sandcastle/gallery/3D Tiles Interior.html @@ -40,7 +40,9 @@ const viewer = new Cesium.Viewer("cesiumContainer"); try { - const tileset = await Cesium.Cesium3DTileset.fromIonAssetId(125737); + const tileset = await Cesium.Cesium3DTileset.fromIonAssetId(125737, { + disableCollision: true, + }); viewer.scene.primitives.add(tileset); } catch (error) { console.log(`Error loading tileset: ${error}`); diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html index 6d0edc1515cf..8645fe5cc535 100644 --- a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html +++ b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html @@ -60,7 +60,6 @@ try { worldTileset = await Cesium.createGooglePhotorealistic3DTileset(); viewer.scene.primitives.add(worldTileset); - viewer.scene.enableCollisionDetectionForTileset(worldTileset); } catch (error) { console.log(`Error loading Photorealistic 3D Tiles tileset. ${error}`); diff --git a/Apps/Sandcastle/gallery/Clamp Model to Ground.html b/Apps/Sandcastle/gallery/Clamp Model to Ground.html index b8db9567bd83..4b326c36c06d 100644 --- a/Apps/Sandcastle/gallery/Clamp Model to Ground.html +++ b/Apps/Sandcastle/gallery/Clamp Model to Ground.html @@ -63,9 +63,6 @@ try { tileset = await Cesium.Cesium3DTileset.fromIonAssetId(40866); viewer.scene.primitives.add(tileset); - - // This line is needed to clamp to 3D Tiles - viewer.scene.enableCollisionDetectionForTileset(tileset); } catch (error) { console.log(`Error loading tileset: ${error}`); } diff --git a/CHANGES.md b/CHANGES.md index d09272f3b9e7..6f28f67eb1ff 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,8 +6,10 @@ ##### Additions :tada: -- Added `Cesium3DTileset.getHeight` to sample height values of the loaded tiles. If using WebGL 1, the `enablePick` option must be set to true to use this function. [#11581](https://github.com/CesiumGS/cesium/pull/11581) - Added `Cesium3DTileset.enableCameraCollision` to prevent the camera from going below a 3D tileset. Tilesets created with `createGooglePhotorealistic3DTileset` have this option enabled by default. [#11581](https://github.com/CesiumGS/cesium/pull/11581) +- Clamping to ground, `HeightReference.CLAMP_TO_GROUND`, and `HeightReference.RELATIVE_TO_GROUND` now take into account 3D Tilesets. These opions will clamp to either 3D Tilesets or Terrain, whichever has a greater height. [#11604](https://github.com/CesiumGS/cesium/pull/11604) +- Added `HeightReference.CLAMP_TO_TERRAIN`, `HeightReference.RELATIVE_TO_TERRAIN`, `HeightReference.CLAMP_TO_3D_TILE`, and `HeightReference.RELATIVE_TO_3D_TILE` to position relatve to terrain or 3D tilesets exclusively.[#11604](https://github.com/CesiumGS/cesium/pull/11604) +- Added `Cesium3DTileset.getHeight` to sample height values of the loaded tiles. If using WebGL 1, the `enablePick` option must be set to true to use this function. [#11581](https://github.com/CesiumGS/cesium/pull/11581) ##### Fixes :wrench: diff --git a/Specs/createGlobe.js b/Specs/createGlobe.js index 200419f42880..fdd17e3d2e77 100644 --- a/Specs/createGlobe.js +++ b/Specs/createGlobe.js @@ -4,8 +4,8 @@ function createGlobe(ellipsoid) { ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); const globe = { - callback: undefined, - removedCallback: false, + _callback: undefined, + _removedCallback: false, ellipsoid: ellipsoid, beginFrame: function () {}, endFrame: function () {}, @@ -22,10 +22,10 @@ function createGlobe(ellipsoid) { }; globe._surface.updateHeight = function (position, callback) { - globe.callback = callback; + globe._callback = callback; return function () { - globe.removedCallback = true; - globe.callback = undefined; + globe._removedCallback = true; + globe._callback = undefined; }; }; diff --git a/packages/engine/Source/DataSources/GroundGeometryUpdater.js b/packages/engine/Source/DataSources/GroundGeometryUpdater.js index dbd2c247e504..6f821b6080ad 100644 --- a/packages/engine/Source/DataSources/GroundGeometryUpdater.js +++ b/packages/engine/Source/DataSources/GroundGeometryUpdater.js @@ -166,7 +166,7 @@ GroundGeometryUpdater.getGeometryHeight = function (height, heightReference) { return; } - if (isHeightReferenceClamp(heightReference)) { + if (!isHeightReferenceClamp(heightReference)) { return height; } return 0.0; diff --git a/packages/engine/Source/Scene/Billboard.js b/packages/engine/Source/Scene/Billboard.js index 8a52aa48cc9b..9e731e2f97ac 100644 --- a/packages/engine/Source/Scene/Billboard.js +++ b/packages/engine/Source/Scene/Billboard.js @@ -10,6 +10,7 @@ import defaultValue from "../Core/defaultValue.js"; import defined from "../Core/defined.js"; import DeveloperError from "../Core/DeveloperError.js"; import DistanceDisplayCondition from "../Core/DistanceDisplayCondition.js"; +import Ellipsoid from "../Core/Ellipsoid.js"; import Matrix4 from "../Core/Matrix4.js"; import NearFarScalar from "../Core/NearFarScalar.js"; import Resource from "../Core/Resource.js"; @@ -1060,11 +1061,11 @@ Billboard.prototype._updateClamping = function () { const scratchCartographic = new Cartographic(); Billboard._updateClamping = function (collection, owner) { const scene = collection._scene; - if (!defined(scene) || !defined(scene.globe)) { + if (!defined(scene)) { //>>includeStart('debug', pragmas.debug); if (owner._heightReference !== HeightReference.NONE) { throw new DeveloperError( - "Height reference is not supported without a scene and globe." + "Height reference is not supported without a scene." ); } //>>includeEnd('debug'); @@ -1072,7 +1073,7 @@ Billboard._updateClamping = function (collection, owner) { } const globe = scene.globe; - const ellipsoid = globe.ellipsoid; + const ellipsoid = defaultValue(globe?.ellipsoid, Ellipsoid.WGS84); const mode = scene.frameState.mode; diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index a682d4c93c86..d099947f3041 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -110,9 +110,9 @@ import Ray from "../Core/Ray.js"; * @property {string|number} [instanceFeatureIdLabel="instanceFeatureId_0"] Label of the instance feature ID set used for picking and styling. If instanceFeatureIdLabel is set to an integer N, it is converted to the string "instanceFeatureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority. * @property {boolean} [showCreditsOnScreen=false] Whether to display the credits of this tileset on screen. * @property {SplitDirection} [splitDirection=SplitDirection.NONE] The {@link SplitDirection} split to apply to this tileset. - * @property {boolean} [enableCameraCollision=false] When {@link ScreenSpaceCameraController#enableCollisionDetection} is true, prevents the camera from going below the tileset surface. + * @property {boolean} [disableCollision=false] When {@link ScreenSpaceCameraController#enableCollisionDetection} is true, allows the camera to go in or below the tileset surface. If using WebGL 1, enablePick must be true for collision to work. * @property {boolean} [projectTo2D=false] Whether to accurately project the tileset to 2D. If this is true, the tileset will be projected accurately to 2D, but it will use more memory to do so. If this is false, the tileset will use less memory and will still render in 2D / CV mode, but its projected positions may be inaccurate. This cannot be set after the tileset has been created. - * @property {boolean} [enablePick=false] Whether to allow with CPU picking with pick when not using WebGL 2 or above. If using WebGL 2 or above, this option will be ignored. If using WebGL 1 and this is true, the pick operation will work correctly, but it will use more memory to do so. If running with WebGL 1 and this is false, the model will use less memory, but pick will always return undefined. This cannot be set after the tileset has loaded. + * @property {boolean} [enablePick=false] Whether to allow collision and CPU picking with pick when WebGL 1. If using WebGL 2 or above, this option will be ignored. If using WebGL 1 and this is true, the pick operation will work correctly, but it will use more memory to do so. If running with WebGL 1 and this is false, the model will use less memory, but pick will always return undefined. This cannot be set after the tileset has loaded. * @property {string} [debugHeatmapTilePropertyName] The tile variable to colorize as a heatmap. All rendered tiles will be colorized relative to each other's specified variable value. * @property {boolean} [debugFreezeFrame=false] For debugging only. Determines if only the tiles from last frame should be used for rendering. * @property {boolean} [debugColorizeTiles=false] For debugging only. When true, assigns a random color to each tile. @@ -153,11 +153,11 @@ import Ray from "../Core/Ray.js"; * } * * @example - * // Keep camera from going under 3D tileset + * // Allow camera to go in and under 3D tileset * try { * const tileset = await Cesium.Cesium3DTileset.fromUrl( * "http://localhost:8002/tilesets/Seattle/tileset.json", - * { enableCameraCollision: true } + * { disableCollision: true } * ); * scene.primitives.add(tileset); * } catch (error) { @@ -842,22 +842,15 @@ function Cesium3DTileset(options) { ); /** - * When {@link ScreenSpaceCameraController#enableCollisionDetection} is true, prevents the camera from going below the tileset surface. - * If using WebGL 1, {@link Cesium3DTileset#ConstructorOptions} enablePick must be true for this behavior to work. + * When {@link ScreenSpaceCameraController#enableCollisionDetection} is true, allows the camera to go in or below the tileset surface. * * @type {boolean} * @default false */ - this.enableCameraCollision = defaultValue( - options.enableCameraCollision, - false - ); + this.disableCollision = defaultValue(options.disableCollision, false); this._projectTo2D = defaultValue(options.projectTo2D, false); - this._enablePick = defaultValue( - options.enablePick, - this.enableCameraCollision - ); + this._enablePick = defaultValue(options.enablePick, false); /** * This property is for debugging only; it is not optimized for production use. @@ -3591,7 +3584,7 @@ Cesium3DTileset.prototype.pick = function (ray, frameState, result) { tile.boundingSphere, scratchSphereIntersection ); - if (!defined(boundsIntersection)) { + if (!defined(boundsIntersection) || !defined(tile.content)) { continue; } diff --git a/packages/engine/Source/Scene/Model/Model.js b/packages/engine/Source/Scene/Model/Model.js index 389c7aa9d8ad..0b39f7be25ad 100644 --- a/packages/engine/Source/Scene/Model/Model.js +++ b/packages/engine/Source/Scene/Model/Model.js @@ -9,6 +9,7 @@ import defaultValue from "../../Core/defaultValue.js"; import DeveloperError from "../../Core/DeveloperError.js"; import destroyObject from "../../Core/destroyObject.js"; import DistanceDisplayCondition from "../../Core/DistanceDisplayCondition.js"; +import Ellipsoid from "../../Core/Ellipsoid.js"; import Event from "../../Core/Event.js"; import Matrix3 from "../../Core/Matrix3.js"; import Matrix4 from "../../Core/Matrix4.js"; @@ -2043,7 +2044,7 @@ function updateClamping(model) { } const globe = scene.globe; - const ellipsoid = globe.ellipsoid; + const ellipsoid = defaultValue(globe?.ellipsoid, Ellipsoid.WGS84); // Compute cartographic position so we don't recompute every update const modelMatrix = model.modelMatrix; diff --git a/packages/engine/Source/Scene/Scene.js b/packages/engine/Source/Scene/Scene.js index 40a6e81bea95..ea11e8e5a268 100644 --- a/packages/engine/Source/Scene/Scene.js +++ b/packages/engine/Source/Scene/Scene.js @@ -3598,7 +3598,7 @@ Scene.prototype.getHeight = function (cartographic, heightReference) { const length = this.primitives.length; for (let i = 0; i < length; ++i) { const primitive = this.primitives.get(i); - if (!primitive.isCesium3DTileset || !primitive.enableCameraCollision) { + if (!primitive.isCesium3DTileset || primitive.disableCollision) { continue; } @@ -3671,24 +3671,55 @@ Scene.prototype.updateHeight = function ( ); } - const tilesetRemoveCallbacks = []; + let tilesetRemoveCallbacks = {}; const ellipsoid = this.globe?.ellipsoid; + const createPrimitiveEventListener = (primitive) => { + if ( + ignore3dTiles || + !primitive.isCesium3DTileset || + primitive.disableCollision + ) { + return; + } + + const tilesetRemoveCallback = primitive.updateHeight( + cartographic, + callbackWrapper, + ellipsoid + ); + tilesetRemoveCallbacks[primitive.id] = tilesetRemoveCallback; + }; + if (!ignore3dTiles) { - for (const tileset of this._terrainTilesets) { - const tilesetRemoveCallback = tileset.updateHeight( - cartographic, - callbackWrapper, - ellipsoid - ); - tilesetRemoveCallbacks.push(tilesetRemoveCallback); + const length = this.primitives.length; + for (let i = 0; i < length; ++i) { + const primitive = this.primitives.get(i); + createPrimitiveEventListener(primitive); } } + const removeAddedListener = this.primitives.primitiveAdded.addEventListener( + createPrimitiveEventListener + ); + const removeRemovedListener = this.primitives.primitiveRemoved.addEventListener( + (primitive) => { + if (!primitive.isCesium3DTileset) { + return; + } + + tilesetRemoveCallbacks[primitive.id](); + delete tilesetRemoveCallbacks[primitive.id]; + } + ); + const removeCallback = () => { terrainRemoveCallback = terrainRemoveCallback && terrainRemoveCallback(); - tilesetRemoveCallbacks.forEach((tilesetRemoveCallback) => + Object.values(tilesetRemoveCallbacks).forEach((tilesetRemoveCallback) => tilesetRemoveCallback() ); + tilesetRemoveCallbacks = {}; + removeAddedListener(); + removeRemovedListener(); }; return removeCallback; diff --git a/packages/engine/Source/Scene/createGooglePhotorealistic3DTileset.js b/packages/engine/Source/Scene/createGooglePhotorealistic3DTileset.js index 7877b3ac852b..aa678f6a0161 100644 --- a/packages/engine/Source/Scene/createGooglePhotorealistic3DTileset.js +++ b/packages/engine/Source/Scene/createGooglePhotorealistic3DTileset.js @@ -46,10 +46,6 @@ async function createGooglePhotorealistic3DTileset(key, options) { options.maximumCacheOverflowBytes, 1024 * 1024 * 1024 ); - options.enableCameraCollision = defaultValue( - options.enableCameraCollision, - true - ); key = defaultValue(key, GoogleMaps.defaultApiKey); if (!defined(key)) { diff --git a/packages/engine/Specs/DataSources/ModelVisualizerSpec.js b/packages/engine/Specs/DataSources/ModelVisualizerSpec.js index 4c12504069d0..7232087d6cd0 100644 --- a/packages/engine/Specs/DataSources/ModelVisualizerSpec.js +++ b/packages/engine/Specs/DataSources/ModelVisualizerSpec.js @@ -13,6 +13,7 @@ import { Resource, Transforms, BoundingSphereState, + Cesium3DTileset, ConstantPositionProperty, ConstantProperty, EntityCollection, @@ -24,7 +25,6 @@ import { CustomShader, Globe, Cartographic, - createWorldTerrainAsync, } from "../../index.js"; import createScene from "../../../../Specs/createScene.js"; import pollToPromise from "../../../../Specs/pollToPromise.js"; @@ -53,6 +53,7 @@ describe( afterEach(function () { visualizer = visualizer && visualizer.destroy(); entityCollection.removeAll(); + scene.primitives.removeAll(); }); afterAll(function () { @@ -404,16 +405,18 @@ describe( expect(result).toEqual(expected); }); - it("computes bounding sphere with height reference clamp to ground", async function () { + it("computes bounding sphere with height reference clamp to terrain", async function () { // Setup a position for the model. const position = Cartesian3.fromDegrees(149.515332, -34.984799); - const positionCartographic = Cartographic.fromCartesian(position); + + const tileset = new Cesium3DTileset(); + scene.primitives.add(tileset); // Initialize the Entity and the ModelGraphics. const time = JulianDate.now(); const testObject = entityCollection.getOrCreateEntity("test"); const model = new ModelGraphics({ - heightReference: HeightReference.CLAMP_TO_GROUND, + heightReference: HeightReference.CLAMP_TO_TERRAIN, }); testObject.model = model; testObject.position = new ConstantProperty(position); @@ -426,61 +429,96 @@ describe( let state = visualizer.getBoundingSphere(testObject, result); expect(state).toBe(BoundingSphereState.PENDING); - // Assign a tiled terrain provider to the globe. - const globe = scene.globe; - globe.terrainProvider = await createWorldTerrainAsync(); + spyOn(scene.globe, "getHeight").and.returnValue(10.0); + spyOn(tileset, "getHeight").and.returnValue(20.0); + + // Repeatedly request the bounding sphere until it's ready. + await pollToPromise(function () { + scene.renderForSpecs(); + visualizer.update(time); + state = visualizer.getBoundingSphere(testObject, result); + return state !== BoundingSphereState.PENDING; + }); + + expect(state).toBe(BoundingSphereState.DONE); + + // Ensure that flags and results computed for this model are reset. + const modelData = visualizer._modelHash[testObject.id]; + expect(modelData.clampedBoundingSphere).toBeUndefined(); - const updatedCartographics = await ModelVisualizer._sampleTerrainMostDetailed( - globe.terrainProvider, - [positionCartographic] + const expectedCenter = Cartographic.fromCartesian(position); + expectedCenter.height = 10.0; + expect(result.center).toEqualEpsilon( + Cartographic.toCartesian(expectedCenter), + CesiumMath.EPSILON8 ); - const sampledResultCartographic = updatedCartographics[0]; - const sampledResult = globe.ellipsoid.cartographicToCartesian( - sampledResultCartographic + }); + + it("computes bounding sphere with height reference relative to terrain", async function () { + // Setup a position for the model. + const heightOffset = 1000.0; + const position = Cartesian3.fromDegrees( + 149.515332, + -34.984799, + heightOffset ); - const sampleTerrainSpy = spyOn( - ModelVisualizer, - "_sampleTerrainMostDetailed" - ).and.callThrough(); + const tileset = new Cesium3DTileset(); + scene.primitives.add(tileset); + + // Initialize the Entity and the ModelGraphics. + const time = JulianDate.now(); + const testObject = entityCollection.getOrCreateEntity("test"); + const model = new ModelGraphics({ + heightReference: HeightReference.RELATIVE_TO_TERRAIN, + }); + testObject.model = model; + testObject.position = new ConstantProperty(position); + model.uri = new ConstantProperty(boxUrl); + + visualizer.update(time); + + // Request the bounding sphere once. + const result = new BoundingSphere(); + let state = visualizer.getBoundingSphere(testObject, result); + expect(state).toBe(BoundingSphereState.PENDING); + + spyOn(scene.globe, "getHeight").and.returnValue(10.0); + spyOn(tileset, "getHeight").and.returnValue(20.0); // Repeatedly request the bounding sphere until it's ready. await pollToPromise(function () { - scene.render(); + scene.renderForSpecs(); visualizer.update(time); state = visualizer.getBoundingSphere(testObject, result); return state !== BoundingSphereState.PENDING; }); - expect(state).toBe(BoundingSphereState.DONE); // Ensure that flags and results computed for this model are reset. const modelData = visualizer._modelHash[testObject.id]; - expect(modelData.awaitingSampleTerrain).toBe(false); expect(modelData.clampedBoundingSphere).toBeUndefined(); - // Ensure that we only sample the terrain once from the visualizer. - expect(sampleTerrainSpy).toHaveBeenCalledTimes(1); - - // Calculate the distance of the bounding sphere returned from the position returned from sample terrain. - // Since sampleTerrainMostDetailed isn't always precise, we account for some error. - const distance = Cartesian3.distance(result.center, sampledResult); - const errorMargin = 100.0; - expect(distance).toBeLessThan(errorMargin); + const expectedCenter = Cartographic.fromCartesian(position); + expectedCenter.height = heightOffset + 10.0; + expect(result.center).toEqualEpsilon( + Cartographic.toCartesian(expectedCenter), + CesiumMath.EPSILON8 + ); }); - it("computes bounding sphere with height reference clamp to ground on terrain provider without availability", function () { + it("computes bounding sphere with height reference clamp to 3D Tiles", async function () { // Setup a position for the model. - const longitude = CesiumMath.toRadians(149.515332); - const latitude = CesiumMath.toRadians(-34.984799); - const height = 1000; - const position = Cartesian3.fromRadians(longitude, latitude, height); + const position = Cartesian3.fromDegrees(149.515332, -34.984799); + + const tileset = new Cesium3DTileset(); + scene.primitives.add(tileset); // Initialize the Entity and the ModelGraphics. const time = JulianDate.now(); const testObject = entityCollection.getOrCreateEntity("test"); const model = new ModelGraphics({ - heightReference: HeightReference.CLAMP_TO_GROUND, + heightReference: HeightReference.CLAMP_TO_3D_TILE, }); testObject.model = model; testObject.position = new ConstantProperty(position); @@ -493,36 +531,32 @@ describe( let state = visualizer.getBoundingSphere(testObject, result); expect(state).toBe(BoundingSphereState.PENDING); - // Ensure that the terrain provider does not have availability. - const globe = scene.globe; - const terrainProvider = globe.terrainProvider; - expect(terrainProvider.availability).toBe(undefined); + spyOn(scene.globe, "getHeight").and.returnValue(20.0); + spyOn(tileset, "getHeight").and.returnValue(10.0); // Repeatedly request the bounding sphere until it's ready. - return pollToPromise(function () { - scene.render(); + await pollToPromise(function () { + scene.renderForSpecs(); visualizer.update(time); state = visualizer.getBoundingSphere(testObject, result); return state !== BoundingSphereState.PENDING; - }).then(() => { - expect(state).toBe(BoundingSphereState.DONE); - // Ensure that the clamped position has height set to 0. - const cartographic = globe.ellipsoid.cartesianToCartographic( - result.center - ); - expect(cartographic.height).toEqualEpsilon(0, CesiumMath.EPSILON6); - expect(cartographic.latitude).toEqualEpsilon( - latitude, - CesiumMath.EPSILON6 - ); - expect(cartographic.longitude).toEqualEpsilon( - longitude, - CesiumMath.EPSILON6 - ); }); + + expect(state).toBe(BoundingSphereState.DONE); + + // Ensure that flags and results computed for this model are reset. + const modelData = visualizer._modelHash[testObject.id]; + expect(modelData.clampedBoundingSphere).toBeUndefined(); + + const expectedCenter = Cartographic.fromCartesian(position); + expectedCenter.height = 10.0; + expect(result.center).toEqualEpsilon( + Cartographic.toCartesian(expectedCenter), + CesiumMath.EPSILON8 + ); }); - it("computes bounding sphere with height reference relative to ground", async function () { + it("computes bounding sphere with height reference relative to 3D Tiles", async function () { // Setup a position for the model. const heightOffset = 1000.0; const position = Cartesian3.fromDegrees( @@ -530,19 +564,15 @@ describe( -34.984799, heightOffset ); - const positionCartographic = Cartographic.fromCartesian(position); - // Setup a spy so we can track how often sampleTerrain is called. - const sampleTerrainSpy = spyOn( - ModelVisualizer, - "_sampleTerrainMostDetailed" - ).and.callThrough(); + const tileset = new Cesium3DTileset(); + scene.primitives.add(tileset); // Initialize the Entity and the ModelGraphics. const time = JulianDate.now(); const testObject = entityCollection.getOrCreateEntity("test"); const model = new ModelGraphics({ - heightReference: HeightReference.RELATIVE_TO_GROUND, + heightReference: HeightReference.RELATIVE_TO_3D_TILE, }); testObject.model = model; testObject.position = new ConstantProperty(position); @@ -555,51 +585,90 @@ describe( let state = visualizer.getBoundingSphere(testObject, result); expect(state).toBe(BoundingSphereState.PENDING); - // Assign a tiled terrain provider to the globe. - const globe = scene.globe; - globe.terrainProvider = await createWorldTerrainAsync(); + spyOn(scene.globe, "getHeight").and.returnValue(20.0); + spyOn(tileset, "getHeight").and.returnValue(10.0); - const updatedCartographics = await ModelVisualizer._sampleTerrainMostDetailed( - globe.terrainProvider, - [positionCartographic] - ); - const sampledResultCartographic = updatedCartographics[0]; - const sampledResult = globe.ellipsoid.cartographicToCartesian( - sampledResultCartographic + // Repeatedly request the bounding sphere until it's ready. + await pollToPromise(function () { + scene.renderForSpecs(); + visualizer.update(time); + state = visualizer.getBoundingSphere(testObject, result); + return state !== BoundingSphereState.PENDING; + }); + expect(state).toBe(BoundingSphereState.DONE); + + // Ensure that flags and results computed for this model are reset. + const modelData = visualizer._modelHash[testObject.id]; + expect(modelData.clampedBoundingSphere).toBeUndefined(); + + const expectedCenter = Cartographic.fromCartesian(position); + expectedCenter.height = heightOffset + 10.0; + expect(result.center).toEqualEpsilon( + Cartographic.toCartesian(expectedCenter), + CesiumMath.EPSILON8 ); + }); + + it("computes bounding sphere with height reference clamp to ground", async function () { + // Setup a position for the model. + const position = Cartesian3.fromDegrees(149.515332, -34.984799); + + const tileset = new Cesium3DTileset(); + scene.primitives.add(tileset); + + // Initialize the Entity and the ModelGraphics. + const time = JulianDate.now(); + const testObject = entityCollection.getOrCreateEntity("test"); + const model = new ModelGraphics({ + heightReference: HeightReference.CLAMP_TO_GROUND, + }); + testObject.model = model; + testObject.position = new ConstantProperty(position); + model.uri = new ConstantProperty(boxUrl); + + visualizer.update(time); + + // Request the bounding sphere once. + const result = new BoundingSphere(); + let state = visualizer.getBoundingSphere(testObject, result); + expect(state).toBe(BoundingSphereState.PENDING); + + spyOn(scene.globe, "getHeight").and.returnValue(10.0); + spyOn(tileset, "getHeight").and.returnValue(20.0); // Repeatedly request the bounding sphere until it's ready. await pollToPromise(function () { - scene.render(); + scene.renderForSpecs(); visualizer.update(time); state = visualizer.getBoundingSphere(testObject, result); return state !== BoundingSphereState.PENDING; }); + expect(state).toBe(BoundingSphereState.DONE); // Ensure that flags and results computed for this model are reset. const modelData = visualizer._modelHash[testObject.id]; - expect(modelData.awaitingSampleTerrain).toBe(false); expect(modelData.clampedBoundingSphere).toBeUndefined(); - // Ensure that we only sample the terrain once from the visualizer. - // We check for 2 calls here because we call it once in the test. - expect(sampleTerrainSpy).toHaveBeenCalledTimes(2); - - // Calculate the distance of the bounding sphere returned from the position returned from sample terrain. - // Since sampleTerrainMostDetailed isn't always precise, we account for some error. - const distance = - Cartesian3.distance(result.center, sampledResult) - heightOffset; - const errorMargin = 100.0; - expect(distance).toBeLessThan(errorMargin); + const expectedCenter = Cartographic.fromCartesian(position); + expectedCenter.height = 20.0; + expect(result.center).toEqualEpsilon( + Cartographic.toCartesian(expectedCenter), + CesiumMath.EPSILON8 + ); }); - it("computes bounding sphere with height reference relative to ground on terrain provider without availability", function () { + it("computes bounding sphere with height reference relative to ground", async function () { // Setup a position for the model. - const longitude = CesiumMath.toRadians(149.515332); - const latitude = CesiumMath.toRadians(-34.984799); - const height = 1000; - const position = Cartesian3.fromRadians(longitude, latitude, height); + const heightOffset = 1000.0; + const position = Cartesian3.fromDegrees( + 149.515332, + -34.984799, + heightOffset + ); + + const tileset = new Cesium3DTileset(); + scene.primitives.add(tileset); // Initialize the Entity and the ModelGraphics. const time = JulianDate.now(); @@ -618,31 +687,28 @@ describe( let state = visualizer.getBoundingSphere(testObject, result); expect(state).toBe(BoundingSphereState.PENDING); - // Ensure that the terrain provider does not have availability. - const globe = scene.globe; - const terrainProvider = globe.terrainProvider; - expect(terrainProvider.availability).toBe(undefined); + spyOn(scene.globe, "getHeight").and.returnValue(10.0); + spyOn(tileset, "getHeight").and.returnValue(20.0); // Repeatedly request the bounding sphere until it's ready. - return pollToPromise(function () { - scene.render(); + await pollToPromise(function () { + scene.renderForSpecs(); visualizer.update(time); state = visualizer.getBoundingSphere(testObject, result); return state !== BoundingSphereState.PENDING; - }).then(() => { - const cartographic = globe.ellipsoid.cartesianToCartographic( - result.center - ); - expect(cartographic.height).toEqualEpsilon(height, CesiumMath.EPSILON6); - expect(cartographic.latitude).toEqualEpsilon( - latitude, - CesiumMath.EPSILON6 - ); - expect(cartographic.longitude).toEqualEpsilon( - longitude, - CesiumMath.EPSILON6 - ); }); + expect(state).toBe(BoundingSphereState.DONE); + + // Ensure that flags and results computed for this model are reset. + const modelData = visualizer._modelHash[testObject.id]; + expect(modelData.clampedBoundingSphere).toBeUndefined(); + + const expectedCenter = Cartographic.fromCartesian(position); + expectedCenter.height = heightOffset + 20.0; + expect(result.center).toEqualEpsilon( + Cartographic.toCartesian(expectedCenter), + CesiumMath.EPSILON8 + ); }); it("computes bounding sphere where globe is undefined", async function () { @@ -715,61 +781,6 @@ describe( expect(state).toBe(BoundingSphereState.FAILED); }); - it("fails bounding sphere when sampleTerrainMostDetailed fails", async function () { - // Setup a position for the model. - const heightOffset = 1000.0; - const position = Cartesian3.fromDegrees( - 149.515332, - -34.984799, - heightOffset - ); - - // Setup a spy so we can track how often sampleTerrain is called. - const sampleTerrainSpy = spyOn( - ModelVisualizer, - "_sampleTerrainMostDetailed" - ).and.callFake(() => { - return Promise.reject(404); - }); - - // Initialize the Entity and the ModelGraphics. - const time = JulianDate.now(); - const testObject = entityCollection.getOrCreateEntity("test"); - const model = new ModelGraphics({ - heightReference: HeightReference.RELATIVE_TO_GROUND, - }); - testObject.model = model; - testObject.position = new ConstantProperty(position); - model.uri = new ConstantProperty(boxUrl); - - visualizer.update(time); - - // Assign a tiled terrain provider to the globe. - const globe = scene.globe; - globe.terrainProvider = await createWorldTerrainAsync(); - - // Request the bounding sphere once. - const result = new BoundingSphere(); - let state; - - // Repeatedly request the bounding sphere until it's ready. - return pollToPromise(function () { - scene.render(); - visualizer.update(time); - state = visualizer.getBoundingSphere(testObject, result); - return state !== BoundingSphereState.PENDING; - }).then(() => { - expect(state).toBe(BoundingSphereState.FAILED); - - // Ensure that flags and results computed for this model are reset. - const modelData = visualizer._modelHash[testObject.id]; - expect(modelData.sampleTerrainFailed).toBe(false); - - // Ensure that we only sample the terrain once from the visualizer. - expect(sampleTerrainSpy).toHaveBeenCalledTimes(1); - }); - }); - it("compute bounding sphere throws without entity", function () { const result = new BoundingSphere(); expect(function () { diff --git a/packages/engine/Specs/Scene/BillboardCollectionSpec.js b/packages/engine/Specs/Scene/BillboardCollectionSpec.js index 529ff9049530..58b341e8fc7f 100644 --- a/packages/engine/Specs/Scene/BillboardCollectionSpec.js +++ b/packages/engine/Specs/Scene/BillboardCollectionSpec.js @@ -3,10 +3,12 @@ import { BoundingSphere, Cartesian2, Cartesian3, + Cartographic, CesiumTerrainProvider, Color, createGuid, DistanceDisplayCondition, + Globe, NearFarScalar, OrthographicOffCenterFrustum, PerspectiveFrustum, @@ -23,7 +25,6 @@ import { import { Math as CesiumMath } from "../../index.js"; -import createGlobe from "../../../../Specs/createGlobe.js"; import createScene from "../../../../Specs/createScene.js"; import pollToPromise from "../../../../Specs/pollToPromise.js"; @@ -2394,7 +2395,7 @@ describe( describe("height referenced billboards", function () { let billboardsWithHeight; beforeEach(function () { - scene.globe = createGlobe(); + scene.globe = new Globe(); billboardsWithHeight = new BillboardCollection({ scene: scene, }); @@ -2417,63 +2418,127 @@ describe( }); it("creating with a height reference creates a height update callback", function () { + spyOn(scene, "updateHeight"); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); it("set height reference property creates a height update callback", function () { + spyOn(scene, "updateHeight"); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); const b = billboardsWithHeight.add({ - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); b.heightReference = HeightReference.CLAMP_TO_GROUND; - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); it("updates the callback when the height reference changes", function () { + spyOn(scene, "updateHeight"); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); const b = billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); b.heightReference = HeightReference.RELATIVE_TO_GROUND; - expect(scene.globe.removedCallback).toEqual(true); - expect(scene.globe.callback).toBeDefined(); - scene.globe.removedCallback = false; + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.RELATIVE_TO_GROUND + ); + }); + + it("removes the callback when the height reference changes", function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); + const b = billboardsWithHeight.add({ + heightReference: HeightReference.CLAMP_TO_GROUND, + position: position, + }); + b.heightReference = HeightReference.NONE; - expect(scene.globe.removedCallback).toEqual(true); - expect(scene.globe.callback).toBeUndefined(); + expect(removeCallback).toHaveBeenCalled(); }); it("changing the position updates the callback", function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + let position = Cartesian3.fromDegrees(-72.0, 40.0); const b = billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); - b.position = Cartesian3.fromDegrees(-73.0, 40.0); - expect(scene.globe.removedCallback).toEqual(true); - expect(scene.globe.callback).toBeDefined(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); + + position = b.position = Cartesian3.fromDegrees(-73.0, 40.0); + + expect(removeCallback).toHaveBeenCalled(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); it("callback updates the position", function () { + let invokeCallback; + spyOn(scene, "updateHeight").and.callFake( + (cartographic, updateCallback) => { + invokeCallback = (height) => { + cartographic.height = height; + updateCallback(cartographic); + }; + } + ); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); const b = billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalled(); let cartographic = scene.globe.ellipsoid.cartesianToCartographic( b._clampedPosition ); expect(cartographic.height).toEqual(0.0); - scene.globe.callback(Cartesian3.fromDegrees(-72.0, 40.0, 100.0)); + invokeCallback(100.0); + cartographic = scene.globe.ellipsoid.cartesianToCartographic( b._clampedPosition ); @@ -2484,14 +2549,16 @@ describe( expect(b._clampedPosition).toBeUndefined(); }); - it("disableDepthTest after another function", function () { + it("removes callback after disableDepthTest", function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + const b = billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, position: Cartesian3.fromDegrees(-122, 46.0), disableDepthTestDistance: Number.POSITIVE_INFINITY, }); scene.renderForSpecs(); - expect(scene.globe.callback).toBeDefined(); expect(b._clampedPosition).toBeDefined(); //After changing disableDepthTestDistance and heightReference, the callback should be undefined @@ -2499,18 +2566,24 @@ describe( b.heightReference = HeightReference.NONE; scene.renderForSpecs(); - expect(scene.globe.callback).toBeUndefined(); expect(b._clampedPosition).toBeUndefined(); + expect(removeCallback).toHaveBeenCalled(); }); - it("changing the terrain provider", async function () { - const b = billboardsWithHeight.add({ + it("updates the callback when the terrain provider is changed", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); + billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); - - spyOn(b, "_updateClamping").and.callThrough(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); const terrainProvider = await CesiumTerrainProvider.fromUrl( "made/up/url", @@ -2521,7 +2594,12 @@ describe( scene.terrainProvider = terrainProvider; - expect(b._updateClamping).toHaveBeenCalled(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); + expect(removeCallback).toHaveBeenCalled(); }); it("height reference without a scene rejects", function () { @@ -2543,15 +2621,17 @@ describe( }).toThrowDeveloperError(); }); - it("height reference without a globe rejects", function () { + it("height reference without a globe works", function () { scene.globe = undefined; expect(function () { - return billboardsWithHeight.add({ + billboardsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, position: Cartesian3.fromDegrees(-72.0, 40.0), }); - }).toThrowDeveloperError(); + + scene.renderForSpecs(); + }).not.toThrowError(); }); it("changing height reference without a globe throws DeveloperError", function () { @@ -2563,7 +2643,8 @@ describe( expect(function () { b.heightReference = HeightReference.CLAMP_TO_GROUND; - }).toThrowDeveloperError(); + scene.renderForSpecs(); + }).not.toThrowDeveloperError(); }); }); }, diff --git a/packages/engine/Specs/Scene/LabelCollectionSpec.js b/packages/engine/Specs/Scene/LabelCollectionSpec.js index a4af501bbd44..70d96c24404e 100644 --- a/packages/engine/Specs/Scene/LabelCollectionSpec.js +++ b/packages/engine/Specs/Scene/LabelCollectionSpec.js @@ -3,6 +3,7 @@ import { BoundingSphere, Cartesian2, Cartesian3, + Cartographic, Color, defined, DistanceDisplayCondition, @@ -19,16 +20,12 @@ import { } from "../../index.js"; import { Math as CesiumMath } from "../../index.js"; - -import createGlobe from "../../../../Specs/createGlobe.js"; import createScene from "../../../../Specs/createScene.js"; import pollToPromise from "../../../../Specs/pollToPromise.js"; describe( "Scene/LabelCollection", function () { - // TODO: rendering tests for pixel offset, eye offset, horizontal origin, vertical origin, font, style, outlineColor, outlineWidth, and fillColor properties - let scene; let camera; let labels; @@ -2565,8 +2562,7 @@ describe( describe("height referenced labels", function () { beforeEach(function () { - scene.globe = createGlobe(); - + scene.globe = new Globe(); labelsWithHeight = new LabelCollection({ scene: scene, }); @@ -2574,7 +2570,6 @@ describe( }); it("explicitly constructs a label with height reference", function () { - scene.globe = createGlobe(); const l = labelsWithHeight.add({ text: "test", heightReference: HeightReference.CLAMP_TO_GROUND, @@ -2584,7 +2579,6 @@ describe( }); it("set label height reference property", function () { - scene.globe = createGlobe(); const l = labelsWithHeight.add({ text: "test", }); @@ -2594,68 +2588,127 @@ describe( }); it("creating with a height reference creates a height update callback", function () { - scene.globe = createGlobe(); + spyOn(scene, "updateHeight"); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); labelsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); it("set height reference property creates a height update callback", function () { - scene.globe = createGlobe(); + spyOn(scene, "updateHeight"); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); const l = labelsWithHeight.add({ - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); l.heightReference = HeightReference.CLAMP_TO_GROUND; - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); it("updates the callback when the height reference changes", function () { - scene.globe = createGlobe(); + spyOn(scene, "updateHeight"); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); const l = labelsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); + + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); l.heightReference = HeightReference.RELATIVE_TO_GROUND; - expect(scene.globe.removedCallback).toEqual(true); - expect(scene.globe.callback).toBeDefined(); - scene.globe.removedCallback = false; + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.RELATIVE_TO_GROUND + ); + }); + + it("removes the callback when the height reference changes", function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); + const l = labelsWithHeight.add({ + heightReference: HeightReference.CLAMP_TO_GROUND, + position: position, + }); + l.heightReference = HeightReference.NONE; - expect(scene.globe.removedCallback).toEqual(true); - expect(scene.globe.callback).toBeUndefined(); + + expect(removeCallback).toHaveBeenCalled(); }); it("changing the position updates the callback", function () { - scene.globe = createGlobe(); + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + let position = Cartesian3.fromDegrees(-72.0, 40.0); const l = labelsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); - l.position = Cartesian3.fromDegrees(-73.0, 40.0); - expect(scene.globe.removedCallback).toEqual(true); - expect(scene.globe.callback).toBeDefined(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); + + position = l.position = Cartesian3.fromDegrees(-73.0, 40.0); + + expect(removeCallback).toHaveBeenCalled(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Cartographic.fromCartesian(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); it("callback updates the position", function () { - scene.globe = createGlobe(); + let invokeCallback; + spyOn(scene, "updateHeight").and.callFake( + (cartographic, updateCallback) => { + invokeCallback = (height) => { + cartographic.height = height; + updateCallback(cartographic); + }; + } + ); + + const position = Cartesian3.fromDegrees(-72.0, 40.0); const l = labelsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, - position: Cartesian3.fromDegrees(-72.0, 40.0), + position: position, }); - expect(scene.globe.callback).toBeDefined(); + expect(scene.updateHeight).toHaveBeenCalled(); let cartographic = scene.globe.ellipsoid.cartesianToCartographic( l._clampedPosition ); expect(cartographic.height).toEqual(0.0); - scene.globe.callback(Cartesian3.fromDegrees(-72.0, 40.0, 100.0)); + invokeCallback(100.0); + cartographic = scene.globe.ellipsoid.cartesianToCartographic( l._clampedPosition ); @@ -2663,7 +2716,6 @@ describe( }); it("resets the clamped position when HeightReference.NONE", function () { - scene.globe = createGlobe(); spyOn(scene.camera, "update"); const l = labelsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, @@ -2681,7 +2733,6 @@ describe( }); it("clears the billboard height reference callback when the label is removed", function () { - scene.globe = createGlobe(); spyOn(scene.camera, "update"); const l = labelsWithHeight.add({ heightReference: HeightReference.CLAMP_TO_GROUND, diff --git a/packages/engine/Specs/Scene/Model/ModelSpec.js b/packages/engine/Specs/Scene/Model/ModelSpec.js index a93f00370367..0e135e0bca5a 100644 --- a/packages/engine/Specs/Scene/Model/ModelSpec.js +++ b/packages/engine/Specs/Scene/Model/ModelSpec.js @@ -2109,8 +2109,6 @@ describe( function createMockGlobe() { const globe = { - callback: undefined, - removedCallback: false, ellipsoid: Ellipsoid.WGS84, update: function () {}, render: function () {}, @@ -2144,10 +2142,8 @@ describe( }); globe._surface.updateHeight = function (position, callback) { - globe.callback = callback; return function () { - globe.removedCallback = true; - globe.callback = undefined; + // TODO }; }; @@ -2380,7 +2376,7 @@ describe( sceneWithMockGlobe ).catch(function (error) { expect(error.message).toEqual( - "Height reference is not supported without a scene and globe." + "Height reference is not supported without a scene." ); }); }); @@ -2403,40 +2399,20 @@ describe( }); }); - it("throws when initializing height reference with no globe", function () { - return loadAndZoomToModelAsync( - { - gltf: boxTexturedGltfUrl, - modelMatrix: Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ), - heightReference: HeightReference.CLAMP_TO_GROUND, - scene: scene, - }, - scene - ).catch(function (error) { - expect(error.message).toEqual( - "Height reference is not supported without a scene and globe." - ); - }); - }); - - it("throws when changing height reference with no globe", function () { - return loadAndZoomToModelAsync( - { - gltf: boxTexturedGltfUrl, - modelMatrix: Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ), - scene: scene, - }, - scene - ).then(function (model) { - expect(function () { - model.heightReference = HeightReference.CLAMP_TO_GROUND; - scene.renderForSpecs(); - }).toThrowDeveloperError(); - }); + it("works when initializing height reference with no globe", function () { + return expectAsync( + loadAndZoomToModelAsync( + { + gltf: boxTexturedGltfUrl, + modelMatrix: Transforms.eastNorthUpToFixedFrame( + Cartesian3.fromDegrees(-72.0, 40.0) + ), + heightReference: HeightReference.CLAMP_TO_GROUND, + scene: scene, + }, + scene + ) + ).toBeResolved(); }); it("destroys height reference callback", function () { From 4308e101fa9ef796c6145064152e7c1e64d28e5f Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Thu, 14 Dec 2023 15:01:45 -0500 Subject: [PATCH 03/15] Update Sandcastle --- .../gallery/Clamp Entities to Ground.html | 281 +++++++++++++++--- .../gallery/Clamp Entities to Ground.jpg | Bin 0 -> 73529 bytes .../gallery/Clamp Model to Ground.jpg | Bin 0 -> 94511 bytes packages/engine/Source/Scene/Scene.js | 6 +- 4 files changed, 249 insertions(+), 38 deletions(-) create mode 100644 Apps/Sandcastle/gallery/Clamp Entities to Ground.jpg create mode 100644 Apps/Sandcastle/gallery/Clamp Model to Ground.jpg diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html index 8645fe5cc535..c2af4a8f7e11 100644 --- a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html +++ b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html @@ -52,6 +52,7 @@ try { worldTerrain = await Cesium.createWorldTerrainAsync(); viewer.scene.terrainProvider = worldTerrain; + scene.globe.show = false; } catch (error) { window.alert(`There was an error creating world terrain. ${error}`); } @@ -65,43 +66,7 @@ ${error}`); } - // Points, labels, and billboards can be rendered on the surface - const pointAndLabel = viewer.entities.add({ - position: Cesium.Cartesian3.fromDegrees(-122.1965, 46.1915), - point: { - color: Cesium.Color.CORNFLOWERBLUE, - pixelSize: 18, - outlineColor: Cesium.Color.DARKSLATEGREY, - outlineWidth: 3, - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - disableDepthTestDistance: Number.POSITIVE_INFINITY, - }, - label: { - text: "Clamped to ground", - font: "14pt sans-serif", - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - horizontalOrigin: Cesium.HorizontalOrigin.LEFT, - verticalOrigin: Cesium.VerticalOrigin.BASELINE, - fillColor: Cesium.Color.GHOSTWHITE, - showBackground: true, - backgroundColor: Cesium.Color.DARKSLATEGREY.withAlpha(0.8), - backgroundPadding: new Cesium.Cartesian2(8, 4), - pixelOffset: new Cesium.Cartesian2(15, 6), - disableDepthTestDistance: Number.POSITIVE_INFINITY, - }, - }); - - const billboard = viewer.entities.add({ - position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), - billboard: { - image: "../images/facility.gif", - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - }, - }); - - viewer.trackedEntity = pointAndLabel; - - Sandcastle.addDefaultToolbarMenu([ + Sandcastle.addToolbarMenu([ { text: "3D Tiles", onselect: () => { @@ -117,6 +82,248 @@ }, }, ]); + + Sandcastle.addDefaultToolbarMenu([ + { + // + // To clamp points or billboards set the heightReference to CLAMP_TO_GROUND or RELATIVE_TO_GROUND + // + text: "Draw Point with Label", + onselect: function () { + const pointAndLabel = viewer.entities.add({ + position: Cesium.Cartesian3.fromDegrees(-122.1965, 46.1915), + point: { + color: Cesium.Color.CORNFLOWERBLUE, + pixelSize: 18, + outlineColor: Cesium.Color.DARKSLATEGREY, + outlineWidth: 3, + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + disableDepthTestDistance: Number.POSITIVE_INFINITY, + }, + label: { + text: "Clamped to ground", + font: "14pt sans-serif", + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + horizontalOrigin: Cesium.HorizontalOrigin.LEFT, + verticalOrigin: Cesium.VerticalOrigin.BASELINE, + fillColor: Cesium.Color.GHOSTWHITE, + showBackground: true, + backgroundColor: Cesium.Color.DARKSLATEGREY.withAlpha(0.8), + backgroundPadding: new Cesium.Cartesian2(8, 4), + pixelOffset: new Cesium.Cartesian2(15, 6), + disableDepthTestDistance: Number.POSITIVE_INFINITY, + }, + }); + viewer.trackedEntity = pointAndLabel; + }, + }, + { + text: "Draw Billboard", + onselect: function () { + const e = viewer.entities.add({ + position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), + billboard: { + image: "../images/facility.gif", + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + }, + }); + + viewer.trackedEntity = e; + }, + }, + { + // + // Corridors, polygons and rectangles will be clamped automatically if they are filled with a constant color and + // has no height or extruded height. + // NOTE: Setting height to 0 will disable clamping. + // + text: "Draw Corridor", + onselect: function () { + const e = viewer.entities.add({ + corridor: { + positions: Cesium.Cartesian3.fromDegreesArray([ + -122.19, + 46.1914, + -122.21, + 46.21, + -122.23, + 46.21, + ]), + width: 2000.0, + material: Cesium.Color.GREEN.withAlpha(0.5), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Polygon", + onselect: function () { + const e = viewer.entities.add({ + polygon: { + hierarchy: { + positions: [ + new Cesium.Cartesian3( + -2358138.847340281, + -3744072.459541374, + 4581158.5714175375 + ), + new Cesium.Cartesian3( + -2357231.4925370603, + -3745103.7886602185, + 4580702.9757762635 + ), + new Cesium.Cartesian3( + -2355912.902205431, + -3744249.029778454, + 4582402.154378103 + ), + new Cesium.Cartesian3( + -2357208.0209552636, + -3743553.4420488174, + 4581961.863286629 + ), + ], + }, + material: Cesium.Color.BLUE.withAlpha(0.5), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Textured Polygon", + onselect: function () { + if ( + !Cesium.Entity.supportsMaterialsforEntitiesOnTerrain( + viewer.scene + ) + ) { + window.alert( + "Terrain Entity materials are not supported on this platform" + ); + return; + } + + const e = viewer.entities.add({ + polygon: { + hierarchy: { + positions: [ + new Cesium.Cartesian3( + -2358138.847340281, + -3744072.459541374, + 4581158.5714175375 + ), + new Cesium.Cartesian3( + -2357231.4925370603, + -3745103.7886602185, + 4580702.9757762635 + ), + new Cesium.Cartesian3( + -2355912.902205431, + -3744249.029778454, + 4582402.154378103 + ), + new Cesium.Cartesian3( + -2357208.0209552636, + -3743553.4420488174, + 4581961.863286629 + ), + ], + }, + material: "../images/Cesium_Logo_Color.jpg", + classificationType: Cesium.ClassificationType.TERRAIN, + stRotation: Cesium.Math.toRadians(45), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Rectangle", + onselect: function () { + const e = viewer.entities.add({ + rectangle: { + coordinates: Cesium.Rectangle.fromDegrees( + -122.3, + 46.0, + -122.0, + 46.3 + ), + material: Cesium.Color.RED.withAlpha(0.5), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Model", + onselect: function () { + const e = viewer.entities.add({ + position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), + model: { + uri: "../../SampleData/models/CesiumMan/Cesium_Man.glb", + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + minimumPixelSize: 128, + maximumScale: 100, + }, + }); + + viewer.trackedEntity = e; + }, + }, + { + text: "Draw polyline", + onselect: function () { + if (!Cesium.Entity.supportsPolylinesOnTerrain(viewer.scene)) { + window.alert( + "Polylines on terrain are not supported on this platform" + ); + } + + viewer.entities.add({ + polyline: { + positions: Cesium.Cartesian3.fromDegreesArray([ + 86.953793, + 27.928257, + 86.953793, + 27.988257, + 86.896497, + 27.988257, + ]), + clampToGround: true, + width: 5, + material: new Cesium.PolylineOutlineMaterialProperty({ + color: Cesium.Color.ORANGE, + outlineWidth: 2, + outlineColor: Cesium.Color.BLACK, + }), + }, + }); + + const target = new Cesium.Cartesian3( + 300770.50872389384, + 5634912.131394585, + 2978152.2865545116 + ); + const offset = new Cesium.Cartesian3( + 6344.974098678562, + -793.3419798081741, + 2499.9508860763162 + ); + viewer.camera.lookAt(target, offset); + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + }, + }, + ]); + + Sandcastle.reset = function () { + viewer.entities.removeAll(); + }; //Sandcastle_End }; if (typeof Cesium !== "undefined") { diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.jpg b/Apps/Sandcastle/gallery/Clamp Entities to Ground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfdf6efe707c97e6f17565fbce89478c5bbdaefe GIT binary patch literal 73529 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 BHIx7V literal 0 HcmV?d00001 diff --git a/Apps/Sandcastle/gallery/Clamp Model to Ground.jpg b/Apps/Sandcastle/gallery/Clamp Model to Ground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..174b994d5b5d6e50f1a60ac4fad87e0de1c10f44 GIT binary patch literal 94511 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 Date: Thu, 14 Dec 2023 15:01:45 -0500 Subject: [PATCH 04/15] Update Sandcastle --- .../gallery/Clamp Entities to Ground.html | 281 +++++++++++-- .../gallery/Clamp Entities to Ground.jpg | Bin 0 -> 73529 bytes .../gallery/Clamp Model to Ground.jpg | Bin 0 -> 94511 bytes Apps/Sandcastle/gallery/Clamp to Terrain.html | 384 ------------------ Apps/Sandcastle/gallery/Clamp to Terrain.jpg | Bin 40375 -> 0 bytes packages/engine/Source/Scene/Scene.js | 6 +- 6 files changed, 249 insertions(+), 422 deletions(-) create mode 100644 Apps/Sandcastle/gallery/Clamp Entities to Ground.jpg create mode 100644 Apps/Sandcastle/gallery/Clamp Model to Ground.jpg delete mode 100644 Apps/Sandcastle/gallery/Clamp to Terrain.html delete mode 100644 Apps/Sandcastle/gallery/Clamp to Terrain.jpg diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html index 8645fe5cc535..c2af4a8f7e11 100644 --- a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html +++ b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html @@ -52,6 +52,7 @@ try { worldTerrain = await Cesium.createWorldTerrainAsync(); viewer.scene.terrainProvider = worldTerrain; + scene.globe.show = false; } catch (error) { window.alert(`There was an error creating world terrain. ${error}`); } @@ -65,43 +66,7 @@ ${error}`); } - // Points, labels, and billboards can be rendered on the surface - const pointAndLabel = viewer.entities.add({ - position: Cesium.Cartesian3.fromDegrees(-122.1965, 46.1915), - point: { - color: Cesium.Color.CORNFLOWERBLUE, - pixelSize: 18, - outlineColor: Cesium.Color.DARKSLATEGREY, - outlineWidth: 3, - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - disableDepthTestDistance: Number.POSITIVE_INFINITY, - }, - label: { - text: "Clamped to ground", - font: "14pt sans-serif", - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - horizontalOrigin: Cesium.HorizontalOrigin.LEFT, - verticalOrigin: Cesium.VerticalOrigin.BASELINE, - fillColor: Cesium.Color.GHOSTWHITE, - showBackground: true, - backgroundColor: Cesium.Color.DARKSLATEGREY.withAlpha(0.8), - backgroundPadding: new Cesium.Cartesian2(8, 4), - pixelOffset: new Cesium.Cartesian2(15, 6), - disableDepthTestDistance: Number.POSITIVE_INFINITY, - }, - }); - - const billboard = viewer.entities.add({ - position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), - billboard: { - image: "../images/facility.gif", - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - }, - }); - - viewer.trackedEntity = pointAndLabel; - - Sandcastle.addDefaultToolbarMenu([ + Sandcastle.addToolbarMenu([ { text: "3D Tiles", onselect: () => { @@ -117,6 +82,248 @@ }, }, ]); + + Sandcastle.addDefaultToolbarMenu([ + { + // + // To clamp points or billboards set the heightReference to CLAMP_TO_GROUND or RELATIVE_TO_GROUND + // + text: "Draw Point with Label", + onselect: function () { + const pointAndLabel = viewer.entities.add({ + position: Cesium.Cartesian3.fromDegrees(-122.1965, 46.1915), + point: { + color: Cesium.Color.CORNFLOWERBLUE, + pixelSize: 18, + outlineColor: Cesium.Color.DARKSLATEGREY, + outlineWidth: 3, + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + disableDepthTestDistance: Number.POSITIVE_INFINITY, + }, + label: { + text: "Clamped to ground", + font: "14pt sans-serif", + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + horizontalOrigin: Cesium.HorizontalOrigin.LEFT, + verticalOrigin: Cesium.VerticalOrigin.BASELINE, + fillColor: Cesium.Color.GHOSTWHITE, + showBackground: true, + backgroundColor: Cesium.Color.DARKSLATEGREY.withAlpha(0.8), + backgroundPadding: new Cesium.Cartesian2(8, 4), + pixelOffset: new Cesium.Cartesian2(15, 6), + disableDepthTestDistance: Number.POSITIVE_INFINITY, + }, + }); + viewer.trackedEntity = pointAndLabel; + }, + }, + { + text: "Draw Billboard", + onselect: function () { + const e = viewer.entities.add({ + position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), + billboard: { + image: "../images/facility.gif", + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + }, + }); + + viewer.trackedEntity = e; + }, + }, + { + // + // Corridors, polygons and rectangles will be clamped automatically if they are filled with a constant color and + // has no height or extruded height. + // NOTE: Setting height to 0 will disable clamping. + // + text: "Draw Corridor", + onselect: function () { + const e = viewer.entities.add({ + corridor: { + positions: Cesium.Cartesian3.fromDegreesArray([ + -122.19, + 46.1914, + -122.21, + 46.21, + -122.23, + 46.21, + ]), + width: 2000.0, + material: Cesium.Color.GREEN.withAlpha(0.5), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Polygon", + onselect: function () { + const e = viewer.entities.add({ + polygon: { + hierarchy: { + positions: [ + new Cesium.Cartesian3( + -2358138.847340281, + -3744072.459541374, + 4581158.5714175375 + ), + new Cesium.Cartesian3( + -2357231.4925370603, + -3745103.7886602185, + 4580702.9757762635 + ), + new Cesium.Cartesian3( + -2355912.902205431, + -3744249.029778454, + 4582402.154378103 + ), + new Cesium.Cartesian3( + -2357208.0209552636, + -3743553.4420488174, + 4581961.863286629 + ), + ], + }, + material: Cesium.Color.BLUE.withAlpha(0.5), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Textured Polygon", + onselect: function () { + if ( + !Cesium.Entity.supportsMaterialsforEntitiesOnTerrain( + viewer.scene + ) + ) { + window.alert( + "Terrain Entity materials are not supported on this platform" + ); + return; + } + + const e = viewer.entities.add({ + polygon: { + hierarchy: { + positions: [ + new Cesium.Cartesian3( + -2358138.847340281, + -3744072.459541374, + 4581158.5714175375 + ), + new Cesium.Cartesian3( + -2357231.4925370603, + -3745103.7886602185, + 4580702.9757762635 + ), + new Cesium.Cartesian3( + -2355912.902205431, + -3744249.029778454, + 4582402.154378103 + ), + new Cesium.Cartesian3( + -2357208.0209552636, + -3743553.4420488174, + 4581961.863286629 + ), + ], + }, + material: "../images/Cesium_Logo_Color.jpg", + classificationType: Cesium.ClassificationType.TERRAIN, + stRotation: Cesium.Math.toRadians(45), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Rectangle", + onselect: function () { + const e = viewer.entities.add({ + rectangle: { + coordinates: Cesium.Rectangle.fromDegrees( + -122.3, + 46.0, + -122.0, + 46.3 + ), + material: Cesium.Color.RED.withAlpha(0.5), + }, + }); + + viewer.zoomTo(e); + }, + }, + { + text: "Draw Model", + onselect: function () { + const e = viewer.entities.add({ + position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), + model: { + uri: "../../SampleData/models/CesiumMan/Cesium_Man.glb", + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, + minimumPixelSize: 128, + maximumScale: 100, + }, + }); + + viewer.trackedEntity = e; + }, + }, + { + text: "Draw polyline", + onselect: function () { + if (!Cesium.Entity.supportsPolylinesOnTerrain(viewer.scene)) { + window.alert( + "Polylines on terrain are not supported on this platform" + ); + } + + viewer.entities.add({ + polyline: { + positions: Cesium.Cartesian3.fromDegreesArray([ + 86.953793, + 27.928257, + 86.953793, + 27.988257, + 86.896497, + 27.988257, + ]), + clampToGround: true, + width: 5, + material: new Cesium.PolylineOutlineMaterialProperty({ + color: Cesium.Color.ORANGE, + outlineWidth: 2, + outlineColor: Cesium.Color.BLACK, + }), + }, + }); + + const target = new Cesium.Cartesian3( + 300770.50872389384, + 5634912.131394585, + 2978152.2865545116 + ); + const offset = new Cesium.Cartesian3( + 6344.974098678562, + -793.3419798081741, + 2499.9508860763162 + ); + viewer.camera.lookAt(target, offset); + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + }, + }, + ]); + + Sandcastle.reset = function () { + viewer.entities.removeAll(); + }; //Sandcastle_End }; if (typeof Cesium !== "undefined") { diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.jpg b/Apps/Sandcastle/gallery/Clamp Entities to Ground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfdf6efe707c97e6f17565fbce89478c5bbdaefe GIT binary patch literal 73529 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 BHIx7V literal 0 HcmV?d00001 diff --git a/Apps/Sandcastle/gallery/Clamp Model to Ground.jpg b/Apps/Sandcastle/gallery/Clamp Model to Ground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..174b994d5b5d6e50f1a60ac4fad87e0de1c10f44 GIT binary patch literal 94511 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 - - - - - - - - Cesium Demo - - - - - - -
-

Loading...

-
-
-
-
-
-
- - - diff --git a/Apps/Sandcastle/gallery/Clamp to Terrain.jpg b/Apps/Sandcastle/gallery/Clamp to Terrain.jpg deleted file mode 100644 index 9841e988347980f14f3aad34745e868f419abc51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40375 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 P&Q3p2OLS8W|1 Date: Thu, 4 Jan 2024 15:20:37 -0500 Subject: [PATCH 05/15] Update model specs --- packages/engine/Source/Scene/Model/Model.js | 5 +- .../engine/Specs/Scene/Model/ModelSpec.js | 455 +++++++++--------- 2 files changed, 239 insertions(+), 221 deletions(-) diff --git a/packages/engine/Source/Scene/Model/Model.js b/packages/engine/Source/Scene/Model/Model.js index 9c3b39142586..ea92cea296f9 100644 --- a/packages/engine/Source/Scene/Model/Model.js +++ b/packages/engine/Source/Scene/Model/Model.js @@ -345,10 +345,9 @@ function Model(options) { const scene = options.scene; if (defined(scene) && defined(scene.terrainProviderChanged)) { this._terrainProviderChangedCallback = scene.terrainProviderChanged.addEventListener( - function () { + () => { this._heightDirty = true; - }, - this + } ); } this._scene = scene; diff --git a/packages/engine/Specs/Scene/Model/ModelSpec.js b/packages/engine/Specs/Scene/Model/ModelSpec.js index e0d95be156ef..195f1913bdc5 100644 --- a/packages/engine/Specs/Scene/Model/ModelSpec.js +++ b/packages/engine/Specs/Scene/Model/ModelSpec.js @@ -15,8 +15,8 @@ import { DistanceDisplayCondition, DracoLoader, Ellipsoid, - Event, FeatureDetection, + Globe, HeadingPitchRange, HeadingPitchRoll, HeightReference, @@ -2106,282 +2106,300 @@ describe( }); describe("height reference", function () { - let sceneWithMockGlobe; - - function createMockGlobe() { - const globe = { - ellipsoid: Ellipsoid.WGS84, - update: function () {}, - render: function () {}, - getHeight: function () { - return 0.0; - }, - _surface: { - tileProvider: {}, - _tileLoadQueueHigh: [], - _tileLoadQueueMedium: [], - _tileLoadQueueLow: [], - _debug: { - tilesWaitingForChildren: 0, - }, - }, - imageryLayersUpdatedEvent: new Event(), - destroy: function () {}, - beginFrame: function () {}, - endFrame: function () {}, - terrainProviderChanged: new Event(), - }; - - Object.defineProperties(globe, { - terrainProvider: { - set: function (value) { - this.terrainProviderChanged.raiseEvent(value); - }, - }, - }); - - globe._surface.updateHeight = function (position, callback) { - return function () { - // TODO - }; - }; - - return globe; - } - - beforeAll(function () { - sceneWithMockGlobe = createScene(); + beforeEach(() => { + scene.globe = new Globe(); }); - beforeEach(function () { - sceneWithMockGlobe.globe = createMockGlobe(); + afterEach(() => { + scene.globe = undefined; }); - afterEach(function () { - sceneWithMockGlobe.primitives.removeAll(); - }); - - afterAll(function () { - sceneWithMockGlobe.destroyForSpecs(); - }); - - it("initializes with height reference", function () { - return loadAndZoomToModelAsync( + it("initializes with height reference", async function () { + const position = Cartesian3.fromDegrees(-72.0, 40.0); + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + modelMatrix: Transforms.eastNorthUpToFixedFrame(position), + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(model.heightReference).toEqual( - HeightReference.CLAMP_TO_GROUND - ); - expect(model._scene).toBe(sceneWithMockGlobe); - expect(model._clampedModelMatrix).toBeDefined(); - }); + scene + ); + expect(model.heightReference).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(model._scene).toBe(scene); + expect(model._clampedModelMatrix).toBeDefined(); }); - it("changing height reference works", function () { - return loadAndZoomToModelAsync( + it("changing height reference works", async function () { + const position = Cartesian3.fromDegrees(-72.0, 40.0); + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, heightReference: HeightReference.NONE, - scene: sceneWithMockGlobe, + modelMatrix: Transforms.eastNorthUpToFixedFrame(position), + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(model.heightReference).toEqual(HeightReference.NONE); - expect(model._clampedModelMatrix).toBeUndefined(); + scene + ); + expect(model.heightReference).toEqual(HeightReference.NONE); + expect(model._clampedModelMatrix).toBeUndefined(); - model.heightReference = HeightReference.CLAMP_TO_GROUND; - expect(model._heightDirty).toBe(true); + model.heightReference = HeightReference.CLAMP_TO_GROUND; + expect(model._heightDirty).toBe(true); - sceneWithMockGlobe.renderForSpecs(); - expect(model._heightDirty).toBe(false); - expect(model.heightReference).toEqual( - HeightReference.CLAMP_TO_GROUND - ); - expect(model._clampedModelMatrix).toBeDefined(); - }); + scene.renderForSpecs(); + expect(model._heightDirty).toBe(false); + expect(model.heightReference).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(model._clampedModelMatrix).toBeDefined(); }); - it("creates height update callback when initializing with height reference", function () { - return loadAndZoomToModelAsync( + it("creates height update callback when initializing with height reference", async function () { + spyOn(scene, "updateHeight"); + const position = Cartesian3.fromDegrees(-72.0, 40.0); + + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, - modelMatrix: Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ), + modelMatrix: Transforms.eastNorthUpToFixedFrame(position), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(model.heightReference).toEqual( - HeightReference.CLAMP_TO_GROUND - ); - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); - }); + scene + ); + + expect(model.heightReference).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); - it("creates height update callback after setting height reference", function () { - return loadAndZoomToModelAsync( + it("creates height update callback after setting height reference", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + const position = Cartesian3.fromDegrees(-72.0, 40.0); + + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, - modelMatrix: Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ), + modelMatrix: Transforms.eastNorthUpToFixedFrame(position), heightReference: HeightReference.NONE, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(model.heightReference).toEqual(HeightReference.NONE); - expect(sceneWithMockGlobe.globe.callback).toBeUndefined(); + scene + ); - model.heightReference = HeightReference.CLAMP_TO_GROUND; - expect(model.heightReference).toEqual( - HeightReference.CLAMP_TO_GROUND - ); - sceneWithMockGlobe.renderForSpecs(); - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); - }); + model.heightReference = HeightReference.CLAMP_TO_GROUND; + expect(model.heightReference).toEqual(HeightReference.CLAMP_TO_GROUND); + + scene.renderForSpecs(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); - it("updates height reference callback when the height reference changes", function () { - return loadAndZoomToModelAsync( + it("removes height update callback after changing height reference", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + const position = Cartesian3.fromDegrees(-72.0, 40.0); + + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, - modelMatrix: Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ), + modelMatrix: Transforms.eastNorthUpToFixedFrame(position), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); + scene + ); - model.heightReference = HeightReference.RELATIVE_TO_GROUND; - sceneWithMockGlobe.renderForSpecs(); - expect(sceneWithMockGlobe.globe.removedCallback).toEqual(true); - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); + model.heightReference = HeightReference.NONE; + expect(model.heightReference).toEqual(HeightReference.NONE); - sceneWithMockGlobe.globe.removedCallback = false; - model.heightReference = HeightReference.NONE; - sceneWithMockGlobe.renderForSpecs(); - expect(sceneWithMockGlobe.globe.removedCallback).toEqual(true); - expect(sceneWithMockGlobe.globe.callback).toBeUndefined(); - }); + scene.renderForSpecs(); + expect(removeCallback).toHaveBeenCalled(); }); - it("updates height reference callback when the model matrix changes", function () { - const modelMatrix = Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ); - return loadAndZoomToModelAsync( + it("updates height reference callback when the height reference changes", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + const position = Cartesian3.fromDegrees(-72.0, 40.0); + + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, - modelMatrix: Matrix4.clone(modelMatrix), + modelMatrix: Transforms.eastNorthUpToFixedFrame(position), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); + scene + ); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); - // Modify the model matrix in place - const position = Cartesian3.fromDegrees(-73.0, 40.0); - model.modelMatrix[12] = position.x; - model.modelMatrix[13] = position.y; - model.modelMatrix[14] = position.z; + model.heightReference = HeightReference.RELATIVE_TO_GROUND; + scene.renderForSpecs(); - sceneWithMockGlobe.renderForSpecs(); - expect(sceneWithMockGlobe.globe.removedCallback).toEqual(true); - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); + expect(removeCallback).toHaveBeenCalled(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.RELATIVE_TO_GROUND + ); + }); - // Replace the model matrix entirely - model.modelMatrix = modelMatrix; + it("updates height reference callback when the model matrix changes", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); - sceneWithMockGlobe.renderForSpecs(); - expect(sceneWithMockGlobe.globe.removedCallback).toEqual(true); - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); - }); + let position = Cartesian3.fromDegrees(-72.0, 40.0); + const modelMatrix = Transforms.eastNorthUpToFixedFrame(position); + const model = await loadAndZoomToModelAsync( + { + gltf: boxTexturedGltfUrl, + modelMatrix: Matrix4.clone(modelMatrix), + heightReference: HeightReference.CLAMP_TO_GROUND, + scene: scene, + }, + scene + ); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); + + // Modify the model matrix in place + position = Cartesian3.fromDegrees(-73.0, 40.0); + model.modelMatrix[12] = position.x; + model.modelMatrix[13] = position.y; + model.modelMatrix[14] = position.z; + + scene.renderForSpecs(); + expect(removeCallback).toHaveBeenCalled(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); - it("height reference callback updates the position", function () { - return loadAndZoomToModelAsync( + it("updates height reference callback when the model matrix is set", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + let position = Cartesian3.fromDegrees(-72.0, 40.0); + const modelMatrix = Transforms.eastNorthUpToFixedFrame(position); + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, - modelMatrix: Transforms.eastNorthUpToFixedFrame( - Cartesian3.fromDegrees(-72.0, 40.0) - ), + modelMatrix: Matrix4.clone(modelMatrix), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); + scene + ); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); - sceneWithMockGlobe.globe.callback( - Cartesian3.fromDegrees(-72.0, 40.0, 100.0) - ); - const matrix = model._clampedModelMatrix; - const position = new Cartesian3(matrix[12], matrix[13], matrix[14]); - const ellipsoid = sceneWithMockGlobe.globe.ellipsoid; - const cartographic = ellipsoid.cartesianToCartographic(position); - expect(cartographic.height).toEqualEpsilon( - 100.0, - CesiumMath.EPSILON9 - ); - }); + position = Cartesian3.fromDegrees(-73.0, 40.0); + modelMatrix[12] = position.x; + modelMatrix[13] = position.y; + modelMatrix[14] = position.z; + model.modelMatrix = modelMatrix; + + scene.renderForSpecs(); + expect(removeCallback).toHaveBeenCalled(); + expect(scene.updateHeight).toHaveBeenCalledWith( + Ellipsoid.WGS84.cartesianToCartographic(position), + jasmine.any(Function), + HeightReference.CLAMP_TO_GROUND + ); }); - it("height reference accounts for change in terrain provider", function () { - return loadAndZoomToModelAsync( + it("height reference callback updates the position", async function () { + let invokeCallback; + spyOn(scene, "updateHeight").and.callFake( + (cartographic, updateCallback) => { + invokeCallback = (height) => { + cartographic.height = height; + updateCallback(cartographic); + }; + } + ); + + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, modelMatrix: Transforms.eastNorthUpToFixedFrame( Cartesian3.fromDegrees(-72.0, 40.0) ), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(model._heightDirty).toBe(false); - const terrainProvider = new CesiumTerrainProvider({ - url: "made/up/url", - requestVertexNormals: true, - }); - sceneWithMockGlobe.terrainProvider = terrainProvider; + scene + ); - expect(model._heightDirty).toBe(true); - sceneWithMockGlobe.terrainProvider = undefined; - }); + invokeCallback(100.0); + + const matrix = model._clampedModelMatrix; + const position = new Cartesian3(matrix[12], matrix[13], matrix[14]); + const cartographic = Ellipsoid.WGS84.cartesianToCartographic(position); + expect(cartographic.height).toEqualEpsilon(100.0, CesiumMath.EPSILON9); }); - it("throws when initializing height reference with no scene", function () { - return loadAndZoomToModelAsync( + it("height reference accounts for change in terrain provider", async function () { + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, modelMatrix: Transforms.eastNorthUpToFixedFrame( Cartesian3.fromDegrees(-72.0, 40.0) ), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: undefined, + scene: scene, }, - sceneWithMockGlobe - ).catch(function (error) { - expect(error.message).toEqual( - "Height reference is not supported without a scene." - ); + scene + ); + expect(model._heightDirty).toBe(false); + const terrainProvider = new CesiumTerrainProvider({ + url: "made/up/url", + requestVertexNormals: true, }); + scene.terrainProvider = terrainProvider; + + expect(model._heightDirty).toBe(true); + scene.terrainProvider = undefined; }); - it("throws when changing height reference with no scene", function () { - return loadAndZoomToModelAsync( + it("throws when initializing height reference with no scene", async function () { + await expectAsync( + loadAndZoomToModelAsync( + { + gltf: boxTexturedGltfUrl, + modelMatrix: Transforms.eastNorthUpToFixedFrame( + Cartesian3.fromDegrees(-72.0, 40.0) + ), + heightReference: HeightReference.CLAMP_TO_GROUND, + scene: undefined, + }, + scene + ) + ).toBeRejectedWithError( + "Height reference is not supported without a scene." + ); + }); + + it("throws when changing height reference with no scene", async function () { + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGltfUrl, modelMatrix: Transforms.eastNorthUpToFixedFrame( @@ -2389,13 +2407,13 @@ describe( ), heightReference: HeightReference.NONE, }, - sceneWithMockGlobe - ).then(function (model) { - expect(function () { - model.heightReference = HeightReference.CLAMP_TO_GROUND; - sceneWithMockGlobe.renderForSpecs(); - }).toThrowDeveloperError(); - }); + scene + ); + + expect(function () { + model.heightReference = HeightReference.CLAMP_TO_GROUND; + scene.renderForSpecs(); + }).toThrowDeveloperError(); }); it("works when initializing height reference with no globe", function () { @@ -2414,24 +2432,25 @@ describe( ).toBeResolved(); }); - it("destroys height reference callback", function () { - return loadAndZoomToModelAsync( + it("destroys height reference callback", async function () { + const removeCallback = jasmine.createSpy(); + spyOn(scene, "updateHeight").and.returnValue(removeCallback); + + const model = await loadAndZoomToModelAsync( { gltf: boxTexturedGlbUrl, modelMatrix: Transforms.eastNorthUpToFixedFrame( Cartesian3.fromDegrees(-72.0, 40.0) ), heightReference: HeightReference.CLAMP_TO_GROUND, - scene: sceneWithMockGlobe, + scene: scene, }, - sceneWithMockGlobe - ).then(function (model) { - expect(sceneWithMockGlobe.globe.callback).toBeDefined(); + scene + ); - sceneWithMockGlobe.primitives.remove(model); - expect(model.isDestroyed()).toBe(true); - expect(sceneWithMockGlobe.globe.callback).toBeUndefined(); - }); + scene.primitives.remove(model); + expect(model.isDestroyed()).toBe(true); + expect(removeCallback).toHaveBeenCalled(); }); }); From 4fd8c5b9ae5d4e219bc27f720e212043067c236b Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Thu, 4 Jan 2024 15:26:37 -0500 Subject: [PATCH 06/15] Error -> DevloperError --- packages/engine/Specs/Scene/Model/ModelSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Specs/Scene/Model/ModelSpec.js b/packages/engine/Specs/Scene/Model/ModelSpec.js index 195f1913bdc5..95a1320e47b1 100644 --- a/packages/engine/Specs/Scene/Model/ModelSpec.js +++ b/packages/engine/Specs/Scene/Model/ModelSpec.js @@ -2393,7 +2393,7 @@ describe( }, scene ) - ).toBeRejectedWithError( + ).toBeRejectedWithDeveloperError( "Height reference is not supported without a scene." ); }); From fe8738002a4ee5330124962c927f839ea4c28801 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Tue, 16 Jan 2024 14:05:45 -0500 Subject: [PATCH 07/15] Fix performance issue --- .../engine/Source/Scene/Cesium3DTileset.js | 43 +++++++++++-------- .../Source/Scene/Cesium3DTilesetTraversal.js | 3 ++ .../engine/Specs/Scene/Cesium3DTilesetSpec.js | 6 +-- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index 4a9426a3f8f8..31ea215eebf6 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -1,4 +1,5 @@ import ApproximateTerrainHeights from "../Core/ApproximateTerrainHeights.js"; +import BoundingSphere from "../Core/BoundingSphere.js"; import Cartesian2 from "../Core/Cartesian2.js"; import Cartesian3 from "../Core/Cartesian3.js"; import Cartographic from "../Core/Cartographic.js"; @@ -3610,42 +3611,50 @@ Cesium3DTileset.prototype.pick = function (ray, frameState, result) { const selectedTiles = this._selectedTiles; const selectedLength = selectedTiles.length; + const candidates = []; - let intersection; - let minDistance = Number.POSITIVE_INFINITY; for (let i = 0; i < selectedLength; ++i) { const tile = selectedTiles[i]; const boundsIntersection = IntersectionTests.raySphere( ray, - tile.boundingSphere, + tile.contentBoundingVolume.boundingSphere, scratchSphereIntersection ); if (!defined(boundsIntersection) || !defined(tile.content)) { continue; } - const candidate = tile.content?.pick( + candidates.push(tile); + } + + const length = candidates.length; + candidates.sort((a, b) => { + const aDist = BoundingSphere.distanceSquaredTo( + a.contentBoundingVolume.boundingSphere, + ray.origin + ); + const bDist = BoundingSphere.distanceSquaredTo( + b.contentBoundingVolume.boundingSphere, + ray.origin + ); + + return aDist - bDist; + }); + + let intersection; + for (let i = 0; i < length; ++i) { + const tile = candidates[i]; + const candidate = tile.content.pick( ray, frameState, scratchPickIntersection ); - if (!defined(candidate)) { - continue; - } - - const distance = Cartesian3.distance(ray.origin, candidate); - if (distance < minDistance) { + if (defined(candidate)) { intersection = Cartesian3.clone(candidate, result); - minDistance = distance; + return intersection; } } - - if (!defined(intersection)) { - return undefined; - } - - return intersection; }; /** diff --git a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js index 12561ba541eb..1ff0b45bf63b 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js @@ -79,6 +79,8 @@ Cesium3DTilesetTraversal.selectTile = function (tile, frameState) { return; } + tile._wasSelectedLastFrame = true; + const { content, tileset } = tile; if (content.featurePropertiesDirty) { // A feature's property in this tile changed, the tile needs to be re-styled. @@ -88,6 +90,7 @@ Cesium3DTilesetTraversal.selectTile = function (tile, frameState) { } else if (tile._selectedFrame < frameState.frameNumber - 1) { // Tile is newly selected; it is selected this frame, but was not selected last frame. tileset._selectedTilesToStyle.push(tile); + tile._wasSelectedLastFrame = false; } tile._selectedFrame = frameState.frameNumber; tileset._selectedTiles.push(tile); diff --git a/packages/engine/Specs/Scene/Cesium3DTilesetSpec.js b/packages/engine/Specs/Scene/Cesium3DTilesetSpec.js index 6653ca4e04f7..822246193a72 100644 --- a/packages/engine/Specs/Scene/Cesium3DTilesetSpec.js +++ b/packages/engine/Specs/Scene/Cesium3DTilesetSpec.js @@ -2577,9 +2577,9 @@ describe( ); const expected = new Cartesian3( - 1215013.8353220497, - -4736316.763939952, - 4081608.4319443353 + 1215013.1035421563, + -4736313.911345786, + 4081605.96109977 ); expect(tileset.pick(ray, scene.frameState)).toEqualEpsilon( expected, From d0c2721e6cb5478dbc6be8362346ece869762a20 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Tue, 16 Jan 2024 14:57:12 -0500 Subject: [PATCH 08/15] PR feedback --- CHANGES.md | 1 + packages/engine/Source/DataSources/ModelVisualizer.js | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 542e89e4f661..dc146dde31e2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,7 @@ - This behavior can be disabled by setting `Cesium3DTileset.disableCollision` to true. - This feature is enabled by default only for WebGL 2 and above, but can be enabled for WebGL 1 by setting the `enablePick` option to true when creating the `Cesium3DTileset`. - Clamping to ground, `HeightReference.CLAMP_TO_GROUND`, and `HeightReference.RELATIVE_TO_GROUND` now take into account 3D Tilesets. These opions will clamp to either 3D Tilesets or Terrain, whichever has a greater height. [#11604](https://github.com/CesiumGS/cesium/pull/11604) + - To restore previous behavior where an entity is clamped only to terrain or relative only to terrain, set `heightReference` to `HeightReference.CLAMP_TO_TERRAIN` or `HeightReference.RELATIVE_TO_TERRAIN` respectively. ##### Additions :tada: diff --git a/packages/engine/Source/DataSources/ModelVisualizer.js b/packages/engine/Source/DataSources/ModelVisualizer.js index 70e2ca6312e3..1e2b7a0a2c6c 100644 --- a/packages/engine/Source/DataSources/ModelVisualizer.js +++ b/packages/engine/Source/DataSources/ModelVisualizer.js @@ -455,12 +455,6 @@ ModelVisualizer.prototype.getBoundingSphere = function (entity, result) { scratchCartographic ); - // Regardless of what the original model's position is set to, when clamping we reset it to 0 - // when computing the position to zoom/fly to. - if (isHeightReferenceClamp(model.heightReference)) { - cartoPosition.height = 0; - } - const height = scene.getHeight(cartoPosition, model.heightReference); if (defined(height)) { if (isHeightReferenceClamp(model.heightReference)) { From 9b95eac1aebb40ddbad547e9e85a6e18fadd5449 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Wed, 17 Jan 2024 09:57:07 -0500 Subject: [PATCH 09/15] Update packages/engine/Source/Scene/Cesium3DTileset.js Co-authored-by: Josh <8007967+jjspace@users.noreply.github.com> --- packages/engine/Source/Scene/Cesium3DTileset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index 31ea215eebf6..6a6fad8e1fc8 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -3546,7 +3546,7 @@ Cesium3DTileset.prototype.getHeight = function (cartographic, scene) { /** * Calls the callback when a new tile is rendered that contains the given cartographic. The only parameter - * is the cartesian position on the tile. + * is the cartographic position on the tile. * * @private * From 0d5607fa191e5df0e46eae9bd19b5d2a1d336bb3 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Wed, 17 Jan 2024 09:59:25 -0500 Subject: [PATCH 10/15] Update packages/engine/Source/Scene/Scene.js Co-authored-by: Josh <8007967+jjspace@users.noreply.github.com> --- packages/engine/Source/Scene/Scene.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Source/Scene/Scene.js b/packages/engine/Source/Scene/Scene.js index 6489fe8bbda2..29cc8e622a14 100644 --- a/packages/engine/Source/Scene/Scene.js +++ b/packages/engine/Source/Scene/Scene.js @@ -3599,7 +3599,7 @@ function getGlobeHeight(scene) { } /** - * Gets the height of the loaded surface ar the cartographic position. + * Gets the height of the loaded surface at the cartographic position. * @param {Cartographic} cartographic The cartographic position. * @param {HeightReference} [heightReference=CLAMP_TO_GROUND] Based on the height reference value, determines whether to ignore heights from 3D Tiles or terrain. * @private From 9591d82f8bd95ef5ac6728812ec87a05ec2c7038 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Wed, 17 Jan 2024 10:12:16 -0500 Subject: [PATCH 11/15] Fix comments --- packages/engine/Source/Scene/Scene.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/engine/Source/Scene/Scene.js b/packages/engine/Source/Scene/Scene.js index 29cc8e622a14..57f73903c231 100644 --- a/packages/engine/Source/Scene/Scene.js +++ b/packages/engine/Source/Scene/Scene.js @@ -533,6 +533,7 @@ function Scene(options) { }); /** + * When false, 3D Tiles will render normally. When true, classified 3D Tile geometry will render normally and * unclassified 3D Tile geometry will render with the color multiplied by {@link Scene#invertClassificationColor}. * @type {boolean} * @default false @@ -541,6 +542,7 @@ function Scene(options) { /** * The highlight color of unclassified 3D Tile geometry when {@link Scene#invertClassification} is true. + *

When the color's alpha is less than 1.0, the unclassified portions of the 3D Tiles will not blend correctly with the classified positions of the 3D Tiles.

*

Also, when the color's alpha is less than 1.0, the WEBGL_depth_texture and EXT_frag_depth WebGL extensions must be supported.

* @type {Color} * @default Color.WHITE @@ -2466,6 +2468,9 @@ function executeCommands(scene, passState) { picking || environmentState.renderTranslucentDepthForPick ) { + // Common/fastest path. Draw 3D Tiles and classification normally. + + // Draw 3D Tiles us.updatePass(Pass.CESIUM_3D_TILE); commands = frustumCommands.commands[Pass.CESIUM_3D_TILE]; length = frustumCommands.indices[Pass.CESIUM_3D_TILE]; @@ -2486,6 +2491,7 @@ function executeCommands(scene, passState) { ); } + // Draw classifications. Modifies 3D Tiles color. if (!environmentState.renderTranslucentDepthForPick) { us.updatePass(Pass.CESIUM_3D_TILE_CLASSIFICATION); commands = @@ -2502,6 +2508,7 @@ function executeCommands(scene, passState) { // Invert classification FBO (FBO2) : Invert_Color + Main_DepthStencil // // 1. Clear FBO2 color to vec4(0.0) for each frustum + // 2. Draw 3D Tiles to FBO2 // 3. Draw classification to FBO2 // 4. Fullscreen pass to FBO1, draw Invert_Color when: // * Main_DepthStencil has the stencil bit set > 0 (classified) @@ -2515,6 +2522,7 @@ function executeCommands(scene, passState) { // IsClassified FBO (FBO3): IsClassified_Color + Invert_DepthStencil // // 1. Clear FBO2 and FBO3 color to vec4(0.0), stencil to 0, and depth to 1.0 + // 2. Draw 3D Tiles to FBO2 // 3. Draw classification to FBO2 // 4. Fullscreen pass to FBO3, draw any color when // * Invert_DepthStencil has the stencil bit set > 0 (classified) @@ -2630,6 +2638,7 @@ function executeCommands(scene, passState) { invertClassification ); + // Classification for translucent 3D Tiles const has3DTilesClassificationCommands = frustumCommands.indices[Pass.CESIUM_3D_TILE_CLASSIFICATION] > 0; if ( @@ -4080,6 +4089,7 @@ Scene.prototype.clampLineWidth = function (width) { * at a particular window coordinate or undefined if nothing is at the location. Other properties may * potentially be set depending on the type of primitive and may be used to further identify the picked object. *

+ * When a feature of a 3D Tiles tileset is picked, pick returns a {@link Cesium3DTileFeature} object. *

* * @example @@ -4211,12 +4221,14 @@ function updateRequestRenderModeDeferCheckPass(scene) { * property that contains the intersected primitive. Other properties may be set depending on the type of primitive * and may be used to further identify the picked object. The ray must be given in world coordinates. *

+ * This function only picks globe tiles and 3D Tiles that are rendered in the current view. Picks all other * primitives regardless of their visibility. *

* * @private * * @param {Ray} ray The ray. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {object} An object containing the object and position of the first intersection. * @@ -4233,6 +4245,7 @@ Scene.prototype.pickFromRay = function (ray, objectsToExclude, width) { * The primitives in the list are ordered by first intersection to last intersection. The ray must be given in * world coordinates. *

+ * This function only picks globe tiles and 3D Tiles that are rendered in the current view. Picks all other * primitives regardless of their visibility. *

* @@ -4240,6 +4253,7 @@ Scene.prototype.pickFromRay = function (ray, objectsToExclude, width) { * * @param {Ray} ray The ray. * @param {number} [limit=Number.MAX_VALUE] If supplied, stop finding intersections after this many intersections. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Object[]} List of objects containing the object and position of each intersection. * @@ -4267,6 +4281,7 @@ Scene.prototype.drillPickFromRay = function ( * @private * * @param {Ray} ray The ray. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to an object containing the object and position of the first intersection. * @@ -4293,6 +4308,7 @@ Scene.prototype.pickFromRayMostDetailed = function ( * * @param {Ray} ray The ray. * @param {number} [limit=Number.MAX_VALUE] If supplied, stop finding intersections after this many intersections. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to exclude from the ray intersection. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to a list of objects containing the object and position of each intersection. * @@ -4316,11 +4332,14 @@ Scene.prototype.drillPickFromRayMostDetailed = function ( /** * Returns the height of scene geometry at the given cartographic position or undefined if there was no * scene geometry to sample height from. The height of the input position is ignored. May be used to clamp objects to + * the globe, 3D Tiles, or primitives in the scene. *

+ * This function only samples height from globe tiles and 3D Tiles that are rendered in the current view. Samples height * from all other primitives regardless of their visibility. *

* * @param {Cartographic} position The cartographic position to sample height from. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not sample height from. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {number} The height. This may be undefined if there was no scene geometry to sample height from. * @@ -4343,11 +4362,14 @@ Scene.prototype.sampleHeight = function (position, objectsToExclude, width) { /** * Clamps the given cartesian position to the scene geometry along the geodetic surface normal. Returns the * clamped position or undefined if there was no scene geometry to clamp to. May be used to clamp + * objects to the globe, 3D Tiles, or primitives in the scene. *

+ * This function only clamps to globe tiles and 3D Tiles that are rendered in the current view. Clamps to * all other primitives regardless of their visibility. *

* * @param {Cartesian3} cartesian The cartesian position. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not clamp to. * @param {number} [width=0.1] Width of the intersection volume in meters. * @param {Cartesian3} [result] An optional object to return the clamped position. * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided. This may be undefined if there was no scene geometry to clamp to. @@ -4387,6 +4409,7 @@ Scene.prototype.clampToHeight = function ( * the height is set to undefined. * * @param {Cartographic[]} positions The cartographic positions to update with sampled heights. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not sample height from. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to the provided list of positions when the query has completed. * @@ -4426,6 +4449,7 @@ Scene.prototype.sampleHeightMostDetailed = function ( * can be sampled at that location, or another error occurs, the element in the array is set to undefined. * * @param {Cartesian3[]} cartesians The cartesian positions to update with clamped positions. + * @param {Object[]} [objectsToExclude] A list of primitives, entities, or 3D Tiles features to not clamp to. * @param {number} [width=0.1] Width of the intersection volume in meters. * @returns {Promise} A promise that resolves to the provided list of positions when the query has completed. * From bcb793a8167facfbdab365ffcb251e8845f31b6f Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Wed, 17 Jan 2024 10:32:18 -0500 Subject: [PATCH 12/15] Fix crash when transitioning --- packages/engine/Source/Scene/Scene.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/engine/Source/Scene/Scene.js b/packages/engine/Source/Scene/Scene.js index 57f73903c231..7cf0923e6328 100644 --- a/packages/engine/Source/Scene/Scene.js +++ b/packages/engine/Source/Scene/Scene.js @@ -3602,6 +3602,10 @@ function callAfterRenderFunctions(scene) { } function getGlobeHeight(scene) { + if (scene.mode === SceneMode.MORPHING) { + return; + } + const camera = scene.camera; const cartographic = camera.positionCartographic; return scene.getHeight(cartographic); From d489a7677ff3391e70ee040289cbc9988baf71ea Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Wed, 17 Jan 2024 15:07:12 -0500 Subject: [PATCH 13/15] Update packages/engine/Source/Scene/Cesium3DTileset.js Co-authored-by: Peter Gagliardi --- packages/engine/Source/Scene/Cesium3DTileset.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index 6a6fad8e1fc8..499de5a262cd 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -3561,9 +3561,7 @@ Cesium3DTileset.prototype.updateHeight = function ( callback, ellipsoid ) { - if (!defined(ellipsoid)) { - ellipsoid = Ellipsoid.WGS84; - } + ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); const object = { positionCartographic: cartographic, From 0f819cffde58f29afddcbf6aa9f9976b9386fdf6 Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Fri, 19 Jan 2024 12:03:20 -0500 Subject: [PATCH 14/15] Cleanup --- .../Sandcastle/gallery/Clamp Entities to Ground.html | 12 ++++++++---- Apps/Sandcastle/gallery/Clamp Model to Ground.html | 7 +++++++ .../Source/DataSources/GroundGeometryUpdater.js | 1 + .../Source/DataSources/TerrainOffsetProperty.js | 2 +- packages/engine/Source/Scene/Billboard.js | 8 ++++---- .../engine/Source/Scene/Cesium3DTilesetTraversal.js | 1 + packages/engine/Source/Scene/HeightReference.js | 8 ++++---- 7 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html index c2af4a8f7e11..cdda0b4e48a6 100644 --- a/Apps/Sandcastle/gallery/Clamp Entities to Ground.html +++ b/Apps/Sandcastle/gallery/Clamp Entities to Ground.html @@ -90,6 +90,7 @@ // text: "Draw Point with Label", onselect: function () { + viewer.entities.removeAll(); const pointAndLabel = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-122.1965, 46.1915), point: { @@ -120,6 +121,7 @@ { text: "Draw Billboard", onselect: function () { + viewer.entities.removeAll(); const e = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), billboard: { @@ -139,6 +141,7 @@ // text: "Draw Corridor", onselect: function () { + viewer.entities.removeAll(); const e = viewer.entities.add({ corridor: { positions: Cesium.Cartesian3.fromDegreesArray([ @@ -160,6 +163,7 @@ { text: "Draw Polygon", onselect: function () { + viewer.entities.removeAll(); const e = viewer.entities.add({ polygon: { hierarchy: { @@ -207,6 +211,7 @@ return; } + viewer.entities.removeAll(); const e = viewer.entities.add({ polygon: { hierarchy: { @@ -245,6 +250,7 @@ { text: "Draw Rectangle", onselect: function () { + viewer.entities.removeAll(); const e = viewer.entities.add({ rectangle: { coordinates: Cesium.Rectangle.fromDegrees( @@ -263,6 +269,7 @@ { text: "Draw Model", onselect: function () { + viewer.entities.removeAll(); const e = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-122.1958, 46.1915), model: { @@ -285,6 +292,7 @@ ); } + viewer.entities.removeAll(); viewer.entities.add({ polyline: { positions: Cesium.Cartesian3.fromDegreesArray([ @@ -320,10 +328,6 @@ }, }, ]); - - Sandcastle.reset = function () { - viewer.entities.removeAll(); - }; //Sandcastle_End }; if (typeof Cesium !== "undefined") { diff --git a/Apps/Sandcastle/gallery/Clamp Model to Ground.html b/Apps/Sandcastle/gallery/Clamp Model to Ground.html index 4b326c36c06d..1d10dd1121bf 100644 --- a/Apps/Sandcastle/gallery/Clamp Model to Ground.html +++ b/Apps/Sandcastle/gallery/Clamp Model to Ground.html @@ -90,6 +90,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb"; + entity.model.scale = 2.5; entity.model.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND; }, @@ -99,6 +100,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumAir/Cesium_Air.glb"; + entity.model.scale = 1.0; entity.model.heightReference = Cesium.HeightReference.RELATIVE_TO_GROUND; }, @@ -108,6 +110,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb"; + entity.model.scale = 2.5; entity.model.heightReference = Cesium.HeightReference.CLAMP_TO_TERRAIN; }, @@ -117,6 +120,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumAir/Cesium_Air.glb"; + entity.model.scale = 1.0; entity.model.heightReference = Cesium.HeightReference.RELATIVE_TO_TERRAIN; }, @@ -126,6 +130,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb"; + entity.model.scale = 1.0; entity.model.heightReference = Cesium.HeightReference.CLAMP_TO_3D_TILE; }, @@ -135,6 +140,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumAir/Cesium_Air.glb"; + entity.model.scale = 1.0; entity.model.heightReference = Cesium.HeightReference.RELATIVE_TO_3D_TILE; }, @@ -144,6 +150,7 @@ onselect: () => { entity.model.uri = "../../SampleData/models/CesiumDrone/CesiumDrone.glb"; + entity.model.scale = 2.5; entity.model.heightReference = Cesium.HeightReference.NONE; }, }, diff --git a/packages/engine/Source/DataSources/GroundGeometryUpdater.js b/packages/engine/Source/DataSources/GroundGeometryUpdater.js index 6f821b6080ad..438b483dd0ae 100644 --- a/packages/engine/Source/DataSources/GroundGeometryUpdater.js +++ b/packages/engine/Source/DataSources/GroundGeometryUpdater.js @@ -169,6 +169,7 @@ GroundGeometryUpdater.getGeometryHeight = function (height, heightReference) { if (!isHeightReferenceClamp(heightReference)) { return height; } + return 0.0; }; diff --git a/packages/engine/Source/DataSources/TerrainOffsetProperty.js b/packages/engine/Source/DataSources/TerrainOffsetProperty.js index 10624d57d0cd..662d108eed26 100644 --- a/packages/engine/Source/DataSources/TerrainOffsetProperty.js +++ b/packages/engine/Source/DataSources/TerrainOffsetProperty.js @@ -143,7 +143,7 @@ TerrainOffsetProperty.prototype._updateClamping = function () { this._removeCallbackFunc = scene.updateHeight( cartographicPosition, updateFunction, - this._updateClamping + this._heightReference ); }; diff --git a/packages/engine/Source/Scene/Billboard.js b/packages/engine/Source/Scene/Billboard.js index 9e731e2f97ac..878bd41dc25e 100644 --- a/packages/engine/Source/Scene/Billboard.js +++ b/packages/engine/Source/Scene/Billboard.js @@ -1096,16 +1096,16 @@ Billboard._updateClamping = function (collection, owner) { return; } + if (defined(owner._removeCallbackFunc)) { + owner._removeCallbackFunc(); + } + const position = ellipsoid.cartesianToCartographic(owner._position); if (!defined(position)) { owner._actualClampedPosition = undefined; return; } - if (defined(owner._removeCallbackFunc)) { - owner._removeCallbackFunc(); - } - function updateFunction(clampedPosition) { owner._clampedPosition = ellipsoid.cartographicToCartesian( clampedPosition, diff --git a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js index 1ff0b45bf63b..57dea371ce94 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js @@ -92,6 +92,7 @@ Cesium3DTilesetTraversal.selectTile = function (tile, frameState) { tileset._selectedTilesToStyle.push(tile); tile._wasSelectedLastFrame = false; } + tile._selectedFrame = frameState.frameNumber; tileset._selectedTiles.push(tile); }; diff --git a/packages/engine/Source/Scene/HeightReference.js b/packages/engine/Source/Scene/HeightReference.js index 8fa4e48a3bc9..e81a671690de 100644 --- a/packages/engine/Source/Scene/HeightReference.js +++ b/packages/engine/Source/Scene/HeightReference.js @@ -57,9 +57,9 @@ const HeightReference = { export default Object.freeze(HeightReference); /** - * Returns true if the height should be offset relative to the surface + * Returns true if the height should be clamped to the surface * @param {HeightReference} heightReference - * @returns true if the height should be offset relative to the surface + * @returns true if the height should be clamped to the surface * @private */ export function isHeightReferenceClamp(heightReference) { @@ -71,9 +71,9 @@ export function isHeightReferenceClamp(heightReference) { } /** - * Returns true if the height should be clamped to the surface + * Returns true if the height should be offset relative to the surface * @param {HeightReference} heightReference - * @returns true if the height should be clamped to the surface + * @returns true if the height should be offset relative to the surface * @private */ export function isHeightReferenceRelative(heightReference) { From 6b5d19af4907fe7add95ed758aadf6ad5293a4dc Mon Sep 17 00:00:00 2001 From: Gabby Getz Date: Wed, 31 Jan 2024 10:20:44 -0500 Subject: [PATCH 15/15] Fix spec --- packages/engine/Specs/Scene/Model/ModelSpec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/engine/Specs/Scene/Model/ModelSpec.js b/packages/engine/Specs/Scene/Model/ModelSpec.js index 0be056fffbb4..b86bbd1df89e 100644 --- a/packages/engine/Specs/Scene/Model/ModelSpec.js +++ b/packages/engine/Specs/Scene/Model/ModelSpec.js @@ -2294,7 +2294,6 @@ describe( expect(model._heightDirty).toBe(true); scene.renderForSpecs(); - expect(model._heightDirty).toBe(false); expect(model.heightReference).toEqual(HeightReference.CLAMP_TO_GROUND); expect(model._clampedModelMatrix).toBeDefined(); });