@cesium/engine 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Build/Workers/{AxisAlignedBoundingBox-a6f9f0e5.js → AxisAlignedBoundingBox-379015ef.js} +1 -1
- package/Build/Workers/{BoundingRectangle-b0a68595.js → BoundingRectangle-57f2b24f.js} +1 -1
- package/Build/Workers/{BoxGeometry-baedd794.js → BoxGeometry-ecabfc78.js} +1 -1
- package/Build/Workers/{Color-f85df1be.js → Color-14d1a36d.js} +1 -1
- package/Build/Workers/{CoplanarPolygonGeometryLibrary-30516950.js → CoplanarPolygonGeometryLibrary-048c3c14.js} +1 -1
- package/Build/Workers/{CorridorGeometryLibrary-5d5d3b3a.js → CorridorGeometryLibrary-520c8619.js} +1 -1
- package/Build/Workers/{CylinderGeometry-d899ae26.js → CylinderGeometry-119068b8.js} +1 -1
- package/Build/Workers/{EllipseGeometry-a49f8449.js → EllipseGeometry-2dfc3523.js} +1 -1
- package/Build/Workers/{EllipseGeometryLibrary-cba7edde.js → EllipseGeometryLibrary-0a1e0170.js} +1 -1
- package/Build/Workers/{EllipseOutlineGeometry-8095c8cb.js → EllipseOutlineGeometry-c5251669.js} +1 -1
- package/Build/Workers/{EllipsoidGeometry-ed93f571.js → EllipsoidGeometry-d10a5221.js} +1 -1
- package/Build/Workers/{EllipsoidOutlineGeometry-e4854854.js → EllipsoidOutlineGeometry-7039a0ae.js} +1 -1
- package/Build/Workers/{EllipsoidTangentPlane-7ae1aa9a.js → EllipsoidTangentPlane-857186be.js} +1 -1
- package/Build/Workers/{FrustumGeometry-b62db3e3.js → FrustumGeometry-400fa1b7.js} +2 -2
- package/Build/Workers/{GeometryAttribute-780af4fa.js → GeometryAttribute-7a2de5c6.js} +1 -1
- package/Build/Workers/{GeometryPipeline-36b61c99.js → GeometryPipeline-916636fa.js} +1 -1
- package/Build/Workers/{IntersectionTests-e889fcf0.js → IntersectionTests-b4d02d4d.js} +1 -1
- package/Build/Workers/{OrientedBoundingBox-43478ac8.js → OrientedBoundingBox-96fe1752.js} +5 -3
- package/Build/Workers/{PolygonGeometryLibrary-38a98276.js → PolygonGeometryLibrary-931f1ec6.js} +1 -1
- package/Build/Workers/{PolygonPipeline-d31ff61c.js → PolygonPipeline-32fc92cc.js} +1 -1
- package/Build/Workers/{PolylinePipeline-30e4cec9.js → PolylinePipeline-6d5c63e5.js} +1 -1
- package/Build/Workers/{PolylineVolumeGeometryLibrary-90551d26.js → PolylineVolumeGeometryLibrary-f068c1fb.js} +1 -1
- package/Build/Workers/{PrimitivePipeline-558d9cb0.js → PrimitivePipeline-879f996a.js} +1 -1
- package/Build/Workers/{RectangleGeometryLibrary-815c68df.js → RectangleGeometryLibrary-2d6f36f3.js} +1 -1
- package/Build/Workers/{TerrainEncoding-341ead52.js → TerrainEncoding-82882059.js} +1 -1
- package/Build/Workers/{Transforms-9e9df299.js → Transforms-9052372a.js} +6 -5
- package/Build/Workers/{WallGeometryLibrary-ccf90976.js → WallGeometryLibrary-db7a64fb.js} +1 -1
- package/Build/Workers/cesiumWorkerBootstrapper.js +1 -1
- package/Build/Workers/combineGeometry.js +1 -1
- package/Build/Workers/createBoxGeometry.js +1 -1
- package/Build/Workers/createBoxOutlineGeometry.js +1 -1
- package/Build/Workers/createCircleGeometry.js +1 -1
- package/Build/Workers/createCircleOutlineGeometry.js +1 -1
- package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
- package/Build/Workers/createCorridorGeometry.js +1 -1
- package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
- package/Build/Workers/createCylinderGeometry.js +1 -1
- package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
- package/Build/Workers/createEllipseGeometry.js +1 -1
- package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
- package/Build/Workers/createEllipsoidGeometry.js +1 -1
- package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
- package/Build/Workers/createFrustumGeometry.js +1 -1
- package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
- package/Build/Workers/createGeometry.js +1 -1
- package/Build/Workers/createGroundPolylineGeometry.js +1 -1
- package/Build/Workers/createPlaneGeometry.js +1 -1
- package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
- package/Build/Workers/createPolygonGeometry.js +1 -1
- package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
- package/Build/Workers/createPolylineGeometry.js +1 -1
- package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
- package/Build/Workers/createRectangleGeometry.js +1 -1
- package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
- package/Build/Workers/createSimplePolylineGeometry.js +1 -1
- package/Build/Workers/createSphereGeometry.js +1 -1
- package/Build/Workers/createSphereOutlineGeometry.js +1 -1
- package/Build/Workers/createVectorTileGeometries.js +1 -1
- package/Build/Workers/createVectorTilePolygons.js +1 -1
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
- package/Build/Workers/createVerticesFromHeightmap.js +1 -1
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +10 -15
- package/Build/Workers/createWallGeometry.js +1 -1
- package/Build/Workers/createWallOutlineGeometry.js +1 -1
- package/Build/Workers/package.js +1 -1
- package/Build/Workers/transferTypedArrayTest.js +1 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
- package/Source/Core/ArcGISTiledElevationTerrainProvider.js +291 -191
- package/Source/Core/CesiumTerrainProvider.js +571 -434
- package/Source/Core/CustomHeightmapTerrainProvider.js +12 -0
- package/Source/Core/EllipsoidTerrainProvider.js +17 -10
- package/Source/Core/FrustumGeometry.js +1 -1
- package/Source/Core/GoogleEarthEnterpriseMetadata.js +86 -34
- package/Source/Core/GoogleEarthEnterpriseTerrainProvider.js +119 -82
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/IonResource.js +14 -3
- package/Source/Core/OrientedBoundingBox.js +4 -2
- package/Source/Core/RequestScheduler.js +1 -1
- package/Source/Core/Resource.js +2 -2
- package/Source/Core/TerrainProvider.js +9 -14
- package/Source/Core/TileProviderError.js +8 -8
- package/Source/Core/VRTheWorldTerrainProvider.js +193 -124
- package/Source/Core/buildModuleUrl.js +4 -3
- package/Source/Core/createWorldTerrain.js +20 -2
- package/Source/Core/createWorldTerrainAsync.js +48 -0
- package/Source/Core/sampleTerrain.js +9 -10
- package/Source/Core/sampleTerrainMostDetailed.js +66 -72
- package/Source/DataSources/Cesium3DTilesetVisualizer.js +37 -26
- package/Source/DataSources/Entity.js +6 -1
- package/Source/DataSources/ModelVisualizer.js +99 -31
- package/Source/DataSources/PolygonGraphics.js +1 -1
- package/Source/Scene/ArcGisMapServerImageryProvider.js +552 -376
- package/Source/Scene/BingMapsImageryProvider.js +511 -305
- package/Source/Scene/BufferLoader.js +29 -34
- package/Source/Scene/Cesium3DTile.js +388 -251
- package/Source/Scene/Cesium3DTileBatchTable.js +2 -2
- package/Source/Scene/Cesium3DTileContent.js +16 -0
- package/Source/Scene/Cesium3DTileContentFactory.js +4 -4
- package/Source/Scene/Cesium3DTilePass.js +8 -11
- package/Source/Scene/Cesium3DTileStyleEngine.js +1 -1
- package/Source/Scene/Cesium3DTilesVoxelProvider.js +225 -117
- package/Source/Scene/Cesium3DTileset.js +755 -481
- package/Source/Scene/Cesium3DTilesetBaseTraversal.js +301 -0
- package/Source/Scene/Cesium3DTilesetMostDetailedTraversal.js +33 -46
- package/Source/Scene/Cesium3DTilesetSkipTraversal.js +421 -0
- package/Source/Scene/Cesium3DTilesetTraversal.js +219 -671
- package/Source/Scene/ClassificationPrimitive.js +7 -0
- package/Source/Scene/Composite3DTileContent.js +69 -26
- package/Source/Scene/CreditDisplay.js +20 -4
- package/Source/Scene/DepthPlane.js +1 -1
- package/Source/Scene/Empty3DTileContent.js +31 -1
- package/Source/Scene/Geometry3DTileContent.js +47 -7
- package/Source/Scene/Globe.js +5 -1
- package/Source/Scene/GlobeSurfaceTile.js +2 -1
- package/Source/Scene/GlobeSurfaceTileProvider.js +50 -27
- package/Source/Scene/GltfBufferViewLoader.js +47 -91
- package/Source/Scene/GltfDracoLoader.js +110 -112
- package/Source/Scene/GltfImageLoader.js +71 -78
- package/Source/Scene/GltfIndexBufferLoader.js +108 -121
- package/Source/Scene/GltfJsonLoader.js +75 -74
- package/Source/Scene/GltfLoader.js +392 -280
- package/Source/Scene/GltfStructuralMetadataLoader.js +109 -110
- package/Source/Scene/GltfTextureLoader.js +97 -96
- package/Source/Scene/GltfVertexBufferLoader.js +128 -133
- package/Source/Scene/GoogleEarthEnterpriseImageryProvider.js +353 -225
- package/Source/Scene/GoogleEarthEnterpriseMapsProvider.js +491 -331
- package/Source/Scene/GridImageryProvider.js +267 -104
- package/Source/Scene/GroundPolylinePrimitive.js +12 -1
- package/Source/Scene/GroundPrimitive.js +8 -1
- package/Source/Scene/I3SDataProvider.js +214 -113
- package/Source/Scene/I3SFeature.js +7 -6
- package/Source/Scene/I3SLayer.js +26 -37
- package/Source/Scene/I3SNode.js +59 -66
- package/Source/Scene/Imagery.js +6 -1
- package/Source/Scene/ImageryLayer.js +299 -48
- package/Source/Scene/ImageryLayerCollection.js +26 -0
- package/Source/Scene/ImageryProvider.js +129 -111
- package/Source/Scene/Implicit3DTileContent.js +72 -23
- package/Source/Scene/ImplicitSubtree.js +66 -45
- package/Source/Scene/IonImageryProvider.js +471 -264
- package/Source/Scene/MapboxImageryProvider.js +272 -112
- package/Source/Scene/MapboxStyleImageryProvider.js +270 -111
- package/Source/Scene/MetadataSchemaLoader.js +26 -36
- package/Source/Scene/Model/B3dmLoader.js +42 -46
- package/Source/Scene/Model/GeoJsonLoader.js +8 -32
- package/Source/Scene/Model/I3dmLoader.js +48 -74
- package/Source/Scene/Model/Model.js +470 -132
- package/Source/Scene/Model/Model3DTileContent.js +83 -31
- package/Source/Scene/Model/ModelAnimationCollection.js +3 -3
- package/Source/Scene/Model/ModelDrawCommand.js +15 -26
- package/Source/Scene/Model/ModelUtility.js +16 -16
- package/Source/Scene/Model/PntsLoader.js +27 -32
- package/Source/Scene/Multiple3DTileContent.js +134 -115
- package/Source/Scene/PointCloud.js +11 -19
- package/Source/Scene/Primitive.js +20 -0
- package/Source/Scene/QuadtreePrimitive.js +2 -0
- package/Source/Scene/QuadtreeTileProvider.js +4 -8
- package/Source/Scene/ResourceCache.js +47 -105
- package/Source/Scene/ResourceCacheStatistics.js +24 -58
- package/Source/Scene/ResourceLoader.js +5 -17
- package/Source/Scene/ResourceLoaderState.js +12 -4
- package/Source/Scene/Scene.js +65 -0
- package/Source/Scene/ScreenSpaceCameraController.js +1 -1
- package/Source/Scene/SingleTileImageryProvider.js +382 -209
- package/Source/Scene/Terrain.js +196 -0
- package/Source/Scene/TileCoordinatesImageryProvider.js +267 -104
- package/Source/Scene/TileMapServiceImageryProvider.js +177 -85
- package/Source/Scene/Tileset3DTileContent.js +47 -5
- package/Source/Scene/TimeDynamicPointCloud.js +15 -2
- package/Source/Scene/UrlTemplateImageryProvider.js +343 -215
- package/Source/Scene/Vector3DTileClampedPolylines.js +96 -84
- package/Source/Scene/Vector3DTileContent.js +47 -22
- package/Source/Scene/Vector3DTileGeometry.js +57 -52
- package/Source/Scene/Vector3DTilePoints.js +72 -68
- package/Source/Scene/Vector3DTilePolygons.js +118 -117
- package/Source/Scene/Vector3DTilePolylines.js +86 -82
- package/Source/Scene/Vector3DTilePrimitive.js +0 -1
- package/Source/Scene/VoxelContent.js +61 -63
- package/Source/Scene/VoxelPrimitive.js +39 -91
- package/Source/Scene/VoxelProvider.js +2 -2
- package/Source/Scene/WebMapServiceImageryProvider.js +272 -111
- package/Source/Scene/WebMapTileServiceImageryProvider.js +270 -107
- package/Source/Scene/computeFlyToLocationForRectangle.js +33 -37
- package/Source/Scene/createOsmBuildings.js +6 -0
- package/Source/Scene/createOsmBuildingsAsync.js +82 -0
- package/Source/Scene/createWorldImagery.js +14 -5
- package/Source/Scene/createWorldImageryAsync.js +39 -0
- package/Source/Widget/CesiumWidget.js +55 -27
- package/index.d.ts +2158 -1395
- package/index.js +58 -51
- package/package.json +1 -1
|
@@ -52,6 +52,10 @@ import Pass from "../Renderer/Pass.js";
|
|
|
52
52
|
*
|
|
53
53
|
* @alias Cesium3DTile
|
|
54
54
|
* @constructor
|
|
55
|
+
* @param {Cesium3DTileset} tileset The tileset
|
|
56
|
+
* @param {Resource} baseResource The base resource for the tileset
|
|
57
|
+
* @param {object} header The JSON header for the tile
|
|
58
|
+
* @param {Cesium3DTile} parent The parent tile of the new tile
|
|
55
59
|
*/
|
|
56
60
|
function Cesium3DTile(tileset, baseResource, header, parent) {
|
|
57
61
|
this._tileset = tileset;
|
|
@@ -255,8 +259,6 @@ function Cesium3DTile(tileset, baseResource, header, parent) {
|
|
|
255
259
|
this._content = content;
|
|
256
260
|
this._contentResource = contentResource;
|
|
257
261
|
this._contentState = contentState;
|
|
258
|
-
this._contentReadyToProcessPromise = undefined;
|
|
259
|
-
this._contentReadyPromise = undefined;
|
|
260
262
|
this._expiredContent = undefined;
|
|
261
263
|
|
|
262
264
|
this._serverKey = serverKey;
|
|
@@ -574,13 +576,29 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
574
576
|
},
|
|
575
577
|
},
|
|
576
578
|
|
|
579
|
+
/**
|
|
580
|
+
* Determines if the tile is visible within the current field of view
|
|
581
|
+
*
|
|
582
|
+
* @memberof Cesium3DTile.prototype
|
|
583
|
+
*
|
|
584
|
+
* @type {boolean}
|
|
585
|
+
* @readonly
|
|
586
|
+
*
|
|
587
|
+
* @private
|
|
588
|
+
*/
|
|
589
|
+
isVisible: {
|
|
590
|
+
get: function () {
|
|
591
|
+
return this._visible && this._inRequestVolume;
|
|
592
|
+
},
|
|
593
|
+
},
|
|
594
|
+
|
|
577
595
|
/**
|
|
578
596
|
* Returns the <code>extras</code> property in the tileset JSON for this tile, which contains application specific metadata.
|
|
579
597
|
* Returns <code>undefined</code> if <code>extras</code> does not exist.
|
|
580
598
|
*
|
|
581
599
|
* @memberof Cesium3DTile.prototype
|
|
582
600
|
*
|
|
583
|
-
* @type {
|
|
601
|
+
* @type {object}
|
|
584
602
|
* @readonly
|
|
585
603
|
* @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#specifying-extensions-and-application-specific-extras|Extras in the 3D Tiles specification.}
|
|
586
604
|
*/
|
|
@@ -614,6 +632,27 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
614
632
|
},
|
|
615
633
|
},
|
|
616
634
|
|
|
635
|
+
/**
|
|
636
|
+
* Determines if the tile's content is renderable. <code>false</code> if the
|
|
637
|
+
* tile has empty content or if it points to an external tileset or implicit content
|
|
638
|
+
*
|
|
639
|
+
* @memberof Cesium3DTile.prototype
|
|
640
|
+
*
|
|
641
|
+
* @type {boolean}
|
|
642
|
+
* @readonly
|
|
643
|
+
*
|
|
644
|
+
* @private
|
|
645
|
+
*/
|
|
646
|
+
hasRenderableContent: {
|
|
647
|
+
get: function () {
|
|
648
|
+
return (
|
|
649
|
+
!this.hasEmptyContent &&
|
|
650
|
+
!this.hasTilesetContent &&
|
|
651
|
+
!this.hasImplicitContent
|
|
652
|
+
);
|
|
653
|
+
},
|
|
654
|
+
},
|
|
655
|
+
|
|
617
656
|
/**
|
|
618
657
|
* Determines if the tile has available content to render. <code>true</code> if the tile's
|
|
619
658
|
* content is ready or if it has expired content that renders while new content loads; otherwise,
|
|
@@ -629,10 +668,7 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
629
668
|
contentAvailable: {
|
|
630
669
|
get: function () {
|
|
631
670
|
return (
|
|
632
|
-
(this.contentReady &&
|
|
633
|
-
!this.hasEmptyContent &&
|
|
634
|
-
!this.hasTilesetContent &&
|
|
635
|
-
!this.hasImplicitContent) ||
|
|
671
|
+
(this.contentReady && this.hasRenderableContent) ||
|
|
636
672
|
(defined(this._expiredContent) && !this.contentFailed)
|
|
637
673
|
);
|
|
638
674
|
},
|
|
@@ -673,8 +709,7 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
673
709
|
},
|
|
674
710
|
|
|
675
711
|
/**
|
|
676
|
-
* Determines if the tile
|
|
677
|
-
* content is expired; otherwise, <code>false</code>.
|
|
712
|
+
* Determines if the tile has renderable content which is unloaded
|
|
678
713
|
*
|
|
679
714
|
* @memberof Cesium3DTile.prototype
|
|
680
715
|
*
|
|
@@ -683,15 +718,15 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
683
718
|
*
|
|
684
719
|
* @private
|
|
685
720
|
*/
|
|
686
|
-
|
|
721
|
+
hasUnloadedRenderableContent: {
|
|
687
722
|
get: function () {
|
|
688
|
-
return this.
|
|
723
|
+
return this.hasRenderableContent && this.contentUnloaded;
|
|
689
724
|
},
|
|
690
725
|
},
|
|
691
726
|
|
|
692
727
|
/**
|
|
693
|
-
* Determines if the tile's content
|
|
694
|
-
* content
|
|
728
|
+
* Determines if the tile's content is expired. <code>true</code> if tile's
|
|
729
|
+
* content is expired; otherwise, <code>false</code>.
|
|
695
730
|
*
|
|
696
731
|
* @memberof Cesium3DTile.prototype
|
|
697
732
|
*
|
|
@@ -700,45 +735,26 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
700
735
|
*
|
|
701
736
|
* @private
|
|
702
737
|
*/
|
|
703
|
-
|
|
738
|
+
contentExpired: {
|
|
704
739
|
get: function () {
|
|
705
|
-
return this._contentState === Cesium3DTileContentState.
|
|
740
|
+
return this._contentState === Cesium3DTileContentState.EXPIRED;
|
|
706
741
|
},
|
|
707
742
|
},
|
|
708
743
|
|
|
709
744
|
/**
|
|
710
|
-
*
|
|
711
|
-
*
|
|
712
|
-
* to render.
|
|
713
|
-
* <p>
|
|
714
|
-
* The promise remains <code>undefined</code> until the tile's content is requested.
|
|
715
|
-
* </p>
|
|
716
|
-
*
|
|
717
|
-
* @type {Promise<Cesium3DTileContent>}
|
|
718
|
-
* @readonly
|
|
745
|
+
* Determines if the tile's content failed to load. <code>true</code> if the tile's
|
|
746
|
+
* content failed to load; otherwise, <code>false</code>.
|
|
719
747
|
*
|
|
720
|
-
* @
|
|
721
|
-
*/
|
|
722
|
-
contentReadyToProcessPromise: {
|
|
723
|
-
get: function () {
|
|
724
|
-
return this._contentReadyToProcessPromise;
|
|
725
|
-
},
|
|
726
|
-
},
|
|
727
|
-
|
|
728
|
-
/**
|
|
729
|
-
* Gets the promise that will be resolved when the tile's content is ready to render.
|
|
730
|
-
* <p>
|
|
731
|
-
* The promise remains <code>undefined</code> until the tile's content is requested.
|
|
732
|
-
* </p>
|
|
748
|
+
* @memberof Cesium3DTile.prototype
|
|
733
749
|
*
|
|
734
|
-
* @type {
|
|
750
|
+
* @type {boolean}
|
|
735
751
|
* @readonly
|
|
736
752
|
*
|
|
737
753
|
* @private
|
|
738
754
|
*/
|
|
739
|
-
|
|
755
|
+
contentFailed: {
|
|
740
756
|
get: function () {
|
|
741
|
-
return this.
|
|
757
|
+
return this._contentState === Cesium3DTileContentState.FAILED;
|
|
742
758
|
},
|
|
743
759
|
},
|
|
744
760
|
|
|
@@ -757,13 +773,20 @@ Object.defineProperties(Cesium3DTile.prototype, {
|
|
|
757
773
|
});
|
|
758
774
|
|
|
759
775
|
const scratchCartesian = new Cartesian3();
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* @private
|
|
779
|
+
* @param {Cesium3DTile} tile
|
|
780
|
+
* @param {FrameState} frameState
|
|
781
|
+
* @returns {Boolean}
|
|
782
|
+
*/
|
|
760
783
|
function isPriorityDeferred(tile, frameState) {
|
|
761
|
-
const tileset = tile
|
|
784
|
+
const { tileset, boundingSphere } = tile;
|
|
785
|
+
const { radius, center } = boundingSphere;
|
|
786
|
+
const { camera } = frameState;
|
|
762
787
|
|
|
763
|
-
// If closest point on line is inside the sphere then set foveatedFactor to 0.
|
|
764
|
-
|
|
765
|
-
const boundingSphere = tile.boundingSphere;
|
|
766
|
-
const radius = boundingSphere.radius;
|
|
788
|
+
// If closest point on line is inside the sphere then set foveatedFactor to 0.
|
|
789
|
+
// Otherwise, the dot product is with the line from camera to the point on the sphere that is closest to the line.
|
|
767
790
|
const scaledCameraDirection = Cartesian3.multiplyByScalar(
|
|
768
791
|
camera.directionWC,
|
|
769
792
|
tile._centerZDepth,
|
|
@@ -777,7 +800,7 @@ function isPriorityDeferred(tile, frameState) {
|
|
|
777
800
|
// The distance from the camera's view direction to the tile.
|
|
778
801
|
const toLine = Cartesian3.subtract(
|
|
779
802
|
closestPointOnLine,
|
|
780
|
-
|
|
803
|
+
center,
|
|
781
804
|
scratchCartesian
|
|
782
805
|
);
|
|
783
806
|
const distanceToCenterLine = Cartesian3.magnitude(toLine);
|
|
@@ -795,7 +818,7 @@ function isPriorityDeferred(tile, frameState) {
|
|
|
795
818
|
scratchCartesian
|
|
796
819
|
);
|
|
797
820
|
const closestOnSphere = Cartesian3.add(
|
|
798
|
-
|
|
821
|
+
center,
|
|
799
822
|
scaledToLine,
|
|
800
823
|
scratchCartesian
|
|
801
824
|
);
|
|
@@ -818,7 +841,7 @@ function isPriorityDeferred(tile, frameState) {
|
|
|
818
841
|
// Skip this feature if: non-skipLevelOfDetail and replace refine, if the foveated settings are turned off, if tile is progressive resolution and replace refine and skipLevelOfDetail (will help get rid of ancestor artifacts faster)
|
|
819
842
|
// Or if the tile is a preload of any kind
|
|
820
843
|
const replace = tile.refine === Cesium3DTileRefine.REPLACE;
|
|
821
|
-
const skipLevelOfDetail = tileset.
|
|
844
|
+
const skipLevelOfDetail = tileset.isSkippingLevelOfDetail;
|
|
822
845
|
if (
|
|
823
846
|
(replace && !skipLevelOfDetail) ||
|
|
824
847
|
!tileset.foveatedScreenSpaceError ||
|
|
@@ -864,6 +887,9 @@ const scratchJulianDate = new JulianDate();
|
|
|
864
887
|
* Get the tile's screen space error.
|
|
865
888
|
*
|
|
866
889
|
* @private
|
|
890
|
+
* @param {FrameState} frameState
|
|
891
|
+
* @param {Boolean} useParentGeometricError
|
|
892
|
+
* @param {number} progressiveResolutionHeightFraction
|
|
867
893
|
*/
|
|
868
894
|
Cesium3DTile.prototype.getScreenSpaceError = function (
|
|
869
895
|
frameState,
|
|
@@ -882,9 +908,8 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
|
|
|
882
908
|
// Leaf tiles do not have any error so save the computation
|
|
883
909
|
return 0.0;
|
|
884
910
|
}
|
|
885
|
-
const camera = frameState
|
|
911
|
+
const { camera, context } = frameState;
|
|
886
912
|
let frustum = camera.frustum;
|
|
887
|
-
const context = frameState.context;
|
|
888
913
|
const width = context.drawingBufferWidth;
|
|
889
914
|
const height = context.drawingBufferHeight * heightFraction;
|
|
890
915
|
let error;
|
|
@@ -902,7 +927,7 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
|
|
|
902
927
|
} else {
|
|
903
928
|
// Avoid divide by zero when viewer is inside the tile
|
|
904
929
|
const distance = Math.max(this._distanceToCamera, CesiumMath.EPSILON7);
|
|
905
|
-
const sseDenominator =
|
|
930
|
+
const sseDenominator = frustum.sseDenominator;
|
|
906
931
|
error = (geometricError * height) / (distance * sseDenominator);
|
|
907
932
|
if (tileset.dynamicScreenSpaceError) {
|
|
908
933
|
const density = tileset._dynamicScreenSpaceErrorComputedDensity;
|
|
@@ -917,6 +942,12 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
|
|
|
917
942
|
return error;
|
|
918
943
|
};
|
|
919
944
|
|
|
945
|
+
/**
|
|
946
|
+
* @private
|
|
947
|
+
* @param {Cesium3DTileset} tileset
|
|
948
|
+
* @param {Cesium3DTile} tile
|
|
949
|
+
* @returns {Boolean}
|
|
950
|
+
*/
|
|
920
951
|
function isPriorityProgressiveResolution(tileset, tile) {
|
|
921
952
|
if (
|
|
922
953
|
tileset.progressiveResolutionHeightFraction <= 0.0 ||
|
|
@@ -944,11 +975,17 @@ function isPriorityProgressiveResolution(tileset, tile) {
|
|
|
944
975
|
return isProgressiveResolutionTile;
|
|
945
976
|
}
|
|
946
977
|
|
|
978
|
+
/**
|
|
979
|
+
* @private
|
|
980
|
+
* @param {Cesium3DTileset} tileset
|
|
981
|
+
* @param {Cesium3DTile} tile
|
|
982
|
+
* @returns {number}
|
|
983
|
+
*/
|
|
947
984
|
function getPriorityReverseScreenSpaceError(tileset, tile) {
|
|
948
985
|
const parent = tile.parent;
|
|
949
986
|
const useParentScreenSpaceError =
|
|
950
987
|
defined(parent) &&
|
|
951
|
-
(!tileset.
|
|
988
|
+
(!tileset.isSkippingLevelOfDetail ||
|
|
952
989
|
tile._screenSpaceError === 0.0 ||
|
|
953
990
|
parent.hasTilesetContent ||
|
|
954
991
|
parent.hasImplicitContent);
|
|
@@ -962,10 +999,15 @@ function getPriorityReverseScreenSpaceError(tileset, tile) {
|
|
|
962
999
|
* Update the tile's visibility.
|
|
963
1000
|
*
|
|
964
1001
|
* @private
|
|
1002
|
+
* @param {FrameState} frameState
|
|
965
1003
|
*/
|
|
966
1004
|
Cesium3DTile.prototype.updateVisibility = function (frameState) {
|
|
967
|
-
const parent = this
|
|
968
|
-
|
|
1005
|
+
const { parent, tileset } = this;
|
|
1006
|
+
if (this._updatedVisibilityFrame === tileset._updatedVisibilityFrame) {
|
|
1007
|
+
// The tile has already been updated for this frame
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
969
1011
|
const parentTransform = defined(parent)
|
|
970
1012
|
? parent.computedTransform
|
|
971
1013
|
: tileset.modelMatrix;
|
|
@@ -996,6 +1038,8 @@ Cesium3DTile.prototype.updateVisibility = function (frameState) {
|
|
|
996
1038
|
this
|
|
997
1039
|
);
|
|
998
1040
|
this.priorityDeferred = isPriorityDeferred(this, frameState);
|
|
1041
|
+
|
|
1042
|
+
this._updatedVisibilityFrame = tileset._updatedVisibilityFrame;
|
|
999
1043
|
};
|
|
1000
1044
|
|
|
1001
1045
|
/**
|
|
@@ -1018,25 +1062,35 @@ Cesium3DTile.prototype.updateExpiration = function () {
|
|
|
1018
1062
|
}
|
|
1019
1063
|
};
|
|
1020
1064
|
|
|
1065
|
+
/**
|
|
1066
|
+
* @private
|
|
1067
|
+
* @param {Cesium3DTile} tile
|
|
1068
|
+
*/
|
|
1021
1069
|
function updateExpireDate(tile) {
|
|
1022
|
-
if (defined(tile.expireDuration)) {
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1070
|
+
if (!defined(tile.expireDuration)) {
|
|
1071
|
+
return;
|
|
1072
|
+
}
|
|
1073
|
+
const expireDurationDate = JulianDate.now(scratchJulianDate);
|
|
1074
|
+
JulianDate.addSeconds(
|
|
1075
|
+
expireDurationDate,
|
|
1076
|
+
tile.expireDuration,
|
|
1077
|
+
expireDurationDate
|
|
1078
|
+
);
|
|
1029
1079
|
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
}
|
|
1034
|
-
} else {
|
|
1035
|
-
tile.expireDate = JulianDate.clone(expireDurationDate);
|
|
1080
|
+
if (defined(tile.expireDate)) {
|
|
1081
|
+
if (JulianDate.lessThan(tile.expireDate, expireDurationDate)) {
|
|
1082
|
+
JulianDate.clone(expireDurationDate, tile.expireDate);
|
|
1036
1083
|
}
|
|
1084
|
+
} else {
|
|
1085
|
+
tile.expireDate = JulianDate.clone(expireDurationDate);
|
|
1037
1086
|
}
|
|
1038
1087
|
}
|
|
1039
1088
|
|
|
1089
|
+
/**
|
|
1090
|
+
* @private
|
|
1091
|
+
* @param {Cesium3DTile} tile
|
|
1092
|
+
* @returns {Function}
|
|
1093
|
+
*/
|
|
1040
1094
|
function createPriorityFunction(tile) {
|
|
1041
1095
|
return function () {
|
|
1042
1096
|
return tile._priority;
|
|
@@ -1049,13 +1103,13 @@ function createPriorityFunction(tile) {
|
|
|
1049
1103
|
* The request may not be made if the Cesium Request Scheduler can't prioritize it.
|
|
1050
1104
|
* </p>
|
|
1051
1105
|
*
|
|
1052
|
-
* @return {
|
|
1106
|
+
* @return {Promise<Cesium3DTileContent>|undefined} A promise that resolves when the request completes, or undefined if there is no request needed, or the request cannot be scheduled.
|
|
1053
1107
|
* @private
|
|
1054
1108
|
*/
|
|
1055
1109
|
Cesium3DTile.prototype.requestContent = function () {
|
|
1056
1110
|
// empty contents don't require any HTTP requests
|
|
1057
1111
|
if (this.hasEmptyContent) {
|
|
1058
|
-
return
|
|
1112
|
+
return;
|
|
1059
1113
|
}
|
|
1060
1114
|
|
|
1061
1115
|
if (this.hasMultipleContents) {
|
|
@@ -1076,6 +1130,8 @@ Cesium3DTile.prototype.requestContent = function () {
|
|
|
1076
1130
|
* </p>
|
|
1077
1131
|
*
|
|
1078
1132
|
* @private
|
|
1133
|
+
* @param {Cesium3DTile} tile
|
|
1134
|
+
* @returns {Promise<Cesium3DTileContent>|Promise<undefined>|undefined} A promise that resolves to the tile content once loaded, or a promise that resolves to undefined if the request was cancelled mid-flight, or undefined if the request cannot be scheduled this frame
|
|
1079
1135
|
*/
|
|
1080
1136
|
function requestMultipleContents(tile) {
|
|
1081
1137
|
let multipleContents = tile._content;
|
|
@@ -1097,86 +1153,120 @@ function requestMultipleContents(tile) {
|
|
|
1097
1153
|
tile._content = multipleContents;
|
|
1098
1154
|
}
|
|
1099
1155
|
|
|
1100
|
-
const
|
|
1101
|
-
|
|
1102
|
-
|
|
1156
|
+
const promise = multipleContents.requestInnerContents();
|
|
1157
|
+
|
|
1158
|
+
if (!defined(promise)) {
|
|
1159
|
+
// Request could not all be scheduled this frame
|
|
1160
|
+
return;
|
|
1103
1161
|
}
|
|
1104
1162
|
|
|
1105
1163
|
tile._contentState = Cesium3DTileContentState.LOADING;
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
if (
|
|
1109
|
-
tile._contentState !== Cesium3DTileContentState.LOADING ||
|
|
1110
|
-
!defined(multipleContents.readyPromise)
|
|
1111
|
-
) {
|
|
1112
|
-
// The tile or one of the inner content requests was canceled,
|
|
1113
|
-
// short circuit.
|
|
1114
|
-
return;
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1164
|
+
return promise
|
|
1165
|
+
.then((content) => {
|
|
1117
1166
|
if (tile.isDestroyed()) {
|
|
1118
|
-
|
|
1119
|
-
tile,
|
|
1120
|
-
tileset,
|
|
1121
|
-
"Tile was unloaded while content was loading"
|
|
1122
|
-
);
|
|
1167
|
+
// Tile is unloaded before the content can process
|
|
1123
1168
|
return;
|
|
1124
1169
|
}
|
|
1125
1170
|
|
|
1126
|
-
|
|
1127
|
-
return multipleContents;
|
|
1128
|
-
}
|
|
1129
|
-
);
|
|
1130
|
-
tile._contentReadyToProcessPromise = contentReadyToProcessPromise;
|
|
1131
|
-
tile._contentReadyPromise = contentReadyToProcessPromise
|
|
1132
|
-
.then(function (content) {
|
|
1171
|
+
// Tile was canceled, try again later
|
|
1133
1172
|
if (!defined(content)) {
|
|
1134
|
-
// request was canceled, short circuit.
|
|
1135
1173
|
return;
|
|
1136
1174
|
}
|
|
1137
1175
|
|
|
1138
|
-
|
|
1176
|
+
tile._contentState = Cesium3DTileContentState.PROCESSING;
|
|
1177
|
+
return multipleContents;
|
|
1139
1178
|
})
|
|
1140
|
-
.
|
|
1141
|
-
if (!defined(content)) {
|
|
1142
|
-
// tile was canceled, short circuit.
|
|
1143
|
-
return;
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1179
|
+
.catch((error) => {
|
|
1146
1180
|
if (tile.isDestroyed()) {
|
|
1147
|
-
|
|
1148
|
-
tile,
|
|
1149
|
-
tileset,
|
|
1150
|
-
"Tile was unloaded while content was processing"
|
|
1151
|
-
);
|
|
1181
|
+
// Tile is unloaded before the content can process
|
|
1152
1182
|
return;
|
|
1153
1183
|
}
|
|
1154
1184
|
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
tile.lastStyleTime = 0.0;
|
|
1158
|
-
|
|
1159
|
-
JulianDate.now(tile._loadTimestamp);
|
|
1160
|
-
tile._contentState = Cesium3DTileContentState.READY;
|
|
1161
|
-
return content;
|
|
1162
|
-
})
|
|
1163
|
-
.catch(function (error) {
|
|
1164
|
-
multipleContentFailed(tile, tileset, error);
|
|
1185
|
+
tile._contentState = Cesium3DTileContentState.FAILED;
|
|
1186
|
+
throw error;
|
|
1165
1187
|
});
|
|
1166
|
-
|
|
1167
|
-
return 0;
|
|
1168
1188
|
}
|
|
1169
1189
|
|
|
1170
|
-
function
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1190
|
+
async function processArrayBuffer(
|
|
1191
|
+
tile,
|
|
1192
|
+
tileset,
|
|
1193
|
+
request,
|
|
1194
|
+
expired,
|
|
1195
|
+
requestPromise
|
|
1196
|
+
) {
|
|
1197
|
+
const previousState = tile._contentState;
|
|
1198
|
+
tile._contentState = Cesium3DTileContentState.LOADING;
|
|
1199
|
+
++tileset.statistics.numberOfPendingRequests;
|
|
1200
|
+
|
|
1201
|
+
let arrayBuffer;
|
|
1202
|
+
try {
|
|
1203
|
+
arrayBuffer = await requestPromise;
|
|
1204
|
+
} catch (error) {
|
|
1205
|
+
--tileset.statistics.numberOfPendingRequests;
|
|
1206
|
+
if (tile.isDestroyed()) {
|
|
1207
|
+
// Tile is unloaded before the content can process
|
|
1208
|
+
return;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
if (request.cancelled || request.state === RequestState.CANCELLED) {
|
|
1212
|
+
// Cancelled due to low priority - try again later.
|
|
1213
|
+
tile._contentState = previousState;
|
|
1214
|
+
++tileset.statistics.numberOfAttemptedRequests;
|
|
1215
|
+
return;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
tile._contentState = Cesium3DTileContentState.FAILED;
|
|
1219
|
+
throw error;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
if (tile.isDestroyed()) {
|
|
1223
|
+
--tileset.statistics.numberOfPendingRequests;
|
|
1224
|
+
// Tile is unloaded before the content can process
|
|
1225
|
+
return;
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
if (request.cancelled || request.state === RequestState.CANCELLED) {
|
|
1229
|
+
// Cancelled due to low priority - try again later.
|
|
1230
|
+
tile._contentState = previousState;
|
|
1231
|
+
--tileset.statistics.numberOfPendingRequests;
|
|
1232
|
+
++tileset.statistics.numberOfAttemptedRequests;
|
|
1233
|
+
return;
|
|
1175
1234
|
}
|
|
1176
1235
|
|
|
1177
|
-
|
|
1236
|
+
try {
|
|
1237
|
+
const content = await makeContent(tile, arrayBuffer);
|
|
1238
|
+
--tileset.statistics.numberOfPendingRequests;
|
|
1239
|
+
|
|
1240
|
+
if (tile.isDestroyed()) {
|
|
1241
|
+
// Tile is unloaded before the content can process
|
|
1242
|
+
return;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
if (expired) {
|
|
1246
|
+
tile.expireDate = undefined;
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
tile._content = content;
|
|
1250
|
+
tile._contentState = Cesium3DTileContentState.PROCESSING;
|
|
1251
|
+
|
|
1252
|
+
return content;
|
|
1253
|
+
} catch (error) {
|
|
1254
|
+
--tileset.statistics.numberOfPendingRequests;
|
|
1255
|
+
if (tile.isDestroyed()) {
|
|
1256
|
+
// Tile is unloaded before the content can process
|
|
1257
|
+
return;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
tile._contentState = Cesium3DTileContentState.FAILED;
|
|
1261
|
+
throw error;
|
|
1262
|
+
}
|
|
1178
1263
|
}
|
|
1179
1264
|
|
|
1265
|
+
/**
|
|
1266
|
+
* @private
|
|
1267
|
+
* @param {Cesium3DTile} tile
|
|
1268
|
+
* @returns {Promise<Cesium3DTileContent>|Promise<undefined>|undefined} A promise that resolves to the tile content once loaded; a promise that resolves to undefined if the tile was destroyed before processing can happen or the request was cancelled mid-flight; or undefined if the request cannot be scheduled this frame.
|
|
1269
|
+
*/
|
|
1180
1270
|
function requestSingleContent(tile) {
|
|
1181
1271
|
// it is important to clone here. The fetchArrayBuffer() below uses
|
|
1182
1272
|
// throttling, but other uses of the resources do not.
|
|
@@ -1199,85 +1289,14 @@ function requestSingleContent(tile) {
|
|
|
1199
1289
|
|
|
1200
1290
|
tile._request = request;
|
|
1201
1291
|
resource.request = request;
|
|
1202
|
-
|
|
1292
|
+
const tileset = tile._tileset;
|
|
1203
1293
|
const promise = resource.fetchArrayBuffer();
|
|
1204
1294
|
if (!defined(promise)) {
|
|
1205
|
-
|
|
1295
|
+
++tileset.statistics.numberOfAttemptedRequests;
|
|
1296
|
+
return;
|
|
1206
1297
|
}
|
|
1207
1298
|
|
|
1208
|
-
|
|
1209
|
-
const tileset = tile._tileset;
|
|
1210
|
-
tile._contentState = Cesium3DTileContentState.LOADING;
|
|
1211
|
-
++tileset.statistics.numberOfPendingRequests;
|
|
1212
|
-
const contentReadyToProcessPromise = promise.then(function (arrayBuffer) {
|
|
1213
|
-
if (tile.isDestroyed()) {
|
|
1214
|
-
// Tile is unloaded before the content finishes loading
|
|
1215
|
-
singleContentFailed(tile, tileset);
|
|
1216
|
-
return;
|
|
1217
|
-
}
|
|
1218
|
-
|
|
1219
|
-
const content = makeContent(tile, arrayBuffer);
|
|
1220
|
-
|
|
1221
|
-
if (expired) {
|
|
1222
|
-
tile.expireDate = undefined;
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
tile._content = content;
|
|
1226
|
-
tile._contentState = Cesium3DTileContentState.PROCESSING;
|
|
1227
|
-
return content;
|
|
1228
|
-
});
|
|
1229
|
-
tile._contentReadyToProcessPromise = contentReadyToProcessPromise;
|
|
1230
|
-
tile._contentReadyPromise = contentReadyToProcessPromise
|
|
1231
|
-
.then(function (content) {
|
|
1232
|
-
if (!defined(content)) {
|
|
1233
|
-
return;
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
--tileset.statistics.numberOfPendingRequests;
|
|
1237
|
-
return content.readyPromise;
|
|
1238
|
-
})
|
|
1239
|
-
.then(function (content) {
|
|
1240
|
-
if (!defined(content)) {
|
|
1241
|
-
return;
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
if (tile.isDestroyed()) {
|
|
1245
|
-
// Tile is unloaded before the content finishes processing
|
|
1246
|
-
singleContentFailed(tile, tileset);
|
|
1247
|
-
return;
|
|
1248
|
-
}
|
|
1249
|
-
updateExpireDate(tile);
|
|
1250
|
-
|
|
1251
|
-
// Refresh style for expired content
|
|
1252
|
-
tile._selectedFrame = 0;
|
|
1253
|
-
tile.lastStyleTime = 0.0;
|
|
1254
|
-
|
|
1255
|
-
JulianDate.now(tile._loadTimestamp);
|
|
1256
|
-
tile._contentState = Cesium3DTileContentState.READY;
|
|
1257
|
-
return content;
|
|
1258
|
-
})
|
|
1259
|
-
.catch(function (error) {
|
|
1260
|
-
if (request.state === RequestState.CANCELLED) {
|
|
1261
|
-
// Cancelled due to low priority - try again later.
|
|
1262
|
-
tile._contentState = previousState;
|
|
1263
|
-
--tileset.statistics.numberOfPendingRequests;
|
|
1264
|
-
++tileset.statistics.numberOfAttemptedRequests;
|
|
1265
|
-
return Promise.reject("Cancelled");
|
|
1266
|
-
}
|
|
1267
|
-
singleContentFailed(tile, tileset);
|
|
1268
|
-
return Promise.reject(error);
|
|
1269
|
-
});
|
|
1270
|
-
|
|
1271
|
-
return 0;
|
|
1272
|
-
}
|
|
1273
|
-
|
|
1274
|
-
function singleContentFailed(tile, tileset) {
|
|
1275
|
-
if (tile._contentState === Cesium3DTileContentState.PROCESSING) {
|
|
1276
|
-
--tileset.statistics.numberOfTilesProcessing;
|
|
1277
|
-
} else {
|
|
1278
|
-
--tileset.statistics.numberOfPendingRequests;
|
|
1279
|
-
}
|
|
1280
|
-
tile._contentState = Cesium3DTileContentState.FAILED;
|
|
1299
|
+
return processArrayBuffer(tile, tileset, request, expired, promise);
|
|
1281
1300
|
}
|
|
1282
1301
|
|
|
1283
1302
|
/**
|
|
@@ -1288,10 +1307,10 @@ function singleContentFailed(tile, tileset) {
|
|
|
1288
1307
|
*
|
|
1289
1308
|
* @param {Cesium3DTile} tile The tile
|
|
1290
1309
|
* @param {ArrayBuffer} arrayBuffer The downloaded payload containing data for the content
|
|
1291
|
-
* @return {Cesium3DTileContent} A content object
|
|
1310
|
+
* @return {Promise<Cesium3DTileContent>} A content object
|
|
1292
1311
|
* @private
|
|
1293
1312
|
*/
|
|
1294
|
-
function makeContent(tile, arrayBuffer) {
|
|
1313
|
+
async function makeContent(tile, arrayBuffer) {
|
|
1295
1314
|
const preprocessed = preprocess3DTileContent(arrayBuffer);
|
|
1296
1315
|
|
|
1297
1316
|
// Vector and Geometry tile rendering do not support the skip LOD optimization.
|
|
@@ -1314,21 +1333,29 @@ function makeContent(tile, arrayBuffer) {
|
|
|
1314
1333
|
|
|
1315
1334
|
let content;
|
|
1316
1335
|
const contentFactory = Cesium3DTileContentFactory[preprocessed.contentType];
|
|
1336
|
+
if (tile.isDestroyed()) {
|
|
1337
|
+
return;
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1317
1340
|
if (defined(preprocessed.binaryPayload)) {
|
|
1318
|
-
content =
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1341
|
+
content = await Promise.resolve(
|
|
1342
|
+
contentFactory(
|
|
1343
|
+
tileset,
|
|
1344
|
+
tile,
|
|
1345
|
+
tile._contentResource,
|
|
1346
|
+
preprocessed.binaryPayload.buffer,
|
|
1347
|
+
0
|
|
1348
|
+
)
|
|
1324
1349
|
);
|
|
1325
1350
|
} else {
|
|
1326
1351
|
// JSON formats
|
|
1327
|
-
content =
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1352
|
+
content = await Promise.resolve(
|
|
1353
|
+
contentFactory(
|
|
1354
|
+
tileset,
|
|
1355
|
+
tile,
|
|
1356
|
+
tile._contentResource,
|
|
1357
|
+
preprocessed.jsonPayload
|
|
1358
|
+
)
|
|
1332
1359
|
);
|
|
1333
1360
|
}
|
|
1334
1361
|
|
|
@@ -1372,18 +1399,12 @@ Cesium3DTile.prototype.cancelRequests = function () {
|
|
|
1372
1399
|
* @private
|
|
1373
1400
|
*/
|
|
1374
1401
|
Cesium3DTile.prototype.unloadContent = function () {
|
|
1375
|
-
if (
|
|
1376
|
-
this.hasEmptyContent ||
|
|
1377
|
-
this.hasTilesetContent ||
|
|
1378
|
-
this.hasImplicitContent
|
|
1379
|
-
) {
|
|
1402
|
+
if (!this.hasRenderableContent) {
|
|
1380
1403
|
return;
|
|
1381
1404
|
}
|
|
1382
1405
|
|
|
1383
1406
|
this._content = this._content && this._content.destroy();
|
|
1384
1407
|
this._contentState = Cesium3DTileContentState.UNLOADED;
|
|
1385
|
-
this._contentReadyToProcessPromise = undefined;
|
|
1386
|
-
this._contentReadyPromise = undefined;
|
|
1387
1408
|
|
|
1388
1409
|
this.lastStyleTime = 0.0;
|
|
1389
1410
|
this.clippingPlanesDirty = this._clippingPlanesState === 0;
|
|
@@ -1402,6 +1423,12 @@ Cesium3DTile.prototype.unloadContent = function () {
|
|
|
1402
1423
|
|
|
1403
1424
|
const scratchProjectedBoundingSphere = new BoundingSphere();
|
|
1404
1425
|
|
|
1426
|
+
/**
|
|
1427
|
+
* @private
|
|
1428
|
+
* @param {Cesium3DTile} tile
|
|
1429
|
+
* @param {FrameState} frameState
|
|
1430
|
+
* @returns {TileBoundingVolume}
|
|
1431
|
+
*/
|
|
1405
1432
|
function getBoundingVolume(tile, frameState) {
|
|
1406
1433
|
if (
|
|
1407
1434
|
frameState.mode !== SceneMode.SCENE3D &&
|
|
@@ -1424,6 +1451,12 @@ function getBoundingVolume(tile, frameState) {
|
|
|
1424
1451
|
: tile._boundingVolume;
|
|
1425
1452
|
}
|
|
1426
1453
|
|
|
1454
|
+
/**
|
|
1455
|
+
* @private
|
|
1456
|
+
* @param {Cesium3DTile} tile
|
|
1457
|
+
* @param {FrameState} frameState
|
|
1458
|
+
* @returns {TileBoundingVolume}
|
|
1459
|
+
*/
|
|
1427
1460
|
function getContentBoundingVolume(tile, frameState) {
|
|
1428
1461
|
if (
|
|
1429
1462
|
frameState.mode !== SceneMode.SCENE3D &&
|
|
@@ -1581,6 +1614,13 @@ const scratchRectangle = new Rectangle();
|
|
|
1581
1614
|
const scratchOrientedBoundingBox = new OrientedBoundingBox();
|
|
1582
1615
|
const scratchTransform = new Matrix4();
|
|
1583
1616
|
|
|
1617
|
+
/**
|
|
1618
|
+
* @private
|
|
1619
|
+
* @param {Array} box An array of 12 numbers that define an oriented bounding box
|
|
1620
|
+
* @param {Matrix4} transform
|
|
1621
|
+
* @param {TileBoundingVolume} [result]
|
|
1622
|
+
* @returns {TileOrientedBoundingBox}
|
|
1623
|
+
*/
|
|
1584
1624
|
function createBox(box, transform, result) {
|
|
1585
1625
|
let center = Cartesian3.fromElements(box[0], box[1], box[2], scratchCenter);
|
|
1586
1626
|
let halfAxes = Matrix3.fromArray(box, 3, scratchHalfAxes);
|
|
@@ -1597,6 +1637,14 @@ function createBox(box, transform, result) {
|
|
|
1597
1637
|
return new TileOrientedBoundingBox(center, halfAxes);
|
|
1598
1638
|
}
|
|
1599
1639
|
|
|
1640
|
+
/**
|
|
1641
|
+
* @private
|
|
1642
|
+
* @param {Array} region An array of six numbers that define a bounding geographic region in EPSG:4979 coordinates with the order [west, south, east, north, minimum height, maximum height]
|
|
1643
|
+
* @param {Matrix4} transform
|
|
1644
|
+
* @param {Matrix4} initialTransform
|
|
1645
|
+
* @param {TileOrientedBoundingBox} [result]
|
|
1646
|
+
* @returns {TileOrientedBoundingBox}
|
|
1647
|
+
*/
|
|
1600
1648
|
function createBoxFromTransformedRegion(
|
|
1601
1649
|
region,
|
|
1602
1650
|
transform,
|
|
@@ -1637,6 +1685,14 @@ function createBoxFromTransformedRegion(
|
|
|
1637
1685
|
return new TileOrientedBoundingBox(center, halfAxes);
|
|
1638
1686
|
}
|
|
1639
1687
|
|
|
1688
|
+
/**
|
|
1689
|
+
* @private
|
|
1690
|
+
* @param {Array} region An array of six numbers that define a bounding geographic region in EPSG:4979 coordinates with the order [west, south, east, north, minimum height, maximum height]
|
|
1691
|
+
* @param {Matrix4} transform
|
|
1692
|
+
* @param {Matrix4} initialTransform
|
|
1693
|
+
* @param {TileBoundingVolume} [result]
|
|
1694
|
+
* @returns {TileBoundingVolume}
|
|
1695
|
+
*/
|
|
1640
1696
|
function createRegion(region, transform, initialTransform, result) {
|
|
1641
1697
|
if (
|
|
1642
1698
|
!Matrix4.equalsEpsilon(transform, initialTransform, CesiumMath.EPSILON8)
|
|
@@ -1662,6 +1718,13 @@ function createRegion(region, transform, initialTransform, result) {
|
|
|
1662
1718
|
});
|
|
1663
1719
|
}
|
|
1664
1720
|
|
|
1721
|
+
/**
|
|
1722
|
+
* @private
|
|
1723
|
+
* @param {Array} sphere An array of four numbers that define a bounding sphere
|
|
1724
|
+
* @param {Matrix4} transform
|
|
1725
|
+
* @param {TileBoundingVolume} [result]
|
|
1726
|
+
* @returns {TileBoundingSphere}
|
|
1727
|
+
*/
|
|
1665
1728
|
function createSphere(sphere, transform, result) {
|
|
1666
1729
|
let center = Cartesian3.fromElements(
|
|
1667
1730
|
sphere[0],
|
|
@@ -1710,19 +1773,15 @@ Cesium3DTile.prototype.createBoundingVolume = function (
|
|
|
1710
1773
|
);
|
|
1711
1774
|
}
|
|
1712
1775
|
|
|
1713
|
-
|
|
1714
|
-
|
|
1776
|
+
const { box, region, sphere } = boundingVolumeHeader;
|
|
1777
|
+
if (defined(box)) {
|
|
1778
|
+
return createBox(box, transform, result);
|
|
1715
1779
|
}
|
|
1716
|
-
if (defined(
|
|
1717
|
-
return createRegion(
|
|
1718
|
-
boundingVolumeHeader.region,
|
|
1719
|
-
transform,
|
|
1720
|
-
this._initialTransform,
|
|
1721
|
-
result
|
|
1722
|
-
);
|
|
1780
|
+
if (defined(region)) {
|
|
1781
|
+
return createRegion(region, transform, this._initialTransform, result);
|
|
1723
1782
|
}
|
|
1724
|
-
if (defined(
|
|
1725
|
-
return createSphere(
|
|
1783
|
+
if (defined(sphere)) {
|
|
1784
|
+
return createSphere(sphere, transform, result);
|
|
1726
1785
|
}
|
|
1727
1786
|
throw new RuntimeError(
|
|
1728
1787
|
"boundingVolume must contain a sphere, region, or box"
|
|
@@ -1733,6 +1792,7 @@ Cesium3DTile.prototype.createBoundingVolume = function (
|
|
|
1733
1792
|
* Update the tile's transform. The transform is applied to the tile's bounding volumes.
|
|
1734
1793
|
*
|
|
1735
1794
|
* @private
|
|
1795
|
+
* @param {Matrix4} parentTransform
|
|
1736
1796
|
*/
|
|
1737
1797
|
Cesium3DTile.prototype.updateTransform = function (parentTransform) {
|
|
1738
1798
|
parentTransform = defaultValue(parentTransform, Matrix4.IDENTITY);
|
|
@@ -1799,6 +1859,13 @@ Cesium3DTile.prototype.updateGeometricErrorScale = function () {
|
|
|
1799
1859
|
}
|
|
1800
1860
|
};
|
|
1801
1861
|
|
|
1862
|
+
/**
|
|
1863
|
+
* @private
|
|
1864
|
+
* @param {Cesium3DTile} tile
|
|
1865
|
+
* @param {Cesium3DTileset} tileset
|
|
1866
|
+
* @param {FrameState} frameState
|
|
1867
|
+
* @param {object} passOptions
|
|
1868
|
+
*/
|
|
1802
1869
|
function applyDebugSettings(tile, tileset, frameState, passOptions) {
|
|
1803
1870
|
if (!passOptions.isRender) {
|
|
1804
1871
|
return;
|
|
@@ -1806,8 +1873,6 @@ function applyDebugSettings(tile, tileset, frameState, passOptions) {
|
|
|
1806
1873
|
|
|
1807
1874
|
const hasContentBoundingVolume =
|
|
1808
1875
|
defined(tile._contentHeader) && defined(tile._contentHeader.boundingVolume);
|
|
1809
|
-
const empty =
|
|
1810
|
-
tile.hasEmptyContent || tile.hasTilesetContent || tile.hasImplicitContent;
|
|
1811
1876
|
|
|
1812
1877
|
const showVolume =
|
|
1813
1878
|
tileset.debugShowBoundingVolume ||
|
|
@@ -1816,7 +1881,7 @@ function applyDebugSettings(tile, tileset, frameState, passOptions) {
|
|
|
1816
1881
|
let color;
|
|
1817
1882
|
if (!tile._finalResolution) {
|
|
1818
1883
|
color = Color.YELLOW;
|
|
1819
|
-
} else if (
|
|
1884
|
+
} else if (!tile.hasRenderableContent) {
|
|
1820
1885
|
color = Color.DARKGRAY;
|
|
1821
1886
|
} else {
|
|
1822
1887
|
color = Color.WHITE;
|
|
@@ -1892,15 +1957,24 @@ function applyDebugSettings(tile, tileset, frameState, passOptions) {
|
|
|
1892
1957
|
}
|
|
1893
1958
|
}
|
|
1894
1959
|
|
|
1960
|
+
/**
|
|
1961
|
+
* @private
|
|
1962
|
+
* @param {Cesium3DTile} tile
|
|
1963
|
+
* @param {Cesium3DTileset} tileset
|
|
1964
|
+
* @param {FrameState} frameState
|
|
1965
|
+
*/
|
|
1895
1966
|
function updateContent(tile, tileset, frameState) {
|
|
1896
|
-
const content = tile._content;
|
|
1897
1967
|
const expiredContent = tile._expiredContent;
|
|
1898
1968
|
|
|
1899
1969
|
// expired content is not supported for multiple contents
|
|
1900
1970
|
if (!tile.hasMultipleContents && defined(expiredContent)) {
|
|
1901
1971
|
if (!tile.contentReady) {
|
|
1902
1972
|
// Render the expired content while the content loads
|
|
1903
|
-
|
|
1973
|
+
try {
|
|
1974
|
+
expiredContent.update(tileset, frameState);
|
|
1975
|
+
} catch (error) {
|
|
1976
|
+
// Eat error for expired content
|
|
1977
|
+
}
|
|
1904
1978
|
return;
|
|
1905
1979
|
}
|
|
1906
1980
|
|
|
@@ -1909,14 +1983,30 @@ function updateContent(tile, tileset, frameState) {
|
|
|
1909
1983
|
tile._expiredContent = undefined;
|
|
1910
1984
|
}
|
|
1911
1985
|
|
|
1912
|
-
content
|
|
1986
|
+
if (!defined(tile.content)) {
|
|
1987
|
+
// Implicit placeholder tile
|
|
1988
|
+
return;
|
|
1989
|
+
}
|
|
1990
|
+
|
|
1991
|
+
try {
|
|
1992
|
+
tile.content.update(tileset, frameState);
|
|
1993
|
+
} catch (error) {
|
|
1994
|
+
tile._contentState = Cesium3DTileContentState.FAILED;
|
|
1995
|
+
throw error;
|
|
1996
|
+
}
|
|
1913
1997
|
}
|
|
1914
1998
|
|
|
1999
|
+
/**
|
|
2000
|
+
* Compute and compare ClippingPlanes state:
|
|
2001
|
+
* - enabled-ness - are clipping planes enabled? is this tile clipped?
|
|
2002
|
+
* - clipping plane count
|
|
2003
|
+
* - clipping function (union v. intersection)
|
|
2004
|
+
|
|
2005
|
+
* @private
|
|
2006
|
+
* @param {Cesium3DTile} tile
|
|
2007
|
+
* @param {Cesium3DTileset} tileset
|
|
2008
|
+
*/
|
|
1915
2009
|
function updateClippingPlanes(tile, tileset) {
|
|
1916
|
-
// Compute and compare ClippingPlanes state:
|
|
1917
|
-
// - enabled-ness - are clipping planes enabled? is this tile clipped?
|
|
1918
|
-
// - clipping plane count
|
|
1919
|
-
// - clipping function (union v. intersection)
|
|
1920
2010
|
const clippingPlanes = tileset.clippingPlanes;
|
|
1921
2011
|
let currentClippingPlanesState = 0;
|
|
1922
2012
|
if (defined(clippingPlanes) && tile._isClipped && clippingPlanes.enabled) {
|
|
@@ -1933,20 +2023,23 @@ function updateClippingPlanes(tile, tileset) {
|
|
|
1933
2023
|
* Get the draw commands needed to render this tile.
|
|
1934
2024
|
*
|
|
1935
2025
|
* @private
|
|
2026
|
+
* @param {Cesium3DTileset} tileset
|
|
2027
|
+
* @param {FrameState} frameState
|
|
2028
|
+
* @param {object} passOptions
|
|
1936
2029
|
*/
|
|
1937
2030
|
Cesium3DTile.prototype.update = function (tileset, frameState, passOptions) {
|
|
1938
|
-
const
|
|
2031
|
+
const { commandList } = frameState;
|
|
2032
|
+
const commandStart = commandList.length;
|
|
1939
2033
|
|
|
1940
2034
|
updateClippingPlanes(this, tileset);
|
|
1941
2035
|
applyDebugSettings(this, tileset, frameState, passOptions);
|
|
1942
2036
|
updateContent(this, tileset, frameState);
|
|
1943
2037
|
|
|
1944
|
-
const commandEnd =
|
|
1945
|
-
|
|
1946
|
-
this._commandsLength = commandsLength;
|
|
2038
|
+
const commandEnd = commandList.length;
|
|
2039
|
+
this._commandsLength = commandEnd - commandStart;
|
|
1947
2040
|
|
|
1948
|
-
for (let i =
|
|
1949
|
-
const command =
|
|
2041
|
+
for (let i = commandStart; i < commandEnd; ++i) {
|
|
2042
|
+
const command = commandList[i];
|
|
1950
2043
|
const translucent = command.pass === Pass.TRANSLUCENT;
|
|
1951
2044
|
command.depthForTranslucentClassification = translucent;
|
|
1952
2045
|
}
|
|
@@ -1965,26 +2058,68 @@ const scratchCommandList = [];
|
|
|
1965
2058
|
* @private
|
|
1966
2059
|
*/
|
|
1967
2060
|
Cesium3DTile.prototype.process = function (tileset, frameState) {
|
|
2061
|
+
if (!this.contentExpired && !this.contentReady && this._content.ready) {
|
|
2062
|
+
updateExpireDate(this);
|
|
2063
|
+
|
|
2064
|
+
// Refresh style for expired content
|
|
2065
|
+
this._selectedFrame = 0;
|
|
2066
|
+
this.lastStyleTime = 0.0;
|
|
2067
|
+
|
|
2068
|
+
JulianDate.now(this._loadTimestamp);
|
|
2069
|
+
this._contentState = Cesium3DTileContentState.READY;
|
|
2070
|
+
|
|
2071
|
+
if (!this.hasTilesetContent && !this.hasImplicitContent) {
|
|
2072
|
+
// RESEARCH_IDEA: ability to unload tiles (without content) for an
|
|
2073
|
+
// external tileset when all the tiles are unloaded.
|
|
2074
|
+
tileset._statistics.incrementLoadCounts(this.content);
|
|
2075
|
+
++tileset._statistics.numberOfTilesWithContentReady;
|
|
2076
|
+
++tileset._statistics.numberOfLoadedTilesTotal;
|
|
2077
|
+
|
|
2078
|
+
// Add to the tile cache. Previously expired tiles are already in the cache and won't get re-added.
|
|
2079
|
+
tileset._cache.add(this);
|
|
2080
|
+
}
|
|
2081
|
+
}
|
|
2082
|
+
|
|
1968
2083
|
const savedCommandList = frameState.commandList;
|
|
1969
2084
|
frameState.commandList = scratchCommandList;
|
|
1970
2085
|
|
|
1971
|
-
|
|
2086
|
+
try {
|
|
2087
|
+
this._content.update(tileset, frameState);
|
|
2088
|
+
} catch (error) {
|
|
2089
|
+
this._contentState = Cesium3DTileContentState.FAILED;
|
|
2090
|
+
throw error;
|
|
2091
|
+
}
|
|
1972
2092
|
|
|
1973
2093
|
scratchCommandList.length = 0;
|
|
1974
2094
|
frameState.commandList = savedCommandList;
|
|
1975
2095
|
};
|
|
1976
2096
|
|
|
2097
|
+
/**
|
|
2098
|
+
* @private
|
|
2099
|
+
* @param {number} normalizedValue
|
|
2100
|
+
* @param {number} numberOfDigits
|
|
2101
|
+
* @param {number} leftShift
|
|
2102
|
+
* @returns {number}
|
|
2103
|
+
*/
|
|
1977
2104
|
function isolateDigits(normalizedValue, numberOfDigits, leftShift) {
|
|
1978
2105
|
const scaled = normalizedValue * Math.pow(10, numberOfDigits);
|
|
1979
2106
|
const integer = parseInt(scaled);
|
|
1980
2107
|
return integer * Math.pow(10, leftShift);
|
|
1981
2108
|
}
|
|
1982
2109
|
|
|
2110
|
+
/**
|
|
2111
|
+
* @private
|
|
2112
|
+
* @param {number} value
|
|
2113
|
+
* @param {number} minimum
|
|
2114
|
+
* @param {number} maximum
|
|
2115
|
+
* @returns {number}
|
|
2116
|
+
*/
|
|
1983
2117
|
function priorityNormalizeAndClamp(value, minimum, maximum) {
|
|
2118
|
+
// Subtract epsilon since we only want decimal digits present in the output.
|
|
1984
2119
|
return Math.max(
|
|
1985
2120
|
CesiumMath.normalize(value, minimum, maximum) - CesiumMath.EPSILON7,
|
|
1986
2121
|
0.0
|
|
1987
|
-
);
|
|
2122
|
+
);
|
|
1988
2123
|
}
|
|
1989
2124
|
|
|
1990
2125
|
/**
|
|
@@ -2044,7 +2179,8 @@ Cesium3DTile.prototype.updatePriority = function () {
|
|
|
2044
2179
|
|
|
2045
2180
|
// Map 0-1 then convert to digit. Include a distance sort when doing non-skipLOD and replacement refinement, helps things like non-skipLOD photogrammetry
|
|
2046
2181
|
const useDistance =
|
|
2047
|
-
!tileset.
|
|
2182
|
+
!tileset.isSkippingLevelOfDetail &&
|
|
2183
|
+
this.refine === Cesium3DTileRefine.REPLACE;
|
|
2048
2184
|
const normalizedPreferredSorting = useDistance
|
|
2049
2185
|
? priorityNormalizeAndClamp(
|
|
2050
2186
|
this._priorityHolder._distanceToCamera,
|
|
@@ -2118,4 +2254,5 @@ Cesium3DTile.prototype.destroy = function () {
|
|
|
2118
2254
|
this._debugViewerRequestVolume && this._debugViewerRequestVolume.destroy();
|
|
2119
2255
|
return destroyObject(this);
|
|
2120
2256
|
};
|
|
2257
|
+
|
|
2121
2258
|
export default Cesium3DTile;
|