@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.
Files changed (200) hide show
  1. package/Build/ThirdParty/Workers/z-worker-pako.js +1 -5
  2. package/Build/Workers/{chunk-7XEAYGZK.js → chunk-24YTYWNB.js} +10 -10
  3. package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2632RVPI.js} +7 -7
  4. package/Build/Workers/chunk-2KACWKS4.js +501 -0
  5. package/Build/Workers/{chunk-QZAD5O7I.js → chunk-2XPLH3JY.js} +7 -7
  6. package/Build/Workers/{chunk-JY5YEZFA.js → chunk-2ZBL3MVO.js} +8 -8
  7. package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-3NCVAGDA.js} +14 -14
  8. package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-5R6VWLMH.js} +6 -6
  9. package/Build/Workers/{chunk-PTQQUQC3.js → chunk-5TIV3L26.js} +13 -13
  10. package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-6WF3KIF5.js} +10 -10
  11. package/Build/Workers/{chunk-5WQ523AW.js → chunk-73FKKY52.js} +5 -5
  12. package/Build/Workers/{chunk-F6SE42BK.js → chunk-7COR472O.js} +15 -472
  13. package/Build/Workers/{chunk-72SANQJV.js → chunk-ADOVHYWO.js} +9 -5
  14. package/Build/Workers/{chunk-5YLJ77FF.js → chunk-BCU2LH5T.js} +12 -11
  15. package/Build/Workers/{chunk-4EBHOMFX.js → chunk-C3XBUYBO.js} +17 -17
  16. package/Build/Workers/{chunk-IX2JCCNM.js → chunk-C6OI26DR.js} +1 -1
  17. package/Build/Workers/{chunk-2HJWSU7B.js → chunk-CO35JNNE.js} +4 -4
  18. package/Build/Workers/{chunk-OVLG3FRS.js → chunk-DGDUKCJJ.js} +6 -6
  19. package/Build/Workers/{chunk-DTAIXKTO.js → chunk-DPUSFA7S.js} +6 -6
  20. package/Build/Workers/{chunk-R5X4OQT4.js → chunk-E6WXPSJS.js} +7 -7
  21. package/Build/Workers/{chunk-VK3EJHWI.js → chunk-EOXYZ34O.js} +2 -2
  22. package/Build/Workers/{chunk-RAEV7K66.js → chunk-EPKE7GE3.js} +5 -5
  23. package/Build/Workers/{chunk-GV56Q4LU.js → chunk-GFA4SMXV.js} +11 -11
  24. package/Build/Workers/{chunk-NKPBIX7F.js → chunk-GXUXEOE2.js} +1 -1
  25. package/Build/Workers/{chunk-NY3K4IM3.js → chunk-HBQPB6IH.js} +12 -12
  26. package/Build/Workers/{chunk-6HZQPRUS.js → chunk-I37B3MZ2.js} +1 -1
  27. package/Build/Workers/{chunk-VRGFV2UO.js → chunk-L4BW3RUA.js} +10 -10
  28. package/Build/Workers/{chunk-6VJVYK2V.js → chunk-LAQP3SCC.js} +2 -2
  29. package/Build/Workers/{chunk-PNBGBETF.js → chunk-LQJ5FFFR.js} +10 -10
  30. package/Build/Workers/{chunk-UAEW6HKG.js → chunk-M2AYBTNH.js} +13 -13
  31. package/Build/Workers/{chunk-YUCVWAY6.js → chunk-MWV7IZK4.js} +7 -7
  32. package/Build/Workers/{chunk-JXDC723O.js → chunk-N4KXMWQU.js} +2 -2
  33. package/Build/Workers/{chunk-XWXM2O2R.js → chunk-NP2GYYE5.js} +6 -6
  34. package/Build/Workers/{chunk-GEJTYLCO.js → chunk-NZWNZA6S.js} +5 -5
  35. package/Build/Workers/{chunk-LZGHD6NY.js → chunk-P2YAAMT2.js} +15 -15
  36. package/Build/Workers/{chunk-S6SKF6DT.js → chunk-P4XKB3QZ.js} +5 -5
  37. package/Build/Workers/{chunk-U2VCRRQW.js → chunk-PXB7T27O.js} +6 -6
  38. package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-QCQUZGXI.js} +4 -4
  39. package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-QKBGRKKG.js} +4 -4
  40. package/Build/Workers/{chunk-ODW7WYM4.js → chunk-RMOEYCZW.js} +2 -2
  41. package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-RSJXEO2A.js} +2 -2
  42. package/Build/Workers/{chunk-UDO6BFSF.js → chunk-RV7ZOSS6.js} +13 -13
  43. package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-SE4PXOEA.js} +17 -17
  44. package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-SS4ESNE3.js} +2 -2
  45. package/Build/Workers/{chunk-AIPU2VSX.js → chunk-TJBU6GML.js} +6 -6
  46. package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-TZORKRNK.js} +1 -1
  47. package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-VR5RBW52.js} +7 -7
  48. package/Build/Workers/{chunk-FP6GYBFX.js → chunk-WHUSTDIB.js} +10 -10
  49. package/Build/Workers/{chunk-5HDYHG3F.js → chunk-X2F6BEPY.js} +13 -13
  50. package/Build/Workers/{chunk-WZU2YLWG.js → chunk-X6XOMPWL.js} +3 -3
  51. package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YDVSBWEO.js} +1 -1
  52. package/Build/Workers/{chunk-46UD5ABS.js → chunk-YV4H2Y7M.js} +4 -4
  53. package/Build/Workers/{chunk-WBQCVXR3.js → chunk-Z7FQLK6N.js} +4 -4
  54. package/Build/Workers/{chunk-L2ZN645J.js → chunk-ZNVSKMQ2.js} +6 -6
  55. package/Build/Workers/{chunk-JCNXK6EL.js → chunk-ZYPTP7GS.js} +11 -11
  56. package/Build/Workers/combineGeometry.js +24 -23
  57. package/Build/Workers/createBoxGeometry.js +18 -17
  58. package/Build/Workers/createBoxOutlineGeometry.js +16 -15
  59. package/Build/Workers/createCircleGeometry.js +26 -25
  60. package/Build/Workers/createCircleOutlineGeometry.js +19 -18
  61. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
  62. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
  63. package/Build/Workers/createCorridorGeometry.js +29 -28
  64. package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
  65. package/Build/Workers/createCylinderGeometry.js +20 -19
  66. package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
  67. package/Build/Workers/createEllipseGeometry.js +26 -25
  68. package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
  69. package/Build/Workers/createEllipsoidGeometry.js +19 -18
  70. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
  71. package/Build/Workers/createFrustumGeometry.js +18 -17
  72. package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
  73. package/Build/Workers/createGeometry.js +54 -33
  74. package/Build/Workers/createGroundPolylineGeometry.js +22 -21
  75. package/Build/Workers/createPlaneGeometry.js +16 -15
  76. package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
  77. package/Build/Workers/createPolygonGeometry.js +33 -32
  78. package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
  79. package/Build/Workers/createPolylineGeometry.js +25 -24
  80. package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
  81. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
  82. package/Build/Workers/createRectangleGeometry.js +27 -26
  83. package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
  84. package/Build/Workers/createSimplePolylineGeometry.js +23 -22
  85. package/Build/Workers/createSphereGeometry.js +19 -18
  86. package/Build/Workers/createSphereOutlineGeometry.js +18 -17
  87. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  88. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  89. package/Build/Workers/createVectorTileGeometries.js +24 -23
  90. package/Build/Workers/createVectorTilePoints.js +12 -12
  91. package/Build/Workers/createVectorTilePolygons.js +22 -21
  92. package/Build/Workers/createVectorTilePolylines.js +14 -14
  93. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
  94. package/Build/Workers/createVerticesFromHeightmap.js +22 -21
  95. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
  96. package/Build/Workers/createWallGeometry.js +24 -23
  97. package/Build/Workers/createWallOutlineGeometry.js +23 -22
  98. package/Build/Workers/decodeDraco.js +11 -11
  99. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  100. package/Build/Workers/decodeI3S.js +601 -92
  101. package/Build/Workers/transcodeKTX2.js +7 -7
  102. package/Build/Workers/transferTypedArrayTest.js +1 -1
  103. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
  104. package/Source/Core/Check.d.ts +127 -0
  105. package/Source/Core/Check.js +0 -1
  106. package/Source/Core/Ellipsoid.js +6 -0
  107. package/Source/Core/Geometry.js +1 -1
  108. package/Source/Core/IntersectionTests.js +6 -3
  109. package/Source/Core/Ion.js +1 -1
  110. package/Source/Core/PixelFormat.js +5 -0
  111. package/Source/Core/PolygonGeometry.js +1 -1
  112. package/Source/Core/Transforms.js +3 -0
  113. package/Source/Core/VerticalExaggeration.js +2 -1
  114. package/Source/Core/srgbToLinear.js +32 -0
  115. package/Source/DataSources/CzmlDataSource.js +51 -23
  116. package/Source/DataSources/DataSourceDisplay.js +27 -0
  117. package/Source/DataSources/Entity.js +20 -2
  118. package/Source/DataSources/GeometryUpdaterSet.js +114 -0
  119. package/Source/DataSources/GeometryVisualizer.js +19 -83
  120. package/Source/Renderer/Context.js +10 -0
  121. package/Source/Renderer/ContextLimits.js +2 -0
  122. package/Source/Renderer/demodernizeShader.js +4 -1
  123. package/Source/Scene/ArcGisMapService.js +1 -1
  124. package/Source/Scene/Axis.js +12 -7
  125. package/Source/Scene/Billboard.js +32 -0
  126. package/Source/Scene/BillboardCollection.js +1 -1
  127. package/Source/Scene/BingMapsImageryProvider.js +4 -0
  128. package/Source/Scene/Camera.js +46 -4
  129. package/Source/Scene/Cesium3DTilesVoxelProvider.js +2 -9
  130. package/Source/Scene/Cesium3DTileset.js +10 -7
  131. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
  132. package/Source/Scene/FrameState.js +5 -0
  133. package/Source/Scene/Globe.js +0 -67
  134. package/Source/Scene/GlobeTranslucencyState.js +1 -1
  135. package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
  136. package/Source/Scene/I3SDataProvider.js +270 -53
  137. package/Source/Scene/I3SDecoder.js +8 -1
  138. package/Source/Scene/I3SFeature.js +2 -5
  139. package/Source/Scene/I3SField.js +136 -31
  140. package/Source/Scene/I3SGeometry.js +70 -2
  141. package/Source/Scene/I3SLayer.js +55 -10
  142. package/Source/Scene/I3SNode.js +175 -18
  143. package/Source/Scene/I3SStatistics.js +94 -0
  144. package/Source/Scene/I3SSublayer.js +176 -0
  145. package/Source/Scene/I3SSymbology.js +337 -0
  146. package/Source/Scene/KeyframeNode.js +1 -1
  147. package/Source/Scene/Label.js +33 -0
  148. package/Source/Scene/LabelCollection.js +2 -1
  149. package/Source/Scene/Model/pickModel.js +25 -7
  150. package/Source/Scene/PickFramebuffer.js +37 -2
  151. package/Source/Scene/Picking.js +113 -39
  152. package/Source/Scene/Primitive.js +6 -5
  153. package/Source/Scene/Scene.js +126 -42
  154. package/Source/Scene/ScreenSpaceCameraController.js +21 -7
  155. package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
  156. package/Source/Scene/SpatialNode.js +12 -19
  157. package/Source/Scene/StructuralMetadata.js +1 -1
  158. package/Source/Scene/VoxelBoxShape.js +67 -6
  159. package/Source/Scene/VoxelCell.js +273 -0
  160. package/Source/Scene/VoxelCylinderShape.js +117 -163
  161. package/Source/Scene/VoxelEllipsoidShape.js +255 -304
  162. package/Source/Scene/VoxelPrimitive.js +109 -15
  163. package/Source/Scene/VoxelRenderResources.js +12 -3
  164. package/Source/Scene/VoxelShape.js +7 -4
  165. package/Source/Scene/VoxelTraversal.js +76 -54
  166. package/Source/Scene/buildVoxelDrawCommands.js +23 -0
  167. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
  168. package/Source/Scene/processVoxelProperties.js +3 -0
  169. package/Source/Shaders/Voxels/IntersectBox.glsl +21 -47
  170. package/Source/Shaders/Voxels/IntersectBox.js +21 -47
  171. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +1 -1
  172. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +1 -1
  173. package/Source/Shaders/Voxels/IntersectCylinder.glsl +76 -203
  174. package/Source/Shaders/Voxels/IntersectCylinder.js +76 -203
  175. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +220 -229
  176. package/Source/Shaders/Voxels/IntersectEllipsoid.js +220 -229
  177. package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
  178. package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
  179. package/Source/Shaders/Voxels/IntersectionUtils.glsl +33 -11
  180. package/Source/Shaders/Voxels/IntersectionUtils.js +33 -11
  181. package/Source/Shaders/Voxels/Megatexture.glsl +1 -2
  182. package/Source/Shaders/Voxels/Megatexture.js +1 -2
  183. package/Source/Shaders/Voxels/Octree.glsl +14 -9
  184. package/Source/Shaders/Voxels/Octree.js +14 -9
  185. package/Source/Shaders/Voxels/VoxelFS.glsl +128 -40
  186. package/Source/Shaders/Voxels/VoxelFS.js +128 -40
  187. package/Source/Shaders/Voxels/VoxelUtils.glsl +31 -0
  188. package/Source/Shaders/Voxels/VoxelUtils.js +33 -0
  189. package/Source/Shaders/Voxels/convertUvToBox.glsl +24 -3
  190. package/Source/Shaders/Voxels/convertUvToBox.js +24 -4
  191. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +64 -40
  192. package/Source/Shaders/Voxels/convertUvToCylinder.js +64 -40
  193. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +100 -91
  194. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +100 -91
  195. package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
  196. package/Source/Workers/createGeometry.js +40 -11
  197. package/Source/Workers/decodeI3S.js +720 -94
  198. package/index.d.ts +542 -40
  199. package/index.js +75 -66
  200. package/package.json +2 -2
@@ -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
- if (defined(materialsCommon)) {
1091
- const technique = materialsCommon.technique;
1092
- if (technique === "CONSTANT") {
1093
- // Add the KHR_materials_unlit extension
1094
- addExtensionsUsed(gltf, "KHR_materials_unlit");
1095
- material.extensions = defined(material.extensions)
1096
- ? material.extensions
1097
- : {};
1098
- material.extensions["KHR_materials_unlit"] = {};
1099
- }
1100
-
1101
- const values = defined(materialsCommon.values)
1102
- ? materialsCommon.values
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
- const ambient = values.ambient;
1106
- const diffuse = values.diffuse;
1107
- const emission = values.emission;
1108
- const transparency = values.transparency;
1109
-
1110
- // These actually exist on the extension object, not the values object despite what's shown in the spec
1111
- const doubleSided = materialsCommon.doubleSided;
1112
- const transparent = materialsCommon.transparent;
1113
-
1114
- // Ignore specular and shininess for now because the conversion to PBR
1115
- // isn't straightforward and depends on the technique
1116
- initializePbrMaterial(material);
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
- if (defined(transparent)) {
1160
- material.alphaMode = transparent ? "BLEND" : "OPAQUE";
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._traceFetches = defaultValue(options.traceFetches, false);
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 = value;
169
- for (let i = 0; i < this._layers.length; i++) {
170
- if (defined(this._layers[i]._tileset)) {
171
- this._layers[i]._tileset.show = this._show;
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 newLayer = new I3SLayer(
388
- provider,
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
- const newLayer = new I3SLayer(provider, data, data.id);
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, trace) {
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
- if (this._traceFetches) {
455
- console.log("I3S FETCH:", resource.url);
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 resource.fetchArrayBuffer();
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 (let layerIndex = 0; layerIndex < this._layers.length; layerIndex++) {
635
- if (defined(this._layers[layerIndex]._extent)) {
636
- const layerExtent = this._layers[layerIndex]._extent;
637
- if (!defined(rectangle)) {
638
- rectangle = Rectangle.clone(layerExtent);
639
- } else {
640
- Rectangle.union(rectangle, layerExtent, rectangle);
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;