@cesium/engine 7.0.0 → 9.0.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/ThirdParty/Workers/z-worker-pako.js +1 -5
- package/Build/Workers/{chunk-7XEAYGZK.js → chunk-24YTYWNB.js} +10 -10
- package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2632RVPI.js} +7 -7
- package/Build/Workers/chunk-2KACWKS4.js +501 -0
- package/Build/Workers/{chunk-QZAD5O7I.js → chunk-2XPLH3JY.js} +7 -7
- package/Build/Workers/{chunk-JY5YEZFA.js → chunk-2ZBL3MVO.js} +8 -8
- package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-3NCVAGDA.js} +14 -14
- package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-5R6VWLMH.js} +6 -6
- package/Build/Workers/{chunk-PTQQUQC3.js → chunk-5TIV3L26.js} +13 -13
- package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-6WF3KIF5.js} +10 -10
- package/Build/Workers/{chunk-5WQ523AW.js → chunk-73FKKY52.js} +5 -5
- package/Build/Workers/{chunk-F6SE42BK.js → chunk-7COR472O.js} +15 -472
- package/Build/Workers/{chunk-72SANQJV.js → chunk-ADOVHYWO.js} +9 -5
- package/Build/Workers/{chunk-5YLJ77FF.js → chunk-BCU2LH5T.js} +12 -11
- package/Build/Workers/{chunk-4EBHOMFX.js → chunk-C3XBUYBO.js} +17 -17
- package/Build/Workers/{chunk-IX2JCCNM.js → chunk-C6OI26DR.js} +1 -1
- package/Build/Workers/{chunk-2HJWSU7B.js → chunk-CO35JNNE.js} +4 -4
- package/Build/Workers/{chunk-OVLG3FRS.js → chunk-DGDUKCJJ.js} +6 -6
- package/Build/Workers/{chunk-DTAIXKTO.js → chunk-DPUSFA7S.js} +6 -6
- package/Build/Workers/{chunk-R5X4OQT4.js → chunk-E6WXPSJS.js} +7 -7
- package/Build/Workers/{chunk-VK3EJHWI.js → chunk-EOXYZ34O.js} +2 -2
- package/Build/Workers/{chunk-RAEV7K66.js → chunk-EPKE7GE3.js} +5 -5
- package/Build/Workers/{chunk-GV56Q4LU.js → chunk-GFA4SMXV.js} +11 -11
- package/Build/Workers/{chunk-NKPBIX7F.js → chunk-GXUXEOE2.js} +1 -1
- package/Build/Workers/{chunk-NY3K4IM3.js → chunk-HBQPB6IH.js} +12 -12
- package/Build/Workers/{chunk-6HZQPRUS.js → chunk-I37B3MZ2.js} +1 -1
- package/Build/Workers/{chunk-VRGFV2UO.js → chunk-L4BW3RUA.js} +10 -10
- package/Build/Workers/{chunk-6VJVYK2V.js → chunk-LAQP3SCC.js} +2 -2
- package/Build/Workers/{chunk-PNBGBETF.js → chunk-LQJ5FFFR.js} +10 -10
- package/Build/Workers/{chunk-UAEW6HKG.js → chunk-M2AYBTNH.js} +13 -13
- package/Build/Workers/{chunk-YUCVWAY6.js → chunk-MWV7IZK4.js} +7 -7
- package/Build/Workers/{chunk-JXDC723O.js → chunk-N4KXMWQU.js} +2 -2
- package/Build/Workers/{chunk-XWXM2O2R.js → chunk-NP2GYYE5.js} +6 -6
- package/Build/Workers/{chunk-GEJTYLCO.js → chunk-NZWNZA6S.js} +5 -5
- package/Build/Workers/{chunk-LZGHD6NY.js → chunk-P2YAAMT2.js} +15 -15
- package/Build/Workers/{chunk-S6SKF6DT.js → chunk-P4XKB3QZ.js} +5 -5
- package/Build/Workers/{chunk-U2VCRRQW.js → chunk-PXB7T27O.js} +6 -6
- package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-QCQUZGXI.js} +4 -4
- package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-QKBGRKKG.js} +4 -4
- package/Build/Workers/{chunk-ODW7WYM4.js → chunk-RMOEYCZW.js} +2 -2
- package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-RSJXEO2A.js} +2 -2
- package/Build/Workers/{chunk-UDO6BFSF.js → chunk-RV7ZOSS6.js} +13 -13
- package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-SE4PXOEA.js} +17 -17
- package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-SS4ESNE3.js} +2 -2
- package/Build/Workers/{chunk-AIPU2VSX.js → chunk-TJBU6GML.js} +6 -6
- package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-TZORKRNK.js} +1 -1
- package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-VR5RBW52.js} +7 -7
- package/Build/Workers/{chunk-FP6GYBFX.js → chunk-WHUSTDIB.js} +10 -10
- package/Build/Workers/{chunk-5HDYHG3F.js → chunk-X2F6BEPY.js} +13 -13
- package/Build/Workers/{chunk-WZU2YLWG.js → chunk-X6XOMPWL.js} +3 -3
- package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YDVSBWEO.js} +1 -1
- package/Build/Workers/{chunk-46UD5ABS.js → chunk-YV4H2Y7M.js} +4 -4
- package/Build/Workers/{chunk-WBQCVXR3.js → chunk-Z7FQLK6N.js} +4 -4
- package/Build/Workers/{chunk-L2ZN645J.js → chunk-ZNVSKMQ2.js} +6 -6
- package/Build/Workers/{chunk-JCNXK6EL.js → chunk-ZYPTP7GS.js} +11 -11
- package/Build/Workers/combineGeometry.js +24 -23
- package/Build/Workers/createBoxGeometry.js +18 -17
- package/Build/Workers/createBoxOutlineGeometry.js +16 -15
- package/Build/Workers/createCircleGeometry.js +26 -25
- package/Build/Workers/createCircleOutlineGeometry.js +19 -18
- package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
- package/Build/Workers/createCorridorGeometry.js +29 -28
- package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
- package/Build/Workers/createCylinderGeometry.js +20 -19
- package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
- package/Build/Workers/createEllipseGeometry.js +26 -25
- package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
- package/Build/Workers/createEllipsoidGeometry.js +19 -18
- package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
- package/Build/Workers/createFrustumGeometry.js +18 -17
- package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
- package/Build/Workers/createGeometry.js +54 -33
- package/Build/Workers/createGroundPolylineGeometry.js +22 -21
- package/Build/Workers/createPlaneGeometry.js +16 -15
- package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
- package/Build/Workers/createPolygonGeometry.js +33 -32
- package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
- package/Build/Workers/createPolylineGeometry.js +25 -24
- package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
- package/Build/Workers/createRectangleGeometry.js +27 -26
- package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
- package/Build/Workers/createSimplePolylineGeometry.js +23 -22
- package/Build/Workers/createSphereGeometry.js +19 -18
- package/Build/Workers/createSphereOutlineGeometry.js +18 -17
- package/Build/Workers/createTaskProcessorWorker.js +3 -3
- package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
- package/Build/Workers/createVectorTileGeometries.js +24 -23
- package/Build/Workers/createVectorTilePoints.js +12 -12
- package/Build/Workers/createVectorTilePolygons.js +22 -21
- package/Build/Workers/createVectorTilePolylines.js +14 -14
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
- package/Build/Workers/createVerticesFromHeightmap.js +22 -21
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
- package/Build/Workers/createWallGeometry.js +24 -23
- package/Build/Workers/createWallOutlineGeometry.js +23 -22
- package/Build/Workers/decodeDraco.js +11 -11
- package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
- package/Build/Workers/decodeI3S.js +601 -92
- package/Build/Workers/transcodeKTX2.js +7 -7
- package/Build/Workers/transferTypedArrayTest.js +1 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
- package/Source/Core/Check.d.ts +127 -0
- package/Source/Core/Check.js +0 -1
- package/Source/Core/Ellipsoid.js +6 -0
- package/Source/Core/Geometry.js +1 -1
- package/Source/Core/IntersectionTests.js +6 -3
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/PixelFormat.js +5 -0
- package/Source/Core/PolygonGeometry.js +1 -1
- package/Source/Core/Transforms.js +3 -0
- package/Source/Core/VerticalExaggeration.js +2 -1
- package/Source/Core/srgbToLinear.js +32 -0
- package/Source/DataSources/CzmlDataSource.js +51 -23
- package/Source/DataSources/DataSourceDisplay.js +27 -0
- package/Source/DataSources/Entity.js +20 -2
- package/Source/DataSources/GeometryUpdaterSet.js +114 -0
- package/Source/DataSources/GeometryVisualizer.js +19 -83
- package/Source/Renderer/Context.js +10 -0
- package/Source/Renderer/ContextLimits.js +2 -0
- package/Source/Renderer/demodernizeShader.js +4 -1
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/Axis.js +12 -7
- package/Source/Scene/Billboard.js +32 -0
- package/Source/Scene/BillboardCollection.js +1 -1
- package/Source/Scene/BingMapsImageryProvider.js +4 -0
- package/Source/Scene/Camera.js +46 -4
- package/Source/Scene/Cesium3DTilesVoxelProvider.js +2 -9
- package/Source/Scene/Cesium3DTileset.js +10 -7
- package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
- package/Source/Scene/FrameState.js +5 -0
- package/Source/Scene/Globe.js +0 -67
- package/Source/Scene/GlobeTranslucencyState.js +1 -1
- package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
- package/Source/Scene/I3SDataProvider.js +270 -53
- package/Source/Scene/I3SDecoder.js +8 -1
- package/Source/Scene/I3SFeature.js +2 -5
- package/Source/Scene/I3SField.js +136 -31
- package/Source/Scene/I3SGeometry.js +70 -2
- package/Source/Scene/I3SLayer.js +55 -10
- package/Source/Scene/I3SNode.js +175 -18
- package/Source/Scene/I3SStatistics.js +94 -0
- package/Source/Scene/I3SSublayer.js +176 -0
- package/Source/Scene/I3SSymbology.js +337 -0
- package/Source/Scene/KeyframeNode.js +1 -1
- package/Source/Scene/Label.js +33 -0
- package/Source/Scene/LabelCollection.js +2 -1
- package/Source/Scene/Model/pickModel.js +25 -7
- package/Source/Scene/PickFramebuffer.js +37 -2
- package/Source/Scene/Picking.js +113 -39
- package/Source/Scene/Primitive.js +6 -5
- package/Source/Scene/Scene.js +126 -42
- package/Source/Scene/ScreenSpaceCameraController.js +21 -7
- package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
- package/Source/Scene/SpatialNode.js +12 -19
- package/Source/Scene/StructuralMetadata.js +1 -1
- package/Source/Scene/VoxelBoxShape.js +67 -6
- package/Source/Scene/VoxelCell.js +273 -0
- package/Source/Scene/VoxelCylinderShape.js +117 -163
- package/Source/Scene/VoxelEllipsoidShape.js +255 -304
- package/Source/Scene/VoxelPrimitive.js +109 -15
- package/Source/Scene/VoxelRenderResources.js +12 -3
- package/Source/Scene/VoxelShape.js +7 -4
- package/Source/Scene/VoxelTraversal.js +76 -54
- package/Source/Scene/buildVoxelDrawCommands.js +23 -0
- package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
- package/Source/Scene/processVoxelProperties.js +3 -0
- package/Source/Shaders/Voxels/IntersectBox.glsl +21 -47
- package/Source/Shaders/Voxels/IntersectBox.js +21 -47
- package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +1 -1
- package/Source/Shaders/Voxels/IntersectClippingPlanes.js +1 -1
- package/Source/Shaders/Voxels/IntersectCylinder.glsl +76 -203
- package/Source/Shaders/Voxels/IntersectCylinder.js +76 -203
- package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +220 -229
- package/Source/Shaders/Voxels/IntersectEllipsoid.js +220 -229
- package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
- package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
- package/Source/Shaders/Voxels/IntersectionUtils.glsl +33 -11
- package/Source/Shaders/Voxels/IntersectionUtils.js +33 -11
- package/Source/Shaders/Voxels/Megatexture.glsl +1 -2
- package/Source/Shaders/Voxels/Megatexture.js +1 -2
- package/Source/Shaders/Voxels/Octree.glsl +14 -9
- package/Source/Shaders/Voxels/Octree.js +14 -9
- package/Source/Shaders/Voxels/VoxelFS.glsl +128 -40
- package/Source/Shaders/Voxels/VoxelFS.js +128 -40
- package/Source/Shaders/Voxels/VoxelUtils.glsl +31 -0
- package/Source/Shaders/Voxels/VoxelUtils.js +33 -0
- package/Source/Shaders/Voxels/convertUvToBox.glsl +24 -3
- package/Source/Shaders/Voxels/convertUvToBox.js +24 -4
- package/Source/Shaders/Voxels/convertUvToCylinder.glsl +64 -40
- package/Source/Shaders/Voxels/convertUvToCylinder.js +64 -40
- package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +100 -91
- package/Source/Shaders/Voxels/convertUvToEllipsoid.js +100 -91
- package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
- package/Source/Workers/createGeometry.js +40 -11
- package/Source/Workers/decodeI3S.js +720 -94
- package/index.d.ts +542 -40
- package/index.js +75 -66
- package/package.json +2 -2
package/Source/Scene/Globe.js
CHANGED
|
@@ -28,7 +28,6 @@ import ImageryLayerCollection from "./ImageryLayerCollection.js";
|
|
|
28
28
|
import QuadtreePrimitive from "./QuadtreePrimitive.js";
|
|
29
29
|
import SceneMode from "./SceneMode.js";
|
|
30
30
|
import ShadowMode from "./ShadowMode.js";
|
|
31
|
-
import deprecationWarning from "../Core/deprecationWarning.js";
|
|
32
31
|
|
|
33
32
|
/**
|
|
34
33
|
* The globe rendered in the scene, including its terrain ({@link Globe#terrainProvider})
|
|
@@ -341,10 +340,6 @@ function Globe(ellipsoid) {
|
|
|
341
340
|
*/
|
|
342
341
|
this.atmosphereBrightnessShift = 0.0;
|
|
343
342
|
|
|
344
|
-
this._terrainExaggerationChanged = false;
|
|
345
|
-
this._terrainExaggeration = 1.0;
|
|
346
|
-
this._terrainExaggerationRelativeHeight = 0.0;
|
|
347
|
-
|
|
348
343
|
/**
|
|
349
344
|
* Whether to show terrain skirts. Terrain skirts are geometry extending downwards from a tile's edges used to hide seams between neighboring tiles.
|
|
350
345
|
* Skirts are always hidden when the camera is underground or translucency is enabled.
|
|
@@ -523,68 +518,6 @@ Object.defineProperties(Globe.prototype, {
|
|
|
523
518
|
return this._terrainProviderChanged;
|
|
524
519
|
},
|
|
525
520
|
},
|
|
526
|
-
/**
|
|
527
|
-
* A scalar used to exaggerate the terrain. Defaults to <code>1.0</code> (no exaggeration).
|
|
528
|
-
* A value of <code>2.0</code> scales the terrain by 2x.
|
|
529
|
-
* A value of <code>0.0</code> makes the terrain completely flat.
|
|
530
|
-
* Note that terrain exaggeration will not modify any other primitive as they are positioned relative to the ellipsoid.
|
|
531
|
-
*
|
|
532
|
-
* @memberof Globe.prototype
|
|
533
|
-
* @type {number}
|
|
534
|
-
* @default 1.0
|
|
535
|
-
*
|
|
536
|
-
* @deprecated
|
|
537
|
-
*/
|
|
538
|
-
terrainExaggeration: {
|
|
539
|
-
get: function () {
|
|
540
|
-
deprecationWarning(
|
|
541
|
-
"Globe.terrainExaggeration",
|
|
542
|
-
"Globe.terrainExaggeration was deprecated in CesiumJS 1.113. It will be removed in CesiumJS 1.116. Use Scene.verticalExaggeration instead."
|
|
543
|
-
);
|
|
544
|
-
return this._terrainExaggeration;
|
|
545
|
-
},
|
|
546
|
-
set: function (value) {
|
|
547
|
-
deprecationWarning(
|
|
548
|
-
"Globe.terrainExaggeration",
|
|
549
|
-
"Globe.terrainExaggeration was deprecated in CesiumJS 1.113. It will be removed in CesiumJS 1.116. Use Scene.verticalExaggeration instead."
|
|
550
|
-
);
|
|
551
|
-
if (value !== this._terrainExaggeration) {
|
|
552
|
-
this._terrainExaggeration = value;
|
|
553
|
-
this._terrainExaggerationChanged = true;
|
|
554
|
-
}
|
|
555
|
-
},
|
|
556
|
-
},
|
|
557
|
-
/**
|
|
558
|
-
* The height from which terrain is exaggerated. Defaults to <code>0.0</code> (scaled relative to ellipsoid surface).
|
|
559
|
-
* Terrain that is above this height will scale upwards and terrain that is below this height will scale downwards.
|
|
560
|
-
* Note that terrain exaggeration will not modify any other primitive as they are positioned relative to the ellipsoid.
|
|
561
|
-
* If {@link Globe#terrainExaggeration} is <code>1.0</code> this value will have no effect.
|
|
562
|
-
*
|
|
563
|
-
* @memberof Globe.prototype
|
|
564
|
-
* @type {number}
|
|
565
|
-
* @default 0.0
|
|
566
|
-
*
|
|
567
|
-
* @deprecated
|
|
568
|
-
*/
|
|
569
|
-
terrainExaggerationRelativeHeight: {
|
|
570
|
-
get: function () {
|
|
571
|
-
deprecationWarning(
|
|
572
|
-
"Globe.terrainExaggerationRelativeHeight",
|
|
573
|
-
"Globe.terrainExaggerationRelativeHeight was deprecated in CesiumJS 1.113. It will be removed in CesiumJS 1.116. Use Scene.verticalExaggerationRelativeHeight instead."
|
|
574
|
-
);
|
|
575
|
-
return this._terrainExaggerationRelativeHeight;
|
|
576
|
-
},
|
|
577
|
-
set: function (value) {
|
|
578
|
-
deprecationWarning(
|
|
579
|
-
"Globe.terrainExaggerationRelativeHeight",
|
|
580
|
-
"Globe.terrainExaggerationRelativeHeight was deprecated in CesiumJS 1.113. It will be removed in CesiumJS 1.116. Use Scene.verticalExaggerationRelativeHeight instead."
|
|
581
|
-
);
|
|
582
|
-
if (value !== this._terrainExaggerationRelativeHeight) {
|
|
583
|
-
this._terrainExaggerationRelativeHeight = value;
|
|
584
|
-
this._terrainExaggerationChanged = true;
|
|
585
|
-
}
|
|
586
|
-
},
|
|
587
|
-
},
|
|
588
521
|
/**
|
|
589
522
|
* Gets an event that's raised when the length of the tile load queue has changed since the last render frame. When the load queue is empty,
|
|
590
523
|
* all terrain and imagery for the current view have been loaded. The event passes the new length of the tile load queue.
|
|
@@ -930,7 +930,7 @@ GlobeTranslucencyState.prototype.pushDerivedCommands = function (
|
|
|
930
930
|
isBlendCommand,
|
|
931
931
|
frameState
|
|
932
932
|
) {
|
|
933
|
-
const picking = frameState.passes.pick;
|
|
933
|
+
const picking = frameState.passes.pick || frameState.passes.pickVoxel;
|
|
934
934
|
if (picking && isBlendCommand) {
|
|
935
935
|
// No need to push blend commands in the pick pass
|
|
936
936
|
return;
|
|
@@ -1079,6 +1079,26 @@ function convertTechniquesToPbr(gltf, options) {
|
|
|
1079
1079
|
removeExtension(gltf, "KHR_blend");
|
|
1080
1080
|
}
|
|
1081
1081
|
|
|
1082
|
+
function assignAsBaseColor(material, baseColor) {
|
|
1083
|
+
if (defined(baseColor)) {
|
|
1084
|
+
if (isVec4(baseColor)) {
|
|
1085
|
+
material.pbrMetallicRoughness.baseColorFactor = srgbToLinear(baseColor);
|
|
1086
|
+
} else if (isTexture(baseColor)) {
|
|
1087
|
+
material.pbrMetallicRoughness.baseColorTexture = baseColor;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
function assignAsEmissive(material, emissive) {
|
|
1093
|
+
if (defined(emissive)) {
|
|
1094
|
+
if (isVec4(emissive)) {
|
|
1095
|
+
material.emissiveFactor = emissive.slice(0, 3);
|
|
1096
|
+
} else if (isTexture(emissive)) {
|
|
1097
|
+
material.emissiveTexture = emissive;
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1082
1102
|
function convertMaterialsCommonToPbr(gltf) {
|
|
1083
1103
|
// Future work: convert KHR_materials_common lights to KHR_lights_punctual
|
|
1084
1104
|
ForEach.material(gltf, function (material) {
|
|
@@ -1086,80 +1106,61 @@ function convertMaterialsCommonToPbr(gltf) {
|
|
|
1086
1106
|
material.extensions,
|
|
1087
1107
|
defaultValue.EMPTY_OBJECT
|
|
1088
1108
|
).KHR_materials_common;
|
|
1109
|
+
if (!defined(materialsCommon)) {
|
|
1110
|
+
// Nothing to do
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1089
1113
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1114
|
+
const values = defaultValue(materialsCommon.values, {});
|
|
1115
|
+
const ambient = values.ambient;
|
|
1116
|
+
const diffuse = values.diffuse;
|
|
1117
|
+
const emission = values.emission;
|
|
1118
|
+
const transparency = values.transparency;
|
|
1119
|
+
|
|
1120
|
+
// These actually exist on the extension object, not the values object despite what's shown in the spec
|
|
1121
|
+
const doubleSided = materialsCommon.doubleSided;
|
|
1122
|
+
const transparent = materialsCommon.transparent;
|
|
1123
|
+
|
|
1124
|
+
// Ignore specular and shininess for now because the conversion to PBR
|
|
1125
|
+
// isn't straightforward and depends on the technique
|
|
1126
|
+
initializePbrMaterial(material);
|
|
1127
|
+
|
|
1128
|
+
const technique = materialsCommon.technique;
|
|
1129
|
+
if (technique === "CONSTANT") {
|
|
1130
|
+
// Add the KHR_materials_unlit extension
|
|
1131
|
+
addExtensionsUsed(gltf, "KHR_materials_unlit");
|
|
1132
|
+
material.extensions = defined(material.extensions)
|
|
1133
|
+
? material.extensions
|
|
1103
1134
|
: {};
|
|
1135
|
+
material.extensions["KHR_materials_unlit"] = {};
|
|
1104
1136
|
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
if (defined(ambient)) {
|
|
1119
|
-
if (isVec4(ambient)) {
|
|
1120
|
-
material.emissiveFactor = ambient.slice(0, 3);
|
|
1121
|
-
} else if (isTexture(ambient)) {
|
|
1122
|
-
material.emissiveTexture = ambient;
|
|
1123
|
-
}
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
if (defined(diffuse)) {
|
|
1127
|
-
if (isVec4(diffuse)) {
|
|
1128
|
-
material.pbrMetallicRoughness.baseColorFactor = srgbToLinear(diffuse);
|
|
1129
|
-
} else if (isTexture(diffuse)) {
|
|
1130
|
-
material.pbrMetallicRoughness.baseColorTexture = diffuse;
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
if (defined(doubleSided)) {
|
|
1135
|
-
material.doubleSided = doubleSided;
|
|
1136
|
-
}
|
|
1137
|
-
|
|
1138
|
-
if (defined(emission)) {
|
|
1139
|
-
if (isVec4(emission)) {
|
|
1140
|
-
material.emissiveFactor = emission.slice(0, 3);
|
|
1141
|
-
} else if (isTexture(emission)) {
|
|
1142
|
-
material.emissiveTexture = emission;
|
|
1143
|
-
}
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
if (defined(transparency)) {
|
|
1147
|
-
if (defined(material.pbrMetallicRoughness.baseColorFactor)) {
|
|
1148
|
-
material.pbrMetallicRoughness.baseColorFactor[3] *= transparency;
|
|
1149
|
-
} else {
|
|
1150
|
-
material.pbrMetallicRoughness.baseColorFactor = [
|
|
1151
|
-
1,
|
|
1152
|
-
1,
|
|
1153
|
-
1,
|
|
1154
|
-
transparency,
|
|
1155
|
-
];
|
|
1156
|
-
}
|
|
1157
|
-
}
|
|
1137
|
+
// The CONSTANT technique does not support 'diffuse', so
|
|
1138
|
+
// assign either the 'emission' or the 'ambient' as the
|
|
1139
|
+
// base color
|
|
1140
|
+
assignAsBaseColor(material, emission);
|
|
1141
|
+
assignAsBaseColor(material, ambient);
|
|
1142
|
+
} else {
|
|
1143
|
+
// Assign the 'diffuse' as the base color, and
|
|
1144
|
+
// the 'ambient' or 'emissive' as the emissive
|
|
1145
|
+
// part if they are present.
|
|
1146
|
+
assignAsBaseColor(material, diffuse);
|
|
1147
|
+
assignAsEmissive(material, ambient);
|
|
1148
|
+
assignAsEmissive(material, emission);
|
|
1149
|
+
}
|
|
1158
1150
|
|
|
1159
|
-
|
|
1160
|
-
|
|
1151
|
+
if (defined(doubleSided)) {
|
|
1152
|
+
material.doubleSided = doubleSided;
|
|
1153
|
+
}
|
|
1154
|
+
if (defined(transparency)) {
|
|
1155
|
+
if (defined(material.pbrMetallicRoughness.baseColorFactor)) {
|
|
1156
|
+
material.pbrMetallicRoughness.baseColorFactor[3] *= transparency;
|
|
1157
|
+
} else {
|
|
1158
|
+
material.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, transparency];
|
|
1161
1159
|
}
|
|
1162
1160
|
}
|
|
1161
|
+
if (defined(transparent)) {
|
|
1162
|
+
material.alphaMode = transparent ? "BLEND" : "OPAQUE";
|
|
1163
|
+
}
|
|
1163
1164
|
});
|
|
1164
1165
|
|
|
1165
1166
|
removeExtension(gltf, "KHR_materials_common");
|
|
@@ -57,6 +57,8 @@ import Resource from "../Core/Resource.js";
|
|
|
57
57
|
import RuntimeError from "../Core/RuntimeError.js";
|
|
58
58
|
import WebMercatorProjection from "../Core/WebMercatorProjection.js";
|
|
59
59
|
import I3SLayer from "./I3SLayer.js";
|
|
60
|
+
import I3SStatistics from "./I3SStatistics.js";
|
|
61
|
+
import I3SSublayer from "./I3SSublayer.js";
|
|
60
62
|
import Lerc from "lerc";
|
|
61
63
|
import Rectangle from "../Core/Rectangle.js";
|
|
62
64
|
|
|
@@ -68,8 +70,30 @@ import Rectangle from "../Core/Rectangle.js";
|
|
|
68
70
|
* @property {string} [name] The name of the I3S dataset.
|
|
69
71
|
* @property {boolean} [show=true] Determines if the dataset will be shown.
|
|
70
72
|
* @property {ArcGISTiledElevationTerrainProvider|Promise<ArcGISTiledElevationTerrainProvider>} [geoidTiledTerrainProvider] Tiled elevation provider describing an Earth Gravitational Model. If defined, geometry will be shifted based on the offsets given by this provider. Required to position I3S data sets with gravity-related height at the correct location.
|
|
71
|
-
* @property {boolean} [traceFetches=false] Debug option. When true, log a message whenever an I3S tile is fetched.
|
|
72
73
|
* @property {Cesium3DTileset.ConstructorOptions} [cesium3dTilesetOptions] Object containing options to pass to an internally created {@link Cesium3DTileset}. See {@link Cesium3DTileset} for list of valid properties. All options can be used with the exception of <code>url</code> and <code>show</code> which are overridden by values from I3SDataProvider.
|
|
74
|
+
* @property {boolean} [showFeatures=false] Determines if the features will be shown.
|
|
75
|
+
* @property {boolean} [adjustMaterialAlphaMode=false] The option to adjust the alpha mode of the material based on the transparency of the vertex color. When <code>true</code>, the alpha mode of the material (if not defined) will be set to BLEND for geometry with any transparency in the color vertex attribute.
|
|
76
|
+
* @property {boolean} [applySymbology=false] Determines if the I3S symbology will be parsed and applied for the layers.
|
|
77
|
+
* @property {boolean} [calculateNormals=false] Determines if the flat normals will be generated for I3S geometry without normals.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* // Increase LOD by reducing SSE
|
|
81
|
+
* const cesium3dTilesetOptions = {
|
|
82
|
+
* maximumScreenSpaceError: 1,
|
|
83
|
+
* };
|
|
84
|
+
* const i3sOptions = {
|
|
85
|
+
* cesium3dTilesetOptions: cesium3dTilesetOptions,
|
|
86
|
+
* };
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* // Set a custom outline color to replace the color defined in I3S symbology
|
|
90
|
+
* const cesium3dTilesetOptions = {
|
|
91
|
+
* outlineColor: Cesium.Color.BLUE,
|
|
92
|
+
* };
|
|
93
|
+
* const i3sOptions = {
|
|
94
|
+
* cesium3dTilesetOptions: cesium3dTilesetOptions,
|
|
95
|
+
* applySymbology: true,
|
|
96
|
+
* };
|
|
73
97
|
*/
|
|
74
98
|
|
|
75
99
|
/**
|
|
@@ -122,7 +146,13 @@ function I3SDataProvider(options) {
|
|
|
122
146
|
this._name = options.name;
|
|
123
147
|
this._show = defaultValue(options.show, true);
|
|
124
148
|
this._geoidTiledTerrainProvider = options.geoidTiledTerrainProvider;
|
|
125
|
-
this.
|
|
149
|
+
this._showFeatures = defaultValue(options.showFeatures, false);
|
|
150
|
+
this._adjustMaterialAlphaMode = defaultValue(
|
|
151
|
+
options.adjustMaterialAlphaMode,
|
|
152
|
+
false
|
|
153
|
+
);
|
|
154
|
+
this._applySymbology = defaultValue(options.applySymbology, false);
|
|
155
|
+
this._calculateNormals = defaultValue(options.calculateNormals, false);
|
|
126
156
|
|
|
127
157
|
this._cesium3dTilesetOptions = defaultValue(
|
|
128
158
|
options.cesium3dTilesetOptions,
|
|
@@ -130,12 +160,15 @@ function I3SDataProvider(options) {
|
|
|
130
160
|
);
|
|
131
161
|
|
|
132
162
|
this._layers = [];
|
|
163
|
+
this._sublayers = [];
|
|
133
164
|
this._data = undefined;
|
|
134
165
|
this._extent = undefined;
|
|
135
166
|
this._geoidDataPromise = undefined;
|
|
136
167
|
this._geoidDataList = undefined;
|
|
137
168
|
this._decoderTaskProcessor = undefined;
|
|
138
169
|
this._taskProcessorReadyPromise = undefined;
|
|
170
|
+
this._attributeStatistics = [];
|
|
171
|
+
this._layersExtent = [];
|
|
139
172
|
}
|
|
140
173
|
|
|
141
174
|
Object.defineProperties(I3SDataProvider.prototype, {
|
|
@@ -165,33 +198,15 @@ Object.defineProperties(I3SDataProvider.prototype, {
|
|
|
165
198
|
Check.defined("value", value);
|
|
166
199
|
//>>includeEnd('debug');
|
|
167
200
|
|
|
168
|
-
this._show
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
this._layers[i].
|
|
201
|
+
if (this._show !== value) {
|
|
202
|
+
this._show = value;
|
|
203
|
+
for (let i = 0; i < this._layers.length; i++) {
|
|
204
|
+
this._layers[i]._updateVisibility();
|
|
172
205
|
}
|
|
173
206
|
}
|
|
174
207
|
},
|
|
175
208
|
},
|
|
176
209
|
|
|
177
|
-
/**
|
|
178
|
-
* Gets or sets debugging and tracing of I3S fetches.
|
|
179
|
-
* @memberof I3SDataProvider.prototype
|
|
180
|
-
* @type {boolean}
|
|
181
|
-
*/
|
|
182
|
-
traceFetches: {
|
|
183
|
-
get: function () {
|
|
184
|
-
return this._traceFetches;
|
|
185
|
-
},
|
|
186
|
-
set: function (value) {
|
|
187
|
-
//>>includeStart('debug', pragmas.debug);
|
|
188
|
-
Check.defined("value", value);
|
|
189
|
-
//>>includeEnd('debug');
|
|
190
|
-
|
|
191
|
-
this._traceFetches = value;
|
|
192
|
-
},
|
|
193
|
-
},
|
|
194
|
-
|
|
195
210
|
/**
|
|
196
211
|
* The terrain provider referencing the GEOID service to be used for orthometric to ellipsoidal conversion.
|
|
197
212
|
* @memberof I3SDataProvider.prototype
|
|
@@ -216,6 +231,18 @@ Object.defineProperties(I3SDataProvider.prototype, {
|
|
|
216
231
|
},
|
|
217
232
|
},
|
|
218
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Gets the collection of building sublayers.
|
|
236
|
+
* @memberof I3SDataProvider.prototype
|
|
237
|
+
* @type {I3SSublayer[]}
|
|
238
|
+
* @readonly
|
|
239
|
+
*/
|
|
240
|
+
sublayers: {
|
|
241
|
+
get: function () {
|
|
242
|
+
return this._sublayers;
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
|
|
219
246
|
/**
|
|
220
247
|
* Gets the I3S data for this object.
|
|
221
248
|
* @memberof I3SDataProvider.prototype
|
|
@@ -251,6 +278,54 @@ Object.defineProperties(I3SDataProvider.prototype, {
|
|
|
251
278
|
return this._resource;
|
|
252
279
|
},
|
|
253
280
|
},
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Determines if the features will be shown.
|
|
284
|
+
* @memberof I3SDataProvider.prototype
|
|
285
|
+
* @type {boolean}
|
|
286
|
+
* @readonly
|
|
287
|
+
*/
|
|
288
|
+
showFeatures: {
|
|
289
|
+
get: function () {
|
|
290
|
+
return this._showFeatures;
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Determines if the alpha mode of the material will be adjusted depending on the color vertex attribute.
|
|
296
|
+
* @memberof I3SDataProvider.prototype
|
|
297
|
+
* @type {boolean}
|
|
298
|
+
* @readonly
|
|
299
|
+
*/
|
|
300
|
+
adjustMaterialAlphaMode: {
|
|
301
|
+
get: function () {
|
|
302
|
+
return this._adjustMaterialAlphaMode;
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Determines if the I3S symbology will be parsed and applied for the layers.
|
|
308
|
+
* @memberof I3SDataProvider.prototype
|
|
309
|
+
* @type {boolean}
|
|
310
|
+
* @readonly
|
|
311
|
+
*/
|
|
312
|
+
applySymbology: {
|
|
313
|
+
get: function () {
|
|
314
|
+
return this._applySymbology;
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Determines if the flat normals will be generated for I3S geometry without normals.
|
|
320
|
+
* @memberof I3SDataProvider.prototype
|
|
321
|
+
* @type {boolean}
|
|
322
|
+
* @readonly
|
|
323
|
+
*/
|
|
324
|
+
calculateNormals: {
|
|
325
|
+
get: function () {
|
|
326
|
+
return this._calculateNormals;
|
|
327
|
+
},
|
|
328
|
+
},
|
|
254
329
|
});
|
|
255
330
|
|
|
256
331
|
/**
|
|
@@ -335,6 +410,101 @@ I3SDataProvider.prototype.updateForPass = function (frameState, passState) {
|
|
|
335
410
|
}
|
|
336
411
|
};
|
|
337
412
|
|
|
413
|
+
function buildLayerUrl(provider, layerId) {
|
|
414
|
+
const dataProviderUrl = provider.resource.getUrlComponent();
|
|
415
|
+
|
|
416
|
+
let layerUrl = "";
|
|
417
|
+
if (dataProviderUrl.match(/layers\/\d/)) {
|
|
418
|
+
layerUrl = `${dataProviderUrl}`.replace(/\/+$/, "");
|
|
419
|
+
} else {
|
|
420
|
+
// Add '/' to url if needed + `$layers/${layerId}/` if tilesetUrl not already in ../layers/[id] format
|
|
421
|
+
layerUrl = `${dataProviderUrl}`
|
|
422
|
+
.replace(/\/?$/, "/")
|
|
423
|
+
.concat(`layers/${layerId}`);
|
|
424
|
+
}
|
|
425
|
+
return layerUrl;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
async function addLayers(provider, data, options) {
|
|
429
|
+
if (data.layerType === "Building") {
|
|
430
|
+
if (!defined(options.showFeatures)) {
|
|
431
|
+
// The Building Scene Layer requires features to be shown to support filtering
|
|
432
|
+
provider._showFeatures = true;
|
|
433
|
+
}
|
|
434
|
+
if (!defined(options.adjustMaterialAlphaMode)) {
|
|
435
|
+
// The Building Scene Layer enables transparency by default
|
|
436
|
+
provider._adjustMaterialAlphaMode = true;
|
|
437
|
+
}
|
|
438
|
+
if (!defined(options.applySymbology)) {
|
|
439
|
+
// The Building Scene Layer applies symbology by default
|
|
440
|
+
provider._applySymbology = true;
|
|
441
|
+
}
|
|
442
|
+
if (!defined(options.calculateNormals)) {
|
|
443
|
+
// The Building Scene Layer calculates flat normals by default
|
|
444
|
+
provider._calculateNormals = true;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const buildingLayerUrl = buildLayerUrl(provider, data.id);
|
|
448
|
+
if (defined(data.sublayers)) {
|
|
449
|
+
const promises = [];
|
|
450
|
+
for (let i = 0; i < data.sublayers.length; i++) {
|
|
451
|
+
const promise = I3SSublayer._fromData(
|
|
452
|
+
provider,
|
|
453
|
+
buildingLayerUrl,
|
|
454
|
+
data.sublayers[i],
|
|
455
|
+
provider
|
|
456
|
+
);
|
|
457
|
+
promises.push(promise);
|
|
458
|
+
}
|
|
459
|
+
const sublayers = await Promise.all(promises);
|
|
460
|
+
for (let i = 0; i < sublayers.length; i++) {
|
|
461
|
+
const sublayer = sublayers[i];
|
|
462
|
+
provider._sublayers.push(sublayer);
|
|
463
|
+
provider._layers.push(...sublayer._i3sLayers);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
if (defined(data.statisticsHRef)) {
|
|
468
|
+
const uri = buildingLayerUrl.concat(`/${data.statisticsHRef}`);
|
|
469
|
+
const statistics = new I3SStatistics(provider, uri);
|
|
470
|
+
await statistics.load();
|
|
471
|
+
provider._attributeStatistics.push(statistics);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (defined(data.fullExtent)) {
|
|
475
|
+
const extent = Rectangle.fromDegrees(
|
|
476
|
+
data.fullExtent.xmin,
|
|
477
|
+
data.fullExtent.ymin,
|
|
478
|
+
data.fullExtent.xmax,
|
|
479
|
+
data.fullExtent.ymax
|
|
480
|
+
);
|
|
481
|
+
provider._layersExtent.push(extent);
|
|
482
|
+
}
|
|
483
|
+
} else if (
|
|
484
|
+
data.layerType === "3DObject" ||
|
|
485
|
+
data.layerType === "IntegratedMesh"
|
|
486
|
+
) {
|
|
487
|
+
if (
|
|
488
|
+
!defined(options.calculateNormals) &&
|
|
489
|
+
!defined(data.textureSetDefinitions)
|
|
490
|
+
) {
|
|
491
|
+
// I3S Layers without textures should calculate flat normals by default
|
|
492
|
+
provider._calculateNormals = true;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
const newLayer = new I3SLayer(provider, data, provider);
|
|
496
|
+
provider._layers.push(newLayer);
|
|
497
|
+
if (defined(newLayer._extent)) {
|
|
498
|
+
provider._layersExtent.push(newLayer._extent);
|
|
499
|
+
}
|
|
500
|
+
} else {
|
|
501
|
+
// Filter other scene layer types out
|
|
502
|
+
console.log(
|
|
503
|
+
`${data.layerType} layer ${data.name} is skipped as not supported.`
|
|
504
|
+
);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
338
508
|
/**
|
|
339
509
|
* Creates an I3SDataProvider. Currently supported I3S versions are 1.6 and
|
|
340
510
|
* 1.7/1.8 (OGC I3S 1.2).
|
|
@@ -375,6 +545,8 @@ I3SDataProvider.fromUrl = async function (url, options) {
|
|
|
375
545
|
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
|
|
376
546
|
|
|
377
547
|
const resource = Resource.createIfNeeded(url);
|
|
548
|
+
// Set a query parameter for json to avoid failure on html pages
|
|
549
|
+
resource.setQueryParameters({ f: "pjson" }, true);
|
|
378
550
|
const data = await I3SDataProvider.loadJson(resource);
|
|
379
551
|
|
|
380
552
|
const provider = new I3SDataProvider(options);
|
|
@@ -383,17 +555,14 @@ I3SDataProvider.fromUrl = async function (url, options) {
|
|
|
383
555
|
|
|
384
556
|
// Success
|
|
385
557
|
if (defined(data.layers)) {
|
|
558
|
+
const promises = [];
|
|
386
559
|
for (let layerIndex = 0; layerIndex < data.layers.length; layerIndex++) {
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
data.layers[layerIndex],
|
|
390
|
-
layerIndex
|
|
391
|
-
);
|
|
392
|
-
provider._layers.push(newLayer);
|
|
560
|
+
const promise = addLayers(provider, data.layers[layerIndex], options);
|
|
561
|
+
promises.push(promise);
|
|
393
562
|
}
|
|
563
|
+
await Promise.all(promises);
|
|
394
564
|
} else {
|
|
395
|
-
|
|
396
|
-
provider._layers.push(newLayer);
|
|
565
|
+
await addLayers(provider, data, options);
|
|
397
566
|
}
|
|
398
567
|
|
|
399
568
|
provider._computeExtent();
|
|
@@ -421,14 +590,9 @@ I3SDataProvider._fetchJson = function (resource) {
|
|
|
421
590
|
* @private
|
|
422
591
|
*
|
|
423
592
|
* @param {Resource} resource The JSON resource to request
|
|
424
|
-
* @param {boolean} [trace=false] Log the resource
|
|
425
593
|
* @returns {Promise<object>} The fetched data
|
|
426
594
|
*/
|
|
427
|
-
I3SDataProvider.loadJson = async function (resource
|
|
428
|
-
if (trace) {
|
|
429
|
-
console.log("I3S FETCH:", resource.url);
|
|
430
|
-
}
|
|
431
|
-
|
|
595
|
+
I3SDataProvider.loadJson = async function (resource) {
|
|
432
596
|
const data = await I3SDataProvider._fetchJson(resource);
|
|
433
597
|
if (defined(data.error)) {
|
|
434
598
|
console.error("Failed to fetch I3S ", resource.url);
|
|
@@ -450,11 +614,20 @@ I3SDataProvider.loadJson = async function (resource, trace) {
|
|
|
450
614
|
/**
|
|
451
615
|
* @private
|
|
452
616
|
*/
|
|
453
|
-
I3SDataProvider.prototype._loadBinary = function (resource) {
|
|
454
|
-
|
|
455
|
-
|
|
617
|
+
I3SDataProvider.prototype._loadBinary = async function (resource) {
|
|
618
|
+
const buffer = await resource.fetchArrayBuffer();
|
|
619
|
+
if (buffer.byteLength > 0) {
|
|
620
|
+
// Check if we have a JSON response with 404
|
|
621
|
+
const array = new Uint8Array(buffer);
|
|
622
|
+
if (array[0] === "{".charCodeAt(0)) {
|
|
623
|
+
const textContent = new TextDecoder();
|
|
624
|
+
const str = textContent.decode(buffer);
|
|
625
|
+
if (str.includes("404")) {
|
|
626
|
+
throw new RuntimeError(`Failed to load binary: ${resource.url}`);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
456
629
|
}
|
|
457
|
-
return
|
|
630
|
+
return buffer;
|
|
458
631
|
};
|
|
459
632
|
|
|
460
633
|
/**
|
|
@@ -593,9 +766,6 @@ async function loadGeoidData(provider) {
|
|
|
593
766
|
const geoidTerrainProvider = provider._geoidTiledTerrainProvider;
|
|
594
767
|
|
|
595
768
|
if (!defined(geoidTerrainProvider)) {
|
|
596
|
-
console.log(
|
|
597
|
-
"No Geoid Terrain service provided - no geoid conversion will be performed."
|
|
598
|
-
);
|
|
599
769
|
return;
|
|
600
770
|
}
|
|
601
771
|
|
|
@@ -631,18 +801,65 @@ I3SDataProvider.prototype._computeExtent = function () {
|
|
|
631
801
|
let rectangle;
|
|
632
802
|
|
|
633
803
|
// Compute the extent from all layers
|
|
634
|
-
for (
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
804
|
+
for (
|
|
805
|
+
let layerIndex = 0;
|
|
806
|
+
layerIndex < this._layersExtent.length;
|
|
807
|
+
layerIndex++
|
|
808
|
+
) {
|
|
809
|
+
const layerExtent = this._layersExtent[layerIndex];
|
|
810
|
+
if (!defined(rectangle)) {
|
|
811
|
+
rectangle = Rectangle.clone(layerExtent);
|
|
812
|
+
} else {
|
|
813
|
+
Rectangle.union(rectangle, layerExtent, rectangle);
|
|
642
814
|
}
|
|
643
815
|
}
|
|
644
816
|
|
|
645
817
|
this._extent = rectangle;
|
|
646
818
|
};
|
|
647
819
|
|
|
820
|
+
/**
|
|
821
|
+
* Returns the collection of names for all available attributes
|
|
822
|
+
* @returns {string[]} The collection of attribute names
|
|
823
|
+
*/
|
|
824
|
+
I3SDataProvider.prototype.getAttributeNames = function () {
|
|
825
|
+
const attributes = [];
|
|
826
|
+
for (let i = 0; i < this._attributeStatistics.length; ++i) {
|
|
827
|
+
attributes.push(...this._attributeStatistics[i].names);
|
|
828
|
+
}
|
|
829
|
+
return attributes;
|
|
830
|
+
};
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* Returns the collection of values for the attribute with the given name
|
|
834
|
+
* @param {string} name The attribute name
|
|
835
|
+
* @returns {string[]} The collection of attribute values
|
|
836
|
+
*/
|
|
837
|
+
I3SDataProvider.prototype.getAttributeValues = function (name) {
|
|
838
|
+
//>>includeStart('debug', pragmas.debug);
|
|
839
|
+
Check.defined("name", name);
|
|
840
|
+
//>>includeEnd('debug');
|
|
841
|
+
|
|
842
|
+
for (let i = 0; i < this._attributeStatistics.length; ++i) {
|
|
843
|
+
const values = this._attributeStatistics[i]._getValues(name);
|
|
844
|
+
if (defined(values)) {
|
|
845
|
+
return values;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
return [];
|
|
849
|
+
};
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* Filters the drawn elements of a scene to specific attribute names and values
|
|
853
|
+
* @param {I3SNode.AttributeFilter[]} [filters=[]] The collection of attribute filters
|
|
854
|
+
* @returns {Promise<void>} A promise that is resolved when the filter is applied
|
|
855
|
+
*/
|
|
856
|
+
I3SDataProvider.prototype.filterByAttributes = function (filters) {
|
|
857
|
+
const promises = [];
|
|
858
|
+
for (let i = 0; i < this._layers.length; i++) {
|
|
859
|
+
const promise = this._layers[i].filterByAttributes(filters);
|
|
860
|
+
promises.push(promise);
|
|
861
|
+
}
|
|
862
|
+
return Promise.all(promises);
|
|
863
|
+
};
|
|
864
|
+
|
|
648
865
|
export default I3SDataProvider;
|