@cesium/engine 7.0.0 → 8.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 (172) hide show
  1. package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-23UFSGND.js} +7 -7
  2. package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2A75IWRS.js} +7 -7
  3. package/Build/Workers/{chunk-VRGFV2UO.js → chunk-2FRVPMCS.js} +10 -10
  4. package/Build/Workers/{chunk-46UD5ABS.js → chunk-2FWRMUTY.js} +4 -4
  5. package/Build/Workers/{chunk-DTAIXKTO.js → chunk-2UPKWTMJ.js} +6 -6
  6. package/Build/Workers/{chunk-6VJVYK2V.js → chunk-34FXV7D7.js} +2 -2
  7. package/Build/Workers/{chunk-ODW7WYM4.js → chunk-3VAZEH7M.js} +2 -2
  8. package/Build/Workers/{chunk-U2VCRRQW.js → chunk-4DO5W5XZ.js} +6 -6
  9. package/Build/Workers/{chunk-VK3EJHWI.js → chunk-4H7PY4U5.js} +2 -2
  10. package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-5QULIR53.js} +4 -4
  11. package/Build/Workers/{chunk-JY5YEZFA.js → chunk-7TC63SJW.js} +8 -8
  12. package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-7ZFGPDJA.js} +4 -4
  13. package/Build/Workers/{chunk-FP6GYBFX.js → chunk-A5DWLWCY.js} +10 -10
  14. package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-BBWDMCVU.js} +1 -1
  15. package/Build/Workers/{chunk-WZU2YLWG.js → chunk-BG4UCVXN.js} +3 -3
  16. package/Build/Workers/{chunk-5WQ523AW.js → chunk-BIKA3NRA.js} +5 -5
  17. package/Build/Workers/{chunk-PTQQUQC3.js → chunk-BROJAZRZ.js} +13 -13
  18. package/Build/Workers/{chunk-YUCVWAY6.js → chunk-DDUQAJ4P.js} +7 -7
  19. package/Build/Workers/{chunk-2HJWSU7B.js → chunk-EERJKOAF.js} +4 -4
  20. package/Build/Workers/{chunk-LZGHD6NY.js → chunk-EG6PTBY2.js} +15 -15
  21. package/Build/Workers/{chunk-IX2JCCNM.js → chunk-EHWHNOEX.js} +1 -1
  22. package/Build/Workers/{chunk-NKPBIX7F.js → chunk-F3YA3Y2Z.js} +1 -1
  23. package/Build/Workers/{chunk-L2ZN645J.js → chunk-F4HFJMGM.js} +6 -6
  24. package/Build/Workers/{chunk-F6SE42BK.js → chunk-FJKNFAKQ.js} +15 -472
  25. package/Build/Workers/{chunk-PNBGBETF.js → chunk-FNIRWHJB.js} +10 -10
  26. package/Build/Workers/{chunk-RAEV7K66.js → chunk-FZRIVR7Y.js} +5 -5
  27. package/Build/Workers/{chunk-AIPU2VSX.js → chunk-G43QFN4Q.js} +6 -6
  28. package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-GATZHF3K.js} +2 -2
  29. package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-GRC2ZTAF.js} +14 -14
  30. package/Build/Workers/{chunk-5YLJ77FF.js → chunk-HU6N6EXB.js} +10 -10
  31. package/Build/Workers/{chunk-4EBHOMFX.js → chunk-I46ZRR5W.js} +17 -17
  32. package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-JURN7NPV.js} +17 -17
  33. package/Build/Workers/{chunk-JCNXK6EL.js → chunk-KKCR2YOP.js} +11 -11
  34. package/Build/Workers/{chunk-S6SKF6DT.js → chunk-LPR3YNP2.js} +5 -5
  35. package/Build/Workers/{chunk-UDO6BFSF.js → chunk-M7ERACJJ.js} +13 -13
  36. package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-MDWEGWPA.js} +10 -10
  37. package/Build/Workers/{chunk-72SANQJV.js → chunk-OGXZVPPM.js} +9 -5
  38. package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-PGSJK77E.js} +6 -6
  39. package/Build/Workers/{chunk-GEJTYLCO.js → chunk-PPH7OFP3.js} +5 -5
  40. package/Build/Workers/{chunk-OVLG3FRS.js → chunk-SH5USDPI.js} +6 -6
  41. package/Build/Workers/{chunk-6HZQPRUS.js → chunk-SOWMRMWA.js} +1 -1
  42. package/Build/Workers/{chunk-JXDC723O.js → chunk-STW2DGFI.js} +2 -2
  43. package/Build/Workers/{chunk-5HDYHG3F.js → chunk-T3XIFPYR.js} +13 -13
  44. package/Build/Workers/chunk-TTUZP4BO.js +501 -0
  45. package/Build/Workers/{chunk-7XEAYGZK.js → chunk-UEXTBDBE.js} +10 -10
  46. package/Build/Workers/{chunk-GV56Q4LU.js → chunk-VOXYEYJT.js} +11 -11
  47. package/Build/Workers/{chunk-NY3K4IM3.js → chunk-X4356LRH.js} +12 -12
  48. package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-XGI5BXZY.js} +2 -2
  49. package/Build/Workers/{chunk-UAEW6HKG.js → chunk-Y2ME2IJV.js} +13 -13
  50. package/Build/Workers/{chunk-XWXM2O2R.js → chunk-Y5UQJLYE.js} +6 -6
  51. package/Build/Workers/{chunk-QZAD5O7I.js → chunk-YJEBABKH.js} +7 -7
  52. package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YWTJ2B4B.js} +1 -1
  53. package/Build/Workers/{chunk-R5X4OQT4.js → chunk-Z3TIFFGF.js} +7 -7
  54. package/Build/Workers/{chunk-WBQCVXR3.js → chunk-ZT7KWISZ.js} +4 -4
  55. package/Build/Workers/combineGeometry.js +24 -23
  56. package/Build/Workers/createBoxGeometry.js +18 -17
  57. package/Build/Workers/createBoxOutlineGeometry.js +16 -15
  58. package/Build/Workers/createCircleGeometry.js +26 -25
  59. package/Build/Workers/createCircleOutlineGeometry.js +19 -18
  60. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
  61. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
  62. package/Build/Workers/createCorridorGeometry.js +29 -28
  63. package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
  64. package/Build/Workers/createCylinderGeometry.js +20 -19
  65. package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
  66. package/Build/Workers/createEllipseGeometry.js +26 -25
  67. package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
  68. package/Build/Workers/createEllipsoidGeometry.js +19 -18
  69. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
  70. package/Build/Workers/createFrustumGeometry.js +18 -17
  71. package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
  72. package/Build/Workers/createGeometry.js +54 -33
  73. package/Build/Workers/createGroundPolylineGeometry.js +22 -21
  74. package/Build/Workers/createPlaneGeometry.js +16 -15
  75. package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
  76. package/Build/Workers/createPolygonGeometry.js +32 -31
  77. package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
  78. package/Build/Workers/createPolylineGeometry.js +25 -24
  79. package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
  80. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
  81. package/Build/Workers/createRectangleGeometry.js +27 -26
  82. package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
  83. package/Build/Workers/createSimplePolylineGeometry.js +23 -22
  84. package/Build/Workers/createSphereGeometry.js +19 -18
  85. package/Build/Workers/createSphereOutlineGeometry.js +18 -17
  86. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  87. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  88. package/Build/Workers/createVectorTileGeometries.js +24 -23
  89. package/Build/Workers/createVectorTilePoints.js +12 -12
  90. package/Build/Workers/createVectorTilePolygons.js +22 -21
  91. package/Build/Workers/createVectorTilePolylines.js +14 -14
  92. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
  93. package/Build/Workers/createVerticesFromHeightmap.js +22 -21
  94. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
  95. package/Build/Workers/createWallGeometry.js +24 -23
  96. package/Build/Workers/createWallOutlineGeometry.js +23 -22
  97. package/Build/Workers/decodeDraco.js +11 -11
  98. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  99. package/Build/Workers/decodeI3S.js +601 -92
  100. package/Build/Workers/transcodeKTX2.js +7 -7
  101. package/Build/Workers/transferTypedArrayTest.js +1 -1
  102. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
  103. package/Source/Core/Ellipsoid.js +6 -0
  104. package/Source/Core/IntersectionTests.js +6 -3
  105. package/Source/Core/Ion.js +1 -1
  106. package/Source/Core/PixelFormat.js +5 -0
  107. package/Source/Core/Transforms.js +3 -0
  108. package/Source/Core/srgbToLinear.js +32 -0
  109. package/Source/DataSources/CzmlDataSource.js +51 -23
  110. package/Source/DataSources/DataSourceDisplay.js +27 -0
  111. package/Source/DataSources/Entity.js +20 -2
  112. package/Source/DataSources/GeometryUpdaterSet.js +114 -0
  113. package/Source/DataSources/GeometryVisualizer.js +19 -83
  114. package/Source/Renderer/Context.js +10 -0
  115. package/Source/Renderer/ContextLimits.js +2 -0
  116. package/Source/Renderer/demodernizeShader.js +4 -1
  117. package/Source/Scene/ArcGisMapService.js +1 -1
  118. package/Source/Scene/Axis.js +12 -7
  119. package/Source/Scene/Camera.js +46 -4
  120. package/Source/Scene/Cesium3DTileset.js +44 -6
  121. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
  122. package/Source/Scene/FrameState.js +5 -0
  123. package/Source/Scene/GlobeTranslucencyState.js +1 -1
  124. package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
  125. package/Source/Scene/I3SDataProvider.js +270 -53
  126. package/Source/Scene/I3SDecoder.js +8 -1
  127. package/Source/Scene/I3SFeature.js +2 -5
  128. package/Source/Scene/I3SField.js +136 -31
  129. package/Source/Scene/I3SGeometry.js +70 -2
  130. package/Source/Scene/I3SLayer.js +55 -10
  131. package/Source/Scene/I3SNode.js +175 -18
  132. package/Source/Scene/I3SStatistics.js +94 -0
  133. package/Source/Scene/I3SSublayer.js +176 -0
  134. package/Source/Scene/I3SSymbology.js +337 -0
  135. package/Source/Scene/KeyframeNode.js +1 -1
  136. package/Source/Scene/Model/pickModel.js +25 -7
  137. package/Source/Scene/PickFramebuffer.js +37 -2
  138. package/Source/Scene/Picking.js +113 -39
  139. package/Source/Scene/Primitive.js +6 -2
  140. package/Source/Scene/Scene.js +126 -42
  141. package/Source/Scene/ScreenSpaceCameraController.js +21 -7
  142. package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
  143. package/Source/Scene/SpatialNode.js +12 -19
  144. package/Source/Scene/StructuralMetadata.js +1 -1
  145. package/Source/Scene/VoxelBoxShape.js +76 -0
  146. package/Source/Scene/VoxelCell.js +273 -0
  147. package/Source/Scene/VoxelCylinderShape.js +114 -43
  148. package/Source/Scene/VoxelEllipsoidShape.js +158 -116
  149. package/Source/Scene/VoxelPrimitive.js +3 -1
  150. package/Source/Scene/VoxelRenderResources.js +3 -0
  151. package/Source/Scene/VoxelShape.js +13 -0
  152. package/Source/Scene/VoxelTraversal.js +76 -54
  153. package/Source/Scene/buildVoxelDrawCommands.js +23 -0
  154. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
  155. package/Source/Scene/processVoxelProperties.js +2 -0
  156. package/Source/Shaders/Voxels/IntersectCylinder.glsl +14 -111
  157. package/Source/Shaders/Voxels/IntersectCylinder.js +14 -111
  158. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +32 -113
  159. package/Source/Shaders/Voxels/IntersectEllipsoid.js +32 -113
  160. package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
  161. package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
  162. package/Source/Shaders/Voxels/VoxelFS.glsl +39 -1
  163. package/Source/Shaders/Voxels/VoxelFS.js +39 -1
  164. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +19 -37
  165. package/Source/Shaders/Voxels/convertUvToCylinder.js +19 -37
  166. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +24 -44
  167. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +24 -44
  168. package/Source/Workers/createGeometry.js +40 -11
  169. package/Source/Workers/decodeI3S.js +720 -94
  170. package/index.d.ts +296 -11
  171. package/index.js +102 -94
  172. package/package.json +1 -1
@@ -120,15 +120,11 @@ function VoxelCylinderShape() {
120
120
  CYLINDER_HAS_RENDER_BOUNDS_ANGLE: undefined,
121
121
  CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO: undefined,
122
122
  CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF: undefined,
123
- CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF: undefined,
124
123
  CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF: undefined,
125
124
 
126
125
  CYLINDER_HAS_SHAPE_BOUNDS_RADIUS: undefined,
127
- CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT: undefined,
128
126
  CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT: undefined,
129
- CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT: undefined,
130
127
  CYLINDER_HAS_SHAPE_BOUNDS_ANGLE: undefined,
131
- CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO: undefined,
132
128
  CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY: undefined,
133
129
  CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY: undefined,
134
130
  CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED: undefined,
@@ -324,17 +320,12 @@ VoxelCylinderShape.prototype.update = function (
324
320
  shapeAngleRange > defaultAngleRangeHalf + epsilonAngle &&
325
321
  shapeAngleRange < defaultAngleRange - epsilonAngle;
326
322
  const shapeIsAngleFlipped =
327
- shapeAngleRange > epsilonAngle &&
328
323
  shapeAngleRange < defaultAngleRangeHalf - epsilonAngle;
329
324
  const shapeIsAngleRangeHalf =
330
325
  shapeAngleRange >= defaultAngleRangeHalf - epsilonAngle &&
331
326
  shapeAngleRange <= defaultAngleRangeHalf + epsilonAngle;
332
- const shapeIsAngleRangeZero = shapeAngleRange <= epsilonAngle;
333
327
  const shapeHasAngle =
334
- shapeIsAngleRegular ||
335
- shapeIsAngleFlipped ||
336
- shapeIsAngleRangeHalf ||
337
- shapeIsAngleRangeZero;
328
+ shapeIsAngleRegular || shapeIsAngleFlipped || shapeIsAngleRangeHalf;
338
329
  const shapeIsMinAngleDiscontinuity = CesiumMath.equalsEpsilon(
339
330
  shapeMinAngle,
340
331
  defaultMinAngle,
@@ -357,23 +348,16 @@ VoxelCylinderShape.prototype.update = function (
357
348
  const renderAngleRange =
358
349
  renderMaxAngle - renderMinAngle + renderIsAngleReversed * defaultAngleRange;
359
350
  const renderIsAngleRegular =
360
- renderAngleRange > defaultAngleRangeHalf + epsilonAngle &&
351
+ renderAngleRange >= defaultAngleRangeHalf - epsilonAngle &&
361
352
  renderAngleRange < defaultAngleRange - epsilonAngle;
362
353
  const renderIsAngleFlipped =
363
354
  renderAngleRange > epsilonAngle &&
364
355
  renderAngleRange < defaultAngleRangeHalf - epsilonAngle;
365
- const renderIsAngleRangeHalf =
366
- renderAngleRange >= defaultAngleRangeHalf - epsilonAngle &&
367
- renderAngleRange <= defaultAngleRangeHalf + epsilonAngle;
368
356
  const renderIsAngleRangeZero = renderAngleRange <= epsilonAngle;
369
357
  const renderHasAngle =
370
- renderIsAngleRegular ||
371
- renderIsAngleFlipped ||
372
- renderIsAngleRangeHalf ||
373
- renderIsAngleRangeZero;
358
+ renderIsAngleRegular || renderIsAngleFlipped || renderIsAngleRangeZero;
374
359
 
375
- const shaderUniforms = this.shaderUniforms;
376
- const shaderDefines = this.shaderDefines;
360
+ const { shaderUniforms, shaderDefines } = this;
377
361
 
378
362
  // To keep things simple, clear the defines every time
379
363
  for (const key in shaderDefines) {
@@ -408,12 +392,6 @@ VoxelCylinderShape.prototype.update = function (
408
392
  if (renderMinHeight === renderMaxHeight) {
409
393
  shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT"] = true;
410
394
  }
411
- if (shapeMinHeight === shapeMaxHeight) {
412
- shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT"] = true;
413
- }
414
- if (shapeMinRadius === shapeMaxRadius) {
415
- shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT"] = true;
416
- }
417
395
  if (!shapeIsDefaultRadius) {
418
396
  shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_RADIUS"] = true;
419
397
 
@@ -423,8 +401,13 @@ VoxelCylinderShape.prototype.update = function (
423
401
  // scale = 1.0 / (maxRadius - minRadius)
424
402
  // offset = -minRadius / (maxRadius - minRadius)
425
403
  // offset = minRadius / (minRadius - maxRadius)
426
- const scale = 1.0 / (shapeMaxRadius - shapeMinRadius);
427
- const offset = shapeMinRadius / (shapeMinRadius - shapeMaxRadius);
404
+ const radiusRange = shapeMaxRadius - shapeMinRadius;
405
+ let scale = 0.0;
406
+ let offset = 1.0;
407
+ if (radiusRange !== 0.0) {
408
+ scale = 1.0 / radiusRange;
409
+ offset = -shapeMinRadius / radiusRange;
410
+ }
428
411
  shaderUniforms.cylinderUvToShapeUvRadius = Cartesian2.fromElements(
429
412
  scale,
430
413
  offset,
@@ -446,8 +429,13 @@ VoxelCylinderShape.prototype.update = function (
446
429
  // offset = -2.0 * (minHeight * 0.5 + 0.5) / (maxHeight - minHeight)
447
430
  // offset = -(minHeight + 1.0) / (maxHeight - minHeight)
448
431
  // offset = (minHeight + 1.0) / (minHeight - maxHeight)
449
- const scale = 2.0 / (shapeMaxHeight - shapeMinHeight);
450
- const offset = (shapeMinHeight + 1.0) / (shapeMinHeight - shapeMaxHeight);
432
+ const heightRange = shapeMaxHeight - shapeMinHeight;
433
+ let scale = 0.0;
434
+ let offset = 1.0;
435
+ if (heightRange !== 0.0) {
436
+ scale = 2.0 / heightRange;
437
+ offset = -(shapeMinHeight + 1.0) / heightRange;
438
+ }
451
439
  shaderUniforms.cylinderUvToShapeUvHeight = Cartesian2.fromElements(
452
440
  scale,
453
441
  offset,
@@ -505,9 +493,6 @@ VoxelCylinderShape.prototype.update = function (
505
493
  } else if (renderIsAngleFlipped) {
506
494
  shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF"] = true;
507
495
  intersectionCount += 2;
508
- } else if (renderIsAngleRangeHalf) {
509
- shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF"] = true;
510
- intersectionCount += 1;
511
496
  } else if (renderIsAngleRangeZero) {
512
497
  shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO"] = true;
513
498
  intersectionCount += 2;
@@ -522,9 +507,6 @@ VoxelCylinderShape.prototype.update = function (
522
507
 
523
508
  if (shapeHasAngle) {
524
509
  shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_ANGLE"] = true;
525
- if (shapeIsAngleRangeZero) {
526
- shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO"] = true;
527
- }
528
510
  if (shapeIsMinAngleDiscontinuity) {
529
511
  shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY"] = true;
530
512
  }
@@ -553,13 +535,21 @@ VoxelCylinderShape.prototype.update = function (
553
535
  // offset = -uvMinAngle / (uvMaxAngle - uvMinAngle)
554
536
  // offset = -((minAngle - pi) / (2.0 * pi)) / (((maxAngle - pi) / (2.0 * pi)) - ((minAngle - pi) / (2.0 * pi)))
555
537
  // offset = -(minAngle - pi) / (maxAngle - minAngle)
556
- const scale = defaultAngleRange / shapeAngleRange;
557
- const offset = -(shapeMinAngle - defaultMinAngle) / shapeAngleRange;
558
- shaderUniforms.cylinderUvToShapeUvAngle = Cartesian2.fromElements(
559
- scale,
560
- offset,
561
- shaderUniforms.cylinderUvToShapeUvAngle
562
- );
538
+ if (shapeAngleRange <= epsilonAngle) {
539
+ shaderUniforms.cylinderUvToShapeUvAngle = Cartesian2.fromElements(
540
+ 0.0,
541
+ 1.0,
542
+ shaderUniforms.cylinderUvToShapeUvAngle
543
+ );
544
+ } else {
545
+ const scale = defaultAngleRange / shapeAngleRange;
546
+ const offset = -(shapeMinAngle - defaultMinAngle) / shapeAngleRange;
547
+ shaderUniforms.cylinderUvToShapeUvAngle = Cartesian2.fromElements(
548
+ scale,
549
+ offset,
550
+ shaderUniforms.cylinderUvToShapeUvAngle
551
+ );
552
+ }
563
553
  }
564
554
 
565
555
  this.shaderMaximumIntersectionsLength = intersectionCount;
@@ -645,6 +635,87 @@ VoxelCylinderShape.prototype.computeOrientedBoundingBoxForTile = function (
645
635
  );
646
636
  };
647
637
 
638
+ const sampleSizeScratch = new Cartesian3();
639
+ const scratchTileMinBounds = new Cartesian3();
640
+ const scratchTileMaxBounds = new Cartesian3();
641
+
642
+ /**
643
+ * Computes an oriented bounding box for a specified sample within a specified tile.
644
+ * The update function must be called before calling this function.
645
+ *
646
+ * @param {SpatialNode} spatialNode The spatial node containing the sample
647
+ * @param {Cartesian3} tileDimensions The size of the tile in number of samples, before padding
648
+ * @param {Cartesian3} tileUv The sample coordinate within the tile
649
+ * @param {OrientedBoundingBox} result The oriented bounding box that will be set to enclose the specified sample
650
+ * @returns {OrientedBoundingBox} The oriented bounding box.
651
+ */
652
+ VoxelCylinderShape.prototype.computeOrientedBoundingBoxForSample = function (
653
+ spatialNode,
654
+ tileDimensions,
655
+ tileUv,
656
+ result
657
+ ) {
658
+ //>>includeStart('debug', pragmas.debug);
659
+ Check.typeOf.object("spatialNode", spatialNode);
660
+ Check.typeOf.object("tileDimensions", tileDimensions);
661
+ Check.typeOf.object("tileUv", tileUv);
662
+ Check.typeOf.object("result", result);
663
+ //>>includeEnd('debug');
664
+
665
+ const tileSizeAtLevel = 1.0 / Math.pow(2.0, spatialNode.level);
666
+ const sampleSize = Cartesian3.divideComponents(
667
+ Cartesian3.ONE,
668
+ tileDimensions,
669
+ sampleSizeScratch
670
+ );
671
+ const sampleSizeAtLevel = Cartesian3.multiplyByScalar(
672
+ sampleSize,
673
+ tileSizeAtLevel,
674
+ sampleSizeScratch
675
+ );
676
+
677
+ const minLerp = Cartesian3.multiplyByScalar(
678
+ Cartesian3.fromElements(
679
+ spatialNode.x + tileUv.x,
680
+ spatialNode.y + tileUv.y,
681
+ spatialNode.z + tileUv.z,
682
+ scratchTileMinBounds
683
+ ),
684
+ tileSizeAtLevel,
685
+ scratchTileMinBounds
686
+ );
687
+ const maxLerp = Cartesian3.add(
688
+ minLerp,
689
+ sampleSizeAtLevel,
690
+ scratchTileMaxBounds
691
+ );
692
+
693
+ const minimumRadius = this._minimumRadius;
694
+ const maximumRadius = this._maximumRadius;
695
+ const minimumHeight = this._minimumHeight;
696
+ const maximumHeight = this._maximumHeight;
697
+ const minimumAngle = this._minimumAngle;
698
+ const maximumAngle = this._maximumAngle;
699
+
700
+ const radiusStart = CesiumMath.lerp(minimumRadius, maximumRadius, minLerp.x);
701
+ const radiusEnd = CesiumMath.lerp(minimumRadius, maximumRadius, maxLerp.x);
702
+ const heightStart = CesiumMath.lerp(minimumHeight, maximumHeight, minLerp.y);
703
+ const heightEnd = CesiumMath.lerp(minimumHeight, maximumHeight, maxLerp.y);
704
+ const angleStart = CesiumMath.lerp(minimumAngle, maximumAngle, minLerp.z);
705
+ const angleEnd = CesiumMath.lerp(minimumAngle, maximumAngle, maxLerp.z);
706
+
707
+ return getCylinderChunkObb(
708
+ radiusStart,
709
+ radiusEnd,
710
+ heightStart,
711
+ heightEnd,
712
+ angleStart,
713
+ angleEnd,
714
+ this.shapeTransform,
715
+ result
716
+ );
717
+ };
718
+
648
719
  const scratchOrientedBoundingBox = new OrientedBoundingBox();
649
720
  const scratchVoxelScale = new Cartesian3();
650
721
  const scratchRootScale = new Cartesian3();
@@ -115,27 +115,20 @@ function VoxelEllipsoidShape() {
115
115
  ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE: undefined,
116
116
  ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO: undefined,
117
117
  ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF: undefined,
118
- ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF: undefined,
119
118
  ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF: undefined,
120
119
  ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY: undefined,
121
120
  ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY: undefined,
122
121
  ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE: undefined,
123
- ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO: undefined,
124
122
  ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED: undefined,
125
- ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE: undefined,
126
123
  ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF: undefined,
127
124
  ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF: undefined,
128
125
  ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF: undefined,
129
126
  ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF: undefined,
130
127
  ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF: undefined,
131
128
  ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF: undefined,
132
- ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO: undefined,
133
129
  ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE: undefined,
134
- ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO: undefined,
135
130
  ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX: undefined,
136
131
  ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN: undefined,
137
- ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT: undefined,
138
- ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN: undefined,
139
132
  ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT: undefined,
140
133
  ELLIPSOID_IS_SPHERE: undefined,
141
134
  ELLIPSOID_INTERSECTION_INDEX_LONGITUDE: undefined,
@@ -156,7 +149,6 @@ function VoxelEllipsoidShape() {
156
149
  const scratchScale = new Cartesian3();
157
150
  const scratchRotationScale = new Matrix3();
158
151
  const scratchShapeOuterExtent = new Cartesian3();
159
- const scratchShapeInnerExtent = new Cartesian3();
160
152
  const scratchRenderOuterExtent = new Cartesian3();
161
153
  const scratchRenderInnerExtent = new Cartesian3();
162
154
  const scratchRenderRectangle = new Rectangle();
@@ -265,17 +257,7 @@ VoxelEllipsoidShape.prototype.update = function (
265
257
  const renderMinHeight = Math.max(shapeMinHeight, clipMinHeight);
266
258
  const renderMaxHeight = Math.min(shapeMaxHeight, clipMaxHeight);
267
259
 
268
- // Compute the closest and farthest a point can be from the center of the ellipsoid.
269
- const shapeInnerExtent = Cartesian3.add(
270
- radii,
271
- Cartesian3.fromElements(
272
- shapeMinHeight,
273
- shapeMinHeight,
274
- shapeMinHeight,
275
- scratchShapeInnerExtent
276
- ),
277
- scratchShapeInnerExtent
278
- );
260
+ // Compute the farthest a point can be from the center of the ellipsoid.
279
261
  const shapeOuterExtent = Cartesian3.add(
280
262
  radii,
281
263
  Cartesian3.fromElements(
@@ -381,18 +363,14 @@ VoxelEllipsoidShape.prototype.update = function (
381
363
  renderIsLongitudeReversed * defaultLongitudeRange;
382
364
  const renderIsLongitudeRangeZero = renderLongitudeRange <= epsilonLongitude;
383
365
  const renderIsLongitudeRangeUnderHalf =
384
- renderLongitudeRange > defaultLongitudeRangeHalf + epsilonLongitude &&
385
- renderLongitudeRange < defaultLongitudeRange - epsilonLongitude;
386
- const renderIsLongitudeRangeHalf =
387
366
  renderLongitudeRange >= defaultLongitudeRangeHalf - epsilonLongitude &&
388
- renderLongitudeRange <= defaultLongitudeRangeHalf + epsilonLongitude;
367
+ renderLongitudeRange < defaultLongitudeRange - epsilonLongitude;
389
368
  const renderIsLongitudeRangeOverHalf =
390
369
  renderLongitudeRange > epsilonLongitude &&
391
370
  renderLongitudeRange < defaultLongitudeRangeHalf - epsilonLongitude;
392
371
  const renderHasLongitude =
393
372
  renderIsLongitudeRangeZero ||
394
373
  renderIsLongitudeRangeUnderHalf ||
395
- renderIsLongitudeRangeHalf ||
396
374
  renderIsLongitudeRangeOverHalf;
397
375
 
398
376
  const shapeIsLongitudeReversed = shapeMaxLongitude < shapeMinLongitude;
@@ -400,7 +378,6 @@ VoxelEllipsoidShape.prototype.update = function (
400
378
  shapeMaxLongitude -
401
379
  shapeMinLongitude +
402
380
  shapeIsLongitudeReversed * defaultLongitudeRange;
403
- const shapeIsLongitudeRangeZero = shapeLongitudeRange <= epsilonLongitude;
404
381
  const shapeIsLongitudeRangeUnderHalf =
405
382
  shapeLongitudeRange > defaultLongitudeRangeHalf + epsilonLongitude &&
406
383
  shapeLongitudeRange < defaultLongitudeRange - epsilonLongitude;
@@ -408,10 +385,8 @@ VoxelEllipsoidShape.prototype.update = function (
408
385
  shapeLongitudeRange >= defaultLongitudeRangeHalf - epsilonLongitude &&
409
386
  shapeLongitudeRange <= defaultLongitudeRangeHalf + epsilonLongitude;
410
387
  const shapeIsLongitudeRangeOverHalf =
411
- shapeLongitudeRange > epsilonLongitude &&
412
388
  shapeLongitudeRange < defaultLongitudeRangeHalf - epsilonLongitude;
413
389
  const shapeHasLongitude =
414
- shapeIsLongitudeRangeZero ||
415
390
  shapeIsLongitudeRangeUnderHalf ||
416
391
  shapeIsLongitudeRangeHalf ||
417
392
  shapeIsLongitudeRangeOverHalf;
@@ -475,20 +450,8 @@ VoxelEllipsoidShape.prototype.update = function (
475
450
  renderOuterExtent,
476
451
  Cartesian3.ZERO
477
452
  );
478
- const renderHasHeight = renderHasMinHeight || renderHasMaxHeight;
479
- const renderHeightRange = renderMaxHeight - renderMinHeight;
480
- const shapeHasMinHeight = !Cartesian3.equals(
481
- shapeInnerExtent,
482
- Cartesian3.ZERO
483
- );
484
- const shapeHasMaxHeight = !Cartesian3.equals(
485
- shapeOuterExtent,
486
- Cartesian3.ZERO
487
- );
488
- const shapeHasHeight = shapeHasMinHeight || shapeHasMaxHeight;
489
453
 
490
- const shaderUniforms = this.shaderUniforms;
491
- const shaderDefines = this.shaderDefines;
454
+ const { shaderUniforms, shaderDefines } = this;
492
455
 
493
456
  // To keep things simple, clear the defines every time
494
457
  for (const key in shaderDefines) {
@@ -522,49 +485,37 @@ VoxelEllipsoidShape.prototype.update = function (
522
485
  shaderDefines["ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX"] = intersectionCount;
523
486
  intersectionCount += 1;
524
487
 
525
- if (renderHasHeight) {
526
- if (renderHeightRange === 0.0) {
527
- shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT"] = true;
528
- }
529
-
530
- if (renderHasMinHeight) {
531
- shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN"] = true;
532
- shaderDefines[
533
- "ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN"
534
- ] = intersectionCount;
535
- intersectionCount += 1;
536
-
537
- // The inverse of the percent of space that is taken up by the inner ellipsoid, relative to the shape bounds
538
- // 1.0 / (1.0 - thickness) // thickness = percent of space that is between the min and max height.
539
- // 1.0 / (1.0 - (shapeMaxHeight - renderMinHeight) / shapeMaxExtent)
540
- // shapeMaxExtent / (shapeMaxExtent - (shapeMaxHeight - renderMinHeight))
541
- shaderUniforms.ellipsoidInverseInnerScaleUv =
542
- shapeMaxExtent / (shapeMaxExtent - (shapeMaxHeight - renderMinHeight));
543
- }
488
+ if (renderHasMinHeight) {
489
+ shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN"] = true;
490
+ shaderDefines[
491
+ "ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN"
492
+ ] = intersectionCount;
493
+ intersectionCount += 1;
494
+
495
+ // The inverse of the percent of space that is taken up by the inner ellipsoid, relative to the shape bounds
496
+ // 1.0 / (1.0 - thickness) // thickness = percent of space that is between the min and max height.
497
+ // 1.0 / (1.0 - (shapeMaxHeight - renderMinHeight) / shapeMaxExtent)
498
+ // shapeMaxExtent / (shapeMaxExtent - (shapeMaxHeight - renderMinHeight))
499
+ shaderUniforms.ellipsoidInverseInnerScaleUv =
500
+ shapeMaxExtent / (shapeMaxExtent - (shapeMaxHeight - renderMinHeight));
501
+ }
544
502
 
545
- if (renderHasMaxHeight) {
546
- shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX"] = true;
547
- shaderUniforms.ellipsoidInverseOuterScaleUv =
548
- shapeMaxExtent / (shapeMaxExtent - (shapeMaxHeight - renderMaxHeight));
549
- }
503
+ if (renderHasMaxHeight) {
504
+ shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX"] = true;
505
+ shaderUniforms.ellipsoidInverseOuterScaleUv =
506
+ shapeMaxExtent / (shapeMaxExtent - (shapeMaxHeight - renderMaxHeight));
550
507
  }
551
508
 
552
- if (shapeHasHeight) {
553
- if (shapeHasMinHeight) {
554
- shaderDefines["ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN"] = true;
555
-
556
- // The percent of space that is between the inner and outer ellipsoid.
557
- const thickness = (shapeMaxHeight - shapeMinHeight) / shapeMaxExtent;
558
- shaderUniforms.ellipsoidInverseHeightDifferenceUv = 1.0 / thickness;
559
- shaderUniforms.ellipseInnerRadiiUv = Cartesian2.fromElements(
560
- shaderUniforms.ellipsoidRadiiUv.x * (1.0 - thickness),
561
- shaderUniforms.ellipsoidRadiiUv.z * (1.0 - thickness),
562
- shaderUniforms.ellipseInnerRadiiUv
563
- );
564
- }
565
- if (shapeMinHeight === shapeMaxHeight) {
566
- shaderDefines["ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT"] = true;
567
- }
509
+ // The percent of space that is between the inner and outer ellipsoid.
510
+ const thickness = (shapeMaxHeight - shapeMinHeight) / shapeMaxExtent;
511
+ shaderUniforms.ellipsoidInverseHeightDifferenceUv = 1.0 / thickness;
512
+ shaderUniforms.ellipseInnerRadiiUv = Cartesian2.fromElements(
513
+ shaderUniforms.ellipsoidRadiiUv.x * (1.0 - thickness),
514
+ shaderUniforms.ellipsoidRadiiUv.z * (1.0 - thickness),
515
+ shaderUniforms.ellipseInnerRadiiUv
516
+ );
517
+ if (shapeMinHeight === shapeMaxHeight) {
518
+ shaderDefines["ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT"] = true;
568
519
  }
569
520
 
570
521
  // Intersects a wedge for the min and max longitude.
@@ -582,11 +533,6 @@ VoxelEllipsoidShape.prototype.update = function (
582
533
  "ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF"
583
534
  ] = true;
584
535
  intersectionCount += 2;
585
- } else if (renderIsLongitudeRangeHalf) {
586
- shaderDefines[
587
- "ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF"
588
- ] = true;
589
- intersectionCount += 1;
590
536
  } else if (renderIsLongitudeRangeZero) {
591
537
  shaderDefines[
592
538
  "ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO"
@@ -621,14 +567,22 @@ VoxelEllipsoidShape.prototype.update = function (
621
567
  // offset = -minLongitudeUv / (maxLongitudeUv - minLongitudeUv)
622
568
  // offset = -((minLongitude - pi) / (2.0 * pi)) / (((maxLongitude - pi) / (2.0 * pi)) - ((minLongitude - pi) / (2.0 * pi)))
623
569
  // offset = -(minLongitude - pi) / (maxLongitude - minLongitude)
624
- const scale = defaultLongitudeRange / shapeLongitudeRange;
625
- const offset =
626
- -(shapeMinLongitude - defaultMinLongitude) / shapeLongitudeRange;
627
- shaderUniforms.ellipsoidUvToShapeUvLongitude = Cartesian2.fromElements(
628
- scale,
629
- offset,
630
- shaderUniforms.ellipsoidUvToShapeUvLongitude
631
- );
570
+ if (shapeLongitudeRange <= epsilonLongitude) {
571
+ shaderUniforms.ellipsoidUvToShapeUvLongitude = Cartesian2.fromElements(
572
+ 0.0,
573
+ 1.0,
574
+ shaderUniforms.ellipsoidUvToShapeUvLongitude
575
+ );
576
+ } else {
577
+ const scale = defaultLongitudeRange / shapeLongitudeRange;
578
+ const offset =
579
+ -(shapeMinLongitude - defaultMinLongitude) / shapeLongitudeRange;
580
+ shaderUniforms.ellipsoidUvToShapeUvLongitude = Cartesian2.fromElements(
581
+ scale,
582
+ offset,
583
+ shaderUniforms.ellipsoidUvToShapeUvLongitude
584
+ );
585
+ }
632
586
  }
633
587
 
634
588
  if (renderHasLongitude) {
@@ -676,8 +630,6 @@ VoxelEllipsoidShape.prototype.update = function (
676
630
  }
677
631
 
678
632
  if (renderHasLatitude) {
679
- shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE"] = true;
680
-
681
633
  // Intersects a cone for min latitude
682
634
  if (renderHasLatitudeMin) {
683
635
  shaderDefines["ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN"] = true;
@@ -728,12 +680,6 @@ VoxelEllipsoidShape.prototype.update = function (
728
680
  }
729
681
  }
730
682
 
731
- if (renderMinLatitude === renderMaxLatitude) {
732
- shaderDefines[
733
- "ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO"
734
- ] = true;
735
- }
736
-
737
683
  const minCosHalfAngleSqr = Math.pow(
738
684
  Math.cos(CesiumMath.PI_OVER_TWO - Math.abs(renderMinLatitude)),
739
685
  2.0
@@ -752,12 +698,6 @@ VoxelEllipsoidShape.prototype.update = function (
752
698
  if (shapeHasLatitude) {
753
699
  shaderDefines["ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE"] = true;
754
700
 
755
- if (shapeMinLatitude === shapeMaxLatitude) {
756
- shaderDefines[
757
- "ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO"
758
- ] = true;
759
- }
760
-
761
701
  // delerp(latitudeUv, minLatitudeUv, maxLatitudeUv)
762
702
  // (latitudeUv - minLatitudeUv) / (maxLatitudeUv - minLatitudeUv)
763
703
  // latitudeUv / (maxLatitudeUv - minLatitudeUv) - minLatitudeUv / (maxLatitudeUv - minLatitudeUv)
@@ -768,13 +708,22 @@ VoxelEllipsoidShape.prototype.update = function (
768
708
  // offset = -((minLatitude - -pi) / (2.0 * pi)) / (((maxLatitude - pi) / (2.0 * pi)) - ((minLatitude - pi) / (2.0 * pi)))
769
709
  // offset = -(minLatitude - -pi) / (maxLatitude - minLatitude)
770
710
  // offset = (-pi - minLatitude) / (maxLatitude - minLatitude)
771
- const scale = defaultLatitudeRange / shapeLatitudeRange;
772
- const offset = (defaultMinLatitude - shapeMinLatitude) / shapeLatitudeRange;
773
- shaderUniforms.ellipsoidUvToShapeUvLatitude = Cartesian2.fromElements(
774
- scale,
775
- offset,
776
- shaderUniforms.ellipsoidUvToShapeUvLatitude
777
- );
711
+ if (shapeLatitudeRange < epsilonLatitude) {
712
+ shaderUniforms.ellipsoidUvToShapeUvLatitude = Cartesian2.fromElements(
713
+ 0.0,
714
+ 1.0,
715
+ shaderUniforms.ellipsoidUvToShapeUvLatitude
716
+ );
717
+ } else {
718
+ const scale = defaultLatitudeRange / shapeLatitudeRange;
719
+ const offset =
720
+ (defaultMinLatitude - shapeMinLatitude) / shapeLatitudeRange;
721
+ shaderUniforms.ellipsoidUvToShapeUvLatitude = Cartesian2.fromElements(
722
+ scale,
723
+ offset,
724
+ shaderUniforms.ellipsoidUvToShapeUvLatitude
725
+ );
726
+ }
778
727
  }
779
728
 
780
729
  if (isSphere) {
@@ -854,6 +803,91 @@ VoxelEllipsoidShape.prototype.computeOrientedBoundingBoxForTile = function (
854
803
  );
855
804
  };
856
805
 
806
+ const sampleSizeScratch = new Cartesian3();
807
+ const scratchTileMinBounds = new Cartesian3();
808
+ const scratchTileMaxBounds = new Cartesian3();
809
+
810
+ /**
811
+ * Computes an oriented bounding box for a specified sample within a specified tile.
812
+ * The update function must be called before calling this function.
813
+ *
814
+ * @param {SpatialNode} spatialNode The spatial node containing the sample
815
+ * @param {Cartesian3} tileDimensions The size of the tile in number of samples, before padding
816
+ * @param {Cartesian3} tileUv The sample coordinate within the tile
817
+ * @param {OrientedBoundingBox} result The oriented bounding box that will be set to enclose the specified sample
818
+ * @returns {OrientedBoundingBox} The oriented bounding box.
819
+ */
820
+ VoxelEllipsoidShape.prototype.computeOrientedBoundingBoxForSample = function (
821
+ spatialNode,
822
+ tileDimensions,
823
+ tileUv,
824
+ result
825
+ ) {
826
+ //>>includeStart('debug', pragmas.debug);
827
+ Check.typeOf.object("spatialNode", spatialNode);
828
+ Check.typeOf.object("tileDimensions", tileDimensions);
829
+ Check.typeOf.object("tileUv", tileUv);
830
+ Check.typeOf.object("result", result);
831
+ //>>includeEnd('debug');
832
+
833
+ const tileSizeAtLevel = 1.0 / Math.pow(2.0, spatialNode.level);
834
+ const sampleSize = Cartesian3.divideComponents(
835
+ Cartesian3.ONE,
836
+ tileDimensions,
837
+ sampleSizeScratch
838
+ );
839
+ const sampleSizeAtLevel = Cartesian3.multiplyByScalar(
840
+ sampleSize,
841
+ tileSizeAtLevel,
842
+ sampleSizeScratch
843
+ );
844
+
845
+ const minLerp = Cartesian3.multiplyByScalar(
846
+ Cartesian3.fromElements(
847
+ spatialNode.x + tileUv.x,
848
+ spatialNode.y + tileUv.y,
849
+ spatialNode.z + tileUv.z,
850
+ scratchTileMinBounds
851
+ ),
852
+ tileSizeAtLevel,
853
+ scratchTileMinBounds
854
+ );
855
+ const maxLerp = Cartesian3.add(
856
+ minLerp,
857
+ sampleSizeAtLevel,
858
+ scratchTileMaxBounds
859
+ );
860
+
861
+ const rectangle = Rectangle.subsection(
862
+ this._rectangle,
863
+ minLerp.x,
864
+ minLerp.y,
865
+ maxLerp.x,
866
+ maxLerp.y,
867
+ scratchRectangle
868
+ );
869
+ const minHeight = CesiumMath.lerp(
870
+ this._minimumHeight,
871
+ this._maximumHeight,
872
+ minLerp.z
873
+ );
874
+ const maxHeight = CesiumMath.lerp(
875
+ this._minimumHeight,
876
+ this._maximumHeight,
877
+ maxLerp.z
878
+ );
879
+
880
+ return getEllipsoidChunkObb(
881
+ rectangle,
882
+ minHeight,
883
+ maxHeight,
884
+ this._ellipsoid,
885
+ this._translation,
886
+ this._rotation,
887
+ result
888
+ );
889
+ };
890
+
857
891
  /**
858
892
  * Computes an approximate step size for raymarching the root tile of a voxel grid.
859
893
  * The update function must be called before calling this function.
@@ -928,7 +962,11 @@ function getEllipsoidChunkObb(
928
962
  * @readonly
929
963
  */
930
964
  VoxelEllipsoidShape.DefaultMinBounds = Object.freeze(
931
- new Cartesian3(-CesiumMath.PI, -CesiumMath.PI_OVER_TWO, -Number.MAX_VALUE)
965
+ new Cartesian3(
966
+ -CesiumMath.PI,
967
+ -CesiumMath.PI_OVER_TWO,
968
+ -Ellipsoid.WGS84.minimumRadius
969
+ )
932
970
  );
933
971
 
934
972
  /**
@@ -939,7 +977,11 @@ VoxelEllipsoidShape.DefaultMinBounds = Object.freeze(
939
977
  * @readonly
940
978
  */
941
979
  VoxelEllipsoidShape.DefaultMaxBounds = Object.freeze(
942
- new Cartesian3(+CesiumMath.PI, +CesiumMath.PI_OVER_TWO, +Number.MAX_VALUE)
980
+ new Cartesian3(
981
+ CesiumMath.PI,
982
+ CesiumMath.PI_OVER_TWO,
983
+ 10.0 * Ellipsoid.WGS84.maximumRadius
984
+ )
943
985
  );
944
986
 
945
987
  export default VoxelEllipsoidShape;
@@ -531,7 +531,7 @@ Object.defineProperties(VoxelPrimitive.prototype, {
531
531
  */
532
532
  orientedBoundingBox: {
533
533
  get: function () {
534
- return this.shape.orientedBoundingBox;
534
+ return this._shape.orientedBoundingBox;
535
535
  },
536
536
  },
537
537
 
@@ -1137,6 +1137,8 @@ VoxelPrimitive.prototype.update = function (frameState) {
1137
1137
  // Render the primitive
1138
1138
  const command = frameState.passes.pick
1139
1139
  ? this._drawCommandPick
1140
+ : frameState.passes.pickVoxel
1141
+ ? this._drawCommandPickVoxel
1140
1142
  : this._drawCommand;
1141
1143
  command.boundingVolume = shape.boundingSphere;
1142
1144
  frameState.commandList.push(command);