@cesium/engine 0.1.0 → 1.1.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 (217) hide show
  1. package/Build/Workers/{AttributeCompression-4589338a.js → AttributeCompression-b646d393.js} +1 -1
  2. package/Build/Workers/{AxisAlignedBoundingBox-bfb1234f.js → AxisAlignedBoundingBox-a4321399.js} +1 -1
  3. package/Build/Workers/{BoundingRectangle-7ffc2153.js → BoundingRectangle-80d8801f.js} +1 -1
  4. package/Build/Workers/{BoxGeometry-93f344a3.js → BoxGeometry-33c10a4f.js} +1 -1
  5. package/Build/Workers/{Color-0c5aaf47.js → Color-1bf9a6e0.js} +1 -1
  6. package/Build/Workers/{CoplanarPolygonGeometryLibrary-6597982a.js → CoplanarPolygonGeometryLibrary-5c5b981b.js} +1 -1
  7. package/Build/Workers/{CorridorGeometryLibrary-2119580e.js → CorridorGeometryLibrary-7cbae7a0.js} +1 -1
  8. package/Build/Workers/{CylinderGeometry-f9503c6d.js → CylinderGeometry-42740df0.js} +1 -1
  9. package/Build/Workers/{EllipseGeometry-fedf72d5.js → EllipseGeometry-49a3ac21.js} +1 -1
  10. package/Build/Workers/{EllipseGeometryLibrary-4ea68687.js → EllipseGeometryLibrary-b891b2f8.js} +1 -1
  11. package/Build/Workers/{EllipseOutlineGeometry-e2ae6a35.js → EllipseOutlineGeometry-fbd72e07.js} +1 -1
  12. package/Build/Workers/{EllipsoidGeodesic-16de63ea.js → EllipsoidGeodesic-98c62a56.js} +1 -1
  13. package/Build/Workers/{EllipsoidGeometry-95c0330e.js → EllipsoidGeometry-a351dba8.js} +1 -1
  14. package/Build/Workers/{EllipsoidOutlineGeometry-d6d2ceec.js → EllipsoidOutlineGeometry-3e8779bf.js} +1 -1
  15. package/Build/Workers/{EllipsoidRhumbLine-ae5e65e0.js → EllipsoidRhumbLine-19756602.js} +1 -1
  16. package/Build/Workers/{EllipsoidTangentPlane-bfc674bf.js → EllipsoidTangentPlane-cfb50678.js} +1 -1
  17. package/Build/Workers/{EncodedCartesian3-f473ea18.js → EncodedCartesian3-81f70735.js} +1 -1
  18. package/Build/Workers/{FrustumGeometry-3bf2e4eb.js → FrustumGeometry-c5754412.js} +1 -1
  19. package/Build/Workers/{GeometryAttribute-df5f473e.js → GeometryAttribute-0bfd05e8.js} +1 -1
  20. package/Build/Workers/{GeometryInstance-aa75b4cf.js → GeometryInstance-451dc1cd.js} +1 -1
  21. package/Build/Workers/{GeometryPipeline-f0e46c42.js → GeometryPipeline-0166905d.js} +1 -1
  22. package/Build/Workers/{IntersectionTests-9de29d51.js → IntersectionTests-a93d3de9.js} +1 -1
  23. package/Build/Workers/{Matrix2-ce637455.js → Matrix2-13178034.js} +4 -2
  24. package/Build/Workers/{Matrix3-4f4df527.js → Matrix3-315394f6.js} +2 -1
  25. package/Build/Workers/{OrientedBoundingBox-d3ff3d4d.js → OrientedBoundingBox-b450cb61.js} +5 -5
  26. package/Build/Workers/{Plane-b81241c2.js → Plane-900aa728.js} +1 -1
  27. package/Build/Workers/{PolygonGeometryLibrary-6f4937bb.js → PolygonGeometryLibrary-f918ac26.js} +1 -1
  28. package/Build/Workers/PolygonPipeline-f59a8f0a.js +1345 -0
  29. package/Build/Workers/{PolylinePipeline-2e2b015c.js → PolylinePipeline-d8e6bd9b.js} +1 -1
  30. package/Build/Workers/{PolylineVolumeGeometryLibrary-7ee1d449.js → PolylineVolumeGeometryLibrary-125d2edf.js} +1 -1
  31. package/Build/Workers/{PrimitivePipeline-a9b7aae0.js → PrimitivePipeline-0d7b5ed4.js} +1 -1
  32. package/Build/Workers/{RectangleGeometryLibrary-9aa6c8f6.js → RectangleGeometryLibrary-0768db63.js} +1 -1
  33. package/Build/Workers/{TerrainEncoding-b52dcfc5.js → TerrainEncoding-06470d7f.js} +1 -1
  34. package/Build/Workers/{Transforms-2f755df8.js → Transforms-26539bce.js} +97 -83
  35. package/Build/Workers/{WallGeometryLibrary-ab19a93d.js → WallGeometryLibrary-6167b0fc.js} +1 -1
  36. package/Build/Workers/{WebMercatorProjection-9f25de49.js → WebMercatorProjection-13a90d41.js} +1 -1
  37. package/Build/Workers/cesiumWorkerBootstrapper.js +25 -1
  38. package/Build/Workers/combineGeometry.js +1 -1
  39. package/Build/Workers/createBoxGeometry.js +1 -1
  40. package/Build/Workers/createBoxOutlineGeometry.js +1 -1
  41. package/Build/Workers/createCircleGeometry.js +1 -1
  42. package/Build/Workers/createCircleOutlineGeometry.js +1 -1
  43. package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
  44. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  45. package/Build/Workers/createCorridorGeometry.js +1 -1
  46. package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
  47. package/Build/Workers/createCylinderGeometry.js +1 -1
  48. package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
  49. package/Build/Workers/createEllipseGeometry.js +1 -1
  50. package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
  51. package/Build/Workers/createEllipsoidGeometry.js +1 -1
  52. package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
  53. package/Build/Workers/createFrustumGeometry.js +1 -1
  54. package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
  55. package/Build/Workers/createGeometry.js +1 -1
  56. package/Build/Workers/createGroundPolylineGeometry.js +1 -1
  57. package/Build/Workers/createPlaneGeometry.js +1 -1
  58. package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
  59. package/Build/Workers/createPolygonGeometry.js +1 -1
  60. package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
  61. package/Build/Workers/createPolylineGeometry.js +1 -1
  62. package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
  63. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  64. package/Build/Workers/createRectangleGeometry.js +1 -1
  65. package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
  66. package/Build/Workers/createSimplePolylineGeometry.js +1 -1
  67. package/Build/Workers/createSphereGeometry.js +1 -1
  68. package/Build/Workers/createSphereOutlineGeometry.js +1 -1
  69. package/Build/Workers/createVectorTileClampedPolylines.js +1 -1
  70. package/Build/Workers/createVectorTileGeometries.js +1 -1
  71. package/Build/Workers/createVectorTilePoints.js +1 -1
  72. package/Build/Workers/createVectorTilePolygons.js +1 -1
  73. package/Build/Workers/createVectorTilePolylines.js +1 -1
  74. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  75. package/Build/Workers/createVerticesFromHeightmap.js +7 -3
  76. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +1 -1
  77. package/Build/Workers/createWallGeometry.js +1 -1
  78. package/Build/Workers/createWallOutlineGeometry.js +1 -1
  79. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +95 -76
  80. package/Build/Workers/decodeI3S.js +1 -1
  81. package/Build/Workers/package.js +25 -1
  82. package/Build/Workers/transferTypedArrayTest.js +25 -1
  83. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  84. package/README.md +9 -9
  85. package/Source/Core/EarthOrientationParameters.js +67 -63
  86. package/Source/Core/Ion.js +1 -1
  87. package/Source/Core/Matrix2.js +2 -1
  88. package/Source/Core/Matrix3.js +2 -1
  89. package/Source/Core/Matrix4.js +1 -0
  90. package/Source/Core/OrientedBoundingBox.js +4 -4
  91. package/Source/Core/S2Cell.js +3 -3
  92. package/Source/Core/Transforms.js +3 -7
  93. package/Source/DataSources/GpxDataSource.js +4 -6
  94. package/Source/DataSources/KmlDataSource.js +3 -5
  95. package/Source/Renderer/Context.js +230 -177
  96. package/Source/Renderer/Pass.js +3 -2
  97. package/Source/Scene/Cesium3DTileContentType.js +19 -0
  98. package/Source/Scene/Cesium3DTilesVoxelProvider.js +482 -0
  99. package/Source/Scene/Cesium3DTilesetMetadata.js +2 -2
  100. package/Source/Scene/ContentMetadata.js +2 -2
  101. package/Source/Scene/DerivedCommand.js +7 -0
  102. package/Source/Scene/Expression.js +1 -1
  103. package/Source/Scene/Globe.js +10 -0
  104. package/Source/Scene/GlobeSurfaceTileProvider.js +7 -0
  105. package/Source/Scene/GltfImageLoader.js +1 -1
  106. package/Source/Scene/GltfVertexBufferLoader.js +10 -2
  107. package/Source/Scene/GroupMetadata.js +2 -2
  108. package/Source/Scene/I3SDataProvider.js +2 -1
  109. package/Source/Scene/I3SFeature.js +1 -1
  110. package/Source/Scene/I3SLayer.js +64 -2
  111. package/Source/Scene/I3SNode.js +50 -6
  112. package/Source/Scene/ImplicitMetadataView.js +2 -2
  113. package/Source/Scene/ImplicitSubtreeCache.js +127 -0
  114. package/Source/Scene/ImplicitSubtreeMetadata.js +2 -2
  115. package/Source/Scene/ImplicitTileset.js +3 -2
  116. package/Source/Scene/KeyframeNode.js +47 -0
  117. package/Source/Scene/Megatexture.js +490 -0
  118. package/Source/Scene/MetadataClass.js +60 -25
  119. package/Source/Scene/MetadataClassProperty.js +132 -68
  120. package/Source/Scene/MetadataComponentType.js +78 -57
  121. package/Source/Scene/MetadataEnum.js +59 -23
  122. package/Source/Scene/MetadataEnumValue.js +49 -15
  123. package/Source/Scene/MetadataSchema.js +53 -24
  124. package/Source/Scene/MetadataSchemaLoader.js +2 -2
  125. package/Source/Scene/MetadataTableProperty.js +2 -2
  126. package/Source/Scene/MetadataType.js +6 -14
  127. package/Source/Scene/Model/GeoJsonLoader.js +1 -1
  128. package/Source/Scene/Model/Model.js +38 -6
  129. package/Source/Scene/Model/buildDrawCommand.js +19 -11
  130. package/Source/Scene/PointCloud.js +1 -1
  131. package/Source/Scene/PropertyAttribute.js +2 -2
  132. package/Source/Scene/PropertyAttributeProperty.js +2 -2
  133. package/Source/Scene/PropertyTable.js +2 -2
  134. package/Source/Scene/PropertyTexture.js +2 -2
  135. package/Source/Scene/PropertyTextureProperty.js +2 -2
  136. package/Source/Scene/ResourceCache.js +9 -1
  137. package/Source/Scene/ResourceCacheKey.js +9 -1
  138. package/Source/Scene/Scene.js +20 -50
  139. package/Source/Scene/SpatialNode.js +375 -0
  140. package/Source/Scene/StructuralMetadata.js +2 -2
  141. package/Source/Scene/TileMetadata.js +2 -2
  142. package/Source/Scene/TilesetMetadata.js +2 -2
  143. package/Source/Scene/VoxelBoxShape.js +527 -0
  144. package/Source/Scene/VoxelContent.js +169 -0
  145. package/Source/Scene/VoxelCylinderShape.js +937 -0
  146. package/Source/Scene/VoxelEllipsoidShape.js +937 -0
  147. package/Source/Scene/VoxelPrimitive.js +1919 -0
  148. package/Source/Scene/VoxelProvider.js +255 -0
  149. package/Source/Scene/VoxelRenderResources.js +224 -0
  150. package/Source/Scene/VoxelShape.js +152 -0
  151. package/Source/Scene/VoxelShapeType.js +105 -0
  152. package/Source/Scene/VoxelTraversal.js +1144 -0
  153. package/Source/Scene/buildVoxelDrawCommands.js +116 -0
  154. package/Source/Scene/parseBatchTable.js +18 -2
  155. package/Source/Scene/preprocess3DTileContent.js +8 -0
  156. package/Source/Scene/processVoxelProperties.js +455 -0
  157. package/Source/Shaders/BillboardCollectionVS.glsl +1 -1
  158. package/Source/Shaders/BillboardCollectionVS.js +1 -1
  159. package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
  160. package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
  161. package/Source/Shaders/Builtin/Constants/passVoxels.glsl +9 -0
  162. package/Source/Shaders/Builtin/Constants/passVoxels.js +11 -0
  163. package/Source/Shaders/Builtin/CzmBuiltins.js +2 -0
  164. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.glsl +55 -43
  165. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +55 -43
  166. package/Source/Shaders/GlobeFS.glsl +2 -1
  167. package/Source/Shaders/GlobeFS.js +2 -1
  168. package/Source/Shaders/PointPrimitiveCollectionVS.glsl +5 -2
  169. package/Source/Shaders/PointPrimitiveCollectionVS.js +5 -2
  170. package/Source/Shaders/Voxels/IntersectBox.glsl +79 -0
  171. package/Source/Shaders/Voxels/IntersectBox.js +81 -0
  172. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +70 -0
  173. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +72 -0
  174. package/Source/Shaders/Voxels/IntersectCylinder.glsl +273 -0
  175. package/Source/Shaders/Voxels/IntersectCylinder.js +275 -0
  176. package/Source/Shaders/Voxels/IntersectDepth.glsl +23 -0
  177. package/Source/Shaders/Voxels/IntersectDepth.js +25 -0
  178. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +337 -0
  179. package/Source/Shaders/Voxels/IntersectEllipsoid.js +339 -0
  180. package/Source/Shaders/Voxels/Intersection.glsl +54 -0
  181. package/Source/Shaders/Voxels/Intersection.js +56 -0
  182. package/Source/Shaders/Voxels/IntersectionUtils.glsl +151 -0
  183. package/Source/Shaders/Voxels/IntersectionUtils.js +153 -0
  184. package/Source/Shaders/Voxels/Megatexture.glsl +136 -0
  185. package/Source/Shaders/Voxels/Megatexture.js +138 -0
  186. package/Source/Shaders/Voxels/Octree.glsl +221 -0
  187. package/Source/Shaders/Voxels/Octree.js +223 -0
  188. package/Source/Shaders/Voxels/VoxelFS.glsl +150 -0
  189. package/Source/Shaders/Voxels/VoxelFS.js +152 -0
  190. package/Source/Shaders/Voxels/VoxelVS.glsl +11 -0
  191. package/Source/Shaders/Voxels/VoxelVS.js +13 -0
  192. package/Source/Shaders/Voxels/convertUvToBox.glsl +16 -0
  193. package/Source/Shaders/Voxels/convertUvToBox.js +18 -0
  194. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +79 -0
  195. package/Source/Shaders/Voxels/convertUvToCylinder.js +81 -0
  196. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +133 -0
  197. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +135 -0
  198. package/Source/ThirdParty/Workers/draco_decoder_nodejs.js +100 -101
  199. package/Source/ThirdParty/Workers/pako_deflate.min.js +2 -2
  200. package/Source/ThirdParty/Workers/pako_inflate.min.js +2 -2
  201. package/Source/ThirdParty/draco_decoder.wasm +0 -0
  202. package/Source/Widget/CesiumWidget.js +1 -1
  203. package/index.d.ts +961 -56
  204. package/index.js +92 -60
  205. package/package.json +6 -4
  206. package/Build/ThirdParty/Workers/basis_transcoder.js +0 -2233
  207. package/Build/ThirdParty/Workers/draco_decoder_nodejs.js +0 -1872
  208. package/Build/ThirdParty/Workers/package.json +0 -1
  209. package/Build/ThirdParty/Workers/pako_deflate.min.js +0 -589
  210. package/Build/ThirdParty/Workers/pako_inflate.min.js +0 -798
  211. package/Build/ThirdParty/Workers/z-worker-pako.js +0 -503
  212. package/Build/ThirdParty/basis_transcoder.wasm +0 -0
  213. package/Build/ThirdParty/draco_decoder.wasm +0 -0
  214. package/Build/ThirdParty/google-earth-dbroot-parser.js +0 -8019
  215. package/Build/Widget/CesiumWidget.css +0 -120
  216. package/Build/Widget/lighter.css +0 -13
  217. package/Build/Workers/PolygonPipeline-774a8aaf.js +0 -1341
@@ -81,50 +81,13 @@ const requestRenderAfterFrame = function (scene) {
81
81
  /**
82
82
  * The container for all 3D graphical objects and state in a Cesium virtual scene. Generally,
83
83
  * a scene is not created directly; instead, it is implicitly created by {@link CesiumWidget}.
84
- * <p>
85
- * <em><code>contextOptions</code> parameter details:</em>
86
- * </p>
87
- * <p>
88
- * The default values are:
89
- * <code>
90
- * {
91
- * webgl : {
92
- * alpha : false,
93
- * depth : true,
94
- * stencil : false,
95
- * antialias : true,
96
- * powerPreference: 'high-performance',
97
- * premultipliedAlpha : true,
98
- * preserveDrawingBuffer : false,
99
- * failIfMajorPerformanceCaveat : false
100
- * },
101
- * allowTextureFilterAnisotropic : true
102
- * }
103
- * </code>
104
- * </p>
105
- * <p>
106
- * The <code>webgl</code> property corresponds to the {@link http://www.khronos.org/registry/webgl/specs/latest/#5.2|WebGLContextAttributes}
107
- * object used to create the WebGL context.
108
- * </p>
109
- * <p>
110
- * <code>webgl.alpha</code> defaults to false, which can improve performance compared to the standard WebGL default
111
- * of true. If an application needs to composite Cesium above other HTML elements using alpha-blending, set
112
- * <code>webgl.alpha</code> to true.
113
- * </p>
114
- * <p>
115
- * The other <code>webgl</code> properties match the WebGL defaults for {@link http://www.khronos.org/registry/webgl/specs/latest/#5.2|WebGLContextAttributes}.
116
- * </p>
117
- * <p>
118
- * <code>allowTextureFilterAnisotropic</code> defaults to true, which enables anisotropic texture filtering when the
119
- * WebGL extension is supported. Setting this to false will improve performance, but hurt visual quality, especially for horizon views.
120
- * </p>
121
84
  *
122
85
  * @alias Scene
123
86
  * @constructor
124
87
  *
125
88
  * @param {Object} options Object with the following properties:
126
89
  * @param {HTMLCanvasElement} options.canvas The HTML canvas element to create the scene for.
127
- * @param {Object} [options.contextOptions] Context and WebGL creation properties. See details above.
90
+ * @param {ContextOptions} [options.contextOptions] Context and WebGL creation properties.
128
91
  * @param {Element} [options.creditContainer] The HTML element in which the credits will be displayed.
129
92
  * @param {Element} [options.creditViewport] The HTML element in which to display the credit popup. If not specified, the viewport will be a added as a sibling of the canvas.
130
93
  * @param {MapProjection} [options.mapProjection=new GeographicProjection()] The map projection to use in 2D and Columbus View modes.
@@ -134,7 +97,7 @@ const requestRenderAfterFrame = function (scene) {
134
97
  * @param {MapMode2D} [options.mapMode2D=MapMode2D.INFINITE_SCROLL] Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction.
135
98
  * @param {Boolean} [options.requestRenderMode=false] If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling improves performance of the application, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}.
136
99
  * @param {Number} [options.maximumRenderTimeChange=0.0] If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}.
137
- * @param {Number} [depthPlaneEllipsoidOffset=0.0] Adjust the DepthPlane to address rendering artefacts below ellipsoid zero elevation.
100
+ * @param {Number} [options.depthPlaneEllipsoidOffset=0.0] Adjust the DepthPlane to address rendering artefacts below ellipsoid zero elevation.
138
101
  * @param {Number} [options.msaaSamples=1] If provided, this value controls the rate of multisample antialiasing. Typical multisampling rates are 2, 4, and sometimes 8 samples per pixel. Higher sampling rates of MSAA may impact performance in exchange for improved visual quality. This value only applies to WebGL2 contexts that support multisample render targets.
139
102
  *
140
103
  * @see CesiumWidget
@@ -157,17 +120,7 @@ function Scene(options) {
157
120
  let creditContainer = options.creditContainer;
158
121
  let creditViewport = options.creditViewport;
159
122
 
160
- let contextOptions = clone(options.contextOptions);
161
- if (!defined(contextOptions)) {
162
- contextOptions = {};
163
- }
164
- if (!defined(contextOptions.webgl)) {
165
- contextOptions.webgl = {};
166
- }
167
- contextOptions.webgl.powerPreference = defaultValue(
168
- contextOptions.webgl.powerPreference,
169
- "high-performance"
170
- );
123
+ const contextOptions = clone(options.contextOptions);
171
124
 
172
125
  //>>includeStart('debug', pragmas.debug);
173
126
  if (!defined(canvas)) {
@@ -2262,6 +2215,17 @@ function executeTranslucentCommandsFrontToBack(
2262
2215
  }
2263
2216
  }
2264
2217
 
2218
+ function executeVoxelCommands(scene, executeFunction, passState, commands) {
2219
+ const context = scene.context;
2220
+
2221
+ mergeSort(commands, backToFront, scene.camera.positionWC);
2222
+
2223
+ const length = commands.length;
2224
+ for (let i = 0; i < length; ++i) {
2225
+ executeFunction(commands[i], scene, context, passState);
2226
+ }
2227
+ }
2228
+
2265
2229
  const scratchPerspectiveFrustum = new PerspectiveFrustum();
2266
2230
  const scratchPerspectiveOffCenterFrustum = new PerspectiveOffCenterFrustum();
2267
2231
  const scratchOrthographicFrustum = new OrthographicFrustum();
@@ -2670,6 +2634,12 @@ function executeCommands(scene, passState) {
2670
2634
  pickDepth.executeCopyDepth(context, passState);
2671
2635
  }
2672
2636
 
2637
+ us.updatePass(Pass.VOXELS);
2638
+ commands = frustumCommands.commands[Pass.VOXELS];
2639
+ length = frustumCommands.indices[Pass.VOXELS];
2640
+ commands.length = length;
2641
+ executeVoxelCommands(scene, executeCommand, passState, commands);
2642
+
2673
2643
  if (picking || !usePostProcessSelected) {
2674
2644
  continue;
2675
2645
  }
@@ -0,0 +1,375 @@
1
+ import binarySearch from "../Core/binarySearch.js";
2
+ import Cartesian3 from "../Core/Cartesian3.js";
3
+ import CesiumMath from "../Core/Math.js";
4
+ import defined from "../Core/defined.js";
5
+ import DeveloperError from "../Core/DeveloperError.js";
6
+ import KeyframeNode from "./KeyframeNode.js";
7
+ import Matrix3 from "../Core/Matrix3.js";
8
+ import OrientedBoundingBox from "../Core/OrientedBoundingBox.js";
9
+
10
+ /**
11
+ * @alias SpatialNode
12
+ * @constructor
13
+ *
14
+ * @param {Number} level
15
+ * @param {Number} x
16
+ * @param {Number} y
17
+ * @param {Number} z
18
+ * @param {SpatialNode} parent
19
+ * @param {VoxelShapeType} shape
20
+ * @param {Cartesian3} voxelDimensions
21
+ *
22
+ * @private
23
+ */
24
+ function SpatialNode(level, x, y, z, parent, shape, voxelDimensions) {
25
+ /**
26
+ * @ignore
27
+ * @type {SpatialNode[]}
28
+ */
29
+ this.children = undefined;
30
+ this.parent = parent;
31
+
32
+ this.level = level;
33
+ this.x = x;
34
+ this.y = y;
35
+ this.z = z;
36
+
37
+ /**
38
+ * @ignore
39
+ * @type {KeyframeNode[]}
40
+ */
41
+ this.keyframeNodes = [];
42
+ /**
43
+ * @ignore
44
+ * @type {KeyframeNode[]}
45
+ */
46
+ this.renderableKeyframeNodes = [];
47
+
48
+ this.renderableKeyframeNodeLerp = 0.0;
49
+ /**
50
+ * @ignore
51
+ * @type {KeyframeNode}
52
+ */
53
+ this.renderableKeyframeNodePrevious = undefined;
54
+ /**
55
+ * @ignore
56
+ * @type {KeyframeNode}
57
+ */
58
+ this.renderableKeyframeNodeNext = undefined;
59
+
60
+ this.orientedBoundingBox = new OrientedBoundingBox();
61
+ this.approximateVoxelSize = 0.0;
62
+ this.screenSpaceError = 0.0;
63
+ this.visitedFrameNumber = -1;
64
+
65
+ this.computeBoundingVolumes(shape, voxelDimensions);
66
+ }
67
+
68
+ /**
69
+ * @param {SpatialNode} a
70
+ * @param {SpatialNode} b
71
+ * @returns {Boolean}
72
+ */
73
+ SpatialNode.spatialComparator = function (a, b) {
74
+ // The higher of the two screen space errors is prioritized
75
+ return b.screenSpaceError - a.screenSpaceError;
76
+ };
77
+
78
+ const scratchObbHalfScale = new Cartesian3();
79
+
80
+ /**
81
+ * @param {VoxelShape} shape
82
+ * @param {Cartesian3} voxelDimensions
83
+ */
84
+ SpatialNode.prototype.computeBoundingVolumes = function (
85
+ shape,
86
+ voxelDimensions
87
+ ) {
88
+ this.orientedBoundingBox = shape.computeOrientedBoundingBoxForTile(
89
+ this.level,
90
+ this.x,
91
+ this.y,
92
+ this.z,
93
+ this.orientedBoundingBox
94
+ );
95
+
96
+ const halfScale = Matrix3.getScale(
97
+ this.orientedBoundingBox.halfAxes,
98
+ scratchObbHalfScale
99
+ );
100
+ const maximumScale = 2.0 * Cartesian3.maximumComponent(halfScale);
101
+ this.approximateVoxelSize =
102
+ maximumScale / Cartesian3.minimumComponent(voxelDimensions);
103
+ };
104
+
105
+ /**
106
+ * @param {FrameState} frameState
107
+ * @param {Number} visibilityPlaneMask
108
+ * @returns {Number} A plane mask as described in {@link CullingVolume#computeVisibilityWithPlaneMask}.
109
+ */
110
+ SpatialNode.prototype.visibility = function (frameState, visibilityPlaneMask) {
111
+ const obb = this.orientedBoundingBox;
112
+ const cullingVolume = frameState.cullingVolume;
113
+ return cullingVolume.computeVisibilityWithPlaneMask(obb, visibilityPlaneMask);
114
+ };
115
+
116
+ /**
117
+ * @param {Cartesian3} cameraPosition
118
+ * @param {Number} screenSpaceErrorMultiplier
119
+ */
120
+ SpatialNode.prototype.computeScreenSpaceError = function (
121
+ cameraPosition,
122
+ screenSpaceErrorMultiplier
123
+ ) {
124
+ const obb = this.orientedBoundingBox;
125
+
126
+ let distance = Math.sqrt(obb.distanceSquaredTo(cameraPosition));
127
+ // Avoid divide-by-zero when viewer is inside the tile.
128
+ distance = Math.max(distance, CesiumMath.EPSILON7);
129
+ const approximateVoxelSize = this.approximateVoxelSize;
130
+ const error = screenSpaceErrorMultiplier * (approximateVoxelSize / distance);
131
+ this.screenSpaceError = error;
132
+ };
133
+
134
+ // This object imitates a KeyframeNode. Only used for binary search function.
135
+ const scratchBinarySearchKeyframeNode = {
136
+ keyframe: 0,
137
+ };
138
+
139
+ /**
140
+ * Find the index of a given key frame position within an array of KeyframeNodes,
141
+ * or the complement (~) of the index where it would be in the sorted array.
142
+ * @param {Number} keyframe
143
+ * @param {KeyframeNode[]} keyframeNodes
144
+ * @returns {Number}
145
+ * @private
146
+ */
147
+ function findKeyframeIndex(keyframe, keyframeNodes) {
148
+ scratchBinarySearchKeyframeNode.keyframe = keyframe;
149
+ return binarySearch(
150
+ keyframeNodes,
151
+ scratchBinarySearchKeyframeNode,
152
+ KeyframeNode.searchComparator
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Computes the most suitable keyframes for rendering, balancing between temporal and visual quality.
158
+ *
159
+ * @param {Number} keyframeLocation
160
+ */
161
+ SpatialNode.prototype.computeSurroundingRenderableKeyframeNodes = function (
162
+ keyframeLocation
163
+ ) {
164
+ let spatialNode = this;
165
+ const startLevel = spatialNode.level;
166
+
167
+ const targetKeyframePrev = Math.floor(keyframeLocation);
168
+ const targetKeyframeNext = Math.ceil(keyframeLocation);
169
+
170
+ let bestKeyframeNodePrev;
171
+ let bestKeyframeNodeNext;
172
+ let minimumDistancePrev = +Number.MAX_VALUE;
173
+ let minimumDistanceNext = +Number.MAX_VALUE;
174
+
175
+ while (defined(spatialNode)) {
176
+ const renderableKeyframeNodes = spatialNode.renderableKeyframeNodes;
177
+
178
+ if (renderableKeyframeNodes.length >= 1) {
179
+ let keyframeNodeIndexPrev = findKeyframeIndex(
180
+ targetKeyframePrev,
181
+ renderableKeyframeNodes
182
+ );
183
+ if (keyframeNodeIndexPrev < 0) {
184
+ keyframeNodeIndexPrev = CesiumMath.clamp(
185
+ ~keyframeNodeIndexPrev - 1,
186
+ 0,
187
+ renderableKeyframeNodes.length - 1
188
+ );
189
+ }
190
+ const keyframeNodePrev = renderableKeyframeNodes[keyframeNodeIndexPrev];
191
+ const keyframePrev = keyframeNodePrev.keyframe;
192
+
193
+ let keyframeNodeNext;
194
+ if (
195
+ targetKeyframeNext === targetKeyframePrev ||
196
+ targetKeyframePrev < keyframePrev
197
+ ) {
198
+ keyframeNodeNext = keyframeNodePrev;
199
+ } else {
200
+ const keyframeNodeIndexNext = Math.min(
201
+ keyframeNodeIndexPrev + 1,
202
+ renderableKeyframeNodes.length - 1
203
+ );
204
+ keyframeNodeNext = renderableKeyframeNodes[keyframeNodeIndexNext];
205
+ }
206
+ const keyframeNext = keyframeNodeNext.keyframe;
207
+
208
+ const keyframeDistancePrev = targetKeyframePrev - keyframePrev;
209
+ const keyframeDistanceNext = keyframeNext - targetKeyframeNext;
210
+ const levelDistance = startLevel - spatialNode.level;
211
+
212
+ // Balance temporal and visual quality
213
+ const levelWeight = Math.exp(levelDistance * 4.0);
214
+ const normalKeyframeWeight = 1.0;
215
+ const reverseKeyframeWeight = 200.0; // Keyframes on the opposite of the desired direction are deprioritized.
216
+ const distancePrev =
217
+ levelDistance * levelWeight +
218
+ (keyframeDistancePrev >= 0
219
+ ? keyframeDistancePrev * normalKeyframeWeight
220
+ : -keyframeDistancePrev * reverseKeyframeWeight);
221
+ const distanceNext =
222
+ levelDistance * levelWeight +
223
+ (keyframeDistanceNext >= 0
224
+ ? keyframeDistanceNext * normalKeyframeWeight
225
+ : -keyframeDistanceNext * reverseKeyframeWeight);
226
+
227
+ if (distancePrev < minimumDistancePrev) {
228
+ minimumDistancePrev = distancePrev;
229
+ bestKeyframeNodePrev = keyframeNodePrev;
230
+ }
231
+ if (distanceNext < minimumDistanceNext) {
232
+ minimumDistanceNext = distanceNext;
233
+ bestKeyframeNodeNext = keyframeNodeNext;
234
+ }
235
+ if (keyframeDistancePrev === 0 && keyframeDistanceNext === 0) {
236
+ // Nothing higher up will be better, so break early.
237
+ break;
238
+ }
239
+ }
240
+
241
+ spatialNode = spatialNode.parent;
242
+ }
243
+
244
+ this.renderableKeyframeNodePrevious = bestKeyframeNodePrev;
245
+ this.renderableKeyframeNodeNext = bestKeyframeNodeNext;
246
+ if (defined(bestKeyframeNodePrev) && defined(bestKeyframeNodeNext)) {
247
+ const bestKeyframePrev = bestKeyframeNodePrev.keyframe;
248
+ const bestKeyframeNext = bestKeyframeNodeNext.keyframe;
249
+ this.renderableKeyframeNodeLerp =
250
+ bestKeyframePrev === bestKeyframeNext
251
+ ? 0.0
252
+ : CesiumMath.clamp(
253
+ (keyframeLocation - bestKeyframePrev) /
254
+ (bestKeyframeNext - bestKeyframePrev),
255
+ 0.0,
256
+ 1.0
257
+ );
258
+ }
259
+ };
260
+
261
+ /**
262
+ * @param {Number} frameNumber
263
+ * @returns {Boolean}
264
+ */
265
+ SpatialNode.prototype.isVisited = function (frameNumber) {
266
+ return this.visitedFrameNumber === frameNumber;
267
+ };
268
+
269
+ /**
270
+ * @param {Number} keyframe
271
+ */
272
+ SpatialNode.prototype.createKeyframeNode = function (keyframe) {
273
+ let index = findKeyframeIndex(keyframe, this.keyframeNodes);
274
+ if (index < 0) {
275
+ index = ~index; // convert to insertion index
276
+ const keyframeNode = new KeyframeNode(this, keyframe);
277
+ this.keyframeNodes.splice(index, 0, keyframeNode);
278
+ }
279
+ };
280
+
281
+ /**
282
+ * @param {KeyframeNode} keyframeNode
283
+ * @param {Megatexture[]} megatextures
284
+ */
285
+ SpatialNode.prototype.destroyKeyframeNode = function (
286
+ keyframeNode,
287
+ megatextures
288
+ ) {
289
+ const keyframe = keyframeNode.keyframe;
290
+ const keyframeIndex = findKeyframeIndex(keyframe, this.keyframeNodes);
291
+ if (keyframeIndex < 0) {
292
+ throw new DeveloperError("Keyframe node does not exist.");
293
+ }
294
+
295
+ this.keyframeNodes.splice(keyframeIndex, 1);
296
+
297
+ if (keyframeNode.megatextureIndex !== -1) {
298
+ for (let i = 0; i < megatextures.length; i++) {
299
+ megatextures[i].remove(keyframeNode.megatextureIndex);
300
+ }
301
+
302
+ const renderableKeyframeNodeIndex = findKeyframeIndex(
303
+ keyframe,
304
+ this.renderableKeyframeNodes
305
+ );
306
+ if (renderableKeyframeNodeIndex < 0) {
307
+ throw new DeveloperError("Renderable keyframe node does not exist.");
308
+ }
309
+
310
+ this.renderableKeyframeNodes.splice(renderableKeyframeNodeIndex, 1);
311
+ }
312
+
313
+ keyframeNode.spatialNode = undefined;
314
+ keyframeNode.state = KeyframeNode.LoadState.UNLOADED;
315
+ keyframeNode.metadatas = {};
316
+ keyframeNode.megatextureIndex = -1;
317
+ keyframeNode.priority = -Number.MAX_VALUE;
318
+ keyframeNode.highPriorityFrameNumber = -1;
319
+ };
320
+
321
+ /**
322
+ * @param {KeyframeNode} keyframeNode
323
+ * @param {Megatexture[]} megatextures
324
+ */
325
+ SpatialNode.prototype.addKeyframeNodeToMegatextures = function (
326
+ keyframeNode,
327
+ megatextures
328
+ ) {
329
+ if (
330
+ keyframeNode.state !== KeyframeNode.LoadState.RECEIVED ||
331
+ keyframeNode.megatextureIndex !== -1 ||
332
+ keyframeNode.metadatas.length !== megatextures.length
333
+ ) {
334
+ throw new DeveloperError("Keyframe node cannot be added to megatexture");
335
+ }
336
+
337
+ for (let i = 0; i < megatextures.length; i++) {
338
+ const megatexture = megatextures[i];
339
+ keyframeNode.megatextureIndex = megatexture.add(keyframeNode.metadatas[i]);
340
+ keyframeNode.metadatas[i] = undefined; // data is in megatexture so no need to hold onto it
341
+ }
342
+
343
+ keyframeNode.state = KeyframeNode.LoadState.LOADED;
344
+
345
+ const renderableKeyframeNodes = this.renderableKeyframeNodes;
346
+ let renderableKeyframeNodeIndex = findKeyframeIndex(
347
+ keyframeNode.keyframe,
348
+ renderableKeyframeNodes
349
+ );
350
+ if (renderableKeyframeNodeIndex >= 0) {
351
+ throw new DeveloperError("Keyframe already renderable");
352
+ }
353
+ renderableKeyframeNodeIndex = ~renderableKeyframeNodeIndex;
354
+ renderableKeyframeNodes.splice(renderableKeyframeNodeIndex, 0, keyframeNode);
355
+ };
356
+
357
+ /**
358
+ * @param {Number} frameNumber
359
+ * @returns Boolean
360
+ */
361
+ SpatialNode.prototype.isRenderable = function (frameNumber) {
362
+ const previousNode = this.renderableKeyframeNodePrevious;
363
+ const nextNode = this.renderableKeyframeNodeNext;
364
+ const level = this.level;
365
+
366
+ return (
367
+ defined(previousNode) &&
368
+ defined(nextNode) &&
369
+ (previousNode.spatialNode.level === level ||
370
+ nextNode.spatialNode.level === level) &&
371
+ this.visitedFrameNumber === frameNumber
372
+ );
373
+ };
374
+
375
+ export default SpatialNode;
@@ -76,7 +76,7 @@ Object.defineProperties(StructuralMetadata.prototype, {
76
76
  },
77
77
 
78
78
  /**
79
- * Extras in the JSON object.
79
+ * Extra user-defined properties.
80
80
  *
81
81
  * @memberof StructuralMetadata.prototype
82
82
  * @type {*}
@@ -90,7 +90,7 @@ Object.defineProperties(StructuralMetadata.prototype, {
90
90
  },
91
91
 
92
92
  /**
93
- * Extensions in the JSON object.
93
+ * An object containing extensions.
94
94
  *
95
95
  * @memberof StructuralMetadata.prototype
96
96
  * @type {Object}
@@ -50,7 +50,7 @@ Object.defineProperties(TileMetadata.prototype, {
50
50
  },
51
51
 
52
52
  /**
53
- * Extras in the JSON object.
53
+ * Extra user-defined properties.
54
54
  *
55
55
  * @memberof TileMetadata.prototype
56
56
  * @type {Object}
@@ -64,7 +64,7 @@ Object.defineProperties(TileMetadata.prototype, {
64
64
  },
65
65
 
66
66
  /**
67
- * Extensions in the JSON object.
67
+ * An object containing extensions.
68
68
  *
69
69
  * @memberof TileMetadata.prototype
70
70
  * @type {Object}
@@ -52,7 +52,7 @@ Object.defineProperties(TilesetMetadata.prototype, {
52
52
  },
53
53
 
54
54
  /**
55
- * Extras in the JSON object.
55
+ * Extra user-defined properties.
56
56
  *
57
57
  * @memberof TilesetMetadata.prototype
58
58
  * @type {*}
@@ -66,7 +66,7 @@ Object.defineProperties(TilesetMetadata.prototype, {
66
66
  },
67
67
 
68
68
  /**
69
- * Extensions in the JSON object.
69
+ * An object containing extensions.
70
70
  *
71
71
  * @memberof TilesetMetadata.prototype
72
72
  * @type {Object}