@cesium/engine 16.0.0 → 18.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 (160) hide show
  1. package/Build/ThirdParty/Workers/z-worker-pako.js +1 -1
  2. package/Build/Workers/{chunk-OWLBD6BL.js → chunk-2AXPWBJG.js} +1 -1
  3. package/Build/Workers/{chunk-PB6SE3SZ.js → chunk-2CAYUY2B.js} +8 -8
  4. package/Build/Workers/{chunk-SCUQTTCN.js → chunk-2NKHPWDY.js} +12 -12
  5. package/Build/Workers/{chunk-YA4XALD5.js → chunk-2QNKQVUT.js} +5 -5
  6. package/Build/Workers/{chunk-WGIOUM2S.js → chunk-3RKVDGRF.js} +8 -8
  7. package/Build/Workers/{chunk-RWAFHSX3.js → chunk-4DSTDGY3.js} +2 -2
  8. package/Build/Workers/{chunk-YL26OJCG.js → chunk-4MIY63FM.js} +13 -13
  9. package/Build/Workers/{chunk-34EWMUFG.js → chunk-5OL6XFNS.js} +1 -1
  10. package/Build/Workers/{chunk-B75OO2DU.js → chunk-5WVF4BK7.js} +5 -5
  11. package/Build/Workers/{chunk-EAWYQ44R.js → chunk-AEGAQ6FD.js} +12 -12
  12. package/Build/Workers/{chunk-4LHK6E47.js → chunk-CES6DHHV.js} +1 -1
  13. package/Build/Workers/{chunk-S3IQBSIB.js → chunk-DINSLSJD.js} +6 -6
  14. package/Build/Workers/{chunk-KV6TEHXY.js → chunk-EHB2OCQX.js} +4 -4
  15. package/Build/Workers/{chunk-NREPBWCX.js → chunk-EXEZHW3P.js} +4 -4
  16. package/Build/Workers/{chunk-ICU72UPR.js → chunk-F4ZAKN4V.js} +2 -2
  17. package/Build/Workers/{chunk-S2NKKWYE.js → chunk-FPYBD2P5.js} +1 -1
  18. package/Build/Workers/{chunk-KKV6XBF5.js → chunk-GAUF4F5A.js} +16 -16
  19. package/Build/Workers/{chunk-ERKJ7IWJ.js → chunk-GM55YFOB.js} +14 -14
  20. package/Build/Workers/{chunk-NB6D74SQ.js → chunk-GS55WTRX.js} +6 -6
  21. package/Build/Workers/{chunk-5TN3LG2T.js → chunk-HQE7KSR4.js} +2 -2
  22. package/Build/Workers/{chunk-EO44CO62.js → chunk-HS76VTVY.js} +2 -2
  23. package/Build/Workers/{chunk-TL5YKZJF.js → chunk-I3BAKR4S.js} +16 -16
  24. package/Build/Workers/{chunk-OMFZ4IN6.js → chunk-IWGMVQGG.js} +9 -9
  25. package/Build/Workers/{chunk-VVTAI2TN.js → chunk-IWZK2AIH.js} +5 -5
  26. package/Build/Workers/{chunk-GQVSADCI.js → chunk-J4MAVE6J.js} +6 -6
  27. package/Build/Workers/{chunk-XF6EBVKV.js → chunk-JF4IYQYC.js} +7 -7
  28. package/Build/Workers/{chunk-CUJH7PS5.js → chunk-KGXTCGX3.js} +12 -12
  29. package/Build/Workers/{chunk-TBSA4MNF.js → chunk-KNA65INJ.js} +4 -4
  30. package/Build/Workers/{chunk-EOIUWEAK.js → chunk-LIPZUYNR.js} +11 -11
  31. package/Build/Workers/{chunk-TEUGW455.js → chunk-LWJWWCZ4.js} +6 -6
  32. package/Build/Workers/{chunk-ORIMMEHO.js → chunk-LZFUG3GO.js} +10 -10
  33. package/Build/Workers/{chunk-COOLDICB.js → chunk-MFGVMUN3.js} +5 -5
  34. package/Build/Workers/{chunk-FW2OX42E.js → chunk-NR7KSD56.js} +3 -3
  35. package/Build/Workers/{chunk-2TQ64T4I.js → chunk-NVJ5JRIM.js} +2 -2
  36. package/Build/Workers/{chunk-OMZGZVHI.js → chunk-NWSAYFZG.js} +6 -6
  37. package/Build/Workers/{chunk-PT6U7UNY.js → chunk-OATG6PKE.js} +12 -12
  38. package/Build/Workers/{chunk-M5J3S3HY.js → chunk-OIHAAHBK.js} +10 -10
  39. package/Build/Workers/{chunk-LCSH4ZOB.js → chunk-QN7JEOQV.js} +5 -5
  40. package/Build/Workers/{chunk-XMKE4XB2.js → chunk-QUSP3NWA.js} +5 -5
  41. package/Build/Workers/{chunk-ZLJDDRGB.js → chunk-RWFYLWSF.js} +9 -9
  42. package/Build/Workers/{chunk-OD4Q7HE5.js → chunk-SIOVJ4L5.js} +4 -4
  43. package/Build/Workers/{chunk-EJJDBH5W.js → chunk-T6B6H3GR.js} +7 -7
  44. package/Build/Workers/{chunk-YFXXUW6U.js → chunk-UK33ZN4K.js} +4 -4
  45. package/Build/Workers/{chunk-V4Y7C25O.js → chunk-VGJSKEIB.js} +4 -4
  46. package/Build/Workers/{chunk-VXAAIRJ7.js → chunk-W6CPO62M.js} +6 -6
  47. package/Build/Workers/{chunk-ILVAXLMC.js → chunk-WGHUCZMX.js} +7 -7
  48. package/Build/Workers/{chunk-GH6I7PBY.js → chunk-WTFZHPUW.js} +5 -5
  49. package/Build/Workers/{chunk-VNDECE6N.js → chunk-WYCR5DWQ.js} +2 -2
  50. package/Build/Workers/{chunk-6B7KGA5P.js → chunk-YV37YFUM.js} +9 -9
  51. package/Build/Workers/{chunk-CQNYYX3N.js → chunk-ZADJ6FRX.js} +4 -4
  52. package/Build/Workers/{chunk-ESED7XBA.js → chunk-ZIP27IX6.js} +6 -6
  53. package/Build/Workers/combineGeometry.js +21 -21
  54. package/Build/Workers/createBoxGeometry.js +15 -15
  55. package/Build/Workers/createBoxOutlineGeometry.js +13 -13
  56. package/Build/Workers/createCircleGeometry.js +23 -23
  57. package/Build/Workers/createCircleOutlineGeometry.js +16 -16
  58. package/Build/Workers/createCoplanarPolygonGeometry.js +30 -30
  59. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +28 -28
  60. package/Build/Workers/createCorridorGeometry.js +26 -26
  61. package/Build/Workers/createCorridorOutlineGeometry.js +25 -25
  62. package/Build/Workers/createCylinderGeometry.js +17 -17
  63. package/Build/Workers/createCylinderOutlineGeometry.js +15 -15
  64. package/Build/Workers/createEllipseGeometry.js +23 -23
  65. package/Build/Workers/createEllipseOutlineGeometry.js +16 -16
  66. package/Build/Workers/createEllipsoidGeometry.js +16 -16
  67. package/Build/Workers/createEllipsoidOutlineGeometry.js +15 -15
  68. package/Build/Workers/createFrustumGeometry.js +15 -15
  69. package/Build/Workers/createFrustumOutlineGeometry.js +15 -15
  70. package/Build/Workers/createGeometry.js +21 -21
  71. package/Build/Workers/createGroundPolylineGeometry.js +19 -19
  72. package/Build/Workers/createPlaneGeometry.js +13 -13
  73. package/Build/Workers/createPlaneOutlineGeometry.js +12 -12
  74. package/Build/Workers/createPolygonGeometry.js +29 -29
  75. package/Build/Workers/createPolygonOutlineGeometry.js +27 -27
  76. package/Build/Workers/createPolylineGeometry.js +22 -22
  77. package/Build/Workers/createPolylineVolumeGeometry.js +28 -28
  78. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +24 -24
  79. package/Build/Workers/createRectangleGeometry.js +24 -24
  80. package/Build/Workers/createRectangleOutlineGeometry.js +17 -17
  81. package/Build/Workers/createSimplePolylineGeometry.js +20 -20
  82. package/Build/Workers/createSphereGeometry.js +16 -16
  83. package/Build/Workers/createSphereOutlineGeometry.js +15 -15
  84. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  85. package/Build/Workers/createVectorTileClampedPolylines.js +12 -12
  86. package/Build/Workers/createVectorTileGeometries.js +21 -21
  87. package/Build/Workers/createVectorTilePoints.js +11 -11
  88. package/Build/Workers/createVectorTilePolygons.js +19 -19
  89. package/Build/Workers/createVectorTilePolylines.js +12 -12
  90. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +19 -19
  91. package/Build/Workers/createVerticesFromHeightmap.js +19 -19
  92. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +16 -16
  93. package/Build/Workers/createWallGeometry.js +21 -21
  94. package/Build/Workers/createWallOutlineGeometry.js +20 -20
  95. package/Build/Workers/decodeDraco.js +10 -10
  96. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  97. package/Build/Workers/decodeI3S.js +9 -9
  98. package/Build/Workers/transcodeKTX2.js +25 -6
  99. package/Build/Workers/transferTypedArrayTest.js +1 -1
  100. package/Build/Workers/upsampleQuantizedTerrainMesh.js +19 -19
  101. package/Source/Core/Check.d.ts +4 -1
  102. package/Source/Core/ITwinPlatform.js +6 -3
  103. package/Source/Core/Ion.js +1 -1
  104. package/Source/Core/PixelFormat.js +36 -0
  105. package/Source/Core/PolygonGeometry.js +1 -0
  106. package/Source/Core/RectangleOutlineGeometry.js +1 -1
  107. package/Source/Renderer/Texture3D.js +568 -0
  108. package/Source/Renderer/createUniform.js +1 -0
  109. package/Source/Renderer/createUniformArray.js +1 -0
  110. package/Source/Scene/ArcGisMapService.js +1 -1
  111. package/Source/Scene/Cesium3DTilesVoxelProvider.js +18 -23
  112. package/Source/Scene/Cesium3DTileset.js +138 -0
  113. package/Source/Scene/GlobeSurfaceShaderSet.js +4 -5
  114. package/Source/Scene/ImageryLayer.js +21 -6
  115. package/Source/Scene/ImageryLayerCollection.js +3 -2
  116. package/Source/Scene/Model/CartesianRectangle.js +108 -0
  117. package/Source/Scene/Model/ImageryConfiguration.js +25 -0
  118. package/Source/Scene/Model/ImageryCoverage.js +488 -0
  119. package/Source/Scene/Model/ImageryFlags.js +31 -0
  120. package/Source/Scene/Model/ImageryInput.js +60 -0
  121. package/Source/Scene/Model/ImageryPipelineStage.js +1040 -0
  122. package/Source/Scene/Model/MappedPositions.js +84 -0
  123. package/Source/Scene/Model/Model.js +38 -0
  124. package/Source/Scene/Model/ModelImagery.js +403 -0
  125. package/Source/Scene/Model/ModelImageryMapping.js +489 -0
  126. package/Source/Scene/Model/ModelPrimitiveImagery.js +972 -0
  127. package/Source/Scene/Model/ModelReader.js +810 -0
  128. package/Source/Scene/Model/ModelRenderResources.js +13 -0
  129. package/Source/Scene/Model/ModelRuntimePrimitive.js +19 -0
  130. package/Source/Scene/Model/ModelSceneGraph.js +133 -27
  131. package/Source/Scene/Model/NodeRenderResources.js +10 -0
  132. package/Source/Scene/ModelComponents.js +10 -0
  133. package/Source/Scene/QuadtreePrimitive.js +5 -1
  134. package/Source/Scene/VoxelBoxShape.js +38 -81
  135. package/Source/Scene/VoxelCylinderShape.js +128 -262
  136. package/Source/Scene/VoxelPrimitive.js +24 -39
  137. package/Source/Scene/VoxelRenderResources.js +1 -1
  138. package/Source/Scene/processVoxelProperties.js +41 -100
  139. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.glsl +0 -1
  140. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +0 -1
  141. package/Source/Shaders/GlobeFS.glsl +22 -0
  142. package/Source/Shaders/GlobeFS.js +22 -0
  143. package/Source/Shaders/Model/MaterialStageFS.glsl +4 -0
  144. package/Source/Shaders/Model/MaterialStageFS.js +4 -0
  145. package/Source/Shaders/Model/ModelVS.glsl +4 -0
  146. package/Source/Shaders/Model/ModelVS.js +4 -0
  147. package/Source/Shaders/PolylineCommon.glsl +1 -1
  148. package/Source/Shaders/PolylineCommon.js +1 -1
  149. package/Source/Shaders/Voxels/IntersectDepth.glsl +10 -3
  150. package/Source/Shaders/Voxels/IntersectDepth.js +10 -3
  151. package/Source/Shaders/Voxels/Intersection.glsl +1 -3
  152. package/Source/Shaders/Voxels/Intersection.js +1 -3
  153. package/Source/Shaders/Voxels/IntersectionUtils.glsl +1 -0
  154. package/Source/Shaders/Voxels/IntersectionUtils.js +1 -0
  155. package/Source/Shaders/Voxels/VoxelFS.glsl +37 -24
  156. package/Source/Shaders/Voxels/VoxelFS.js +37 -24
  157. package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
  158. package/index.d.ts +59 -7
  159. package/index.js +74 -62
  160. package/package.json +3 -3
@@ -29,9 +29,7 @@ RayShapeIntersection intersectScene(in vec2 screenCoord, in Ray ray, out Interse
29
29
  #endif\n\
30
30
  \n\
31
31
  // Depth\n\
32
- #if defined(DEPTH_TEST)\n\
33
- intersectDepth(screenCoord, ray, ix);\n\
34
- #endif\n\
32
+ intersectDepth(screenCoord, ray, ix);\n\
35
33
  \n\
36
34
  // Find the first intersection that's in front of the ray\n\
37
35
  #if (INTERSECTION_COUNT > 1)\n\
@@ -56,6 +56,7 @@ struct Intersections {
56
56
  // INTERSECTION_COUNT is the number of ray-*shape* (volume) intersections,
57
57
  // so we need twice as many to track ray-*surface* intersections
58
58
  vec4 intersections[INTERSECTION_COUNT * 2];
59
+ float distanceToDepthBuffer;
59
60
 
60
61
  #if (INTERSECTION_COUNT > 1)
61
62
  // Maintain state for future nextIntersection calls
@@ -57,6 +57,7 @@ struct Intersections {\n\
57
57
  // INTERSECTION_COUNT is the number of ray-*shape* (volume) intersections,\n\
58
58
  // so we need twice as many to track ray-*surface* intersections\n\
59
59
  vec4 intersections[INTERSECTION_COUNT * 2];\n\
60
+ float distanceToDepthBuffer;\n\
60
61
  \n\
61
62
  #if (INTERSECTION_COUNT > 1)\n\
62
63
  // Maintain state for future nextIntersection calls\n\
@@ -15,8 +15,10 @@
15
15
  #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0
16
16
  #endif
17
17
 
18
+ uniform mat4 u_transformPositionUvToView;
18
19
  uniform mat3 u_transformDirectionViewToLocal;
19
20
  uniform vec3 u_cameraPositionUv;
21
+ uniform vec3 u_cameraDirectionUv;
20
22
  uniform float u_stepSize;
21
23
 
22
24
  #if defined(PICKING)
@@ -111,26 +113,38 @@ int getSampleIndex(in SampleData sampleData) {
111
113
  return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);
112
114
  }
113
115
 
114
- void main()
115
- {
116
- vec4 fragCoord = gl_FragCoord;
117
- vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]
118
- vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz);
119
- vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case
120
- vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case
121
- vec3 viewPosUv = u_cameraPositionUv;
116
+ /**
117
+ * Compute the view ray at the current fragment, in the local UV coordinates of the shape.
118
+ */
119
+ Ray getViewRayUv() {
120
+ vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);
121
+ vec3 viewDirUv;
122
+ vec3 viewPosUv;
123
+ if (czm_orthographicIn3D == 1.0) {
124
+ eyeCoordinates.z = 0.0;
125
+ viewPosUv = (u_transformPositionViewToUv * eyeCoordinates).xyz;
126
+ viewDirUv = normalize(u_cameraDirectionUv);
127
+ } else {
128
+ viewPosUv = u_cameraPositionUv;
129
+ viewDirUv = normalize(u_transformDirectionViewToLocal * eyeCoordinates.xyz);
130
+ }
122
131
  #if defined(SHAPE_ELLIPSOID)
123
132
  // viewDirUv has been scaled to a space where the ellipsoid is a sphere.
124
133
  // Undo this scaling to get the raw direction.
125
134
  vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv;
126
- Ray viewRayUv = Ray(viewPosUv, viewDirUv, rawDir);
135
+ return Ray(viewPosUv, viewDirUv, rawDir);
127
136
  #else
128
- Ray viewRayUv = Ray(viewPosUv, viewDirUv, viewDirUv);
137
+ return Ray(viewPosUv, viewDirUv, viewDirUv);
129
138
  #endif
139
+ }
140
+
141
+ void main()
142
+ {
143
+ Ray viewRayUv = getViewRayUv();
130
144
 
131
145
  Intersections ix;
146
+ vec2 screenCoord = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]
132
147
  RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix);
133
-
134
148
  // Exit early if the scene was completely missed.
135
149
  if (shapeIntersection.entry.w == NO_HIT) {
136
150
  discard;
@@ -138,7 +152,7 @@ void main()
138
152
 
139
153
  float currentT = shapeIntersection.entry.w;
140
154
  float endT = shapeIntersection.exit.w;
141
- vec3 positionUv = viewPosUv + currentT * viewDirUv;
155
+ vec3 positionUv = viewRayUv.pos + currentT * viewRayUv.dir;
142
156
  PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);
143
157
 
144
158
  // Traverse the tree from the start position
@@ -150,14 +164,15 @@ void main()
150
164
  #if defined(JITTER)
151
165
  float noise = hash(screenCoord); // [0,1]
152
166
  currentT += noise * step.w;
153
- positionUv += noise * step.w * viewDirUv;
167
+ positionUv += noise * step.w * viewRayUv.dir;
154
168
  #endif
155
169
 
156
170
  FragmentInput fragmentInput;
157
171
  #if defined(STATISTICS)
158
- setStatistics(fragmentInput.metadata.statistics);
172
+ setStatistics(fragmentInput.metadataStatistics);
159
173
  #endif
160
174
 
175
+ czm_modelMaterial materialOutput;
161
176
  vec4 colorAccum = vec4(0.0);
162
177
 
163
178
  for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) {
@@ -166,19 +181,19 @@ void main()
166
181
 
167
182
  // Prepare the custom shader inputs
168
183
  copyPropertiesToMetadata(properties, fragmentInput.metadata);
169
- fragmentInput.voxel.positionUv = positionUv;
170
- fragmentInput.voxel.positionShapeUv = pointJacobian.point;
171
- fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv;
172
- fragmentInput.voxel.viewDirUv = viewDirUv;
173
- fragmentInput.voxel.viewDirWorld = viewDirWorld;
174
- fragmentInput.voxel.surfaceNormal = step.xyz;
184
+
185
+ fragmentInput.attributes.positionEC = vec3(u_transformPositionUvToView * vec4(positionUv, 1.0));
186
+ fragmentInput.attributes.normalEC = normalize(czm_normal * step.xyz);
187
+
188
+ fragmentInput.voxel.viewDirUv = viewRayUv.dir;
189
+
175
190
  fragmentInput.voxel.travelDistance = step.w;
176
191
  fragmentInput.voxel.stepCount = stepCount;
177
192
  fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;
178
193
  fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);
194
+ fragmentInput.voxel.distanceToDepthBuffer = ix.distanceToDepthBuffer - currentT;
179
195
 
180
196
  // Run the custom shader
181
- czm_modelMaterial materialOutput;
182
197
  fragmentMain(fragmentInput, materialOutput);
183
198
 
184
199
  // Sanitize the custom shader output
@@ -203,8 +218,6 @@ void main()
203
218
 
204
219
  // Keep raymarching
205
220
  currentT += step.w;
206
- positionUv = viewPosUv + currentT * viewDirUv;
207
-
208
221
  // Check if there's more intersections.
209
222
  if (currentT > endT) {
210
223
  #if (INTERSECTION_COUNT == 1)
@@ -217,10 +230,10 @@ void main()
217
230
  // Found another intersection. Resume raymarching there
218
231
  currentT = shapeIntersection.entry.w;
219
232
  endT = shapeIntersection.exit.w;
220
- positionUv = viewPosUv + currentT * viewDirUv;
221
233
  }
222
234
  #endif
223
235
  }
236
+ positionUv = viewRayUv.pos + currentT * viewRayUv.dir;
224
237
 
225
238
  // Traverse the tree from the current ray position.
226
239
  // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step.
@@ -16,8 +16,10 @@ export default "// See Intersection.glsl for the definition of intersectScene\n\
16
16
  #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0\n\
17
17
  #endif\n\
18
18
  \n\
19
+ uniform mat4 u_transformPositionUvToView;\n\
19
20
  uniform mat3 u_transformDirectionViewToLocal;\n\
20
21
  uniform vec3 u_cameraPositionUv;\n\
22
+ uniform vec3 u_cameraDirectionUv;\n\
21
23
  uniform float u_stepSize;\n\
22
24
  \n\
23
25
  #if defined(PICKING)\n\
@@ -112,26 +114,38 @@ int getSampleIndex(in SampleData sampleData) {\n\
112
114
  return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);\n\
113
115
  }\n\
114
116
  \n\
115
- void main()\n\
116
- {\n\
117
- vec4 fragCoord = gl_FragCoord;\n\
118
- vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]\n\
119
- vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz);\n\
120
- vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case\n\
121
- vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case\n\
122
- vec3 viewPosUv = u_cameraPositionUv;\n\
117
+ /**\n\
118
+ * Compute the view ray at the current fragment, in the local UV coordinates of the shape.\n\
119
+ */\n\
120
+ Ray getViewRayUv() {\n\
121
+ vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);\n\
122
+ vec3 viewDirUv;\n\
123
+ vec3 viewPosUv;\n\
124
+ if (czm_orthographicIn3D == 1.0) {\n\
125
+ eyeCoordinates.z = 0.0;\n\
126
+ viewPosUv = (u_transformPositionViewToUv * eyeCoordinates).xyz;\n\
127
+ viewDirUv = normalize(u_cameraDirectionUv);\n\
128
+ } else {\n\
129
+ viewPosUv = u_cameraPositionUv;\n\
130
+ viewDirUv = normalize(u_transformDirectionViewToLocal * eyeCoordinates.xyz);\n\
131
+ }\n\
123
132
  #if defined(SHAPE_ELLIPSOID)\n\
124
133
  // viewDirUv has been scaled to a space where the ellipsoid is a sphere.\n\
125
134
  // Undo this scaling to get the raw direction.\n\
126
135
  vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv;\n\
127
- Ray viewRayUv = Ray(viewPosUv, viewDirUv, rawDir);\n\
136
+ return Ray(viewPosUv, viewDirUv, rawDir);\n\
128
137
  #else\n\
129
- Ray viewRayUv = Ray(viewPosUv, viewDirUv, viewDirUv);\n\
138
+ return Ray(viewPosUv, viewDirUv, viewDirUv);\n\
130
139
  #endif\n\
140
+ }\n\
141
+ \n\
142
+ void main()\n\
143
+ {\n\
144
+ Ray viewRayUv = getViewRayUv();\n\
131
145
  \n\
132
146
  Intersections ix;\n\
147
+ vec2 screenCoord = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]\n\
133
148
  RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix);\n\
134
- \n\
135
149
  // Exit early if the scene was completely missed.\n\
136
150
  if (shapeIntersection.entry.w == NO_HIT) {\n\
137
151
  discard;\n\
@@ -139,7 +153,7 @@ void main()\n\
139
153
  \n\
140
154
  float currentT = shapeIntersection.entry.w;\n\
141
155
  float endT = shapeIntersection.exit.w;\n\
142
- vec3 positionUv = viewPosUv + currentT * viewDirUv;\n\
156
+ vec3 positionUv = viewRayUv.pos + currentT * viewRayUv.dir;\n\
143
157
  PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);\n\
144
158
  \n\
145
159
  // Traverse the tree from the start position\n\
@@ -151,14 +165,15 @@ void main()\n\
151
165
  #if defined(JITTER)\n\
152
166
  float noise = hash(screenCoord); // [0,1]\n\
153
167
  currentT += noise * step.w;\n\
154
- positionUv += noise * step.w * viewDirUv;\n\
168
+ positionUv += noise * step.w * viewRayUv.dir;\n\
155
169
  #endif\n\
156
170
  \n\
157
171
  FragmentInput fragmentInput;\n\
158
172
  #if defined(STATISTICS)\n\
159
- setStatistics(fragmentInput.metadata.statistics);\n\
173
+ setStatistics(fragmentInput.metadataStatistics);\n\
160
174
  #endif\n\
161
175
  \n\
176
+ czm_modelMaterial materialOutput;\n\
162
177
  vec4 colorAccum = vec4(0.0);\n\
163
178
  \n\
164
179
  for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) {\n\
@@ -167,19 +182,19 @@ void main()\n\
167
182
  \n\
168
183
  // Prepare the custom shader inputs\n\
169
184
  copyPropertiesToMetadata(properties, fragmentInput.metadata);\n\
170
- fragmentInput.voxel.positionUv = positionUv;\n\
171
- fragmentInput.voxel.positionShapeUv = pointJacobian.point;\n\
172
- fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv;\n\
173
- fragmentInput.voxel.viewDirUv = viewDirUv;\n\
174
- fragmentInput.voxel.viewDirWorld = viewDirWorld;\n\
175
- fragmentInput.voxel.surfaceNormal = step.xyz;\n\
185
+ \n\
186
+ fragmentInput.attributes.positionEC = vec3(u_transformPositionUvToView * vec4(positionUv, 1.0));\n\
187
+ fragmentInput.attributes.normalEC = normalize(czm_normal * step.xyz);\n\
188
+ \n\
189
+ fragmentInput.voxel.viewDirUv = viewRayUv.dir;\n\
190
+ \n\
176
191
  fragmentInput.voxel.travelDistance = step.w;\n\
177
192
  fragmentInput.voxel.stepCount = stepCount;\n\
178
193
  fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;\n\
179
194
  fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);\n\
195
+ fragmentInput.voxel.distanceToDepthBuffer = ix.distanceToDepthBuffer - currentT;\n\
180
196
  \n\
181
197
  // Run the custom shader\n\
182
- czm_modelMaterial materialOutput;\n\
183
198
  fragmentMain(fragmentInput, materialOutput);\n\
184
199
  \n\
185
200
  // Sanitize the custom shader output\n\
@@ -204,8 +219,6 @@ void main()\n\
204
219
  \n\
205
220
  // Keep raymarching\n\
206
221
  currentT += step.w;\n\
207
- positionUv = viewPosUv + currentT * viewDirUv;\n\
208
- \n\
209
222
  // Check if there's more intersections.\n\
210
223
  if (currentT > endT) {\n\
211
224
  #if (INTERSECTION_COUNT == 1)\n\
@@ -218,10 +231,10 @@ void main()\n\
218
231
  // Found another intersection. Resume raymarching there\n\
219
232
  currentT = shapeIntersection.entry.w;\n\
220
233
  endT = shapeIntersection.exit.w;\n\
221
- positionUv = viewPosUv + currentT * viewDirUv;\n\
222
234
  }\n\
223
235
  #endif\n\
224
236
  }\n\
237
+ positionUv = viewRayUv.pos + currentT * viewRayUv.dir;\n\
225
238
  \n\
226
239
  // Traverse the tree from the current ray position.\n\
227
240
  // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step.\n\
@@ -1 +1 @@
1
- !function(){"use strict";const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:o,Uint32Array:i,Int32Array:c,Map:l,DataView:u,Promise:h,TextEncoder:f,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y,CompressionStream:m,DecompressionStream:_}=self,b=void 0,S="undefined",v="function";class k{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const z=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;z[e]=t}class D{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^z[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class C extends g{constructor(){let e;const t=new D;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new u(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const I={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=I.getPartial(n);return 32===s?e.concat(t):I._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+I.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,s.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=I.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=I.getPartial(r);return s.push(I.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},A={bytes:{fromBits(e){const t=I.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(I.partial(8*(3&n),s)),t}}},q=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;"string"==typeof e&&(e=A.utf8String.toBits(e));const n=t._buffer=I.concat(t._buffer,e),s=t._length,a=t._length=s+I.bitLength(e);if(a>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const o=new i(n);let c=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(o.subarray(16*c,16*(c+1))),c+=1;return n.splice(0,16*c),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=I.concat(t,[I.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let o=r[0],i=r[1],c=r[2],l=r[3],u=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,o)+n._f(e,i,c,l)+u+a[e]+n._key[s.floor(e/20)]|0;u=l,l=c,c=n._S(30,i),i=o,o=t}r[0]=r[0]+o|0,r[1]=r[1]+i|0,r[2]=r[2]+c|0,r[3]=r[3]+l|0,r[4]=r[4]+u|0}},R={getRandomValues(e){const t=new i(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;a<e.length;a+=4){const e=n(4294967296*(r||s.random()));r=987654071*e(),t[a/4]=4294967296*e()|0}return e}},H={importKey:e=>new H.hmacSha1(A.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const a=1+(s>>5)<<2;let o,i,c,l,h;const f=new ArrayBuffer(a),p=new u(f);let d=0;const g=I;for(t=A.bytes.toBits(t),h=1;(a||1)>d;h++){for(o=i=e.encrypt(g.concat(t,[h])),c=1;n>c;c++)for(i=e.encrypt(i),l=0;l<i.length;l++)o[l]^=i[l];for(c=0;(a||1)>d&&c<o.length;c++)p.setInt32(d,o[c]),d+=4}return f.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=q,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},P=typeof p!=S&&typeof p.getRandomValues==v,B="Invalid password",K="Invalid signature",T="zipjs-abort-check-password";function V(e){return P?p.getRandomValues(e):R.getRandomValues(e)}const x=16,E={name:"PBKDF2"},U=t.assign({hash:{name:"HMAC"}},E),W=t.assign({iterations:1e3,hash:{name:"SHA-1"}},E),M=["deriveBits"],N=[8,12,16],O=[16,24,32],L=10,F=[0,0,0,0],j=typeof p!=S,G=j&&p.subtle,X=j&&typeof G!=S,J=A.bytes,Q=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let o,i,c,l=1;if(4!==a&&6!==a&&8!==a)throw new r("invalid aes key size");for(t._key=[i=e.slice(0),c=[]],o=a;4*a+28>o;o++){let e=i[o-1];(o%a==0||8===a&&o%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],o%a==0&&(e=e<<8^e>>>24^l<<24,l=l<<1^283*(l>>7))),i[o]=i[o-a]^e}for(let e=0;o;e++,o--){const t=i[3&e?o:o-4];c[e]=4>=o||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let o,i,c,l;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let u=o=0;!n[u];u^=i||1,o=a[o]||1){let a=o^o<<1^o<<2^o<<3^o<<4;a=a>>8^255&a^99,n[u]=a,s[a]=u,l=r[c=r[i=r[u]]];let h=16843009*l^65537*c^257*i^16843008*u,f=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][u]=f=f<<24^f>>>8,t[n][a]=h=h<<24^h>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r("invalid aes block size");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],o=this._tables[t],i=o[0],c=o[1],l=o[2],u=o[3],h=o[4];let f,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],m=e[t?1:3]^n[3],_=4;for(let e=0;s>e;e++)f=i[g>>>24]^c[w>>16&255]^l[y>>8&255]^u[255&m]^n[_],p=i[w>>>24]^c[y>>16&255]^l[m>>8&255]^u[255&g]^n[_+1],d=i[y>>>24]^c[m>>16&255]^l[g>>8&255]^u[255&w]^n[_+2],m=i[m>>>24]^c[g>>16&255]^l[w>>8&255]^u[255&y]^n[_+3],_+=4,g=f,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=h[g>>>24]<<24^h[w>>16&255]<<16^h[y>>8&255]<<8^h[255&m]^n[_++],f=g,g=w,w=y,y=m,m=f;return a}},Y=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=I.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return I.clamp(t,r)}},Z=H.hmacSha1;let $=j&&X&&typeof G.importKey==v,ee=j&&X&&typeof G.deriveBits==v;class te extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:o,checkPasswordOnly:i}){super({start(){t.assign(this,{ready:new h((e=>this.resolveReady=e)),password:ae(e,n),signed:s,strength:o-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:o,resolveReady:c,ready:l}=n;s?(await(async(e,t,n,s)=>{const a=await re(e,t,n,ie(s,0,N[t])),o=ie(s,N[t]);if(a[0]!=o[0]||a[1]!=o[1])throw new r(B)})(n,o,s,ie(e,0,N[o]+2)),e=ie(e,N[o]+2),i?t.error(new r(T)):c()):await l;const u=new a(e.length-L-(e.length-L)%x);t.enqueue(se(n,e,u,0,L,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:o,ready:i}=this;if(s&&n){await i;const c=ie(o,0,o.length-L),l=ie(o,o.length-L);let u=new a;if(c.length){const e=le(J,c);s.update(e);const t=n.update(e);u=ce(J,t)}if(t){const e=ie(ce(J,s.digest()),0,L);for(let t=0;L>t;t++)if(e[t]!=l[t])throw new r(K)}e.enqueue(u)}}})}}class ne extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new h((e=>this.resolveReady=e)),password:ae(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:o,ready:i}=n;let c=new a;s?(c=await(async(e,t,n)=>{const s=V(new a(N[t]));return oe(s,await re(e,t,n,s))})(n,r,s),o()):await i;const l=new a(c.length+e.length-e.length%x);l.set(c,0),t.enqueue(se(n,e,l,c.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:o}=this;if(n&&t){await o;let i=new a;if(s.length){const e=t.update(le(J,s));n.update(e),i=ce(J,e)}r.signature=ce(J,n.digest()).slice(0,L),e.enqueue(oe(i,r.signature))}}}),r=this}}function se(e,t,n,s,r,o){const{ctr:i,hmac:c,pending:l}=e,u=t.length-r;let h;for(l.length&&(t=oe(l,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,u-u%x)),h=0;u-x>=h;h+=x){const e=le(J,ie(t,h,h+x));o&&c.update(e);const r=i.update(e);o||c.update(r),n.set(ce(J,r),h+s)}return e.pending=ie(t,h),n}async function re(n,s,r,o){n.password=null;const i=await(async(e,t,n,s,r)=>{if(!$)return H.importKey(t);try{return await G.importKey("raw",t,n,!1,r)}catch(e){return $=!1,H.importKey(t)}})(0,r,U,0,M),c=await(async(e,t,n)=>{if(!ee)return H.pbkdf2(t,e.salt,W.iterations,n);try{return await G.deriveBits(e,t,n)}catch(s){return ee=!1,H.pbkdf2(t,e.salt,W.iterations,n)}})(t.assign({salt:o},W),i,8*(2*O[s]+2)),l=new a(c),u=le(J,ie(l,0,O[s])),h=le(J,ie(l,O[s],2*O[s])),f=ie(l,2*O[s]);return t.assign(n,{keys:{key:u,authentication:h,passwordVerification:f},ctr:new Y(new Q(u),e.from(F)),hmac:new Z(h)}),f}function ae(e,t){return t===b?(e=>{if(typeof f==S){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new f).encode(e)})(e):t}function oe(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function ie(e,t,n){return e.subarray(t,n)}function ce(e,t){return e.fromBits(t)}function le(e,t){return e.toBits(t)}class ue extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;if(n.password){const t=fe(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new r(B);e=e.subarray(12)}s?t.error(new r(T)):t.enqueue(fe(n,e))}})}}class he extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=V(new a(12));t[11]=n.passwordVerification,s=new a(e.length+t.length),s.set(pe(n,t),0),r=12}else s=new a(e.length),r=0;s.set(pe(n,e),r),t.enqueue(s)}})}}function fe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,n[s]);return n}function pe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,t[s]);return n}function de(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new D(s[0]),crcKey2:new D(s[2])});for(let t=0;t<n.length;t++)ge(e,n.charCodeAt(t))}function ge(e,t){let[n,r,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),r=me(s.imul(me(r+ye(n)),134775813)+1),e.crcKey2.append([r>>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function we(e){const t=2|e.keys[2];return ye(s.imul(t,1^t)>>>8)}function ye(e){return 255&e}function me(e){return 4294967295&e}const _e="deflate-raw";class be extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:o,zipCrypto:i,signed:c,level:l}=e,h=this;let f,p,d=ve(super.readable);a&&!i||!c||(f=new C,d=De(d,f)),r&&(d=ze(d,o,{level:l,chunkSize:t},s,n)),a&&(i?d=De(d,new he(e)):(p=new ne(e),d=De(d,p))),ke(h,d,(()=>{let e;a&&!i&&(e=p.signature),a&&!i||!c||(e=new u(f.value.buffer).getUint32(0)),h.signature=e}))}}class Se extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:o,signed:i,signature:c,compressed:l,useCompressionStream:h}=e;let f,p,d=ve(super.readable);o&&(a?d=De(d,new ue(e)):(p=new te(e),d=De(d,p))),l&&(d=ze(d,h,{chunkSize:t},s,n)),o&&!a||!i||(f=new C,d=De(d,f)),ke(this,d,(()=>{if((!o||a)&&i){const e=new u(f.value.buffer);if(c!=e.getUint32(0,!1))throw new r(K)}}))}}function ve(e){return De(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ke(e,n,s){n=De(n,new g({flush:s})),t.defineProperty(e,"readable",{get:()=>n})}function ze(e,t,n,s,r){try{e=De(e,new(t&&s?s:r)(_e,n))}catch(s){if(!t)return e;try{e=De(e,new r(_e,n))}catch(t){return e}}return e}function De(e,t){return e.pipeThrough(t)}const Ce="data",Ie="close";class Ae extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith("deflate")?a=be:r.startsWith("inflate")&&(a=Se);let o=0,i=0;const c=new a(e,n),l=super.readable,u=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:i})}}),h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){const{signature:e}=c;t.assign(s,{signature:e,outputSize:o,inputSize:i})}});t.defineProperty(s,"readable",{get:()=>l.pipeThrough(u).pipeThrough(c).pipeThrough(h)})}}class qe extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Re=new l,He=new l;let Pe,Be=0,Ke=!0;async function Te(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Ke?importScripts.apply(b,s):await Ve(s)}catch(e){Ke=!1,await Ve(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new k(self.Deflate)),self.Inflate&&(r.DecompressionStream=new k(self.Inflate));const a={highWaterMark:1},o=e.readable||new w({async pull(e){const t=new h((e=>Re.set(Be,e)));xe({type:"pull",messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),i=e.writable||new y({async write(e){let t;const s=new h((e=>t=e));He.set(Be,t),xe({type:Ce,value:e,messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER,await s}},a),c=new Ae(t,r);Pe=new AbortController;const{signal:l}=Pe;await o.pipeThrough(c).pipeThrough(new qe(r.chunkSize)).pipeTo(i,{signal:l,preventClose:!0,preventAbort:!0}),await i.getWriter().close();const{signature:u,inputSize:f,outputSize:p}=c;xe({type:Ie,result:{signature:u,inputSize:f,outputSize:p}})}catch(e){Ee(e)}}async function Ve(e){for(const t of e)await import(t)}function xe(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ee(e=new r("Unknown error")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}function Ue(e,n,s){return class{constructor(r){const o=this;var i,c;i=r,c="level",(typeof t.hasOwn===v?t.hasOwn(i,c):i.hasOwnProperty(c))&&r.level===b&&delete r.level,o.codec=new e(t.assign({},n,r)),s(o.codec,(e=>{if(o.pendingData){const t=o.pendingData;o.pendingData=new a(t.length+e.length);const{pendingData:n}=o;n.set(t,0),n.set(e,t.length)}else o.pendingData=new a(e)}))}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}addEventListener("message",(({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if("start"==t&&Te(e),t==Ce){const e=Re.get(n);Re.delete(n),e({value:new a(s),done:r})}if("ack"==t){const e=He.get(n);He.delete(n),e()}t==Ie&&Pe.abort()}catch(e){Ee(e)}})),self.initCodec=()=>{const{Deflate:e,Inflate:t}=((e,t={},n)=>({Deflate:Ue(e.Deflate,t.deflate,n),Inflate:Ue(e.Inflate,t.inflate,n)}))(pako,{deflate:{raw:!0},inflate:{raw:!0}},((e,t)=>e.onData=t));self.Deflate=e,self.Inflate=t}}();
1
+ !function(){"use strict";const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:o,Uint32Array:i,Int32Array:c,Map:l,DataView:u,Promise:h,TextEncoder:f,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y,CompressionStream:m,DecompressionStream:_}=self,b=void 0,S="undefined",v="function";class k{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const z=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;z[e]=t}class D{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^z[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class C extends g{constructor(){let e;const t=new D;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new u(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const I={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=I.getPartial(n);return 32===s?e.concat(t):I._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+I.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,s.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=I.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=I.getPartial(r);return s.push(I.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},A={bytes:{fromBits(e){const t=I.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(I.partial(8*(3&n),s)),t}}},q=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;"string"==typeof e&&(e=A.utf8String.toBits(e));const n=t._buffer=I.concat(t._buffer,e),s=t._length,a=t._length=s+I.bitLength(e);if(a>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const o=new i(n);let c=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(o.subarray(16*c,16*(c+1))),c+=1;return n.splice(0,16*c),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=I.concat(t,[I.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let o=r[0],i=r[1],c=r[2],l=r[3],u=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,o)+n._f(e,i,c,l)+u+a[e]+n._key[s.floor(e/20)]|0;u=l,l=c,c=n._S(30,i),i=o,o=t}r[0]=r[0]+o|0,r[1]=r[1]+i|0,r[2]=r[2]+c|0,r[3]=r[3]+l|0,r[4]=r[4]+u|0}},R={getRandomValues(e){const t=new i(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;a<e.length;a+=4){const e=n(4294967296*(r||s.random()));r=987654071*e(),t[a/4]=4294967296*e()|0}return e}},H={importKey:e=>new H.hmacSha1(A.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const a=1+(s>>5)<<2;let o,i,c,l,h;const f=new ArrayBuffer(a),p=new u(f);let d=0;const g=I;for(t=A.bytes.toBits(t),h=1;(a||1)>d;h++){for(o=i=e.encrypt(g.concat(t,[h])),c=1;n>c;c++)for(i=e.encrypt(i),l=0;l<i.length;l++)o[l]^=i[l];for(c=0;(a||1)>d&&c<o.length;c++)p.setInt32(d,o[c]),d+=4}return f.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=q,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},P=typeof p!=S&&typeof p.getRandomValues==v,B="Invalid password",K="Invalid signature",T="zipjs-abort-check-password";function V(e){return P?p.getRandomValues(e):R.getRandomValues(e)}const x=16,E={name:"PBKDF2"},U=t.assign({hash:{name:"HMAC"}},E),W=t.assign({iterations:1e3,hash:{name:"SHA-1"}},E),M=["deriveBits"],N=[8,12,16],O=[16,24,32],L=10,F=[0,0,0,0],j=typeof p!=S,G=j&&p.subtle,X=j&&typeof G!=S,J=A.bytes,Q=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let o,i,c,l=1;if(4!==a&&6!==a&&8!==a)throw new r("invalid aes key size");for(t._key=[i=e.slice(0),c=[]],o=a;4*a+28>o;o++){let e=i[o-1];(o%a===0||8===a&&o%a===4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],o%a===0&&(e=e<<8^e>>>24^l<<24,l=l<<1^283*(l>>7))),i[o]=i[o-a]^e}for(let e=0;o;e++,o--){const t=i[3&e?o:o-4];c[e]=4>=o||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let o,i,c,l;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let u=o=0;!n[u];u^=i||1,o=a[o]||1){let a=o^o<<1^o<<2^o<<3^o<<4;a=a>>8^255&a^99,n[u]=a,s[a]=u,l=r[c=r[i=r[u]]];let h=16843009*l^65537*c^257*i^16843008*u,f=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][u]=f=f<<24^f>>>8,t[n][a]=h=h<<24^h>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r("invalid aes block size");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],o=this._tables[t],i=o[0],c=o[1],l=o[2],u=o[3],h=o[4];let f,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],m=e[t?1:3]^n[3],_=4;for(let e=0;s>e;e++)f=i[g>>>24]^c[w>>16&255]^l[y>>8&255]^u[255&m]^n[_],p=i[w>>>24]^c[y>>16&255]^l[m>>8&255]^u[255&g]^n[_+1],d=i[y>>>24]^c[m>>16&255]^l[g>>8&255]^u[255&w]^n[_+2],m=i[m>>>24]^c[g>>16&255]^l[w>>8&255]^u[255&y]^n[_+3],_+=4,g=f,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=h[g>>>24]<<24^h[w>>16&255]<<16^h[y>>8&255]<<8^h[255&m]^n[_++],f=g,g=w,w=y,y=m,m=f;return a}},Y=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=I.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return I.clamp(t,r)}},Z=H.hmacSha1;let $=j&&X&&typeof G.importKey==v,ee=j&&X&&typeof G.deriveBits==v;class te extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:o,checkPasswordOnly:i}){super({start(){t.assign(this,{ready:new h((e=>this.resolveReady=e)),password:ae(e,n),signed:s,strength:o-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:o,resolveReady:c,ready:l}=n;s?(await(async(e,t,n,s)=>{const a=await re(e,t,n,ie(s,0,N[t])),o=ie(s,N[t]);if(a[0]!=o[0]||a[1]!=o[1])throw new r(B)})(n,o,s,ie(e,0,N[o]+2)),e=ie(e,N[o]+2),i?t.error(new r(T)):c()):await l;const u=new a(e.length-L-(e.length-L)%x);t.enqueue(se(n,e,u,0,L,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:o,ready:i}=this;if(s&&n){await i;const c=ie(o,0,o.length-L),l=ie(o,o.length-L);let u=new a;if(c.length){const e=le(J,c);s.update(e);const t=n.update(e);u=ce(J,t)}if(t){const e=ie(ce(J,s.digest()),0,L);for(let t=0;L>t;t++)if(e[t]!=l[t])throw new r(K)}e.enqueue(u)}}})}}class ne extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new h((e=>this.resolveReady=e)),password:ae(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:o,ready:i}=n;let c=new a;s?(c=await(async(e,t,n)=>{const s=V(new a(N[t]));return oe(s,await re(e,t,n,s))})(n,r,s),o()):await i;const l=new a(c.length+e.length-e.length%x);l.set(c,0),t.enqueue(se(n,e,l,c.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:o}=this;if(n&&t){await o;let i=new a;if(s.length){const e=t.update(le(J,s));n.update(e),i=ce(J,e)}r.signature=ce(J,n.digest()).slice(0,L),e.enqueue(oe(i,r.signature))}}}),r=this}}function se(e,t,n,s,r,o){const{ctr:i,hmac:c,pending:l}=e,u=t.length-r;let h;for(l.length&&(t=oe(l,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,u-u%x)),h=0;u-x>=h;h+=x){const e=le(J,ie(t,h,h+x));o&&c.update(e);const r=i.update(e);o||c.update(r),n.set(ce(J,r),h+s)}return e.pending=ie(t,h),n}async function re(n,s,r,o){n.password=null;const i=await(async(e,t,n,s,r)=>{if(!$)return H.importKey(t);try{return await G.importKey("raw",t,n,!1,r)}catch(e){return $=!1,H.importKey(t)}})(0,r,U,0,M),c=await(async(e,t,n)=>{if(!ee)return H.pbkdf2(t,e.salt,W.iterations,n);try{return await G.deriveBits(e,t,n)}catch(s){return ee=!1,H.pbkdf2(t,e.salt,W.iterations,n)}})(t.assign({salt:o},W),i,8*(2*O[s]+2)),l=new a(c),u=le(J,ie(l,0,O[s])),h=le(J,ie(l,O[s],2*O[s])),f=ie(l,2*O[s]);return t.assign(n,{keys:{key:u,authentication:h,passwordVerification:f},ctr:new Y(new Q(u),e.from(F)),hmac:new Z(h)}),f}function ae(e,t){return t===b?(e=>{if(typeof f==S){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new f).encode(e)})(e):t}function oe(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function ie(e,t,n){return e.subarray(t,n)}function ce(e,t){return e.fromBits(t)}function le(e,t){return e.toBits(t)}class ue extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;if(n.password){const t=fe(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new r(B);e=e.subarray(12)}s?t.error(new r(T)):t.enqueue(fe(n,e))}})}}class he extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=V(new a(12));t[11]=n.passwordVerification,s=new a(e.length+t.length),s.set(pe(n,t),0),r=12}else s=new a(e.length),r=0;s.set(pe(n,e),r),t.enqueue(s)}})}}function fe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,n[s]);return n}function pe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,t[s]);return n}function de(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new D(s[0]),crcKey2:new D(s[2])});for(let t=0;t<n.length;t++)ge(e,n.charCodeAt(t))}function ge(e,t){let[n,r,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),r=me(s.imul(me(r+ye(n)),134775813)+1),e.crcKey2.append([r>>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function we(e){const t=2|e.keys[2];return ye(s.imul(t,1^t)>>>8)}function ye(e){return 255&e}function me(e){return 4294967295&e}const _e="deflate-raw";class be extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:o,zipCrypto:i,signed:c,level:l}=e,h=this;let f,p,d=ve(super.readable);a&&!i||!c||(f=new C,d=De(d,f)),r&&(d=ze(d,o,{level:l,chunkSize:t},s,n)),a&&(i?d=De(d,new he(e)):(p=new ne(e),d=De(d,p))),ke(h,d,(()=>{let e;a&&!i&&(e=p.signature),a&&!i||!c||(e=new u(f.value.buffer).getUint32(0)),h.signature=e}))}}class Se extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:o,signed:i,signature:c,compressed:l,useCompressionStream:h}=e;let f,p,d=ve(super.readable);o&&(a?d=De(d,new ue(e)):(p=new te(e),d=De(d,p))),l&&(d=ze(d,h,{chunkSize:t},s,n)),o&&!a||!i||(f=new C,d=De(d,f)),ke(this,d,(()=>{if((!o||a)&&i){const e=new u(f.value.buffer);if(c!=e.getUint32(0,!1))throw new r(K)}}))}}function ve(e){return De(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ke(e,n,s){n=De(n,new g({flush:s})),t.defineProperty(e,"readable",{get:()=>n})}function ze(e,t,n,s,r){try{e=De(e,new(t&&s?s:r)(_e,n))}catch(s){if(!t)return e;try{e=De(e,new r(_e,n))}catch(t){return e}}return e}function De(e,t){return e.pipeThrough(t)}const Ce="data",Ie="close";class Ae extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith("deflate")?a=be:r.startsWith("inflate")&&(a=Se);let o=0,i=0;const c=new a(e,n),l=super.readable,u=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:i})}}),h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){const{signature:e}=c;t.assign(s,{signature:e,outputSize:o,inputSize:i})}});t.defineProperty(s,"readable",{get:()=>l.pipeThrough(u).pipeThrough(c).pipeThrough(h)})}}class qe extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Re=new l,He=new l;let Pe,Be=0,Ke=!0;async function Te(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Ke?importScripts.apply(b,s):await Ve(s)}catch(e){Ke=!1,await Ve(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new k(self.Deflate)),self.Inflate&&(r.DecompressionStream=new k(self.Inflate));const a={highWaterMark:1},o=e.readable||new w({async pull(e){const t=new h((e=>Re.set(Be,e)));xe({type:"pull",messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),i=e.writable||new y({async write(e){let t;const s=new h((e=>t=e));He.set(Be,t),xe({type:Ce,value:e,messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER,await s}},a),c=new Ae(t,r);Pe=new AbortController;const{signal:l}=Pe;await o.pipeThrough(c).pipeThrough(new qe(r.chunkSize)).pipeTo(i,{signal:l,preventClose:!0,preventAbort:!0}),await i.getWriter().close();const{signature:u,inputSize:f,outputSize:p}=c;xe({type:Ie,result:{signature:u,inputSize:f,outputSize:p}})}catch(e){Ee(e)}}async function Ve(e){for(const t of e)await import(t)}function xe(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ee(e=new r("Unknown error")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}function Ue(e,n,s){return class{constructor(r){const o=this;var i,c;i=r,c="level",(typeof t.hasOwn===v?t.hasOwn(i,c):i.hasOwnProperty(c))&&r.level===b&&delete r.level,o.codec=new e(t.assign({},n,r)),s(o.codec,(e=>{if(o.pendingData){const t=o.pendingData;o.pendingData=new a(t.length+e.length);const{pendingData:n}=o;n.set(t,0),n.set(e,t.length)}else o.pendingData=new a(e)}))}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}addEventListener("message",(({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if("start"==t&&Te(e),t==Ce){const e=Re.get(n);Re.delete(n),e({value:new a(s),done:r})}if("ack"==t){const e=He.get(n);He.delete(n),e()}t==Ie&&Pe.abort()}catch(e){Ee(e)}})),self.initCodec=()=>{const{Deflate:e,Inflate:t}=((e,t={},n)=>({Deflate:Ue(e.Deflate,t.deflate,n),Inflate:Ue(e.Inflate,t.inflate,n)}))(pako,{deflate:{raw:!0},inflate:{raw:!0}},((e,t)=>e.onData=t));self.Deflate=e,self.Inflate=t}}();
package/index.d.ts CHANGED
@@ -3023,7 +3023,10 @@ export const Check: {
3023
3023
  * @param {*} test The value to test
3024
3024
  * @exception {DeveloperError} test must be typeof 'object'
3025
3025
  */
3026
- object(name: string, test: any): asserts test is object;
3026
+ object(
3027
+ name: string,
3028
+ test: any,
3029
+ ): asserts test is Record<string | number | symbol, any>;
3027
3030
  /**
3028
3031
  * Throws if test is not typeof 'boolean'
3029
3032
  *
@@ -13134,8 +13137,9 @@ export class PolygonGeometry {
13134
13137
  * @param array - The packed array.
13135
13138
  * @param [startingIndex = 0] - The starting index of the element to be unpacked.
13136
13139
  * @param [result] - The object into which to store the result.
13140
+ * @returns The modified result parameter or a new PolygonGeometry instance if one was not provided.
13137
13141
  */
13138
- static unpack(array: number[], startingIndex?: number, result?: PolygonGeometry): void;
13142
+ static unpack(array: number[], startingIndex?: number, result?: PolygonGeometry): PolygonGeometry;
13139
13143
  /**
13140
13144
  * Computes a rectangle which encloses the polygon defined by the list of positions, including cases over the international date line and the poles.
13141
13145
  * @param positions - A linear ring defining the outer boundary of the polygon.
@@ -14627,7 +14631,7 @@ export class RectangleOutlineGeometry {
14627
14631
  * @param array - The packed array.
14628
14632
  * @param [startingIndex = 0] - The starting index of the element to be unpacked.
14629
14633
  * @param [result] - The object into which to store the result.
14630
- * @returns The modified result parameter or a new Quaternion instance if one was not provided.
14634
+ * @returns The modified result parameter or a new RectangleOutlineGeometry instance if one was not provided.
14631
14635
  */
14632
14636
  static unpack(array: number[], startingIndex?: number, result?: RectangleOutlineGeometry): RectangleOutlineGeometry;
14633
14637
  /**
@@ -29346,6 +29350,7 @@ export namespace Cesium3DTileset {
29346
29350
  * @property [enableCollision = false] - When <code>true</code>, enables collisions for camera or CPU picking. While this is <code>true</code> the camera will be prevented from going below the tileset surface if {@link ScreenSpaceCameraController#enableCollisionDetection} is true.
29347
29351
  * @property [projectTo2D = false] - Whether to accurately project the tileset to 2D. If this is true, the tileset will be projected accurately to 2D, but it will use more memory to do so. If this is false, the tileset will use less memory and will still render in 2D / CV mode, but its projected positions may be inaccurate. This cannot be set after the tileset has been created.
29348
29352
  * @property [enablePick = false] - Whether to allow collision and CPU picking with <code>pick</code> when using WebGL 1. If using WebGL 2 or above, this option will be ignored. If using WebGL 1 and this is true, the <code>pick</code> operation will work correctly, but it will use more memory to do so. If running with WebGL 1 and this is false, the model will use less memory, but <code>pick</code> will always return <code>undefined</code>. This cannot be set after the tileset has loaded.
29353
+ * @property [asynchronouslyLoadImagery = false] - Whether loading imagery that is draped over the tileset should be done asynchronously. If this is <code>true</code>, then tile content will be displayed with its original texture until the imagery texture is loaded. If this is <code>false</code>, then the tile content will not be displayed until the imagery is ready.
29349
29354
  * @property [debugHeatmapTilePropertyName] - The tile variable to colorize as a heatmap. All rendered tiles will be colorized relative to each other's specified variable value.
29350
29355
  * @property [debugFreezeFrame = false] - For debugging only. Determines if only the tiles from last frame should be used for rendering.
29351
29356
  * @property [debugColorizeTiles = false] - For debugging only. When true, assigns a random color to each tile.
@@ -29411,6 +29416,7 @@ export namespace Cesium3DTileset {
29411
29416
  enableCollision?: boolean;
29412
29417
  projectTo2D?: boolean;
29413
29418
  enablePick?: boolean;
29419
+ asynchronouslyLoadImagery?: boolean;
29414
29420
  debugHeatmapTilePropertyName?: string;
29415
29421
  debugFreezeFrame?: boolean;
29416
29422
  debugColorizeTiles?: boolean;
@@ -29916,6 +29922,20 @@ export class Cesium3DTileset {
29916
29922
  * The {@link ClippingPolygonCollection} used to selectively disable rendering the tileset.
29917
29923
  */
29918
29924
  clippingPolygons: ClippingPolygonCollection;
29925
+ /**
29926
+ * The collection of <code>ImageryLayer</code> objects providing 2D georeferenced
29927
+ * image data that will be rendered over the tileset.
29928
+ *
29929
+ * The imagery will be draped over glTF, B3DM, PNTS, or GeoJSON tile content.
29930
+ * @example
29931
+ * // Drape Bing Maps Aerial imagery over the tileset
29932
+ * const imageryProvider = await Cesium.createWorldImageryAsync({
29933
+ * style: Cesium.IonWorldImageryStyle.AERIAL,
29934
+ * });
29935
+ * const imageryLayer = new ImageryLayer(imageryProvider);
29936
+ * tileset.imageryLayers.add(imageryLayer);
29937
+ */
29938
+ readonly imageryLayers: ImageryLayerCollection;
29919
29939
  /**
29920
29940
  * Gets the tileset's properties dictionary object, which contains metadata about per-feature properties.
29921
29941
  * <p>
@@ -34223,7 +34243,7 @@ export namespace ImageryLayer {
34223
34243
  * <code>function(frameState, layer, x, y, level)</code>. The function is passed the
34224
34244
  * current frame state, this layer, and the x, y, and level coordinates
34225
34245
  * of the imagery tile for which the hue is required, and it is expected to return
34226
- * the contrast value to use for the tile. The function is executed for every
34246
+ * the hue value to use for the tile. The function is executed for every
34227
34247
  * frame and for every tile, so it must be fast.
34228
34248
  * @property [saturation = 1.0] - The saturation of this layer. 1.0 uses the unmodified imagery color.
34229
34249
  * Less than 1.0 reduces the saturation while greater than 1.0 increases it.
@@ -34231,7 +34251,7 @@ export namespace ImageryLayer {
34231
34251
  * <code>function(frameState, layer, x, y, level)</code>. The function is passed the
34232
34252
  * current frame state, this layer, and the x, y, and level coordinates
34233
34253
  * of the imagery tile for which the saturation is required, and it is expected to return
34234
- * the contrast value to use for the tile. The function is executed for every
34254
+ * the saturation value to use for the tile. The function is executed for every
34235
34255
  * frame and for every tile, so it must be fast.
34236
34256
  * @property [gamma = 1.0] - The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color.
34237
34257
  * This can either be a simple number or a function with the signature
@@ -34292,7 +34312,7 @@ export namespace ImageryLayer {
34292
34312
 
34293
34313
  /**
34294
34314
  * An imagery layer that displays tiled image data from a single imagery provider
34295
- * on a {@link Globe}.
34315
+ * on a {@link Globe} or {@link Cesium3DTileset}.
34296
34316
  * @example
34297
34317
  * // Add an OpenStreetMaps layer
34298
34318
  * const imageryLayer = new Cesium.ImageryLayer(new Cesium.OpenStreetMapImageryProvider({
@@ -34308,6 +34328,18 @@ export namespace ImageryLayer {
34308
34328
  * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812));
34309
34329
  * imageryLayer.alpha = 0.5;
34310
34330
  * scene.imageryLayers.add(imageryLayer);
34331
+ * @example
34332
+ * // Drape Bing Maps Aerial imagery over a 3D tileset
34333
+ * const tileset = await Cesium.Cesium3DTileset.fromUrl(
34334
+ * "http://localhost:8002/tilesets/Seattle/tileset.json"
34335
+ * );
34336
+ * scene.primitives.add(tileset);
34337
+ *
34338
+ * const imageryProvider = await Cesium.createWorldImageryAsync({
34339
+ * style: Cesium.IonWorldImageryStyle.AERIAL,
34340
+ * });
34341
+ * const imageryLayer = new ImageryLayer(imageryProvider);
34342
+ * tileset.imageryLayers.add(imageryLayer);
34311
34343
  * @param [imageryProvider] - The imagery provider to use.
34312
34344
  * @param [options] - An object describing initialization options
34313
34345
  */
@@ -34557,7 +34589,7 @@ export class ImageryLayer {
34557
34589
  }
34558
34590
 
34559
34591
  /**
34560
- * An ordered collection of imagery layers.
34592
+ * An ordered collection of imagery layers for rendering raster imagery on a {@link Globe} or {@link Cesium3DTileset}.
34561
34593
  */
34562
34594
  export class ImageryLayerCollection {
34563
34595
  constructor();
@@ -38411,6 +38443,26 @@ export class ModelNode {
38411
38443
  originalMatrix: Matrix4;
38412
38444
  }
38413
38445
 
38446
+ /**
38447
+ * Reads and returns a value with the given type
38448
+ * at the given byte offset from the data view, in little-endian
38449
+ * order
38450
+ * @param dataView - Typed data view into a binary buffer
38451
+ * @param byteOffset - The offset, in bytes, from the start of the view to read the data from
38452
+ * @param numberOfComponents - The number of components to read
38453
+ * @param result - The array in which to read the result
38454
+ */
38455
+ export type ComponentsReaderCallback = (dataView: DataView, byteOffset: number, numberOfComponents: number, result: number[]) => void;
38456
+
38457
+ /**
38458
+ * Reads and returns a value with the given type
38459
+ * at the given byte offset from the data view, in little-endian
38460
+ * order
38461
+ * @param dataView - Typed data view into a binary buffer
38462
+ * @param byteOffset - The offset, in bytes, from the start of the view to read the data from
38463
+ */
38464
+ export type ComponentReaderCallback = (dataView: DataView, byteOffset: number) => number | bigint;
38465
+
38414
38466
  /**
38415
38467
  * A simple struct that serves as a value of a <code>sampler2D</code>-valued
38416
38468
  * uniform. This is used with {@link CustomShader} and {@link TextureManager}