@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,230 +1,105 @@
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, Intersections,\n\
3
+ // RayShapeIntersection, setSurfaceIntersection, setShapeIntersection,\n\
4
+ // intersectIntersections\n\
5
+ // See IntersectLongitude.glsl for the definitions of intersectHalfPlane,\n\
6
+ // intersectFlippedWedge, intersectRegularWedge\n\
4
7
  \n\
5
8
  /* Cylinder defines (set in Scene/VoxelCylinderShape.js)\n\
6
9
  #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN\n\
7
- #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MAX\n\
8
10
  #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT\n\
9
- #define CYLINDER_HAS_RENDER_BOUNDS_HEIGHT\n\
10
- #define CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
11
11
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE\n\
12
12
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF\n\
13
13
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF\n\
14
- #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF\n\
15
14
  #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
16
15
  \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
16
  #define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX\n\
28
17
  #define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN\n\
29
18
  #define CYLINDER_INTERSECTION_INDEX_ANGLE\n\
30
19
  */\n\
31
20
  \n\
32
21
  // Cylinder uniforms\n\
33
- #if defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MAX) || defined(CYLINDER_HAS_RENDER_BOUNDS_HEIGHT)\n\
34
- uniform vec3 u_cylinderUvToRenderBoundsScale;\n\
35
- uniform vec3 u_cylinderUvToRenderBoundsTranslate;\n\
36
- #endif\n\
37
- #if defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN) && !defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT)\n\
38
- uniform float u_cylinderUvToRenderRadiusMin;\n\
39
- #endif\n\
22
+ uniform vec2 u_cylinderRenderRadiusMinMax;\n\
23
+ uniform vec2 u_cylinderRenderHeightMinMax;\n\
40
24
  #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE)\n\
41
25
  uniform vec2 u_cylinderRenderAngleMinMax;\n\
42
26
  #endif\n\
43
27
  \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\
28
+ /**\n\
29
+ * Find the intersection of a ray with the volume defined by two planes of constant z\n\
30
+ */\n\
31
+ RayShapeIntersection intersectHeightBounds(in Ray ray, in vec2 minMaxHeight, in bool convex)\n\
92
32
  {\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\
33
+ float zPosition = ray.pos.z;\n\
34
+ float zDirection = ray.dir.z;\n\
102
35
  \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\
36
+ float tmin = (minMaxHeight.x - zPosition) / zDirection;\n\
37
+ float tmax = (minMaxHeight.y - zPosition) / zDirection;\n\
107
38
  \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\
39
+ // Normals point outside the volume\n\
40
+ float signFlip = convex ? 1.0 : -1.0;\n\
41
+ vec4 intersectMin = vec4(0.0, 0.0, -1.0 * signFlip, tmin);\n\
42
+ vec4 intersectMax = vec4(0.0, 0.0, 1.0 * signFlip, tmax);\n\
112
43
  \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\
44
+ bool topEntry = zDirection < 0.0;\n\
45
+ vec4 entry = topEntry ? intersectMax : intersectMin;\n\
46
+ vec4 exit = topEntry ? intersectMin : intersectMax;\n\
117
47
  \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\
48
+ return RayShapeIntersection(entry, exit);\n\
122
49
  }\n\
123
50
  \n\
124
- vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)\n\
51
+ /**\n\
52
+ * Find the intersection of a ray with a right cylindrical surface of a given radius\n\
53
+ * about the z-axis.\n\
54
+ */\n\
55
+ RayShapeIntersection intersectCylinder(in Ray ray, in float radius, in bool convex)\n\
125
56
  {\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\
57
+ vec2 position = ray.pos.xy;\n\
58
+ vec2 direction = ray.dir.xy;\n\
130
59
  \n\
131
- vec2 intersectUnitCylinder(Ray ray)\n\
132
- {\n\
133
- vec3 o = ray.pos;\n\
134
- vec3 d = ray.dir;\n\
60
+ float a = dot(direction, direction);\n\
61
+ float b = dot(position, direction);\n\
62
+ float c = dot(position, position) - radius * radius;\n\
63
+ float determinant = b * b - a * c;\n\
135
64
  \n\
136
- float a = dot(d.xy, d.xy);\n\
137
- float b = dot(o.xy, d.xy);\n\
138
- float c = dot(o.xy, o.xy) - 1.0;\n\
139
- float det = b * b - a * c;\n\
140
- \n\
141
- if (det < 0.0) {\n\
142
- return vec2(NO_HIT);\n\
143
- }\n\
144
- \n\
145
- det = sqrt(det);\n\
146
- float ta = (-b - det) / a;\n\
147
- float tb = (-b + det) / a;\n\
148
- float t1 = min(ta, tb);\n\
149
- float t2 = max(ta, tb);\n\
150
- \n\
151
- float z1 = o.z + t1 * d.z;\n\
152
- float z2 = o.z + t2 * d.z;\n\
153
- \n\
154
- if (abs(z1) >= 1.0)\n\
155
- {\n\
156
- float tCap = (sign(z1) - o.z) / d.z;\n\
157
- t1 = abs(b + a * tCap) < det ? tCap : NO_HIT;\n\
65
+ if (determinant < 0.0) {\n\
66
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
67
+ return RayShapeIntersection(miss, miss);\n\
158
68
  }\n\
159
69
  \n\
160
- if (abs(z2) >= 1.0)\n\
161
- {\n\
162
- float tCap = (sign(z2) - o.z) / d.z;\n\
163
- t2 = abs(b + a * tCap) < det ? tCap : NO_HIT;\n\
164
- }\n\
70
+ determinant = sqrt(determinant);\n\
71
+ float t1 = (-b - determinant) / a;\n\
72
+ float t2 = (-b + determinant) / a;\n\
73
+ float signFlip = convex ? 1.0 : -1.0;\n\
74
+ vec4 intersect1 = vec4(normalize(position + t1 * direction) * signFlip, 0.0, t1);\n\
75
+ vec4 intersect2 = vec4(normalize(position + t2 * direction) * signFlip, 0.0, t2);\n\
165
76
  \n\
166
- return vec2(t1, t2);\n\
77
+ return RayShapeIntersection(intersect1, intersect2);\n\
167
78
  }\n\
168
79
  \n\
169
- vec2 intersectUnitCircle(Ray ray) {\n\
170
- vec3 o = ray.pos;\n\
171
- vec3 d = ray.dir;\n\
172
- \n\
173
- float t = -o.z / d.z;\n\
174
- vec2 zPlanePos = o.xy + d.xy * t;\n\
175
- float distSqr = dot(zPlanePos, zPlanePos);\n\
176
- \n\
177
- if (distSqr > 1.0) {\n\
178
- return vec2(NO_HIT);\n\
179
- }\n\
180
- \n\
181
- return vec2(t, t);\n\
182
- }\n\
183
- \n\
184
- vec2 intersectInfiniteUnitCylinder(Ray ray)\n\
80
+ /**\n\
81
+ * Find the intersection of a ray with a right cylindrical solid of given\n\
82
+ * radius and height bounds. NOTE: The shape is assumed to be convex.\n\
83
+ */\n\
84
+ RayShapeIntersection intersectBoundedCylinder(in Ray ray, in float radius, in vec2 minMaxHeight)\n\
185
85
  {\n\
186
- vec3 o = ray.pos;\n\
187
- vec3 d = ray.dir;\n\
188
- \n\
189
- float a = dot(d.xy, d.xy);\n\
190
- float b = dot(o.xy, d.xy);\n\
191
- float c = dot(o.xy, o.xy) - 1.0;\n\
192
- float det = b * b - a * c;\n\
193
- \n\
194
- if (det < 0.0) {\n\
195
- return vec2(NO_HIT);\n\
196
- }\n\
197
- \n\
198
- det = sqrt(det);\n\
199
- float t1 = (-b - det) / a;\n\
200
- float t2 = (-b + det) / a;\n\
201
- float tmin = min(t1, t2);\n\
202
- float tmax = max(t1, t2);\n\
203
- \n\
204
- return vec2(tmin, tmax);\n\
86
+ RayShapeIntersection cylinderIntersection = intersectCylinder(ray, radius, true);\n\
87
+ RayShapeIntersection heightBoundsIntersection = intersectHeightBounds(ray, minMaxHeight, true);\n\
88
+ return intersectIntersections(ray, cylinderIntersection, heightBoundsIntersection);\n\
205
89
  }\n\
206
90
  \n\
207
91
  void intersectShape(Ray ray, inout Intersections ix)\n\
208
92
  {\n\
209
- #if defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MAX) || defined(CYLINDER_HAS_RENDER_BOUNDS_HEIGHT)\n\
210
- ray.pos = ray.pos * u_cylinderUvToRenderBoundsScale + u_cylinderUvToRenderBoundsTranslate;\n\
211
- ray.dir *= u_cylinderUvToRenderBoundsScale;\n\
212
- #else\n\
213
- // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1].\n\
214
- // Direction is scaled as well to be in sync with position.\n\
215
- ray.pos = ray.pos * 2.0 - 1.0;\n\
216
- ray.dir *= 2.0;\n\
217
- #endif\n\
93
+ // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1].\n\
94
+ // Direction is scaled as well to be in sync with position.\n\
95
+ ray.pos = ray.pos * 2.0 - 1.0;\n\
96
+ ray.dir *= 2.0;\n\
218
97
  \n\
219
- #if defined(CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT)\n\
220
- vec2 outerIntersect = intersectUnitCircle(ray);\n\
221
- #else\n\
222
- vec2 outerIntersect = intersectUnitCylinder(ray);\n\
223
- #endif\n\
98
+ RayShapeIntersection outerIntersect = intersectBoundedCylinder(ray, u_cylinderRenderRadiusMinMax.y, u_cylinderRenderHeightMinMax);\n\
224
99
  \n\
225
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MAX, outerIntersect);\n\
100
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MAX, outerIntersect);\n\
226
101
  \n\
227
- if (outerIntersect.x == NO_HIT) {\n\
102
+ if (outerIntersect.entry.w == NO_HIT) {\n\
228
103
  return;\n\
229
104
  }\n\
230
105
  \n\
@@ -245,31 +120,29 @@ void intersectShape(Ray ray, inout Intersections ix)\n\
245
120
  \n\
246
121
  // Note: If initializeIntersections() changes its sorting function\n\
247
122
  // from bubble sort to something else, this code may need to change.\n\
248
- vec2 innerIntersect = intersectInfiniteUnitCylinder(ray);\n\
249
- setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter\n\
250
- setIntersection(ix, 1, innerIntersect.x, false, true); // negative, enter\n\
251
- setIntersection(ix, 2, innerIntersect.y, false, false); // negative, exit\n\
252
- setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit\n\
123
+ RayShapeIntersection innerIntersect = intersectCylinder(ray, 1.0, false);\n\
124
+ setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter\n\
125
+ setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter\n\
126
+ setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit\n\
127
+ setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit\n\
253
128
  #elif defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN)\n\
254
- Ray innerRay = Ray(ray.pos * u_cylinderUvToRenderRadiusMin, ray.dir * u_cylinderUvToRenderRadiusMin);\n\
255
- vec2 innerIntersect = intersectInfiniteUnitCylinder(innerRay);\n\
256
- setIntersectionPair(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MIN, innerIntersect);\n\
129
+ RayShapeIntersection innerIntersect = intersectCylinder(ray, u_cylinderRenderRadiusMinMax.x, false);\n\
130
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MIN, innerIntersect);\n\
257
131
  #endif\n\
258
132
  \n\
259
133
  #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\
134
+ RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax);\n\
135
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect);\n\
262
136
  #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\
137
+ RayShapeIntersection wedgeIntersects[2];\n\
138
+ intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects);\n\
139
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);\n\
140
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);\n\
269
141
  #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\
142
+ RayShapeIntersection wedgeIntersects[2];\n\
143
+ intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects);\n\
144
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]);\n\
145
+ setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]);\n\
273
146
  #endif\n\
274
147
  }\n\
275
148
  ";