@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
@@ -8,6 +8,7 @@ import VoxelVS from "../Shaders/Voxels/VoxelVS.js";
8
8
  import IntersectionUtils from "../Shaders/Voxels/IntersectionUtils.js";
9
9
  import IntersectDepth from "../Shaders/Voxels/IntersectDepth.js";
10
10
  import IntersectClippingPlanes from "../Shaders/Voxels/IntersectClippingPlanes.js";
11
+ import IntersectLongitude from "../Shaders/Voxels/IntersectLongitude.js";
11
12
  import IntersectBox from "../Shaders/Voxels/IntersectBox.js";
12
13
  import IntersectCylinder from "../Shaders/Voxels/IntersectCylinder.js";
13
14
  import IntersectEllipsoid from "../Shaders/Voxels/IntersectEllipsoid.js";
@@ -131,12 +132,14 @@ function VoxelRenderResources(primitive) {
131
132
  ]);
132
133
  } else if (shapeType === "CYLINDER") {
133
134
  shaderBuilder.addFragmentLines([
135
+ IntersectLongitude,
134
136
  IntersectCylinder,
135
137
  Intersection,
136
138
  convertUvToCylinder,
137
139
  ]);
138
140
  } else if (shapeType === "ELLIPSOID") {
139
141
  shaderBuilder.addFragmentLines([
142
+ IntersectLongitude,
140
143
  IntersectEllipsoid,
141
144
  Intersection,
142
145
  convertUvToEllipsoid,
@@ -117,6 +117,19 @@ VoxelShape.prototype.update = DeveloperError.throwInstantiationError;
117
117
  VoxelShape.prototype.computeOrientedBoundingBoxForTile =
118
118
  DeveloperError.throwInstantiationError;
119
119
 
120
+ /**
121
+ * Computes an oriented bounding box for a specified sample within a specified tile.
122
+ * The update function must be called before calling this function.
123
+ *
124
+ * @param {SpatialNode} spatialNode The spatial node containing the sample
125
+ * @param {Cartesian3} tileDimensions The size of the tile in number of samples, before padding
126
+ * @param {Cartesian3} tileUv The sample coordinate within the tile
127
+ * @param {OrientedBoundingBox} result The oriented bounding box that will be set to enclose the specified sample
128
+ * @returns {OrientedBoundingBox} The oriented bounding box.
129
+ */
130
+ VoxelShape.prototype.computeOrientedBoundingBoxForSample =
131
+ DeveloperError.throwInstantiationError;
132
+
120
133
  /**
121
134
  * Computes an approximate step size for raymarching the root tile of a voxel grid.
122
135
  * The update function must be called before calling this function.
@@ -49,16 +49,14 @@ function VoxelTraversal(
49
49
  */
50
50
  this._primitive = primitive;
51
51
 
52
- const length = types.length;
53
-
54
52
  /**
55
53
  * @type {Megatexture[]}
56
54
  * @readonly
57
55
  */
58
- this.megatextures = new Array(length);
56
+ this.megatextures = new Array(types.length);
59
57
 
60
58
  // TODO make sure to split the maximumTextureMemoryByteLength across all the megatextures
61
- for (let i = 0; i < length; i++) {
59
+ for (let i = 0; i < types.length; i++) {
62
60
  const type = types[i];
63
61
  const componentCount = MetadataType.getComponentCount(type);
64
62
  const componentType = componentTypes[i];
@@ -218,6 +216,18 @@ function VoxelTraversal(
218
216
  this.leafNodeTexelSizeUv = new Cartesian2();
219
217
  }
220
218
 
219
+ /**
220
+ * Finds a keyframe node in the traversal
221
+ *
222
+ * @param {number} megatextureIndex
223
+ * @returns {KeyframeNode}
224
+ */
225
+ VoxelTraversal.prototype.findKeyframeNode = function (megatextureIndex) {
226
+ return this._keyframeNodesInMegatexture.find(function (keyframeNode) {
227
+ return keyframeNode.megatextureIndex === megatextureIndex;
228
+ });
229
+ };
230
+
221
231
  function binaryTreeWeightingRecursive(arr, start, end, depth) {
222
232
  if (start > end) {
223
233
  return;
@@ -382,10 +392,7 @@ VoxelTraversal.prototype.destroy = function () {
382
392
  * @private
383
393
  */
384
394
  function recomputeBoundingVolumesRecursive(that, node) {
385
- const primitive = that._primitive;
386
- const shape = primitive._shape;
387
- const dimensions = primitive._provider.dimensions;
388
- node.computeBoundingVolumes(shape, dimensions);
395
+ node.computeBoundingVolumes(that._primitive._shape);
389
396
  if (defined(node.children)) {
390
397
  for (let i = 0; i < 8; i++) {
391
398
  const child = node.children[i];
@@ -410,12 +417,11 @@ function requestData(that, keyframeNode) {
410
417
  return;
411
418
  }
412
419
 
413
- const primitive = that._primitive;
414
- const provider = primitive._provider;
420
+ const provider = that._primitive._provider;
415
421
 
416
422
  function postRequestSuccess(result) {
417
423
  that._simultaneousRequestCount--;
418
- const length = primitive._provider.types.length;
424
+ const length = provider.types.length;
419
425
 
420
426
  if (!defined(result)) {
421
427
  keyframeNode.state = KeyframeNode.LoadState.UNAVAILABLE;
@@ -434,7 +440,7 @@ function requestData(that, keyframeNode) {
434
440
  const data = result[i];
435
441
  const expectedLength = tileVoxelCount * channelCount;
436
442
  if (data.length === expectedLength) {
437
- keyframeNode.metadatas[i] = data;
443
+ keyframeNode.metadata[i] = data;
438
444
  // State is received only when all metadata requests have been received
439
445
  keyframeNode.state = KeyframeNode.LoadState.RECEIVED;
440
446
  } else {
@@ -492,42 +498,22 @@ function loadAndUnload(that, frameState) {
492
498
  const frameNumber = that._frameNumber;
493
499
  const primitive = that._primitive;
494
500
  const shape = primitive._shape;
495
- const { dimensions } = primitive;
496
501
  const targetScreenSpaceError = primitive.screenSpaceError;
497
502
  const priorityQueue = that._priorityQueue;
498
- const keyframeLocation = that._keyframeLocation;
499
503
  const keyframeCount = that._keyframeCount;
500
- const rootNode = that.rootNode;
504
+
505
+ const previousKeyframe = CesiumMath.clamp(
506
+ Math.floor(that._keyframeLocation),
507
+ 0,
508
+ keyframeCount - 2
509
+ );
510
+ const nextKeyframe = previousKeyframe + 1;
501
511
 
502
512
  const { camera, context, pixelRatio } = frameState;
503
513
  const { positionWC, frustum } = camera;
504
514
  const screenHeight = context.drawingBufferHeight / pixelRatio;
505
515
  const screenSpaceErrorMultiplier = screenHeight / frustum.sseDenominator;
506
516
 
507
- function keyframePriority(previousKeyframe, keyframe, nextKeyframe) {
508
- const keyframeDifference = Math.min(
509
- Math.abs(keyframe - previousKeyframe),
510
- Math.abs(keyframe - nextKeyframe)
511
- );
512
- const maxKeyframeDifference = Math.max(
513
- previousKeyframe,
514
- keyframeCount - nextKeyframe - 1,
515
- 1
516
- );
517
- const keyframeFactor = Math.pow(
518
- 1.0 - keyframeDifference / maxKeyframeDifference,
519
- 4.0
520
- );
521
- const binaryTreeFactor = Math.exp(
522
- -that._binaryTreeKeyframeWeighting[keyframe]
523
- );
524
- return CesiumMath.lerp(
525
- binaryTreeFactor,
526
- keyframeFactor,
527
- 0.15 + 0.85 * keyframeFactor
528
- );
529
- }
530
-
531
517
  /**
532
518
  * @ignore
533
519
  * @param {SpatialNode} spatialNode
@@ -545,13 +531,6 @@ function loadAndUnload(that, frameState) {
545
531
  }
546
532
  spatialNode.visitedFrameNumber = frameNumber;
547
533
 
548
- const previousKeyframe = CesiumMath.clamp(
549
- Math.floor(keyframeLocation),
550
- 0,
551
- keyframeCount - 2
552
- );
553
- const nextKeyframe = previousKeyframe + 1;
554
-
555
534
  // Create keyframe nodes at the playhead.
556
535
  // If they already exist, nothing will be created.
557
536
  if (keyframeCount === 1) {
@@ -561,16 +540,21 @@ function loadAndUnload(that, frameState) {
561
540
  spatialNode.createKeyframeNode(k);
562
541
  }
563
542
  }
564
- const ssePriority = mapInfiniteRangeToZeroOne(spatialNode.screenSpaceError);
543
+ const { screenSpaceError, keyframeNodes } = spatialNode;
544
+ const ssePriority = mapInfiniteRangeToZeroOne(screenSpaceError);
565
545
 
566
546
  let hasLoadedKeyframe = false;
567
- const keyframeNodes = spatialNode.keyframeNodes;
568
547
  for (let i = 0; i < keyframeNodes.length; i++) {
569
548
  const keyframeNode = keyframeNodes[i];
570
549
 
571
550
  keyframeNode.priority =
572
551
  10.0 * ssePriority +
573
- keyframePriority(previousKeyframe, keyframeNode.keyframe, nextKeyframe);
552
+ keyframePriority(
553
+ previousKeyframe,
554
+ keyframeNode.keyframe,
555
+ nextKeyframe,
556
+ that
557
+ );
574
558
 
575
559
  if (
576
560
  keyframeNode.state !== KeyframeNode.LoadState.UNAVAILABLE &&
@@ -584,16 +568,14 @@ function loadAndUnload(that, frameState) {
584
568
  }
585
569
  }
586
570
 
587
- const meetsScreenSpaceError =
588
- spatialNode.screenSpaceError < targetScreenSpaceError;
589
- if (meetsScreenSpaceError || !hasLoadedKeyframe) {
571
+ if (screenSpaceError < targetScreenSpaceError || !hasLoadedKeyframe) {
590
572
  // Free up memory
591
573
  spatialNode.children = undefined;
592
574
  return;
593
575
  }
594
576
 
595
577
  if (!defined(spatialNode.children)) {
596
- spatialNode.constructChildNodes(shape, dimensions);
578
+ spatialNode.constructChildNodes(shape);
597
579
  }
598
580
  for (let childIndex = 0; childIndex < 8; childIndex++) {
599
581
  const child = spatialNode.children[childIndex];
@@ -601,9 +583,11 @@ function loadAndUnload(that, frameState) {
601
583
  }
602
584
  }
603
585
 
586
+ // Add all the nodes to the queue, to sort them by priority.
604
587
  priorityQueue.reset();
605
- addToQueueRecursive(rootNode, CullingVolume.MASK_INDETERMINATE);
588
+ addToQueueRecursive(that.rootNode, CullingVolume.MASK_INDETERMINATE);
606
589
 
590
+ // Move the nodes from the queue to array of high priority nodes.
607
591
  const highPriorityKeyframeNodes = that._highPriorityKeyframeNodes;
608
592
  let highPriorityKeyframeNodeCount = 0;
609
593
  let highPriorityKeyframeNode;
@@ -616,6 +600,8 @@ function loadAndUnload(that, frameState) {
616
600
  highPriorityKeyframeNodeCount++;
617
601
  }
618
602
 
603
+ // Sort the list of keyframe nodes in the megatexture by priority, so
604
+ // we can remove the lowest priority nodes if we need space.
619
605
  const keyframeNodesInMegatexture = that._keyframeNodesInMegatexture;
620
606
  // TODO: some of the megatexture state should be stored once, not duplicate for each megatexture
621
607
  const megatexture = that.megatextures[0];
@@ -628,6 +614,8 @@ function loadAndUnload(that, frameState) {
628
614
  return b.highPriorityFrameNumber - a.highPriorityFrameNumber;
629
615
  });
630
616
 
617
+ // Add the high priority nodes to the megatexture,
618
+ // removing existing lower-priority nodes if necessary.
631
619
  let destroyedCount = 0;
632
620
  let addedCount = 0;
633
621
 
@@ -675,6 +663,40 @@ function loadAndUnload(that, frameState) {
675
663
  }
676
664
  }
677
665
 
666
+ /**
667
+ * Compute a priority for a keyframe node.
668
+ *
669
+ * @private
670
+ * @param {number} previousKeyframe
671
+ * @param {number} keyframe
672
+ * @param {number} nextKeyframe
673
+ * @param {VoxelTraversal} traversal
674
+ * @returns {number} The computed priority
675
+ */
676
+ function keyframePriority(previousKeyframe, keyframe, nextKeyframe, traversal) {
677
+ const keyframeDifference = Math.min(
678
+ Math.abs(keyframe - previousKeyframe),
679
+ Math.abs(keyframe - nextKeyframe)
680
+ );
681
+ const maxKeyframeDifference = Math.max(
682
+ previousKeyframe,
683
+ traversal._keyframeCount - nextKeyframe - 1,
684
+ 1
685
+ );
686
+ const keyframeFactor = Math.pow(
687
+ 1.0 - keyframeDifference / maxKeyframeDifference,
688
+ 4.0
689
+ );
690
+ const binaryTreeFactor = Math.exp(
691
+ -traversal._binaryTreeKeyframeWeighting[keyframe]
692
+ );
693
+ return CesiumMath.lerp(
694
+ binaryTreeFactor,
695
+ keyframeFactor,
696
+ 0.15 + 0.85 * keyframeFactor
697
+ );
698
+ }
699
+
678
700
  /**
679
701
  * @function
680
702
  *
@@ -58,8 +58,17 @@ function buildVoxelDrawCommands(primitive, context) {
58
58
  // Compile shaders
59
59
  const shaderBuilderPick = shaderBuilder.clone();
60
60
  shaderBuilderPick.addDefine("PICKING", undefined, ShaderDestination.FRAGMENT);
61
+ const shaderBuilderPickVoxel = shaderBuilder.clone();
62
+ shaderBuilderPickVoxel.addDefine(
63
+ "PICKING_VOXEL",
64
+ undefined,
65
+ ShaderDestination.FRAGMENT
66
+ );
61
67
  const shaderProgram = shaderBuilder.buildShaderProgram(context);
62
68
  const shaderProgramPick = shaderBuilderPick.buildShaderProgram(context);
69
+ const shaderProgramPickVoxel = shaderBuilderPickVoxel.buildShaderProgram(
70
+ context
71
+ );
63
72
  const renderState = RenderState.fromCache({
64
73
  cull: {
65
74
  enabled: true,
@@ -98,6 +107,14 @@ function buildVoxelDrawCommands(primitive, context) {
98
107
  drawCommandPick.shaderProgram = shaderProgramPick;
99
108
  drawCommandPick.pickOnly = true;
100
109
 
110
+ // Create the pick voxels draw command
111
+ const drawCommandPickVoxel = DrawCommand.shallowClone(
112
+ drawCommand,
113
+ new DrawCommand()
114
+ );
115
+ drawCommandPickVoxel.shaderProgram = shaderProgramPickVoxel;
116
+ drawCommandPickVoxel.pickOnly = true;
117
+
101
118
  // Delete the old shader programs
102
119
  if (defined(primitive._drawCommand)) {
103
120
  const command = primitive._drawCommand;
@@ -109,9 +126,15 @@ function buildVoxelDrawCommands(primitive, context) {
109
126
  command.shaderProgram =
110
127
  command.shaderProgram && command.shaderProgram.destroy();
111
128
  }
129
+ if (defined(primitive._drawCommandPickVoxel)) {
130
+ const command = primitive._drawCommandPickVoxel;
131
+ command.shaderProgram =
132
+ command.shaderProgram && command.shaderProgram.destroy();
133
+ }
112
134
 
113
135
  primitive._drawCommand = drawCommand;
114
136
  primitive._drawCommandPick = drawCommandPick;
137
+ primitive._drawCommandPickVoxel = drawCommandPickVoxel;
115
138
  }
116
139
 
117
140
  export default buildVoxelDrawCommands;
@@ -46,6 +46,7 @@ async function createGooglePhotorealistic3DTileset(key, options) {
46
46
  options.maximumCacheOverflowBytes,
47
47
  1024 * 1024 * 1024
48
48
  );
49
+ options.enableCollision = defaultValue(options.enableCollision, true);
49
50
 
50
51
  key = defaultValue(key, GoogleMaps.defaultApiKey);
51
52
  if (!defined(key)) {
@@ -153,6 +153,8 @@ function processVoxelProperties(renderResources, primitive) {
153
153
  shaderBuilder.addStructField(voxelStructId, "vec3", "viewDirWorld");
154
154
  shaderBuilder.addStructField(voxelStructId, "vec3", "surfaceNormal");
155
155
  shaderBuilder.addStructField(voxelStructId, "float", "travelDistance");
156
+ shaderBuilder.addStructField(voxelStructId, "int", "tileIndex");
157
+ shaderBuilder.addStructField(voxelStructId, "int", "sampleIndex");
156
158
 
157
159
  // FragmentInput struct
158
160
  const fragmentInputStructId = "FragmentInput";
@@ -1,5 +1,7 @@
1
- // See IntersectionUtils.glsl for the definitions of Ray, setIntersection,
2
- // setIntersectionPair
1
+ // See IntersectionUtils.glsl for the definitions of Ray, NO_HIT,
2
+ // setIntersection, setIntersectionPair, setShapeIntersection
3
+ // See IntersectLongitude.glsl for the definitions of intersectHalfPlane,
4
+ // intersectFlippedWedge, intersectRegularWedge
3
5
 
4
6
  /* Cylinder defines (set in Scene/VoxelCylinderShape.js)
5
7
  #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN
@@ -10,19 +12,8 @@
10
12
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE
11
13
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF
12
14
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF
13
- #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF
14
15
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
15
16
 
16
- #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS
17
- #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT
18
- #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT
19
- #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
20
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE
21
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
22
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY
23
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY
24
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED
25
-
26
17
  #define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX
27
18
  #define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN
28
19
  #define CYLINDER_INTERSECTION_INDEX_ANGLE
@@ -40,93 +31,6 @@
40
31
  uniform vec2 u_cylinderRenderAngleMinMax;
41
32
  #endif
42
33
 
43
- vec4 intersectHalfPlane(Ray ray, float angle) {
44
- vec2 o = ray.pos.xy;
45
- vec2 d = ray.dir.xy;
46
- vec2 planeDirection = vec2(cos(angle), sin(angle));
47
- vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);
48
-
49
- float a = dot(o, planeNormal);
50
- float b = dot(d, planeNormal);
51
- float t = -a / b;
52
-
53
- vec2 p = o + t * d;
54
- bool outside = dot(p, planeDirection) < 0.0;
55
- if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);
56
-
57
- return vec4(-INF_HIT, t, t, +INF_HIT);
58
- }
59
-
60
- #define POSITIVE_HIT vec2(t, +INF_HIT);
61
- #define NEGATIVE_HIT vec2(-INF_HIT, t);
62
-
63
- vec2 intersectHalfSpace(Ray ray, float angle)
64
- {
65
- vec2 o = ray.pos.xy;
66
- vec2 d = ray.dir.xy;
67
- vec2 n = vec2(sin(angle), -cos(angle));
68
-
69
- float a = dot(o, n);
70
- float b = dot(d, n);
71
- float t = -a / b;
72
- float s = sign(a);
73
-
74
- // Half space cuts right through the camera, pick the side to intersect
75
- if (a == 0.0) {
76
- if (b >= 0.0) {
77
- return POSITIVE_HIT;
78
- } else {
79
- return NEGATIVE_HIT;
80
- }
81
- }
82
-
83
- if (t >= 0.0 != s >= 0.0) {
84
- return POSITIVE_HIT;
85
- } else {
86
- return NEGATIVE_HIT;
87
- }
88
- }
89
-
90
- vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)
91
- {
92
- vec2 o = ray.pos.xy;
93
- vec2 d = ray.dir.xy;
94
- vec2 n1 = vec2(sin(minAngle), -cos(minAngle));
95
- vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));
96
-
97
- float a1 = dot(o, n1);
98
- float a2 = dot(o, n2);
99
- float b1 = dot(d, n1);
100
- float b2 = dot(d, n2);
101
-
102
- float t1 = -a1 / b1;
103
- float t2 = -a2 / b2;
104
- float s1 = sign(a1);
105
- float s2 = sign(a2);
106
-
107
- float tmin = min(t1, t2);
108
- float tmax = max(t1, t2);
109
- float smin = tmin == t1 ? s1 : s2;
110
- float smax = tmin == t1 ? s2 : s1;
111
-
112
- bool e = tmin >= 0.0;
113
- bool f = tmax >= 0.0;
114
- bool g = smin >= 0.0;
115
- bool h = smax >= 0.0;
116
-
117
- if (e != g && f == h) return vec2(tmin, tmax);
118
- else if (e == g && f == h) return vec2(-INF_HIT, tmin);
119
- else if (e != g && f != h) return vec2(tmax, +INF_HIT);
120
- else return vec2(NO_HIT);
121
- }
122
-
123
- vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)
124
- {
125
- vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);
126
- vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);
127
- return vec4(planeIntersectMin, planeIntersectMax);
128
- }
129
-
130
34
  vec2 intersectUnitCylinder(Ray ray)
131
35
  {
132
36
  vec3 o = ray.pos;
@@ -256,18 +160,17 @@ void intersectShape(Ray ray, inout Intersections ix)
256
160
  #endif
257
161
 
258
162
  #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF)
259
- vec2 wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax.x, u_cylinderRenderAngleMinMax.y);
260
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);
163
+ RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax);
164
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);
261
165
  #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF)
262
- vec4 wedgeIntersect = intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax.x, u_cylinderRenderAngleMinMax.y);
263
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersect.xy);
264
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersect.zw);
265
- #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF)
266
- vec2 wedgeIntersect = intersectHalfSpace(ray, u_cylinderRenderAngleMinMax.x);
267
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);
166
+ RayShapeIntersection wedgeIntersects[2];
167
+ intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects);
168
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);
169
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);
268
170
  #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)
269
- vec4 wedgeIntersect = intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x);
270
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersect.xy);
271
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersect.zw);
171
+ RayShapeIntersection wedgeIntersects[2];
172
+ intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects);
173
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);
174
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);
272
175
  #endif
273
176
  }
@@ -1,6 +1,8 @@
1
1
  //This file is automatically rebuilt by the Cesium build process.
2
- export default "// See IntersectionUtils.glsl for the definitions of Ray, setIntersection,\n\
3
- // setIntersectionPair\n\
2
+ export default "// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT,\n\
3
+ // setIntersection, setIntersectionPair, setShapeIntersection\n\
4
+ // See IntersectLongitude.glsl for the definitions of intersectHalfPlane,\n\
5
+ // intersectFlippedWedge, intersectRegularWedge\n\
4
6
  \n\
5
7
  /* Cylinder defines (set in Scene/VoxelCylinderShape.js)\n\
6
8
  #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN\n\
@@ -11,19 +13,8 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, setInt
11
13
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE\n\
12
14
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF\n\
13
15
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF\n\
14
- #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF\n\
15
16
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
16
17
  \n\
17
- #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS\n\
18
- #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT\n\
19
- #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT\n\
20
- #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT\n\
21
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE\n\
22
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
23
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY\n\
24
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY\n\
25
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED\n\
26
- \n\
27
18
  #define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX\n\
28
19
  #define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN\n\
29
20
  #define CYLINDER_INTERSECTION_INDEX_ANGLE\n\
@@ -41,93 +32,6 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, setInt
41
32
  uniform vec2 u_cylinderRenderAngleMinMax;\n\
42
33
  #endif\n\
43
34
  \n\
44
- vec4 intersectHalfPlane(Ray ray, float angle) {\n\
45
- vec2 o = ray.pos.xy;\n\
46
- vec2 d = ray.dir.xy;\n\
47
- vec2 planeDirection = vec2(cos(angle), sin(angle));\n\
48
- vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);\n\
49
- \n\
50
- float a = dot(o, planeNormal);\n\
51
- float b = dot(d, planeNormal);\n\
52
- float t = -a / b;\n\
53
- \n\
54
- vec2 p = o + t * d;\n\
55
- bool outside = dot(p, planeDirection) < 0.0;\n\
56
- if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
57
- \n\
58
- return vec4(-INF_HIT, t, t, +INF_HIT);\n\
59
- }\n\
60
- \n\
61
- #define POSITIVE_HIT vec2(t, +INF_HIT);\n\
62
- #define NEGATIVE_HIT vec2(-INF_HIT, t);\n\
63
- \n\
64
- vec2 intersectHalfSpace(Ray ray, float angle)\n\
65
- {\n\
66
- vec2 o = ray.pos.xy;\n\
67
- vec2 d = ray.dir.xy;\n\
68
- vec2 n = vec2(sin(angle), -cos(angle));\n\
69
- \n\
70
- float a = dot(o, n);\n\
71
- float b = dot(d, n);\n\
72
- float t = -a / b;\n\
73
- float s = sign(a);\n\
74
- \n\
75
- // Half space cuts right through the camera, pick the side to intersect\n\
76
- if (a == 0.0) {\n\
77
- if (b >= 0.0) {\n\
78
- return POSITIVE_HIT;\n\
79
- } else {\n\
80
- return NEGATIVE_HIT;\n\
81
- }\n\
82
- }\n\
83
- \n\
84
- if (t >= 0.0 != s >= 0.0) {\n\
85
- return POSITIVE_HIT;\n\
86
- } else {\n\
87
- return NEGATIVE_HIT;\n\
88
- }\n\
89
- }\n\
90
- \n\
91
- vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)\n\
92
- {\n\
93
- vec2 o = ray.pos.xy;\n\
94
- vec2 d = ray.dir.xy;\n\
95
- vec2 n1 = vec2(sin(minAngle), -cos(minAngle));\n\
96
- vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));\n\
97
- \n\
98
- float a1 = dot(o, n1);\n\
99
- float a2 = dot(o, n2);\n\
100
- float b1 = dot(d, n1);\n\
101
- float b2 = dot(d, n2);\n\
102
- \n\
103
- float t1 = -a1 / b1;\n\
104
- float t2 = -a2 / b2;\n\
105
- float s1 = sign(a1);\n\
106
- float s2 = sign(a2);\n\
107
- \n\
108
- float tmin = min(t1, t2);\n\
109
- float tmax = max(t1, t2);\n\
110
- float smin = tmin == t1 ? s1 : s2;\n\
111
- float smax = tmin == t1 ? s2 : s1;\n\
112
- \n\
113
- bool e = tmin >= 0.0;\n\
114
- bool f = tmax >= 0.0;\n\
115
- bool g = smin >= 0.0;\n\
116
- bool h = smax >= 0.0;\n\
117
- \n\
118
- if (e != g && f == h) return vec2(tmin, tmax);\n\
119
- else if (e == g && f == h) return vec2(-INF_HIT, tmin);\n\
120
- else if (e != g && f != h) return vec2(tmax, +INF_HIT);\n\
121
- else return vec2(NO_HIT);\n\
122
- }\n\
123
- \n\
124
- vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)\n\
125
- {\n\
126
- vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);\n\
127
- vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);\n\
128
- return vec4(planeIntersectMin, planeIntersectMax);\n\
129
- }\n\
130
- \n\
131
35
  vec2 intersectUnitCylinder(Ray ray)\n\
132
36
  {\n\
133
37
  vec3 o = ray.pos;\n\
@@ -257,19 +161,18 @@ void intersectShape(Ray ray, inout Intersections ix)\n\
257
161
  #endif\n\
258
162
  \n\
259
163
  #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF)\n\
260
- vec2 wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax.x, u_cylinderRenderAngleMinMax.y);\n\
261
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);\n\
164
+ RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax);\n\
165
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);\n\
262
166
  #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF)\n\
263
- vec4 wedgeIntersect = intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax.x, u_cylinderRenderAngleMinMax.y);\n\
264
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersect.xy);\n\
265
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersect.zw);\n\
266
- #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF)\n\
267
- vec2 wedgeIntersect = intersectHalfSpace(ray, u_cylinderRenderAngleMinMax.x);\n\
268
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);\n\
167
+ RayShapeIntersection wedgeIntersects[2];\n\
168
+ intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects);\n\
169
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);\n\
170
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);\n\
269
171
  #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)\n\
270
- vec4 wedgeIntersect = intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x);\n\
271
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersect.xy);\n\
272
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersect.zw);\n\
172
+ RayShapeIntersection wedgeIntersects[2];\n\
173
+ intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects);\n\
174
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);\n\
175
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);\n\
273
176
  #endif\n\
274
177
  }\n\
275
178
  ";