@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
@@ -0,0 +1,102 @@
1
+ // See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT,
2
+ // RayShapeIntersection
3
+
4
+ vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) {
5
+ float normalSign = positiveNormal ? 1.0 : -1.0;
6
+ vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign;
7
+
8
+ vec2 position = ray.pos.xy;
9
+ vec2 direction = ray.dir.xy;
10
+ float approachRate = dot(direction, planeNormal);
11
+ float distance = -dot(position, planeNormal);
12
+
13
+ float t = (approachRate == 0.0)
14
+ ? NO_HIT
15
+ : distance / approachRate;
16
+
17
+ return vec4(planeNormal, 0.0, t);
18
+ }
19
+
20
+ RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal)
21
+ {
22
+ vec4 intersection = intersectLongitude(ray, angle, positiveNormal);
23
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);
24
+
25
+ bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0);
26
+ if (!hitFront) {
27
+ return RayShapeIntersection(intersection, farSide);
28
+ } else {
29
+ return RayShapeIntersection(-1.0 * farSide, intersection);
30
+ }
31
+ }
32
+
33
+ void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2])
34
+ {
35
+ intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false);
36
+ intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true);
37
+ }
38
+
39
+ bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) {
40
+ float normalSign = positiveNormal ? 1.0 : -1.0;
41
+ vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign;
42
+ vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy;
43
+ return dot(hit, planeDirection) > 0.0;
44
+ }
45
+
46
+ void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) {
47
+ vec4 intersection = intersectLongitude(ray, angle, true);
48
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);
49
+
50
+ if (hitPositiveHalfPlane(ray, intersection, true)) {
51
+ intersections[0].entry = -1.0 * farSide;
52
+ intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w);
53
+ intersections[1].entry = intersection;
54
+ intersections[1].exit = farSide;
55
+ } else {
56
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);
57
+ intersections[0].entry = -1.0 * farSide;
58
+ intersections[0].exit = farSide;
59
+ intersections[1].entry = miss;
60
+ intersections[1].exit = miss;
61
+ }
62
+ }
63
+
64
+ RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle)
65
+ {
66
+ // Note: works for maxAngle > minAngle + pi, where the "regular wedge"
67
+ // is actually a negative volume.
68
+ // Compute intersections with the two planes.
69
+ // Normals will point toward the "outside" (negative space)
70
+ vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false);
71
+ vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true);
72
+
73
+ // Choose intersection with smallest T as the "first", the other as "last"
74
+ // Note: first or last could be in the "shadow" wedge, beyond the tip
75
+ bool inOrder = intersect1.w <= intersect2.w;
76
+ vec4 first = inOrder ? intersect1 : intersect2;
77
+ vec4 last = inOrder ? intersect2 : intersect1;
78
+
79
+ bool firstIsAhead = first.w >= 0.0;
80
+ bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0;
81
+ bool exitFromInside = firstIsAhead == startedInsideFirst;
82
+ bool lastIsAhead = last.w > 0.0;
83
+ bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0;
84
+ bool enterFromOutside = lastIsAhead == startedOutsideLast;
85
+
86
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);
87
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);
88
+
89
+ if (exitFromInside && enterFromOutside) {
90
+ // Ray crosses both faces of negative wedge, exiting then entering the positive shape
91
+ return RayShapeIntersection(first, last);
92
+ } else if (!exitFromInside && enterFromOutside) {
93
+ // Ray starts inside wedge. last is in shadow wedge, and first is actually the entry
94
+ return RayShapeIntersection(-1.0 * farSide, first);
95
+ } else if (exitFromInside && !enterFromOutside) {
96
+ // First intersection was in the shadow wedge, so last is actually the exit
97
+ return RayShapeIntersection(last, farSide);
98
+ } else { // !exitFromInside && !enterFromOutside
99
+ // Both intersections were in the shadow wedge
100
+ return RayShapeIntersection(miss, miss);
101
+ }
102
+ }
@@ -0,0 +1,104 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT,\n\
3
+ // RayShapeIntersection\n\
4
+ \n\
5
+ vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) {\n\
6
+ float normalSign = positiveNormal ? 1.0 : -1.0;\n\
7
+ vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign;\n\
8
+ \n\
9
+ vec2 position = ray.pos.xy;\n\
10
+ vec2 direction = ray.dir.xy;\n\
11
+ float approachRate = dot(direction, planeNormal);\n\
12
+ float distance = -dot(position, planeNormal);\n\
13
+ \n\
14
+ float t = (approachRate == 0.0)\n\
15
+ ? NO_HIT\n\
16
+ : distance / approachRate;\n\
17
+ \n\
18
+ return vec4(planeNormal, 0.0, t);\n\
19
+ }\n\
20
+ \n\
21
+ RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal)\n\
22
+ {\n\
23
+ vec4 intersection = intersectLongitude(ray, angle, positiveNormal);\n\
24
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
25
+ \n\
26
+ bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0);\n\
27
+ if (!hitFront) {\n\
28
+ return RayShapeIntersection(intersection, farSide);\n\
29
+ } else {\n\
30
+ return RayShapeIntersection(-1.0 * farSide, intersection);\n\
31
+ }\n\
32
+ }\n\
33
+ \n\
34
+ void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2])\n\
35
+ {\n\
36
+ intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false);\n\
37
+ intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true);\n\
38
+ }\n\
39
+ \n\
40
+ bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) {\n\
41
+ float normalSign = positiveNormal ? 1.0 : -1.0;\n\
42
+ vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign;\n\
43
+ vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy;\n\
44
+ return dot(hit, planeDirection) > 0.0;\n\
45
+ }\n\
46
+ \n\
47
+ void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) {\n\
48
+ vec4 intersection = intersectLongitude(ray, angle, true);\n\
49
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
50
+ \n\
51
+ if (hitPositiveHalfPlane(ray, intersection, true)) {\n\
52
+ intersections[0].entry = -1.0 * farSide;\n\
53
+ intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w);\n\
54
+ intersections[1].entry = intersection;\n\
55
+ intersections[1].exit = farSide;\n\
56
+ } else {\n\
57
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
58
+ intersections[0].entry = -1.0 * farSide;\n\
59
+ intersections[0].exit = farSide;\n\
60
+ intersections[1].entry = miss;\n\
61
+ intersections[1].exit = miss;\n\
62
+ }\n\
63
+ }\n\
64
+ \n\
65
+ RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle)\n\
66
+ {\n\
67
+ // Note: works for maxAngle > minAngle + pi, where the \"regular wedge\"\n\
68
+ // is actually a negative volume.\n\
69
+ // Compute intersections with the two planes.\n\
70
+ // Normals will point toward the \"outside\" (negative space)\n\
71
+ vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false);\n\
72
+ vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true);\n\
73
+ \n\
74
+ // Choose intersection with smallest T as the \"first\", the other as \"last\"\n\
75
+ // Note: first or last could be in the \"shadow\" wedge, beyond the tip\n\
76
+ bool inOrder = intersect1.w <= intersect2.w;\n\
77
+ vec4 first = inOrder ? intersect1 : intersect2;\n\
78
+ vec4 last = inOrder ? intersect2 : intersect1;\n\
79
+ \n\
80
+ bool firstIsAhead = first.w >= 0.0;\n\
81
+ bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0;\n\
82
+ bool exitFromInside = firstIsAhead == startedInsideFirst;\n\
83
+ bool lastIsAhead = last.w > 0.0;\n\
84
+ bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0;\n\
85
+ bool enterFromOutside = lastIsAhead == startedOutsideLast;\n\
86
+ \n\
87
+ vec4 farSide = vec4(normalize(ray.dir), INF_HIT);\n\
88
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
89
+ \n\
90
+ if (exitFromInside && enterFromOutside) {\n\
91
+ // Ray crosses both faces of negative wedge, exiting then entering the positive shape\n\
92
+ return RayShapeIntersection(first, last);\n\
93
+ } else if (!exitFromInside && enterFromOutside) {\n\
94
+ // Ray starts inside wedge. last is in shadow wedge, and first is actually the entry\n\
95
+ return RayShapeIntersection(-1.0 * farSide, first);\n\
96
+ } else if (exitFromInside && !enterFromOutside) {\n\
97
+ // First intersection was in the shadow wedge, so last is actually the exit\n\
98
+ return RayShapeIntersection(last, farSide);\n\
99
+ } else { // !exitFromInside && !enterFromOutside\n\
100
+ // Both intersections were in the shadow wedge\n\
101
+ return RayShapeIntersection(miss, miss);\n\
102
+ }\n\
103
+ }\n\
104
+ ";
@@ -4,22 +4,44 @@
4
4
 
5
5
  #define NO_HIT (-czm_infinity)
6
6
  #define INF_HIT (czm_infinity * 0.5)
7
- #define RAY_SHIFT (0.000003163)
8
- #define RAY_SCALE (1.003163)
9
-
10
- struct Ray {
11
- vec3 pos;
12
- vec3 dir;
13
- #if defined(SHAPE_BOX)
14
- vec3 dInv;
15
- #endif
16
- };
17
7
 
18
8
  struct RayShapeIntersection {
19
9
  vec4 entry;
20
10
  vec4 exit;
21
11
  };
22
12
 
13
+ vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1)
14
+ {
15
+ if (intersect0.w == NO_HIT) {
16
+ return intersect1;
17
+ } else if (intersect1.w == NO_HIT) {
18
+ return intersect0;
19
+ }
20
+ return (intersect0.w <= intersect1.w) ? intersect0 : intersect1;
21
+ }
22
+
23
+ vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1)
24
+ {
25
+ return (intersect0.w >= intersect1.w) ? intersect0 : intersect1;
26
+ }
27
+
28
+ RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1)
29
+ {
30
+ bool missed = (intersect0.entry.w == NO_HIT) ||
31
+ (intersect1.entry.w == NO_HIT) ||
32
+ (intersect0.exit.w < intersect1.entry.w) ||
33
+ (intersect0.entry.w > intersect1.exit.w);
34
+ if (missed) {
35
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);
36
+ return RayShapeIntersection(miss, miss);
37
+ }
38
+
39
+ vec4 entry = intersectionMax(intersect0.entry, intersect1.entry);
40
+ vec4 exit = intersectionMin(intersect0.exit, intersect1.exit);
41
+
42
+ return RayShapeIntersection(entry, exit);
43
+ }
44
+
23
45
  struct Intersections {
24
46
  // Don't access these member variables directly - call the functions instead.
25
47
 
@@ -57,7 +79,7 @@ vec4 encodeIntersectionType(vec4 intersection, int index, bool entry)
57
79
  // Use defines instead of real functions because WebGL1 cannot access array with non-constant index.
58
80
  #define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t))
59
81
  #define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y)
60
- #define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection) (ix).intersections[(index)] = intersection;
82
+ #define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter))
61
83
  #define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false)
62
84
 
63
85
  #if (INTERSECTION_COUNT > 1)
@@ -5,22 +5,44 @@ export default "/* Intersection defines\n\
5
5
  \n\
6
6
  #define NO_HIT (-czm_infinity)\n\
7
7
  #define INF_HIT (czm_infinity * 0.5)\n\
8
- #define RAY_SHIFT (0.000003163)\n\
9
- #define RAY_SCALE (1.003163)\n\
10
- \n\
11
- struct Ray {\n\
12
- vec3 pos;\n\
13
- vec3 dir;\n\
14
- #if defined(SHAPE_BOX)\n\
15
- vec3 dInv;\n\
16
- #endif\n\
17
- };\n\
18
8
  \n\
19
9
  struct RayShapeIntersection {\n\
20
10
  vec4 entry;\n\
21
11
  vec4 exit;\n\
22
12
  };\n\
23
13
  \n\
14
+ vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1)\n\
15
+ {\n\
16
+ if (intersect0.w == NO_HIT) {\n\
17
+ return intersect1;\n\
18
+ } else if (intersect1.w == NO_HIT) {\n\
19
+ return intersect0;\n\
20
+ }\n\
21
+ return (intersect0.w <= intersect1.w) ? intersect0 : intersect1;\n\
22
+ }\n\
23
+ \n\
24
+ vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1)\n\
25
+ {\n\
26
+ return (intersect0.w >= intersect1.w) ? intersect0 : intersect1;\n\
27
+ }\n\
28
+ \n\
29
+ RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1)\n\
30
+ {\n\
31
+ bool missed = (intersect0.entry.w == NO_HIT) ||\n\
32
+ (intersect1.entry.w == NO_HIT) ||\n\
33
+ (intersect0.exit.w < intersect1.entry.w) ||\n\
34
+ (intersect0.entry.w > intersect1.exit.w);\n\
35
+ if (missed) {\n\
36
+ vec4 miss = vec4(normalize(ray.dir), NO_HIT);\n\
37
+ return RayShapeIntersection(miss, miss);\n\
38
+ }\n\
39
+ \n\
40
+ vec4 entry = intersectionMax(intersect0.entry, intersect1.entry);\n\
41
+ vec4 exit = intersectionMin(intersect0.exit, intersect1.exit);\n\
42
+ \n\
43
+ return RayShapeIntersection(entry, exit);\n\
44
+ }\n\
45
+ \n\
24
46
  struct Intersections {\n\
25
47
  // Don't access these member variables directly - call the functions instead.\n\
26
48
  \n\
@@ -58,7 +80,7 @@ vec4 encodeIntersectionType(vec4 intersection, int index, bool entry)\n\
58
80
  // Use defines instead of real functions because WebGL1 cannot access array with non-constant index.\n\
59
81
  #define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t))\n\
60
82
  #define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y)\n\
61
- #define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection) (ix).intersections[(index)] = intersection;\n\
83
+ #define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter))\n\
62
84
  #define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false)\n\
63
85
  \n\
64
86
  #if (INTERSECTION_COUNT > 1)\n\
@@ -71,9 +71,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)
71
71
  */
72
72
 
73
73
  Properties getPropertiesFromMegatexture(in SampleData sampleData) {
74
- vec3 tileUv = clamp(sampleData.tileUv, vec3(0.0), vec3(1.0)); // TODO is the clamp necessary?
75
74
  int tileIndex = sampleData.megatextureIndex;
76
- vec3 voxelCoord = tileUv * vec3(u_dimensions);
75
+ vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);
77
76
  ivec3 voxelDimensions = u_dimensions;
78
77
 
79
78
  #if defined(PADDING)
@@ -72,9 +72,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)\n\
72
72
  */\n\
73
73
  \n\
74
74
  Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
75
- vec3 tileUv = clamp(sampleData.tileUv, vec3(0.0), vec3(1.0)); // TODO is the clamp necessary?\n\
76
75
  int tileIndex = sampleData.megatextureIndex;\n\
77
- vec3 voxelCoord = tileUv * vec3(u_dimensions);\n\
76
+ vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);\n\
78
77
  ivec3 voxelDimensions = u_dimensions;\n\
79
78
  \n\
80
79
  #if defined(PADDING)\n\
@@ -79,10 +79,15 @@ int getOctreeParentIndex(in int octreeIndex) {
79
79
  */
80
80
  vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {
81
81
  // PERFORMANCE_IDEA: use bit-shifting (only in WebGL2)
82
- float dimAtLevel = pow(2.0, float(octreeCoords.w));
82
+ float dimAtLevel = exp2(float(octreeCoords.w));
83
83
  return shapePosition * dimAtLevel - vec3(octreeCoords.xyz);
84
84
  }
85
85
 
86
+ vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {
87
+ vec3 tileUv = getTileUv(shapePosition, octreeCoords);
88
+ return clamp(tileUv, vec3(0.0), vec3(1.0));
89
+ }
90
+
86
91
  void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {
87
92
  sampleData.megatextureIndex = data.data;
88
93
  sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)
@@ -121,7 +126,7 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
121
126
  #endif
122
127
 
123
128
  OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) {
124
- float sizeAtLevel = 1.0 / pow(2.0, float(traversalData.octreeCoords.w));
129
+ float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w));
125
130
  vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel;
126
131
  vec3 end = start + vec3(sizeAtLevel);
127
132
  OctreeNodeData childData;
@@ -167,11 +172,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
167
172
 
168
173
  #if (SAMPLE_COUNT == 1)
169
174
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
170
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);
175
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
171
176
  #else
172
177
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
173
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);
174
- sampleDatas[1].tileUv = getTileUv(shapePosition, sampleDatas[1].tileCoords);
178
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
179
+ sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);
175
180
  #endif
176
181
  }
177
182
 
@@ -189,7 +194,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {
189
194
  void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {
190
195
  if (insideTile(shapePosition, traversalData.octreeCoords)) {
191
196
  for (int i = 0; i < SAMPLE_COUNT; i++) {
192
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);
197
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
193
198
  }
194
199
  return;
195
200
  }
@@ -211,10 +216,10 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
211
216
 
212
217
  #if (SAMPLE_COUNT == 1)
213
218
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
214
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);
219
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
215
220
  #else
216
221
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
217
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);
218
- sampleDatas[1].tileUv = getTileUv(shapePosition, sampleDatas[1].tileCoords);
222
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
223
+ sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);
219
224
  #endif
220
225
  }
@@ -80,10 +80,15 @@ int getOctreeParentIndex(in int octreeIndex) {\n\
80
80
  */\n\
81
81
  vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
82
82
  // PERFORMANCE_IDEA: use bit-shifting (only in WebGL2)\n\
83
- float dimAtLevel = pow(2.0, float(octreeCoords.w));\n\
83
+ float dimAtLevel = exp2(float(octreeCoords.w));\n\
84
84
  return shapePosition * dimAtLevel - vec3(octreeCoords.xyz);\n\
85
85
  }\n\
86
86
  \n\
87
+ vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
88
+ vec3 tileUv = getTileUv(shapePosition, octreeCoords);\n\
89
+ return clamp(tileUv, vec3(0.0), vec3(1.0));\n\
90
+ }\n\
91
+ \n\
87
92
  void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {\n\
88
93
  sampleData.megatextureIndex = data.data;\n\
89
94
  sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)\n\
@@ -122,7 +127,7 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
122
127
  #endif\n\
123
128
  \n\
124
129
  OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) {\n\
125
- float sizeAtLevel = 1.0 / pow(2.0, float(traversalData.octreeCoords.w));\n\
130
+ float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w));\n\
126
131
  vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel;\n\
127
132
  vec3 end = start + vec3(sizeAtLevel);\n\
128
133
  OctreeNodeData childData;\n\
@@ -168,11 +173,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
168
173
  \n\
169
174
  #if (SAMPLE_COUNT == 1)\n\
170
175
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
171
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
176
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
172
177
  #else\n\
173
178
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
174
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
175
- sampleDatas[1].tileUv = getTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
179
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
180
+ sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
176
181
  #endif\n\
177
182
  }\n\
178
183
  \n\
@@ -190,7 +195,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
190
195
  void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
191
196
  if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
192
197
  for (int i = 0; i < SAMPLE_COUNT; i++) {\n\
193
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
198
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
194
199
  }\n\
195
200
  return;\n\
196
201
  }\n\
@@ -212,11 +217,11 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
212
217
  \n\
213
218
  #if (SAMPLE_COUNT == 1)\n\
214
219
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
215
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
220
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
216
221
  #else\n\
217
222
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
218
- sampleDatas[0].tileUv = getTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
219
- sampleDatas[1].tileUv = getTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
223
+ sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
224
+ sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
220
225
  #endif\n\
221
226
  }\n\
222
227
  ";