@cesium/engine 7.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/Build/ThirdParty/Workers/z-worker-pako.js +1 -5
  2. package/Build/Workers/{chunk-7XEAYGZK.js → chunk-24YTYWNB.js} +10 -10
  3. package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2632RVPI.js} +7 -7
  4. package/Build/Workers/chunk-2KACWKS4.js +501 -0
  5. package/Build/Workers/{chunk-QZAD5O7I.js → chunk-2XPLH3JY.js} +7 -7
  6. package/Build/Workers/{chunk-JY5YEZFA.js → chunk-2ZBL3MVO.js} +8 -8
  7. package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-3NCVAGDA.js} +14 -14
  8. package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-5R6VWLMH.js} +6 -6
  9. package/Build/Workers/{chunk-PTQQUQC3.js → chunk-5TIV3L26.js} +13 -13
  10. package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-6WF3KIF5.js} +10 -10
  11. package/Build/Workers/{chunk-5WQ523AW.js → chunk-73FKKY52.js} +5 -5
  12. package/Build/Workers/{chunk-F6SE42BK.js → chunk-7COR472O.js} +15 -472
  13. package/Build/Workers/{chunk-72SANQJV.js → chunk-ADOVHYWO.js} +9 -5
  14. package/Build/Workers/{chunk-5YLJ77FF.js → chunk-BCU2LH5T.js} +12 -11
  15. package/Build/Workers/{chunk-4EBHOMFX.js → chunk-C3XBUYBO.js} +17 -17
  16. package/Build/Workers/{chunk-IX2JCCNM.js → chunk-C6OI26DR.js} +1 -1
  17. package/Build/Workers/{chunk-2HJWSU7B.js → chunk-CO35JNNE.js} +4 -4
  18. package/Build/Workers/{chunk-OVLG3FRS.js → chunk-DGDUKCJJ.js} +6 -6
  19. package/Build/Workers/{chunk-DTAIXKTO.js → chunk-DPUSFA7S.js} +6 -6
  20. package/Build/Workers/{chunk-R5X4OQT4.js → chunk-E6WXPSJS.js} +7 -7
  21. package/Build/Workers/{chunk-VK3EJHWI.js → chunk-EOXYZ34O.js} +2 -2
  22. package/Build/Workers/{chunk-RAEV7K66.js → chunk-EPKE7GE3.js} +5 -5
  23. package/Build/Workers/{chunk-GV56Q4LU.js → chunk-GFA4SMXV.js} +11 -11
  24. package/Build/Workers/{chunk-NKPBIX7F.js → chunk-GXUXEOE2.js} +1 -1
  25. package/Build/Workers/{chunk-NY3K4IM3.js → chunk-HBQPB6IH.js} +12 -12
  26. package/Build/Workers/{chunk-6HZQPRUS.js → chunk-I37B3MZ2.js} +1 -1
  27. package/Build/Workers/{chunk-VRGFV2UO.js → chunk-L4BW3RUA.js} +10 -10
  28. package/Build/Workers/{chunk-6VJVYK2V.js → chunk-LAQP3SCC.js} +2 -2
  29. package/Build/Workers/{chunk-PNBGBETF.js → chunk-LQJ5FFFR.js} +10 -10
  30. package/Build/Workers/{chunk-UAEW6HKG.js → chunk-M2AYBTNH.js} +13 -13
  31. package/Build/Workers/{chunk-YUCVWAY6.js → chunk-MWV7IZK4.js} +7 -7
  32. package/Build/Workers/{chunk-JXDC723O.js → chunk-N4KXMWQU.js} +2 -2
  33. package/Build/Workers/{chunk-XWXM2O2R.js → chunk-NP2GYYE5.js} +6 -6
  34. package/Build/Workers/{chunk-GEJTYLCO.js → chunk-NZWNZA6S.js} +5 -5
  35. package/Build/Workers/{chunk-LZGHD6NY.js → chunk-P2YAAMT2.js} +15 -15
  36. package/Build/Workers/{chunk-S6SKF6DT.js → chunk-P4XKB3QZ.js} +5 -5
  37. package/Build/Workers/{chunk-U2VCRRQW.js → chunk-PXB7T27O.js} +6 -6
  38. package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-QCQUZGXI.js} +4 -4
  39. package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-QKBGRKKG.js} +4 -4
  40. package/Build/Workers/{chunk-ODW7WYM4.js → chunk-RMOEYCZW.js} +2 -2
  41. package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-RSJXEO2A.js} +2 -2
  42. package/Build/Workers/{chunk-UDO6BFSF.js → chunk-RV7ZOSS6.js} +13 -13
  43. package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-SE4PXOEA.js} +17 -17
  44. package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-SS4ESNE3.js} +2 -2
  45. package/Build/Workers/{chunk-AIPU2VSX.js → chunk-TJBU6GML.js} +6 -6
  46. package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-TZORKRNK.js} +1 -1
  47. package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-VR5RBW52.js} +7 -7
  48. package/Build/Workers/{chunk-FP6GYBFX.js → chunk-WHUSTDIB.js} +10 -10
  49. package/Build/Workers/{chunk-5HDYHG3F.js → chunk-X2F6BEPY.js} +13 -13
  50. package/Build/Workers/{chunk-WZU2YLWG.js → chunk-X6XOMPWL.js} +3 -3
  51. package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YDVSBWEO.js} +1 -1
  52. package/Build/Workers/{chunk-46UD5ABS.js → chunk-YV4H2Y7M.js} +4 -4
  53. package/Build/Workers/{chunk-WBQCVXR3.js → chunk-Z7FQLK6N.js} +4 -4
  54. package/Build/Workers/{chunk-L2ZN645J.js → chunk-ZNVSKMQ2.js} +6 -6
  55. package/Build/Workers/{chunk-JCNXK6EL.js → chunk-ZYPTP7GS.js} +11 -11
  56. package/Build/Workers/combineGeometry.js +24 -23
  57. package/Build/Workers/createBoxGeometry.js +18 -17
  58. package/Build/Workers/createBoxOutlineGeometry.js +16 -15
  59. package/Build/Workers/createCircleGeometry.js +26 -25
  60. package/Build/Workers/createCircleOutlineGeometry.js +19 -18
  61. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
  62. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
  63. package/Build/Workers/createCorridorGeometry.js +29 -28
  64. package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
  65. package/Build/Workers/createCylinderGeometry.js +20 -19
  66. package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
  67. package/Build/Workers/createEllipseGeometry.js +26 -25
  68. package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
  69. package/Build/Workers/createEllipsoidGeometry.js +19 -18
  70. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
  71. package/Build/Workers/createFrustumGeometry.js +18 -17
  72. package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
  73. package/Build/Workers/createGeometry.js +54 -33
  74. package/Build/Workers/createGroundPolylineGeometry.js +22 -21
  75. package/Build/Workers/createPlaneGeometry.js +16 -15
  76. package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
  77. package/Build/Workers/createPolygonGeometry.js +33 -32
  78. package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
  79. package/Build/Workers/createPolylineGeometry.js +25 -24
  80. package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
  81. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
  82. package/Build/Workers/createRectangleGeometry.js +27 -26
  83. package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
  84. package/Build/Workers/createSimplePolylineGeometry.js +23 -22
  85. package/Build/Workers/createSphereGeometry.js +19 -18
  86. package/Build/Workers/createSphereOutlineGeometry.js +18 -17
  87. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  88. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  89. package/Build/Workers/createVectorTileGeometries.js +24 -23
  90. package/Build/Workers/createVectorTilePoints.js +12 -12
  91. package/Build/Workers/createVectorTilePolygons.js +22 -21
  92. package/Build/Workers/createVectorTilePolylines.js +14 -14
  93. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
  94. package/Build/Workers/createVerticesFromHeightmap.js +22 -21
  95. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
  96. package/Build/Workers/createWallGeometry.js +24 -23
  97. package/Build/Workers/createWallOutlineGeometry.js +23 -22
  98. package/Build/Workers/decodeDraco.js +11 -11
  99. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  100. package/Build/Workers/decodeI3S.js +601 -92
  101. package/Build/Workers/transcodeKTX2.js +7 -7
  102. package/Build/Workers/transferTypedArrayTest.js +1 -1
  103. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
  104. package/Source/Core/Check.d.ts +127 -0
  105. package/Source/Core/Check.js +0 -1
  106. package/Source/Core/Ellipsoid.js +6 -0
  107. package/Source/Core/Geometry.js +1 -1
  108. package/Source/Core/IntersectionTests.js +6 -3
  109. package/Source/Core/Ion.js +1 -1
  110. package/Source/Core/PixelFormat.js +5 -0
  111. package/Source/Core/PolygonGeometry.js +1 -1
  112. package/Source/Core/Transforms.js +3 -0
  113. package/Source/Core/VerticalExaggeration.js +2 -1
  114. package/Source/Core/srgbToLinear.js +32 -0
  115. package/Source/DataSources/CzmlDataSource.js +51 -23
  116. package/Source/DataSources/DataSourceDisplay.js +27 -0
  117. package/Source/DataSources/Entity.js +20 -2
  118. package/Source/DataSources/GeometryUpdaterSet.js +114 -0
  119. package/Source/DataSources/GeometryVisualizer.js +19 -83
  120. package/Source/Renderer/Context.js +10 -0
  121. package/Source/Renderer/ContextLimits.js +2 -0
  122. package/Source/Renderer/demodernizeShader.js +4 -1
  123. package/Source/Scene/ArcGisMapService.js +1 -1
  124. package/Source/Scene/Axis.js +12 -7
  125. package/Source/Scene/Billboard.js +32 -0
  126. package/Source/Scene/BillboardCollection.js +1 -1
  127. package/Source/Scene/BingMapsImageryProvider.js +4 -0
  128. package/Source/Scene/Camera.js +46 -4
  129. package/Source/Scene/Cesium3DTilesVoxelProvider.js +2 -9
  130. package/Source/Scene/Cesium3DTileset.js +10 -7
  131. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
  132. package/Source/Scene/FrameState.js +5 -0
  133. package/Source/Scene/Globe.js +0 -67
  134. package/Source/Scene/GlobeTranslucencyState.js +1 -1
  135. package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
  136. package/Source/Scene/I3SDataProvider.js +270 -53
  137. package/Source/Scene/I3SDecoder.js +8 -1
  138. package/Source/Scene/I3SFeature.js +2 -5
  139. package/Source/Scene/I3SField.js +136 -31
  140. package/Source/Scene/I3SGeometry.js +70 -2
  141. package/Source/Scene/I3SLayer.js +55 -10
  142. package/Source/Scene/I3SNode.js +175 -18
  143. package/Source/Scene/I3SStatistics.js +94 -0
  144. package/Source/Scene/I3SSublayer.js +176 -0
  145. package/Source/Scene/I3SSymbology.js +337 -0
  146. package/Source/Scene/KeyframeNode.js +1 -1
  147. package/Source/Scene/Label.js +33 -0
  148. package/Source/Scene/LabelCollection.js +2 -1
  149. package/Source/Scene/Model/pickModel.js +25 -7
  150. package/Source/Scene/PickFramebuffer.js +37 -2
  151. package/Source/Scene/Picking.js +113 -39
  152. package/Source/Scene/Primitive.js +6 -5
  153. package/Source/Scene/Scene.js +126 -42
  154. package/Source/Scene/ScreenSpaceCameraController.js +21 -7
  155. package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
  156. package/Source/Scene/SpatialNode.js +12 -19
  157. package/Source/Scene/StructuralMetadata.js +1 -1
  158. package/Source/Scene/VoxelBoxShape.js +67 -6
  159. package/Source/Scene/VoxelCell.js +273 -0
  160. package/Source/Scene/VoxelCylinderShape.js +117 -163
  161. package/Source/Scene/VoxelEllipsoidShape.js +255 -304
  162. package/Source/Scene/VoxelPrimitive.js +109 -15
  163. package/Source/Scene/VoxelRenderResources.js +12 -3
  164. package/Source/Scene/VoxelShape.js +7 -4
  165. package/Source/Scene/VoxelTraversal.js +76 -54
  166. package/Source/Scene/buildVoxelDrawCommands.js +23 -0
  167. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
  168. package/Source/Scene/processVoxelProperties.js +3 -0
  169. package/Source/Shaders/Voxels/IntersectBox.glsl +21 -47
  170. package/Source/Shaders/Voxels/IntersectBox.js +21 -47
  171. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +1 -1
  172. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +1 -1
  173. package/Source/Shaders/Voxels/IntersectCylinder.glsl +76 -203
  174. package/Source/Shaders/Voxels/IntersectCylinder.js +76 -203
  175. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +220 -229
  176. package/Source/Shaders/Voxels/IntersectEllipsoid.js +220 -229
  177. package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
  178. package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
  179. package/Source/Shaders/Voxels/IntersectionUtils.glsl +33 -11
  180. package/Source/Shaders/Voxels/IntersectionUtils.js +33 -11
  181. package/Source/Shaders/Voxels/Megatexture.glsl +1 -2
  182. package/Source/Shaders/Voxels/Megatexture.js +1 -2
  183. package/Source/Shaders/Voxels/Octree.glsl +14 -9
  184. package/Source/Shaders/Voxels/Octree.js +14 -9
  185. package/Source/Shaders/Voxels/VoxelFS.glsl +128 -40
  186. package/Source/Shaders/Voxels/VoxelFS.js +128 -40
  187. package/Source/Shaders/Voxels/VoxelUtils.glsl +31 -0
  188. package/Source/Shaders/Voxels/VoxelUtils.js +33 -0
  189. package/Source/Shaders/Voxels/convertUvToBox.glsl +24 -3
  190. package/Source/Shaders/Voxels/convertUvToBox.js +24 -4
  191. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +64 -40
  192. package/Source/Shaders/Voxels/convertUvToCylinder.js +64 -40
  193. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +100 -91
  194. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +100 -91
  195. package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
  196. package/Source/Workers/createGeometry.js +40 -11
  197. package/Source/Workers/decodeI3S.js +720 -94
  198. package/index.d.ts +542 -40
  199. package/index.js +75 -66
  200. package/package.json +2 -2
@@ -1,23 +1,20 @@
1
1
  //This file is automatically rebuilt by the Cesium build process.
2
- export default "// See IntersectionUtils.glsl for the definitions of Ray, Intersections,\n\
3
- // setIntersection, setIntersectionPair, INF_HIT, NO_HIT\n\
2
+ export default "// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, Intersections,\n\
3
+ // RayShapeIntersection, setSurfaceIntersection, setShapeIntersection\n\
4
+ // See IntersectLongitude.glsl for the definitions of intersectHalfPlane,\n\
5
+ // intersectFlippedWedge, intersectRegularWedge\n\
4
6
  \n\
5
7
  /* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js)\n\
6
8
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE\n\
7
9
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO\n\
8
10
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF\n\
9
- #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF\n\
10
11
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF\n\
11
- #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE\n\
12
12
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF\n\
13
13
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF\n\
14
14
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF\n\
15
15
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF\n\
16
16
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF\n\
17
17
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF\n\
18
- #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX\n\
19
- #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN\n\
20
- #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
21
18
  #define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE\n\
22
19
  #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX\n\
23
20
  #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN\n\
@@ -28,205 +25,225 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, Inters
28
25
  #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE)\n\
29
26
  uniform vec2 u_ellipsoidRenderLongitudeMinMax;\n\
30
27
  #endif\n\
31
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF)\n\
32
- uniform vec2 u_ellipsoidRenderLatitudeCosSqrHalfMinMax;\n\
33
- #endif\n\
34
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX)\n\
35
- uniform float u_ellipsoidInverseOuterScaleUv;\n\
36
- #endif\n\
37
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
38
- uniform float u_ellipsoidInverseInnerScaleUv;\n\
39
- #endif\n\
40
- \n\
41
- vec2 intersectZPlane(Ray ray)\n\
42
- {\n\
43
- float o = ray.pos.z;\n\
44
- float d = ray.dir.z;\n\
45
- float t = -o / d;\n\
46
- float s = sign(o);\n\
47
- \n\
48
- if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);\n\
49
- else return vec2(-INF_HIT, t);\n\
50
- }\n\
51
- \n\
52
- vec4 intersectHalfPlane(Ray ray, float angle) {\n\
53
- vec2 o = ray.pos.xy;\n\
54
- vec2 d = ray.dir.xy;\n\
55
- vec2 planeDirection = vec2(cos(angle), sin(angle));\n\
56
- vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);\n\
28
+ uniform float u_eccentricitySquared;\n\
29
+ uniform vec2 u_ellipsoidRenderLatitudeSinMinMax;\n\
30
+ uniform vec2 u_clipMinMaxHeight;\n\
57
31
  \n\
58
- float a = dot(o, planeNormal);\n\
59
- float b = dot(d, planeNormal);\n\
60
- float t = -a / b;\n\
32
+ RayShapeIntersection intersectZPlane(in Ray ray, in float z) {\n\
33
+ float t = -ray.pos.z / ray.dir.z;\n\
61
34
  \n\
62
- vec2 p = o + t * d;\n\
63
- bool outside = dot(p, planeDirection) < 0.0;\n\
64
- if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
35
+ bool startsOutside = sign(ray.pos.z) == sign(z);\n\
36
+ bool entry = (t >= 0.0) != startsOutside;\n\
65
37
  \n\
66
- return vec4(-INF_HIT, t, t, +INF_HIT);\n\
67
- }\n\
68
- \n\
69
- vec2 intersectHalfSpace(Ray ray, float angle)\n\
70
- {\n\
71
- vec2 o = ray.pos.xy;\n\
72
- vec2 d = ray.dir.xy;\n\
73
- vec2 n = vec2(sin(angle), -cos(angle));\n\
74
- \n\
75
- float a = dot(o, n);\n\
76
- float b = dot(d, n);\n\
77
- float t = -a / b;\n\
78
- float s = sign(a);\n\
38
+ vec4 intersect = vec4(0.0, 0.0, z, t);\n\
39
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
79
40
  \n\
80
- if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);\n\
81
- else return vec2(-INF_HIT, t);\n\
41
+ if (entry) {\n\
42
+ return RayShapeIntersection(intersect, farSide);\n\
43
+ } else {\n\
44
+ return RayShapeIntersection(-1.0 * farSide, intersect);\n\
45
+ }\n\
82
46
  }\n\
83
47
  \n\
84
- vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)\n\
48
+ RayShapeIntersection intersectHeight(in Ray ray, in float relativeHeight, in bool convex)\n\
85
49
  {\n\
86
- vec2 o = ray.pos.xy;\n\
87
- vec2 d = ray.dir.xy;\n\
88
- vec2 n1 = vec2(sin(minAngle), -cos(minAngle));\n\
89
- vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));\n\
90
- \n\
91
- float a1 = dot(o, n1);\n\
92
- float a2 = dot(o, n2);\n\
93
- float b1 = dot(d, n1);\n\
94
- float b2 = dot(d, n2);\n\
50
+ // Scale the ray by the ellipsoid axes to make it a unit sphere\n\
51
+ // Note: approximating ellipsoid + height as an ellipsoid\n\
52
+ vec3 radiiCorrection = u_ellipsoidRadiiUv / (u_ellipsoidRadiiUv + relativeHeight);\n\
53
+ vec3 position = ray.pos * radiiCorrection;\n\
54
+ vec3 direction = ray.dir * radiiCorrection;\n\
55
+ \n\
56
+ float a = dot(direction, direction); // ~ 1.0 (or maybe 4.0 if ray is scaled)\n\
57
+ float b = dot(direction, position); // roughly inside [-1.0, 1.0] when zoomed in\n\
58
+ float c = dot(position, position) - 1.0; // ~ 0.0 when zoomed in.\n\
59
+ float determinant = b * b - a * c; // ~ b * b when zoomed in\n\
60
+ \n\
61
+ if (determinant < 0.0) {\n\
62
+ vec4 miss = vec4(normalize(direction), NO_HIT);\n\
63
+ return RayShapeIntersection(miss, miss);\n\
64
+ }\n\
95
65
  \n\
96
- float t1 = -a1 / b1;\n\
97
- float t2 = -a2 / b2;\n\
98
- float s1 = sign(a1);\n\
99
- float s2 = sign(a2);\n\
66
+ determinant = sqrt(determinant);\n\
100
67
  \n\
68
+ // Compute larger root using standard formula\n\
69
+ float signB = b < 0.0 ? -1.0 : 1.0;\n\
70
+ // The other root may suffer from subtractive cancellation in the standard formula.\n\
71
+ // Compute it from the first root instead.\n\
72
+ float t1 = (-b - signB * determinant) / a;\n\
73
+ float t2 = c / (a * t1);\n\
101
74
  float tmin = min(t1, t2);\n\
102
75
  float tmax = max(t1, t2);\n\
103
- float smin = tmin == t1 ? s1 : s2;\n\
104
- float smax = tmin == t1 ? s2 : s1;\n\
105
- \n\
106
- bool e = tmin >= 0.0;\n\
107
- bool f = tmax >= 0.0;\n\
108
- bool g = smin >= 0.0;\n\
109
- bool h = smax >= 0.0;\n\
110
- \n\
111
- if (e != g && f == h) return vec2(tmin, tmax);\n\
112
- else if (e == g && f == h) return vec2(-INF_HIT, tmin);\n\
113
- else if (e != g && f != h) return vec2(tmax, +INF_HIT);\n\
114
- else return vec2(NO_HIT);\n\
115
- }\n\
116
76
  \n\
117
- vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)\n\
118
- {\n\
119
- vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);\n\
120
- vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);\n\
121
- return vec4(planeIntersectMin, planeIntersectMax);\n\
77
+ float directionScale = convex ? 1.0 : -1.0;\n\
78
+ vec3 d1 = directionScale * normalize(position + tmin * direction);\n\
79
+ vec3 d2 = directionScale * normalize(position + tmax * direction);\n\
80
+ \n\
81
+ return RayShapeIntersection(vec4(d1, tmin), vec4(d2, tmax));\n\
122
82
  }\n\
123
83
  \n\
124
- vec2 intersectUnitSphere(Ray ray)\n\
84
+ /**\n\
85
+ * Given a circular cone around the z-axis, with apex at the origin,\n\
86
+ * find the parametric distance(s) along a ray where that ray intersects\n\
87
+ * the cone.\n\
88
+ * The cone opening angle is described by the squared cosine of\n\
89
+ * its half-angle (the angle between the Z-axis and the surface)\n\
90
+ */\n\
91
+ vec2 intersectDoubleEndedCone(in Ray ray, in float cosSqrHalfAngle)\n\
125
92
  {\n\
126
93
  vec3 o = ray.pos;\n\
127
94
  vec3 d = ray.dir;\n\
95
+ float sinSqrHalfAngle = 1.0 - cosSqrHalfAngle;\n\
128
96
  \n\
129
- float b = dot(d, o);\n\
130
- float c = dot(o, o) - 1.0;\n\
131
- float det = b * b - c;\n\
132
- \n\
133
- if (det < 0.0) {\n\
134
- return vec2(NO_HIT);\n\
135
- }\n\
136
- \n\
137
- det = sqrt(det);\n\
138
- float t1 = -b - det;\n\
139
- float t2 = -b + det;\n\
140
- float tmin = min(t1, t2);\n\
141
- float tmax = max(t1, t2);\n\
142
- \n\
143
- return vec2(tmin, tmax);\n\
144
- }\n\
97
+ float aSin = d.z * d.z * sinSqrHalfAngle;\n\
98
+ float aCos = -dot(d.xy, d.xy) * cosSqrHalfAngle;\n\
99
+ float a = aSin + aCos;\n\
145
100
  \n\
146
- vec2 intersectUnitSphereUnnormalizedDirection(Ray ray)\n\
147
- {\n\
148
- vec3 o = ray.pos;\n\
149
- vec3 d = ray.dir;\n\
101
+ float bSin = d.z * o.z * sinSqrHalfAngle;\n\
102
+ float bCos = -dot(o.xy, d.xy) * cosSqrHalfAngle;\n\
103
+ float b = bSin + bCos;\n\
150
104
  \n\
151
- float a = dot(d, d);\n\
152
- float b = dot(d, o);\n\
153
- float c = dot(o, o) - 1.0;\n\
154
- float det = b * b - a * c;\n\
105
+ float cSin = o.z * o.z * sinSqrHalfAngle;\n\
106
+ float cCos = -dot(o.xy, o.xy) * cosSqrHalfAngle;\n\
107
+ float c = cSin + cCos;\n\
108
+ // determinant = b * b - a * c. But bSin * bSin = aSin * cSin.\n\
109
+ // Avoid subtractive cancellation by expanding to eliminate these terms\n\
110
+ float determinant = 2.0 * bSin * bCos + bCos * bCos - aSin * cCos - aCos * cSin - aCos * cCos;\n\
155
111
  \n\
156
- if (det < 0.0) {\n\
112
+ if (determinant < 0.0) {\n\
157
113
  return vec2(NO_HIT);\n\
114
+ } else if (a == 0.0) {\n\
115
+ // Ray is parallel to cone surface\n\
116
+ return (b == 0.0)\n\
117
+ ? vec2(NO_HIT) // Ray is on cone surface\n\
118
+ : vec2(-0.5 * c / b, NO_HIT);\n\
158
119
  }\n\
159
120
  \n\
160
- det = sqrt(det);\n\
161
- float t1 = (-b - det) / a;\n\
162
- float t2 = (-b + det) / a;\n\
121
+ determinant = sqrt(determinant);\n\
122
+ \n\
123
+ // Compute larger root using standard formula\n\
124
+ float signB = b < 0.0 ? -1.0 : 1.0;\n\
125
+ float t1 = (-b - signB * determinant) / a;\n\
126
+ // The other root may suffer from subtractive cancellation in the standard formula.\n\
127
+ // Compute it from the first root instead.\n\
128
+ float t2 = c / (a * t1);\n\
163
129
  float tmin = min(t1, t2);\n\
164
130
  float tmax = max(t1, t2);\n\
165
- \n\
166
131
  return vec2(tmin, tmax);\n\
167
132
  }\n\
168
133
  \n\
169
- vec2 intersectDoubleEndedCone(Ray ray, float cosSqrHalfAngle)\n\
170
- {\n\
171
- vec3 o = ray.pos;\n\
172
- vec3 d = ray.dir;\n\
173
- float a = d.z * d.z - dot(d, d) * cosSqrHalfAngle;\n\
174
- float b = d.z * o.z - dot(o, d) * cosSqrHalfAngle;\n\
175
- float c = o.z * o.z - dot(o, o) * cosSqrHalfAngle;\n\
176
- float det = b * b - a * c;\n\
177
- \n\
178
- if (det < 0.0) {\n\
179
- return vec2(NO_HIT);\n\
180
- }\n\
134
+ /**\n\
135
+ * Given a point on a conical surface, find the surface normal at that point.\n\
136
+ */\n\
137
+ vec3 getConeNormal(in vec3 p, in bool convex) {\n\
138
+ // Start with radial component pointing toward z-axis\n\
139
+ vec2 radial = -abs(p.z) * normalize(p.xy);\n\
140
+ // Z component points toward opening of cone\n\
141
+ float zSign = (p.z < 0.0) ? -1.0 : 1.0;\n\
142
+ float z = length(p.xy) * zSign;\n\
143
+ // Flip normal if shape is convex\n\
144
+ float flip = (convex) ? -1.0 : 1.0;\n\
145
+ return normalize(vec3(radial, z) * flip);\n\
146
+ }\n\
181
147
  \n\
182
- det = sqrt(det);\n\
183
- float t1 = (-b - det) / a;\n\
184
- float t2 = (-b + det) / a;\n\
185
- float tmin = min(t1, t2);\n\
186
- float tmax = max(t1, t2);\n\
187
- return vec2(tmin, tmax);\n\
148
+ /**\n\
149
+ * Compute the shift between the ellipsoid origin and the apex of a cone of latitude\n\
150
+ */\n\
151
+ float getLatitudeConeShift(in float sinLatitude) {\n\
152
+ // Find prime vertical radius of curvature: \n\
153
+ // the distance along the ellipsoid normal to the intersection with the z-axis\n\
154
+ float x2 = u_eccentricitySquared * sinLatitude * sinLatitude;\n\
155
+ float primeVerticalRadius = inversesqrt(1.0 - x2);\n\
156
+ \n\
157
+ // Compute a shift from the origin to the intersection of the cone with the z-axis\n\
158
+ return primeVerticalRadius * u_eccentricitySquared * sinLatitude;\n\
188
159
  }\n\
189
160
  \n\
190
- vec4 intersectFlippedCone(Ray ray, float cosSqrHalfAngle) {\n\
161
+ void intersectFlippedCone(in Ray ray, in float cosHalfAngle, out RayShapeIntersection intersections[2]) {\n\
162
+ // Undo the scaling from ellipsoid to sphere\n\
163
+ ray.pos = ray.pos * u_ellipsoidRadiiUv;\n\
164
+ ray.dir = ray.dir * u_ellipsoidRadiiUv;\n\
165
+ // Shift the ray to account for the latitude cone not being centered at the Earth center\n\
166
+ ray.pos.z += getLatitudeConeShift(cosHalfAngle);\n\
167
+ \n\
168
+ float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle;\n\
191
169
  vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle);\n\
170
+ \n\
171
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
172
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
173
+ \n\
174
+ // Initialize output with no intersections\n\
175
+ intersections[0].entry = -1.0 * farSide;\n\
176
+ intersections[0].exit = farSide;\n\
177
+ intersections[1].entry = miss;\n\
178
+ intersections[1].exit = miss;\n\
192
179
  \n\
193
180
  if (intersect.x == NO_HIT) {\n\
194
- return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
181
+ return;\n\
195
182
  }\n\
196
183
  \n\
197
- vec3 o = ray.pos;\n\
198
- vec3 d = ray.dir;\n\
184
+ // Find the points of intersection\n\
199
185
  float tmin = intersect.x;\n\
200
186
  float tmax = intersect.y;\n\
201
- float zmin = o.z + tmin * d.z;\n\
202
- float zmax = o.z + tmax * d.z;\n\
203
- \n\
204
- // One interval\n\
205
- if (zmin < 0.0 && zmax < 0.0) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
206
- else if (zmin < 0.0) return vec4(-INF_HIT, tmax, NO_HIT, NO_HIT);\n\
207
- else if (zmax < 0.0) return vec4(tmin, +INF_HIT, NO_HIT, NO_HIT);\n\
208
- // Two intervals\n\
209
- else return vec4(-INF_HIT, tmin, tmax, +INF_HIT);\n\
187
+ vec3 p0 = ray.pos + tmin * ray.dir;\n\
188
+ vec3 p1 = ray.pos + tmax * ray.dir;\n\
189
+ \n\
190
+ vec4 intersect0 = vec4(getConeNormal(p0, true), tmin);\n\
191
+ vec4 intersect1 = vec4(getConeNormal(p1, true), tmax);\n\
192
+ \n\
193
+ bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle);\n\
194
+ bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle);\n\
195
+ \n\
196
+ if (p0InShadowCone && p1InShadowCone) {\n\
197
+ // no valid intersections\n\
198
+ } else if (p0InShadowCone) {\n\
199
+ intersections[0].exit = intersect1;\n\
200
+ } else if (p1InShadowCone) {\n\
201
+ intersections[0].entry = intersect0;\n\
202
+ } else {\n\
203
+ intersections[0].exit = intersect0;\n\
204
+ intersections[1].entry = intersect1;\n\
205
+ intersections[1].exit = farSide;\n\
206
+ }\n\
210
207
  }\n\
211
208
  \n\
212
- vec2 intersectRegularCone(Ray ray, float cosSqrHalfAngle) {\n\
209
+ RayShapeIntersection intersectRegularCone(in Ray ray, in float cosHalfAngle, in bool convex) {\n\
210
+ // Undo the scaling from ellipsoid to sphere\n\
211
+ ray.pos = ray.pos * u_ellipsoidRadiiUv;\n\
212
+ ray.dir = ray.dir * u_ellipsoidRadiiUv;\n\
213
+ // Shift the ray to account for the latitude cone not being centered at the Earth center\n\
214
+ ray.pos.z += getLatitudeConeShift(cosHalfAngle);\n\
215
+ \n\
216
+ float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle;\n\
213
217
  vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle);\n\
218
+ \n\
219
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
220
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
214
221
  \n\
215
222
  if (intersect.x == NO_HIT) {\n\
216
- return vec2(NO_HIT);\n\
223
+ return RayShapeIntersection(miss, miss);\n\
217
224
  }\n\
218
225
  \n\
219
- vec3 o = ray.pos;\n\
220
- vec3 d = ray.dir;\n\
226
+ // Find the points of intersection\n\
221
227
  float tmin = intersect.x;\n\
222
228
  float tmax = intersect.y;\n\
223
- float zmin = o.z + tmin * d.z;\n\
224
- float zmax = o.z + tmax * d.z;\n\
225
- \n\
226
- if (zmin < 0.0 && zmax < 0.0) return vec2(NO_HIT);\n\
227
- else if (zmin < 0.0) return vec2(tmax, +INF_HIT);\n\
228
- else if (zmax < 0.0) return vec2(-INF_HIT, tmin);\n\
229
- else return vec2(tmin, tmax);\n\
229
+ vec3 p0 = ray.pos + tmin * ray.dir;\n\
230
+ vec3 p1 = ray.pos + tmax * ray.dir;\n\
231
+ \n\
232
+ vec4 intersect0 = vec4(getConeNormal(p0, convex), tmin);\n\
233
+ vec4 intersect1 = vec4(getConeNormal(p1, convex), tmax);\n\
234
+ \n\
235
+ bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle);\n\
236
+ bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle);\n\
237
+ \n\
238
+ if (p0InShadowCone && p1InShadowCone) {\n\
239
+ return RayShapeIntersection(miss, miss);\n\
240
+ } else if (p0InShadowCone) {\n\
241
+ return RayShapeIntersection(intersect1, farSide);\n\
242
+ } else if (p1InShadowCone) {\n\
243
+ return RayShapeIntersection(-1.0 * farSide, intersect0);\n\
244
+ } else {\n\
245
+ return RayShapeIntersection(intersect0, intersect1);\n\
246
+ }\n\
230
247
  }\n\
231
248
  \n\
232
249
  void intersectShape(in Ray ray, inout Intersections ix) {\n\
@@ -234,26 +251,26 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
234
251
  // Direction is scaled as well to be in sync with position.\n\
235
252
  ray.pos = ray.pos * 2.0 - 1.0;\n\
236
253
  ray.dir *= 2.0;\n\
237
- \n\
238
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX)\n\
239
- Ray outerRay = Ray(ray.pos * u_ellipsoidInverseOuterScaleUv, ray.dir * u_ellipsoidInverseOuterScaleUv);\n\
240
- #else\n\
241
- Ray outerRay = ray;\n\
242
- #endif\n\
243
254
  \n\
244
255
  // Outer ellipsoid\n\
245
- vec2 outerIntersect = intersectUnitSphereUnnormalizedDirection(outerRay);\n\
246
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect);\n\
256
+ RayShapeIntersection outerIntersect = intersectHeight(ray, u_clipMinMaxHeight.y, true);\n\
257
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect);\n\
247
258
  \n\
248
259
  // Exit early if the outer ellipsoid was missed.\n\
249
- if (outerIntersect.x == NO_HIT) {\n\
260
+ if (outerIntersect.entry.w == NO_HIT) {\n\
250
261
  return;\n\
251
262
  }\n\
252
263
  \n\
253
264
  // Inner ellipsoid\n\
254
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT)\n\
255
- // When the ellipsoid is perfectly thin it's necessary to sandwich the\n\
256
- // inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
265
+ RayShapeIntersection innerIntersect = intersectHeight(ray, u_clipMinMaxHeight.x, false);\n\
266
+ \n\
267
+ if (innerIntersect.entry.w == NO_HIT) {\n\
268
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);\n\
269
+ } else {\n\
270
+ // When the ellipsoid is large and thin it's possible for floating point math\n\
271
+ // to cause the ray to intersect the inner ellipsoid before the outer ellipsoid. \n\
272
+ // To prevent this from happening, clamp innerIntersect to outerIntersect and\n\
273
+ // sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
257
274
  \n\
258
275
  // Without this special case,\n\
259
276
  // [outerMin, outerMax, innerMin, innerMax] will bubble sort to\n\
@@ -268,82 +285,56 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
268
285
  \n\
269
286
  // Note: If initializeIntersections() changes its sorting function\n\
270
287
  // from bubble sort to something else, this code may need to change.\n\
271
- setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter\n\
272
- setIntersection(ix, 1, outerIntersect.x, false, true); // negative, enter\n\
273
- setIntersection(ix, 2, outerIntersect.y, false, false); // negative, exit\n\
274
- setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit\n\
275
- #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
276
- Ray innerRay = Ray(ray.pos * u_ellipsoidInverseInnerScaleUv, ray.dir * u_ellipsoidInverseInnerScaleUv);\n\
277
- vec2 innerIntersect = intersectUnitSphereUnnormalizedDirection(innerRay);\n\
278
- \n\
279
- if (innerIntersect == vec2(NO_HIT)) {\n\
280
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);\n\
281
- } else {\n\
282
- // When the ellipsoid is very large and thin it's possible for floating\n\
283
- // point math to cause the ray to intersect the inner ellipsoid before\n\
284
- // the outer ellipsoid. To prevent this from happening, clamp innerIntersect\n\
285
- // to outerIntersect and sandwhich the intersections like described above.\n\
286
- //\n\
287
- // In theory a similar fix is needed for cylinders, however it's more\n\
288
- // complicated to implement because the inner shape is allowed to be\n\
289
- // intersected first.\n\
290
- innerIntersect.x = max(innerIntersect.x, outerIntersect.x);\n\
291
- innerIntersect.y = min(innerIntersect.y, outerIntersect.y);\n\
292
- setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter\n\
293
- setIntersection(ix, 1, innerIntersect.x, false, true); // negative, enter\n\
294
- setIntersection(ix, 2, innerIntersect.y, false, false); // negative, exit\n\
295
- setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit\n\
296
- }\n\
297
- #endif\n\
298
- \n\
299
- // Flip the ray because the intersection function expects a cone growing towards +Z.\n\
300
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF)\n\
301
- Ray flippedRay = outerRay;\n\
302
- flippedRay.dir.z *= -1.0;\n\
303
- flippedRay.pos.z *= -1.0;\n\
304
- #endif\n\
288
+ innerIntersect.entry.w = max(innerIntersect.entry.w, outerIntersect.entry.w);\n\
289
+ innerIntersect.exit.w = min(innerIntersect.exit.w, outerIntersect.exit.w);\n\
290
+ setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter\n\
291
+ setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter\n\
292
+ setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit\n\
293
+ setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit\n\
294
+ }\n\
305
295
  \n\
306
296
  // Bottom cone\n\
307
297
  #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF)\n\
308
- vec2 bottomConeIntersection = intersectRegularCone(flippedRay, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.x);\n\
309
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);\n\
298
+ RayShapeIntersection bottomConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, false);\n\
299
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);\n\
310
300
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF)\n\
311
- vec2 bottomConeIntersection = intersectZPlane(flippedRay);\n\
312
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);\n\
301
+ RayShapeIntersection bottomConeIntersection = intersectZPlane(ray, -1.0);\n\
302
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);\n\
313
303
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF)\n\
314
- vec4 bottomConeIntersection = intersectFlippedCone(ray, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.x);\n\
315
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersection.xy);\n\
316
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersection.zw);\n\
304
+ RayShapeIntersection bottomConeIntersections[2];\n\
305
+ intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, bottomConeIntersections);\n\
306
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersections[0]);\n\
307
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersections[1]);\n\
317
308
  #endif\n\
318
309
  \n\
319
310
  // Top cone\n\
320
311
  #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF)\n\
321
- vec4 topConeIntersection = intersectFlippedCone(flippedRay, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.y);\n\
322
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersection.xy);\n\
323
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersection.zw);\n\
312
+ RayShapeIntersection topConeIntersections[2];\n\
313
+ intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, topConeIntersections);\n\
314
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersections[0]);\n\
315
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersections[1]);\n\
324
316
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF)\n\
325
- vec2 topConeIntersection = intersectZPlane(ray);\n\
326
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);\n\
317
+ RayShapeIntersection topConeIntersection = intersectZPlane(ray, 1.0);\n\
318
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);\n\
327
319
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF)\n\
328
- vec2 topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.y);\n\
329
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);\n\
320
+ RayShapeIntersection topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, false);\n\
321
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);\n\
330
322
  #endif\n\
331
323
  \n\
332
324
  // Wedge\n\
333
325
  #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)\n\
334
- vec4 wedgeIntersect = intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x);\n\
335
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersect.xy);\n\
336
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersect.zw);\n\
326
+ RayShapeIntersection wedgeIntersects[2];\n\
327
+ intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects);\n\
328
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
329
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
337
330
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF)\n\
338
- vec2 wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax.x, u_ellipsoidRenderLongitudeMinMax.y);\n\
339
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
340
- #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF)\n\
341
- vec2 wedgeIntersect = intersectHalfSpace(ray, u_ellipsoidRenderLongitudeMinMax.x);\n\
342
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
331
+ RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax);\n\
332
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
343
333
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF)\n\
344
- vec4 wedgeIntersect = intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax.x, u_ellipsoidRenderLongitudeMinMax.y);\n\
345
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersect.xy);\n\
346
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersect.zw);\n\
334
+ RayShapeIntersection wedgeIntersects[2];\n\
335
+ intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects);\n\
336
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
337
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
347
338
  #endif\n\
348
339
  }\n\
349
340
  ";