@cesium/engine 1.0.0 → 1.1.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 (196) hide show
  1. package/Build/Workers/{AttributeCompression-4589338a.js → AttributeCompression-b646d393.js} +1 -1
  2. package/Build/Workers/{AxisAlignedBoundingBox-bfb1234f.js → AxisAlignedBoundingBox-a4321399.js} +1 -1
  3. package/Build/Workers/{BoundingRectangle-7ffc2153.js → BoundingRectangle-80d8801f.js} +1 -1
  4. package/Build/Workers/{BoxGeometry-93f344a3.js → BoxGeometry-33c10a4f.js} +1 -1
  5. package/Build/Workers/{Color-0c5aaf47.js → Color-1bf9a6e0.js} +1 -1
  6. package/Build/Workers/{CoplanarPolygonGeometryLibrary-6597982a.js → CoplanarPolygonGeometryLibrary-5c5b981b.js} +1 -1
  7. package/Build/Workers/{CorridorGeometryLibrary-2119580e.js → CorridorGeometryLibrary-7cbae7a0.js} +1 -1
  8. package/Build/Workers/{CylinderGeometry-f9503c6d.js → CylinderGeometry-42740df0.js} +1 -1
  9. package/Build/Workers/{EllipseGeometry-fedf72d5.js → EllipseGeometry-49a3ac21.js} +1 -1
  10. package/Build/Workers/{EllipseGeometryLibrary-4ea68687.js → EllipseGeometryLibrary-b891b2f8.js} +1 -1
  11. package/Build/Workers/{EllipseOutlineGeometry-e2ae6a35.js → EllipseOutlineGeometry-fbd72e07.js} +1 -1
  12. package/Build/Workers/{EllipsoidGeodesic-16de63ea.js → EllipsoidGeodesic-98c62a56.js} +1 -1
  13. package/Build/Workers/{EllipsoidGeometry-95c0330e.js → EllipsoidGeometry-a351dba8.js} +1 -1
  14. package/Build/Workers/{EllipsoidOutlineGeometry-d6d2ceec.js → EllipsoidOutlineGeometry-3e8779bf.js} +1 -1
  15. package/Build/Workers/{EllipsoidRhumbLine-ae5e65e0.js → EllipsoidRhumbLine-19756602.js} +1 -1
  16. package/Build/Workers/{EllipsoidTangentPlane-bfc674bf.js → EllipsoidTangentPlane-cfb50678.js} +1 -1
  17. package/Build/Workers/{EncodedCartesian3-f473ea18.js → EncodedCartesian3-81f70735.js} +1 -1
  18. package/Build/Workers/{FrustumGeometry-3bf2e4eb.js → FrustumGeometry-c5754412.js} +1 -1
  19. package/Build/Workers/{GeometryAttribute-df5f473e.js → GeometryAttribute-0bfd05e8.js} +1 -1
  20. package/Build/Workers/{GeometryInstance-aa75b4cf.js → GeometryInstance-451dc1cd.js} +1 -1
  21. package/Build/Workers/{GeometryPipeline-f0e46c42.js → GeometryPipeline-0166905d.js} +1 -1
  22. package/Build/Workers/{IntersectionTests-9de29d51.js → IntersectionTests-a93d3de9.js} +1 -1
  23. package/Build/Workers/{Matrix2-ce637455.js → Matrix2-13178034.js} +4 -2
  24. package/Build/Workers/{Matrix3-4f4df527.js → Matrix3-315394f6.js} +2 -1
  25. package/Build/Workers/{OrientedBoundingBox-d3ff3d4d.js → OrientedBoundingBox-b450cb61.js} +5 -5
  26. package/Build/Workers/{Plane-b81241c2.js → Plane-900aa728.js} +1 -1
  27. package/Build/Workers/{PolygonGeometryLibrary-6f4937bb.js → PolygonGeometryLibrary-f918ac26.js} +1 -1
  28. package/Build/Workers/PolygonPipeline-f59a8f0a.js +1345 -0
  29. package/Build/Workers/{PolylinePipeline-2e2b015c.js → PolylinePipeline-d8e6bd9b.js} +1 -1
  30. package/Build/Workers/{PolylineVolumeGeometryLibrary-7ee1d449.js → PolylineVolumeGeometryLibrary-125d2edf.js} +1 -1
  31. package/Build/Workers/{PrimitivePipeline-a9b7aae0.js → PrimitivePipeline-0d7b5ed4.js} +1 -1
  32. package/Build/Workers/{RectangleGeometryLibrary-9aa6c8f6.js → RectangleGeometryLibrary-0768db63.js} +1 -1
  33. package/Build/Workers/{TerrainEncoding-b52dcfc5.js → TerrainEncoding-06470d7f.js} +1 -1
  34. package/Build/Workers/{Transforms-2f755df8.js → Transforms-26539bce.js} +97 -83
  35. package/Build/Workers/{WallGeometryLibrary-ab19a93d.js → WallGeometryLibrary-6167b0fc.js} +1 -1
  36. package/Build/Workers/{WebMercatorProjection-9f25de49.js → WebMercatorProjection-13a90d41.js} +1 -1
  37. package/Build/Workers/cesiumWorkerBootstrapper.js +25 -1
  38. package/Build/Workers/combineGeometry.js +1 -1
  39. package/Build/Workers/createBoxGeometry.js +1 -1
  40. package/Build/Workers/createBoxOutlineGeometry.js +1 -1
  41. package/Build/Workers/createCircleGeometry.js +1 -1
  42. package/Build/Workers/createCircleOutlineGeometry.js +1 -1
  43. package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
  44. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  45. package/Build/Workers/createCorridorGeometry.js +1 -1
  46. package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
  47. package/Build/Workers/createCylinderGeometry.js +1 -1
  48. package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
  49. package/Build/Workers/createEllipseGeometry.js +1 -1
  50. package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
  51. package/Build/Workers/createEllipsoidGeometry.js +1 -1
  52. package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
  53. package/Build/Workers/createFrustumGeometry.js +1 -1
  54. package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
  55. package/Build/Workers/createGeometry.js +1 -1
  56. package/Build/Workers/createGroundPolylineGeometry.js +1 -1
  57. package/Build/Workers/createPlaneGeometry.js +1 -1
  58. package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
  59. package/Build/Workers/createPolygonGeometry.js +1 -1
  60. package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
  61. package/Build/Workers/createPolylineGeometry.js +1 -1
  62. package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
  63. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  64. package/Build/Workers/createRectangleGeometry.js +1 -1
  65. package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
  66. package/Build/Workers/createSimplePolylineGeometry.js +1 -1
  67. package/Build/Workers/createSphereGeometry.js +1 -1
  68. package/Build/Workers/createSphereOutlineGeometry.js +1 -1
  69. package/Build/Workers/createVectorTileClampedPolylines.js +1 -1
  70. package/Build/Workers/createVectorTileGeometries.js +1 -1
  71. package/Build/Workers/createVectorTilePoints.js +1 -1
  72. package/Build/Workers/createVectorTilePolygons.js +1 -1
  73. package/Build/Workers/createVectorTilePolylines.js +1 -1
  74. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  75. package/Build/Workers/createVerticesFromHeightmap.js +7 -3
  76. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +1 -1
  77. package/Build/Workers/createWallGeometry.js +1 -1
  78. package/Build/Workers/createWallOutlineGeometry.js +1 -1
  79. package/Build/Workers/decodeI3S.js +1 -1
  80. package/Build/Workers/package.js +25 -1
  81. package/Build/Workers/transferTypedArrayTest.js +25 -1
  82. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  83. package/Source/Core/EarthOrientationParameters.js +67 -63
  84. package/Source/Core/Ion.js +1 -1
  85. package/Source/Core/Matrix2.js +2 -1
  86. package/Source/Core/Matrix3.js +2 -1
  87. package/Source/Core/Matrix4.js +1 -0
  88. package/Source/Core/OrientedBoundingBox.js +4 -4
  89. package/Source/Core/S2Cell.js +3 -3
  90. package/Source/Core/Transforms.js +3 -7
  91. package/Source/DataSources/GpxDataSource.js +4 -6
  92. package/Source/DataSources/KmlDataSource.js +3 -5
  93. package/Source/Renderer/Context.js +27 -9
  94. package/Source/Renderer/Pass.js +3 -2
  95. package/Source/Scene/Cesium3DTileContentType.js +19 -0
  96. package/Source/Scene/Cesium3DTilesVoxelProvider.js +482 -0
  97. package/Source/Scene/Cesium3DTilesetMetadata.js +2 -2
  98. package/Source/Scene/ContentMetadata.js +2 -2
  99. package/Source/Scene/DerivedCommand.js +7 -0
  100. package/Source/Scene/Expression.js +1 -1
  101. package/Source/Scene/Globe.js +10 -0
  102. package/Source/Scene/GlobeSurfaceTileProvider.js +7 -0
  103. package/Source/Scene/GltfImageLoader.js +1 -1
  104. package/Source/Scene/GltfVertexBufferLoader.js +10 -2
  105. package/Source/Scene/GroupMetadata.js +2 -2
  106. package/Source/Scene/ImplicitMetadataView.js +2 -2
  107. package/Source/Scene/ImplicitSubtreeCache.js +127 -0
  108. package/Source/Scene/ImplicitSubtreeMetadata.js +2 -2
  109. package/Source/Scene/ImplicitTileset.js +3 -2
  110. package/Source/Scene/KeyframeNode.js +47 -0
  111. package/Source/Scene/Megatexture.js +490 -0
  112. package/Source/Scene/MetadataClass.js +60 -25
  113. package/Source/Scene/MetadataClassProperty.js +132 -68
  114. package/Source/Scene/MetadataComponentType.js +78 -57
  115. package/Source/Scene/MetadataEnum.js +59 -23
  116. package/Source/Scene/MetadataEnumValue.js +49 -15
  117. package/Source/Scene/MetadataSchema.js +53 -24
  118. package/Source/Scene/MetadataSchemaLoader.js +2 -2
  119. package/Source/Scene/MetadataTableProperty.js +2 -2
  120. package/Source/Scene/MetadataType.js +6 -14
  121. package/Source/Scene/Model/GeoJsonLoader.js +1 -1
  122. package/Source/Scene/Model/Model.js +2 -3
  123. package/Source/Scene/Model/buildDrawCommand.js +19 -11
  124. package/Source/Scene/PointCloud.js +1 -1
  125. package/Source/Scene/PropertyAttribute.js +2 -2
  126. package/Source/Scene/PropertyAttributeProperty.js +2 -2
  127. package/Source/Scene/PropertyTable.js +2 -2
  128. package/Source/Scene/PropertyTexture.js +2 -2
  129. package/Source/Scene/PropertyTextureProperty.js +2 -2
  130. package/Source/Scene/ResourceCache.js +9 -1
  131. package/Source/Scene/ResourceCacheKey.js +9 -1
  132. package/Source/Scene/Scene.js +17 -0
  133. package/Source/Scene/SpatialNode.js +375 -0
  134. package/Source/Scene/StructuralMetadata.js +2 -2
  135. package/Source/Scene/TileMetadata.js +2 -2
  136. package/Source/Scene/TilesetMetadata.js +2 -2
  137. package/Source/Scene/VoxelBoxShape.js +527 -0
  138. package/Source/Scene/VoxelContent.js +169 -0
  139. package/Source/Scene/VoxelCylinderShape.js +937 -0
  140. package/Source/Scene/VoxelEllipsoidShape.js +937 -0
  141. package/Source/Scene/VoxelPrimitive.js +1919 -0
  142. package/Source/Scene/VoxelProvider.js +255 -0
  143. package/Source/Scene/VoxelRenderResources.js +224 -0
  144. package/Source/Scene/VoxelShape.js +152 -0
  145. package/Source/Scene/VoxelShapeType.js +105 -0
  146. package/Source/Scene/VoxelTraversal.js +1144 -0
  147. package/Source/Scene/buildVoxelDrawCommands.js +116 -0
  148. package/Source/Scene/parseBatchTable.js +18 -2
  149. package/Source/Scene/preprocess3DTileContent.js +8 -0
  150. package/Source/Scene/processVoxelProperties.js +455 -0
  151. package/Source/Shaders/BillboardCollectionVS.glsl +1 -1
  152. package/Source/Shaders/BillboardCollectionVS.js +1 -1
  153. package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
  154. package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
  155. package/Source/Shaders/Builtin/Constants/passVoxels.glsl +9 -0
  156. package/Source/Shaders/Builtin/Constants/passVoxels.js +11 -0
  157. package/Source/Shaders/Builtin/CzmBuiltins.js +17 -15
  158. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.glsl +55 -43
  159. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +55 -43
  160. package/Source/Shaders/GlobeFS.glsl +2 -1
  161. package/Source/Shaders/GlobeFS.js +2 -1
  162. package/Source/Shaders/PointPrimitiveCollectionVS.glsl +5 -2
  163. package/Source/Shaders/PointPrimitiveCollectionVS.js +5 -2
  164. package/Source/Shaders/Voxels/IntersectBox.glsl +79 -0
  165. package/Source/Shaders/Voxels/IntersectBox.js +81 -0
  166. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +70 -0
  167. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +72 -0
  168. package/Source/Shaders/Voxels/IntersectCylinder.glsl +273 -0
  169. package/Source/Shaders/Voxels/IntersectCylinder.js +275 -0
  170. package/Source/Shaders/Voxels/IntersectDepth.glsl +23 -0
  171. package/Source/Shaders/Voxels/IntersectDepth.js +25 -0
  172. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +337 -0
  173. package/Source/Shaders/Voxels/IntersectEllipsoid.js +339 -0
  174. package/Source/Shaders/Voxels/Intersection.glsl +54 -0
  175. package/Source/Shaders/Voxels/Intersection.js +56 -0
  176. package/Source/Shaders/Voxels/IntersectionUtils.glsl +151 -0
  177. package/Source/Shaders/Voxels/IntersectionUtils.js +153 -0
  178. package/Source/Shaders/Voxels/Megatexture.glsl +136 -0
  179. package/Source/Shaders/Voxels/Megatexture.js +138 -0
  180. package/Source/Shaders/Voxels/Octree.glsl +221 -0
  181. package/Source/Shaders/Voxels/Octree.js +223 -0
  182. package/Source/Shaders/Voxels/VoxelFS.glsl +150 -0
  183. package/Source/Shaders/Voxels/VoxelFS.js +152 -0
  184. package/Source/Shaders/Voxels/VoxelVS.glsl +11 -0
  185. package/Source/Shaders/Voxels/VoxelVS.js +13 -0
  186. package/Source/Shaders/Voxels/convertUvToBox.glsl +16 -0
  187. package/Source/Shaders/Voxels/convertUvToBox.js +18 -0
  188. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +79 -0
  189. package/Source/Shaders/Voxels/convertUvToCylinder.js +81 -0
  190. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +133 -0
  191. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +135 -0
  192. package/Source/ThirdParty/Workers/z-worker-pako.js +0 -0
  193. package/index.d.ts +3124 -2287
  194. package/index.js +1117 -1085
  195. package/package.json +3 -4
  196. package/Build/Workers/PolygonPipeline-774a8aaf.js +0 -1341
@@ -0,0 +1,23 @@
1
+ // See IntersectionUtils.glsl for the definitions of Ray, Intersections,
2
+ // setIntersectionPair, INF_HIT, NO_HIT
3
+
4
+ /* intersectDepth defines (set in Scene/VoxelRenderResources.js)
5
+ #define DEPTH_INTERSECTION_INDEX ###
6
+ */
7
+
8
+ uniform mat4 u_transformPositionViewToUv;
9
+
10
+ void intersectDepth(vec2 screenCoord, Ray ray, inout Intersections ix) {
11
+ float logDepthOrDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, screenCoord));
12
+ if (logDepthOrDepth != 0.0) {
13
+ // Calculate how far the ray must travel before it hits the depth buffer.
14
+ vec4 eyeCoordinateDepth = czm_screenToEyeCoordinates(screenCoord, logDepthOrDepth);
15
+ eyeCoordinateDepth /= eyeCoordinateDepth.w;
16
+ vec3 depthPositionUv = vec3(u_transformPositionViewToUv * eyeCoordinateDepth);
17
+ float t = dot(depthPositionUv - ray.pos, ray.dir);
18
+ setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(t, +INF_HIT));
19
+ } else {
20
+ // There's no depth at this location.
21
+ setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(NO_HIT));
22
+ }
23
+ }
@@ -0,0 +1,25 @@
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
+ // setIntersectionPair, INF_HIT, NO_HIT\n\
4
+ \n\
5
+ /* intersectDepth defines (set in Scene/VoxelRenderResources.js)\n\
6
+ #define DEPTH_INTERSECTION_INDEX ###\n\
7
+ */\n\
8
+ \n\
9
+ uniform mat4 u_transformPositionViewToUv;\n\
10
+ \n\
11
+ void intersectDepth(vec2 screenCoord, Ray ray, inout Intersections ix) {\n\
12
+ float logDepthOrDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, screenCoord));\n\
13
+ if (logDepthOrDepth != 0.0) {\n\
14
+ // Calculate how far the ray must travel before it hits the depth buffer.\n\
15
+ vec4 eyeCoordinateDepth = czm_screenToEyeCoordinates(screenCoord, logDepthOrDepth);\n\
16
+ eyeCoordinateDepth /= eyeCoordinateDepth.w;\n\
17
+ vec3 depthPositionUv = vec3(u_transformPositionViewToUv * eyeCoordinateDepth);\n\
18
+ float t = dot(depthPositionUv - ray.pos, ray.dir);\n\
19
+ setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(t, +INF_HIT));\n\
20
+ } else {\n\
21
+ // There's no depth at this location.\n\
22
+ setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(NO_HIT));\n\
23
+ }\n\
24
+ }\n\
25
+ ";
@@ -0,0 +1,337 @@
1
+ // See IntersectionUtils.glsl for the definitions of Ray, Intersections,
2
+ // setIntersection, setIntersectionPair, INF_HIT, NO_HIT
3
+
4
+ /* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js)
5
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE
6
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO
7
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF
8
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF
9
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF
10
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE
11
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF
12
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF
13
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF
14
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF
15
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF
16
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF
17
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN
18
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT
19
+ #define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE
20
+ #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX
21
+ #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN
22
+ #define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX
23
+ #define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN
24
+ */
25
+
26
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE)
27
+ uniform vec2 u_ellipsoidRenderLongitudeMinMax;
28
+ #endif
29
+ #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)
30
+ uniform vec2 u_ellipsoidRenderLatitudeCosSqrHalfMinMax;
31
+ #endif
32
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)
33
+ uniform float u_ellipsoidInverseInnerScaleUv;
34
+ #endif
35
+
36
+ vec2 intersectZPlane(Ray ray)
37
+ {
38
+ float o = ray.pos.z;
39
+ float d = ray.dir.z;
40
+ float t = -o / d;
41
+ float s = sign(o);
42
+
43
+ if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);
44
+ else return vec2(-INF_HIT, t);
45
+ }
46
+
47
+ vec4 intersectHalfPlane(Ray ray, float angle) {
48
+ vec2 o = ray.pos.xy;
49
+ vec2 d = ray.dir.xy;
50
+ vec2 planeDirection = vec2(cos(angle), sin(angle));
51
+ vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);
52
+
53
+ float a = dot(o, planeNormal);
54
+ float b = dot(d, planeNormal);
55
+ float t = -a / b;
56
+
57
+ vec2 p = o + t * d;
58
+ bool outside = dot(p, planeDirection) < 0.0;
59
+ if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);
60
+
61
+ return vec4(-INF_HIT, t, t, +INF_HIT);
62
+ }
63
+
64
+ vec2 intersectHalfSpace(Ray ray, float angle)
65
+ {
66
+ vec2 o = ray.pos.xy;
67
+ vec2 d = ray.dir.xy;
68
+ vec2 n = vec2(sin(angle), -cos(angle));
69
+
70
+ float a = dot(o, n);
71
+ float b = dot(d, n);
72
+ float t = -a / b;
73
+ float s = sign(a);
74
+
75
+ if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);
76
+ else return vec2(-INF_HIT, t);
77
+ }
78
+
79
+ vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)
80
+ {
81
+ vec2 o = ray.pos.xy;
82
+ vec2 d = ray.dir.xy;
83
+ vec2 n1 = vec2(sin(minAngle), -cos(minAngle));
84
+ vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));
85
+
86
+ float a1 = dot(o, n1);
87
+ float a2 = dot(o, n2);
88
+ float b1 = dot(d, n1);
89
+ float b2 = dot(d, n2);
90
+
91
+ float t1 = -a1 / b1;
92
+ float t2 = -a2 / b2;
93
+ float s1 = sign(a1);
94
+ float s2 = sign(a2);
95
+
96
+ float tmin = min(t1, t2);
97
+ float tmax = max(t1, t2);
98
+ float smin = tmin == t1 ? s1 : s2;
99
+ float smax = tmin == t1 ? s2 : s1;
100
+
101
+ bool e = tmin >= 0.0;
102
+ bool f = tmax >= 0.0;
103
+ bool g = smin >= 0.0;
104
+ bool h = smax >= 0.0;
105
+
106
+ if (e != g && f == h) return vec2(tmin, tmax);
107
+ else if (e == g && f == h) return vec2(-INF_HIT, tmin);
108
+ else if (e != g && f != h) return vec2(tmax, +INF_HIT);
109
+ else return vec2(NO_HIT);
110
+ }
111
+
112
+ vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)
113
+ {
114
+ vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);
115
+ vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);
116
+ return vec4(planeIntersectMin, planeIntersectMax);
117
+ }
118
+
119
+ vec2 intersectUnitSphere(Ray ray)
120
+ {
121
+ vec3 o = ray.pos;
122
+ vec3 d = ray.dir;
123
+
124
+ float b = dot(d, o);
125
+ float c = dot(o, o) - 1.0;
126
+ float det = b * b - c;
127
+
128
+ if (det < 0.0) {
129
+ return vec2(NO_HIT);
130
+ }
131
+
132
+ det = sqrt(det);
133
+ float t1 = -b - det;
134
+ float t2 = -b + det;
135
+ float tmin = min(t1, t2);
136
+ float tmax = max(t1, t2);
137
+
138
+ return vec2(tmin, tmax);
139
+ }
140
+
141
+ vec2 intersectUnitSphereUnnormalizedDirection(Ray ray)
142
+ {
143
+ vec3 o = ray.pos;
144
+ vec3 d = ray.dir;
145
+
146
+ float a = dot(d, d);
147
+ float b = dot(d, o);
148
+ float c = dot(o, o) - 1.0;
149
+ float det = b * b - a * c;
150
+
151
+ if (det < 0.0) {
152
+ return vec2(NO_HIT);
153
+ }
154
+
155
+ det = sqrt(det);
156
+ float t1 = (-b - det) / a;
157
+ float t2 = (-b + det) / a;
158
+ float tmin = min(t1, t2);
159
+ float tmax = max(t1, t2);
160
+
161
+ return vec2(tmin, tmax);
162
+ }
163
+
164
+ vec2 intersectDoubleEndedCone(Ray ray, float cosSqrHalfAngle)
165
+ {
166
+ vec3 o = ray.pos;
167
+ vec3 d = ray.dir;
168
+ float a = d.z * d.z - dot(d, d) * cosSqrHalfAngle;
169
+ float b = d.z * o.z - dot(o, d) * cosSqrHalfAngle;
170
+ float c = o.z * o.z - dot(o, o) * cosSqrHalfAngle;
171
+ float det = b * b - a * c;
172
+
173
+ if (det < 0.0) {
174
+ return vec2(NO_HIT);
175
+ }
176
+
177
+ det = sqrt(det);
178
+ float t1 = (-b - det) / a;
179
+ float t2 = (-b + det) / a;
180
+ float tmin = min(t1, t2);
181
+ float tmax = max(t1, t2);
182
+ return vec2(tmin, tmax);
183
+ }
184
+
185
+ vec4 intersectFlippedCone(Ray ray, float cosSqrHalfAngle) {
186
+ vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle);
187
+
188
+ if (intersect.x == NO_HIT) {
189
+ return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);
190
+ }
191
+
192
+ vec3 o = ray.pos;
193
+ vec3 d = ray.dir;
194
+ float tmin = intersect.x;
195
+ float tmax = intersect.y;
196
+ float zmin = o.z + tmin * d.z;
197
+ float zmax = o.z + tmax * d.z;
198
+
199
+ // One interval
200
+ if (zmin < 0.0 && zmax < 0.0) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);
201
+ else if (zmin < 0.0) return vec4(-INF_HIT, tmax, NO_HIT, NO_HIT);
202
+ else if (zmax < 0.0) return vec4(tmin, +INF_HIT, NO_HIT, NO_HIT);
203
+ // Two intervals
204
+ else return vec4(-INF_HIT, tmin, tmax, +INF_HIT);
205
+ }
206
+
207
+ vec2 intersectRegularCone(Ray ray, float cosSqrHalfAngle) {
208
+ vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle);
209
+
210
+ if (intersect.x == NO_HIT) {
211
+ return vec2(NO_HIT);
212
+ }
213
+
214
+ vec3 o = ray.pos;
215
+ vec3 d = ray.dir;
216
+ float tmin = intersect.x;
217
+ float tmax = intersect.y;
218
+ float zmin = o.z + tmin * d.z;
219
+ float zmax = o.z + tmax * d.z;
220
+
221
+ if (zmin < 0.0 && zmax < 0.0) return vec2(NO_HIT);
222
+ else if (zmin < 0.0) return vec2(tmax, +INF_HIT);
223
+ else if (zmax < 0.0) return vec2(-INF_HIT, tmin);
224
+ else return vec2(tmin, tmax);
225
+ }
226
+
227
+ void intersectShape(in Ray ray, inout Intersections ix) {
228
+ // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1].
229
+ // Direction is scaled as well to be in sync with position.
230
+ ray.pos = ray.pos * 2.0 - 1.0;
231
+ ray.dir *= 2.0;
232
+
233
+ // Outer ellipsoid
234
+ vec2 outerIntersect = intersectUnitSphereUnnormalizedDirection(ray);
235
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect);
236
+
237
+ // Exit early if the outer ellipsoid was missed.
238
+ if (outerIntersect.x == NO_HIT) {
239
+ return;
240
+ }
241
+
242
+ // Inner ellipsoid
243
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT)
244
+ // When the ellipsoid is perfectly thin it's necessary to sandwich the
245
+ // inner ellipsoid intersection inside the outer ellipsoid intersection.
246
+
247
+ // Without this special case,
248
+ // [outerMin, outerMax, innerMin, innerMax] will bubble sort to
249
+ // [outerMin, innerMin, outerMax, innerMax] which will cause the back
250
+ // side of the ellipsoid to be invisible because it will think the ray
251
+ // is still inside the inner (negative) ellipsoid after exiting the
252
+ // outer (positive) ellipsoid.
253
+
254
+ // With this special case,
255
+ // [outerMin, innerMin, innerMax, outerMax] will bubble sort to
256
+ // [outerMin, innerMin, innerMax, outerMax] which will work correctly.
257
+
258
+ // Note: If initializeIntersections() changes its sorting function
259
+ // from bubble sort to something else, this code may need to change.
260
+ setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter
261
+ setIntersection(ix, 1, outerIntersect.x, false, true); // negative, enter
262
+ setIntersection(ix, 2, outerIntersect.y, false, false); // negative, exit
263
+ setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit
264
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)
265
+ Ray innerRay = Ray(ray.pos * u_ellipsoidInverseInnerScaleUv, ray.dir * u_ellipsoidInverseInnerScaleUv);
266
+ vec2 innerIntersect = intersectUnitSphereUnnormalizedDirection(innerRay);
267
+
268
+ if (innerIntersect == vec2(NO_HIT)) {
269
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);
270
+ } else {
271
+ // When the ellipsoid is very large and thin it's possible for floating
272
+ // point math to cause the ray to intersect the inner ellipsoid before
273
+ // the outer ellipsoid. To prevent this from happening, clamp innerIntersect
274
+ // to outerIntersect and sandwhich the intersections like described above.
275
+ //
276
+ // In theory a similar fix is needed for cylinders, however it's more
277
+ // complicated to implement because the inner shape is allowed to be
278
+ // intersected first.
279
+ innerIntersect.x = max(innerIntersect.x, outerIntersect.x);
280
+ innerIntersect.y = min(innerIntersect.y, outerIntersect.y);
281
+ setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter
282
+ setIntersection(ix, 1, innerIntersect.x, false, true); // negative, enter
283
+ setIntersection(ix, 2, innerIntersect.y, false, false); // negative, exit
284
+ setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit
285
+ }
286
+ #endif
287
+
288
+ // Flip the ray because the intersection function expects a cone growing towards +Z.
289
+ #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)
290
+ Ray flippedRay = ray;
291
+ flippedRay.dir.z *= -1.0;
292
+ flippedRay.pos.z *= -1.0;
293
+ #endif
294
+
295
+ // Bottom cone
296
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF)
297
+ vec2 bottomConeIntersection = intersectRegularCone(flippedRay, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.x);
298
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);
299
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF)
300
+ vec2 bottomConeIntersection = intersectZPlane(flippedRay);
301
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection);
302
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF)
303
+ vec4 bottomConeIntersection = intersectFlippedCone(ray, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.x);
304
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersection.xy);
305
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersection.zw);
306
+ #endif
307
+
308
+ // Top cone
309
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF)
310
+ vec4 topConeIntersection = intersectFlippedCone(flippedRay, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.y);
311
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersection.xy);
312
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersection.zw);
313
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF)
314
+ vec2 topConeIntersection = intersectZPlane(ray);
315
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);
316
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF)
317
+ vec2 topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeCosSqrHalfMinMax.y);
318
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection);
319
+ #endif
320
+
321
+ // Wedge
322
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)
323
+ vec4 wedgeIntersect = intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x);
324
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersect.xy);
325
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersect.zw);
326
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF)
327
+ vec2 wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax.x, u_ellipsoidRenderLongitudeMinMax.y);
328
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);
329
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF)
330
+ vec2 wedgeIntersect = intersectHalfSpace(ray, u_ellipsoidRenderLongitudeMinMax.x);
331
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);
332
+ #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF)
333
+ vec4 wedgeIntersect = intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax.x, u_ellipsoidRenderLongitudeMinMax.y);
334
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersect.xy);
335
+ setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersect.zw);
336
+ #endif
337
+ }