@cesium/engine 6.2.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/Build/ThirdParty/Workers/z-worker-pako.js +568 -407
  2. package/Build/Workers/{chunk-RH4N2ONY.js → chunk-23UFSGND.js} +7 -7
  3. package/Build/Workers/{chunk-HPP4JLNH.js → chunk-2A75IWRS.js} +7 -7
  4. package/Build/Workers/{chunk-5IRLXUTA.js → chunk-2FRVPMCS.js} +10 -10
  5. package/Build/Workers/{chunk-ZQRZBHYI.js → chunk-2FWRMUTY.js} +4 -4
  6. package/Build/Workers/{chunk-Z2SIPUKB.js → chunk-2UPKWTMJ.js} +6 -6
  7. package/Build/Workers/{chunk-434ZTTFX.js → chunk-34FXV7D7.js} +2 -2
  8. package/Build/Workers/{chunk-MW3CJYLX.js → chunk-3VAZEH7M.js} +2 -2
  9. package/Build/Workers/{chunk-HUPNRBWW.js → chunk-4DO5W5XZ.js} +6 -6
  10. package/Build/Workers/{chunk-PIXK6KHB.js → chunk-4H7PY4U5.js} +2 -2
  11. package/Build/Workers/{chunk-BP467WX3.js → chunk-5QULIR53.js} +4 -4
  12. package/Build/Workers/{chunk-R3HUGXBH.js → chunk-7TC63SJW.js} +8 -8
  13. package/Build/Workers/{chunk-SQVTYRZY.js → chunk-7ZFGPDJA.js} +4 -4
  14. package/Build/Workers/{chunk-TIXXVKUY.js → chunk-A5DWLWCY.js} +10 -10
  15. package/Build/Workers/{chunk-CWJQGBWT.js → chunk-BBWDMCVU.js} +1 -1
  16. package/Build/Workers/{chunk-4KP73B43.js → chunk-BG4UCVXN.js} +3 -3
  17. package/Build/Workers/{chunk-Y4OJ4B23.js → chunk-BIKA3NRA.js} +5 -5
  18. package/Build/Workers/{chunk-DR5XZ6K5.js → chunk-BROJAZRZ.js} +13 -13
  19. package/Build/Workers/{chunk-FWGNCYP6.js → chunk-DDUQAJ4P.js} +7 -7
  20. package/Build/Workers/{chunk-QRBRVGZC.js → chunk-EERJKOAF.js} +4 -4
  21. package/Build/Workers/{chunk-52VSIKEA.js → chunk-EG6PTBY2.js} +15 -15
  22. package/Build/Workers/{chunk-O43GWBSF.js → chunk-EHWHNOEX.js} +1 -1
  23. package/Build/Workers/{chunk-MN34FIF5.js → chunk-F3YA3Y2Z.js} +1 -1
  24. package/Build/Workers/{chunk-GF5TNNKP.js → chunk-F4HFJMGM.js} +6 -6
  25. package/Build/Workers/{chunk-HOT2SNXP.js → chunk-FJKNFAKQ.js} +133 -553
  26. package/Build/Workers/{chunk-TMPVBFJQ.js → chunk-FNIRWHJB.js} +10 -10
  27. package/Build/Workers/{chunk-DMCSY5BU.js → chunk-FZRIVR7Y.js} +5 -5
  28. package/Build/Workers/{chunk-Z4JUBRHP.js → chunk-G43QFN4Q.js} +6 -6
  29. package/Build/Workers/{chunk-HPH5HSFE.js → chunk-GATZHF3K.js} +2 -2
  30. package/Build/Workers/{chunk-CSIZ3BGT.js → chunk-GRC2ZTAF.js} +14 -14
  31. package/Build/Workers/{chunk-NE4JNU6H.js → chunk-HU6N6EXB.js} +10 -10
  32. package/Build/Workers/{chunk-GVL5I7TC.js → chunk-I46ZRR5W.js} +17 -17
  33. package/Build/Workers/{chunk-5GDBZTHX.js → chunk-JURN7NPV.js} +17 -17
  34. package/Build/Workers/{chunk-H5DUXHCV.js → chunk-KKCR2YOP.js} +11 -11
  35. package/Build/Workers/{chunk-LX6XV4DK.js → chunk-LPR3YNP2.js} +5 -5
  36. package/Build/Workers/{chunk-HFKSAB5K.js → chunk-M7ERACJJ.js} +13 -13
  37. package/Build/Workers/{chunk-BUZDZBUH.js → chunk-MDWEGWPA.js} +10 -10
  38. package/Build/Workers/{chunk-LGJUI2CE.js → chunk-OGXZVPPM.js} +9 -5
  39. package/Build/Workers/{chunk-PZ2WJWUG.js → chunk-PGSJK77E.js} +6 -6
  40. package/Build/Workers/{chunk-ARPTYYKS.js → chunk-PPH7OFP3.js} +5 -5
  41. package/Build/Workers/{chunk-R4OZKBXH.js → chunk-SH5USDPI.js} +6 -6
  42. package/Build/Workers/{chunk-SV7DDPAC.js → chunk-SOWMRMWA.js} +1 -1
  43. package/Build/Workers/{chunk-RIDPF7PO.js → chunk-STW2DGFI.js} +2 -2
  44. package/Build/Workers/{chunk-CDGHUKQ4.js → chunk-T3XIFPYR.js} +13 -13
  45. package/Build/Workers/chunk-TTUZP4BO.js +501 -0
  46. package/Build/Workers/{chunk-QTZQZY2C.js → chunk-UEXTBDBE.js} +34 -10
  47. package/Build/Workers/{chunk-XUTVA4K5.js → chunk-VOXYEYJT.js} +11 -11
  48. package/Build/Workers/{chunk-AXFRNOVC.js → chunk-X4356LRH.js} +12 -12
  49. package/Build/Workers/{chunk-5HLGKKG3.js → chunk-XGI5BXZY.js} +2 -2
  50. package/Build/Workers/{chunk-SNN7WOC2.js → chunk-Y2ME2IJV.js} +13 -13
  51. package/Build/Workers/{chunk-LGL4P5KL.js → chunk-Y5UQJLYE.js} +6 -6
  52. package/Build/Workers/{chunk-3PW6ZBN4.js → chunk-YJEBABKH.js} +7 -7
  53. package/Build/Workers/{chunk-YBKFS53K.js → chunk-YWTJ2B4B.js} +1 -1
  54. package/Build/Workers/{chunk-5SK36PU4.js → chunk-Z3TIFFGF.js} +7 -7
  55. package/Build/Workers/{chunk-JGG36SQV.js → chunk-ZT7KWISZ.js} +4 -4
  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 -29
  64. package/Build/Workers/createCorridorOutlineGeometry.js +28 -28
  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 +32 -166
  78. package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
  79. package/Build/Workers/createPolylineGeometry.js +25 -24
  80. package/Build/Workers/createPolylineVolumeGeometry.js +32 -33
  81. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
  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/LICENSE.md +1 -1
  105. package/Source/Assets/approximateTerrainHeights.json +1 -1
  106. package/Source/Core/Ellipsoid.js +6 -0
  107. package/Source/Core/GregorianDate.js +85 -0
  108. package/Source/Core/HeadingPitchRange.js +2 -2
  109. package/Source/Core/IntersectionTests.js +6 -3
  110. package/Source/Core/Ion.js +1 -1
  111. package/Source/Core/PixelFormat.js +5 -0
  112. package/Source/Core/PolygonGeometry.js +0 -169
  113. package/Source/Core/Resource.js +30 -69
  114. package/Source/Core/Transforms.js +30 -18
  115. package/Source/Core/createWorldBathymetryAsync.js +45 -0
  116. package/Source/Core/srgbToLinear.js +32 -0
  117. package/Source/DataSources/CzmlDataSource.js +51 -23
  118. package/Source/DataSources/DataSourceDisplay.js +27 -0
  119. package/Source/DataSources/EllipsoidGeometryUpdater.js +3 -4
  120. package/Source/DataSources/Entity.js +28 -7
  121. package/Source/DataSources/EntityCollection.js +1 -2
  122. package/Source/DataSources/GeometryUpdater.js +1 -2
  123. package/Source/DataSources/GeometryUpdaterSet.js +114 -0
  124. package/Source/DataSources/GeometryVisualizer.js +19 -83
  125. package/Source/DataSources/GroundGeometryUpdater.js +6 -3
  126. package/Source/DataSources/ModelVisualizer.js +19 -98
  127. package/Source/DataSources/PolygonGeometryUpdater.js +14 -2
  128. package/Source/DataSources/PolylineGeometryUpdater.js +9 -8
  129. package/Source/DataSources/TerrainOffsetProperty.js +15 -23
  130. package/Source/Renderer/AutomaticUniforms.js +121 -1
  131. package/Source/Renderer/Context.js +10 -0
  132. package/Source/Renderer/ContextLimits.js +2 -0
  133. package/Source/Renderer/UniformState.js +127 -0
  134. package/Source/Renderer/demodernizeShader.js +4 -1
  135. package/Source/Scene/ArcGisMapService.js +1 -1
  136. package/Source/Scene/Atmosphere.js +127 -0
  137. package/Source/Scene/Axis.js +12 -7
  138. package/Source/Scene/Billboard.js +29 -26
  139. package/Source/Scene/BillboardCollection.js +3 -3
  140. package/Source/Scene/Camera.js +47 -5
  141. package/Source/Scene/Cesium3DTile.js +1 -0
  142. package/Source/Scene/Cesium3DTileContent.js +14 -0
  143. package/Source/Scene/Cesium3DTileset.js +364 -45
  144. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
  145. package/Source/Scene/Cesium3DTilesetTraversal.js +4 -0
  146. package/Source/Scene/Composite3DTileContent.js +42 -0
  147. package/Source/Scene/DynamicAtmosphereLightingType.js +56 -0
  148. package/Source/Scene/Empty3DTileContent.js +4 -0
  149. package/Source/Scene/Fog.js +1 -0
  150. package/Source/Scene/FrameState.js +14 -1
  151. package/Source/Scene/Geometry3DTileContent.js +4 -0
  152. package/Source/Scene/Globe.js +3 -2
  153. package/Source/Scene/GlobeSurfaceTileProvider.js +3 -1
  154. package/Source/Scene/GlobeTranslucencyState.js +1 -1
  155. package/Source/Scene/GltfLoader.js +15 -5
  156. package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
  157. package/Source/Scene/HeightReference.js +59 -2
  158. package/Source/Scene/I3SDataProvider.js +270 -53
  159. package/Source/Scene/I3SDecoder.js +8 -1
  160. package/Source/Scene/I3SFeature.js +2 -5
  161. package/Source/Scene/I3SField.js +136 -31
  162. package/Source/Scene/I3SGeometry.js +70 -2
  163. package/Source/Scene/I3SLayer.js +55 -10
  164. package/Source/Scene/I3SNode.js +175 -18
  165. package/Source/Scene/I3SStatistics.js +94 -0
  166. package/Source/Scene/I3SSublayer.js +176 -0
  167. package/Source/Scene/I3SSymbology.js +337 -0
  168. package/Source/Scene/Implicit3DTileContent.js +4 -0
  169. package/Source/Scene/KeyframeNode.js +1 -1
  170. package/Source/Scene/LabelCollection.js +2 -2
  171. package/Source/Scene/Model/AtmospherePipelineStage.js +59 -0
  172. package/Source/Scene/Model/B3dmLoader.js +4 -0
  173. package/Source/Scene/Model/FeatureIdPipelineStage.js +25 -2
  174. package/Source/Scene/Model/I3dmLoader.js +4 -0
  175. package/Source/Scene/Model/InstancingPipelineStage.js +24 -6
  176. package/Source/Scene/Model/MetadataPipelineStage.js +31 -3
  177. package/Source/Scene/Model/Model.js +82 -32
  178. package/Source/Scene/Model/Model3DTileContent.js +31 -0
  179. package/Source/Scene/Model/ModelAnimationChannel.js +16 -15
  180. package/Source/Scene/Model/ModelSceneGraph.js +6 -0
  181. package/Source/Scene/Model/pickModel.js +426 -0
  182. package/Source/Scene/Multiple3DTileContent.js +42 -0
  183. package/Source/Scene/PickFramebuffer.js +37 -2
  184. package/Source/Scene/Picking.js +113 -39
  185. package/Source/Scene/Primitive.js +6 -2
  186. package/Source/Scene/QuadtreePrimitive.js +1 -1
  187. package/Source/Scene/Scene.js +312 -46
  188. package/Source/Scene/ScreenSpaceCameraController.js +23 -13
  189. package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
  190. package/Source/Scene/SkyAtmosphere.js +5 -6
  191. package/Source/Scene/SpatialNode.js +12 -19
  192. package/Source/Scene/StructuralMetadata.js +1 -1
  193. package/Source/Scene/Terrain.js +49 -0
  194. package/Source/Scene/TileBoundingS2Cell.js +2 -2
  195. package/Source/Scene/Tileset3DTileContent.js +4 -0
  196. package/Source/Scene/Vector3DTileContent.js +4 -0
  197. package/Source/Scene/VoxelBoxShape.js +76 -0
  198. package/Source/Scene/VoxelCell.js +273 -0
  199. package/Source/Scene/VoxelCylinderShape.js +114 -43
  200. package/Source/Scene/VoxelEllipsoidShape.js +158 -116
  201. package/Source/Scene/VoxelPrimitive.js +3 -1
  202. package/Source/Scene/VoxelRenderResources.js +3 -0
  203. package/Source/Scene/VoxelShape.js +13 -0
  204. package/Source/Scene/VoxelTraversal.js +76 -54
  205. package/Source/Scene/buildVoxelDrawCommands.js +23 -0
  206. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
  207. package/Source/Scene/processVoxelProperties.js +2 -0
  208. package/Source/Shaders/AtmosphereCommon.glsl +3 -11
  209. package/Source/Shaders/AtmosphereCommon.js +3 -11
  210. package/Source/Shaders/Builtin/CzmBuiltins.js +12 -0
  211. package/Source/Shaders/Builtin/Functions/applyHSBShift.glsl +32 -0
  212. package/Source/Shaders/Builtin/Functions/applyHSBShift.js +34 -0
  213. package/Source/Shaders/Builtin/Functions/approximateTanh.glsl +10 -0
  214. package/Source/Shaders/Builtin/Functions/approximateTanh.js +12 -0
  215. package/Source/Shaders/Builtin/Functions/computeAtmosphereColor.glsl +44 -0
  216. package/Source/Shaders/Builtin/Functions/computeAtmosphereColor.js +46 -0
  217. package/Source/Shaders/Builtin/Functions/computeGroundAtmosphereScattering.glsl +30 -0
  218. package/Source/Shaders/Builtin/Functions/computeGroundAtmosphereScattering.js +32 -0
  219. package/Source/Shaders/Builtin/Functions/computeScattering.glsl +150 -0
  220. package/Source/Shaders/Builtin/Functions/computeScattering.js +152 -0
  221. package/Source/Shaders/Builtin/Functions/getDynamicAtmosphereLightDirection.glsl +22 -0
  222. package/Source/Shaders/Builtin/Functions/getDynamicAtmosphereLightDirection.js +24 -0
  223. package/Source/Shaders/Builtin/Functions/translateRelativeToEye.glsl +5 -0
  224. package/Source/Shaders/Builtin/Functions/translateRelativeToEye.js +5 -0
  225. package/Source/Shaders/GlobeFS.glsl +16 -25
  226. package/Source/Shaders/GlobeFS.js +16 -25
  227. package/Source/Shaders/GlobeVS.glsl +1 -1
  228. package/Source/Shaders/GlobeVS.js +1 -1
  229. package/Source/Shaders/Model/AtmosphereStageFS.glsl +111 -0
  230. package/Source/Shaders/Model/AtmosphereStageFS.js +113 -0
  231. package/Source/Shaders/Model/AtmosphereStageVS.glsl +12 -0
  232. package/Source/Shaders/Model/AtmosphereStageVS.js +14 -0
  233. package/Source/Shaders/Model/GeometryStageFS.glsl +1 -1
  234. package/Source/Shaders/Model/GeometryStageFS.js +1 -1
  235. package/Source/Shaders/Model/GeometryStageVS.glsl +4 -4
  236. package/Source/Shaders/Model/GeometryStageVS.js +4 -4
  237. package/Source/Shaders/Model/ModelColorStageFS.glsl +1 -1
  238. package/Source/Shaders/Model/ModelColorStageFS.js +2 -1
  239. package/Source/Shaders/Model/ModelFS.glsl +4 -0
  240. package/Source/Shaders/Model/ModelFS.js +4 -0
  241. package/Source/Shaders/Model/ModelVS.glsl +9 -4
  242. package/Source/Shaders/Model/ModelVS.js +9 -4
  243. package/Source/Shaders/SkyAtmosphereCommon.glsl +3 -13
  244. package/Source/Shaders/SkyAtmosphereCommon.js +3 -13
  245. package/Source/Shaders/SkyAtmosphereFS.glsl +5 -10
  246. package/Source/Shaders/SkyAtmosphereFS.js +5 -10
  247. package/Source/Shaders/SkyAtmosphereVS.glsl +3 -2
  248. package/Source/Shaders/SkyAtmosphereVS.js +3 -2
  249. package/Source/Shaders/Voxels/IntersectCylinder.glsl +14 -111
  250. package/Source/Shaders/Voxels/IntersectCylinder.js +14 -111
  251. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +32 -113
  252. package/Source/Shaders/Voxels/IntersectEllipsoid.js +32 -113
  253. package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
  254. package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
  255. package/Source/Shaders/Voxels/VoxelFS.glsl +39 -1
  256. package/Source/Shaders/Voxels/VoxelFS.js +39 -1
  257. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +19 -37
  258. package/Source/Shaders/Voxels/convertUvToCylinder.js +19 -37
  259. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +24 -44
  260. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +24 -44
  261. package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
  262. package/Source/ThirdParty/draco_decoder.wasm +0 -0
  263. package/Source/Workers/createGeometry.js +40 -11
  264. package/Source/Workers/decodeI3S.js +720 -94
  265. package/index.d.ts +574 -71
  266. package/index.js +217 -196
  267. package/package.json +3 -3
  268. package/Build/Workers/chunk-ATB2I7OS.js +0 -55
@@ -1,14 +1,14 @@
1
1
  //This file is automatically rebuilt by the Cesium build process.
2
2
  export default "// See IntersectionUtils.glsl for the definitions of Ray, Intersections,\n\
3
3
  // setIntersection, setIntersectionPair, INF_HIT, NO_HIT\n\
4
+ // See IntersectLongitude.glsl for the definitions of intersectHalfPlane,\n\
5
+ // intersectFlippedWedge, intersectRegularWedge\n\
4
6
  \n\
5
7
  /* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js)\n\
6
8
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE\n\
7
9
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO\n\
8
10
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF\n\
9
- #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF\n\
10
11
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF\n\
11
- #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE\n\
12
12
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF\n\
13
13
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF\n\
14
14
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF\n\
@@ -17,7 +17,6 @@ export default "// See IntersectionUtils.glsl for the definitions of Ray, Inters
17
17
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF\n\
18
18
  #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MAX\n\
19
19
  #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN\n\
20
- #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
21
20
  #define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE\n\
22
21
  #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX\n\
23
22
  #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN\n\
@@ -49,78 +48,6 @@ vec2 intersectZPlane(Ray ray)\n\
49
48
  else return vec2(-INF_HIT, t);\n\
50
49
  }\n\
51
50
  \n\
52
- vec4 intersectHalfPlane(Ray ray, float angle) {\n\
53
- vec2 o = ray.pos.xy;\n\
54
- vec2 d = ray.dir.xy;\n\
55
- vec2 planeDirection = vec2(cos(angle), sin(angle));\n\
56
- vec2 planeNormal = vec2(planeDirection.y, -planeDirection.x);\n\
57
- \n\
58
- float a = dot(o, planeNormal);\n\
59
- float b = dot(d, planeNormal);\n\
60
- float t = -a / b;\n\
61
- \n\
62
- vec2 p = o + t * d;\n\
63
- bool outside = dot(p, planeDirection) < 0.0;\n\
64
- if (outside) return vec4(-INF_HIT, +INF_HIT, NO_HIT, NO_HIT);\n\
65
- \n\
66
- return vec4(-INF_HIT, t, t, +INF_HIT);\n\
67
- }\n\
68
- \n\
69
- vec2 intersectHalfSpace(Ray ray, float angle)\n\
70
- {\n\
71
- vec2 o = ray.pos.xy;\n\
72
- vec2 d = ray.dir.xy;\n\
73
- vec2 n = vec2(sin(angle), -cos(angle));\n\
74
- \n\
75
- float a = dot(o, n);\n\
76
- float b = dot(d, n);\n\
77
- float t = -a / b;\n\
78
- float s = sign(a);\n\
79
- \n\
80
- if (t >= 0.0 != s >= 0.0) return vec2(t, +INF_HIT);\n\
81
- else return vec2(-INF_HIT, t);\n\
82
- }\n\
83
- \n\
84
- vec2 intersectRegularWedge(Ray ray, float minAngle, float maxAngle)\n\
85
- {\n\
86
- vec2 o = ray.pos.xy;\n\
87
- vec2 d = ray.dir.xy;\n\
88
- vec2 n1 = vec2(sin(minAngle), -cos(minAngle));\n\
89
- vec2 n2 = vec2(-sin(maxAngle), cos(maxAngle));\n\
90
- \n\
91
- float a1 = dot(o, n1);\n\
92
- float a2 = dot(o, n2);\n\
93
- float b1 = dot(d, n1);\n\
94
- float b2 = dot(d, n2);\n\
95
- \n\
96
- float t1 = -a1 / b1;\n\
97
- float t2 = -a2 / b2;\n\
98
- float s1 = sign(a1);\n\
99
- float s2 = sign(a2);\n\
100
- \n\
101
- float tmin = min(t1, t2);\n\
102
- float tmax = max(t1, t2);\n\
103
- float smin = tmin == t1 ? s1 : s2;\n\
104
- float smax = tmin == t1 ? s2 : s1;\n\
105
- \n\
106
- bool e = tmin >= 0.0;\n\
107
- bool f = tmax >= 0.0;\n\
108
- bool g = smin >= 0.0;\n\
109
- bool h = smax >= 0.0;\n\
110
- \n\
111
- if (e != g && f == h) return vec2(tmin, tmax);\n\
112
- else if (e == g && f == h) return vec2(-INF_HIT, tmin);\n\
113
- else if (e != g && f != h) return vec2(tmax, +INF_HIT);\n\
114
- else return vec2(NO_HIT);\n\
115
- }\n\
116
- \n\
117
- vec4 intersectFlippedWedge(Ray ray, float minAngle, float maxAngle)\n\
118
- {\n\
119
- vec2 planeIntersectMin = intersectHalfSpace(ray, minAngle);\n\
120
- vec2 planeIntersectMax = intersectHalfSpace(ray, maxAngle + czm_pi);\n\
121
- return vec4(planeIntersectMin, planeIntersectMax);\n\
122
- }\n\
123
- \n\
124
51
  vec2 intersectUnitSphere(Ray ray)\n\
125
52
  {\n\
126
53
  vec3 o = ray.pos;\n\
@@ -251,39 +178,32 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
251
178
  }\n\
252
179
  \n\
253
180
  // Inner ellipsoid\n\
254
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT)\n\
255
- // When the ellipsoid is perfectly thin it's necessary to sandwich the\n\
256
- // inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
257
- \n\
258
- // Without this special case,\n\
259
- // [outerMin, outerMax, innerMin, innerMax] will bubble sort to\n\
260
- // [outerMin, innerMin, outerMax, innerMax] which will cause the back\n\
261
- // side of the ellipsoid to be invisible because it will think the ray\n\
262
- // is still inside the inner (negative) ellipsoid after exiting the\n\
263
- // outer (positive) ellipsoid.\n\
264
- \n\
265
- // With this special case,\n\
266
- // [outerMin, innerMin, innerMax, outerMax] will bubble sort to\n\
267
- // [outerMin, innerMin, innerMax, outerMax] which will work correctly.\n\
268
- \n\
269
- // Note: If initializeIntersections() changes its sorting function\n\
270
- // from bubble sort to something else, this code may need to change.\n\
271
- setIntersection(ix, 0, outerIntersect.x, true, true); // positive, enter\n\
272
- setIntersection(ix, 1, outerIntersect.x, false, true); // negative, enter\n\
273
- setIntersection(ix, 2, outerIntersect.y, false, false); // negative, exit\n\
274
- setIntersection(ix, 3, outerIntersect.y, true, false); // positive, exit\n\
275
- #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
181
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_MIN)\n\
276
182
  Ray innerRay = Ray(ray.pos * u_ellipsoidInverseInnerScaleUv, ray.dir * u_ellipsoidInverseInnerScaleUv);\n\
277
183
  vec2 innerIntersect = intersectUnitSphereUnnormalizedDirection(innerRay);\n\
278
184
  \n\
279
185
  if (innerIntersect == vec2(NO_HIT)) {\n\
280
186
  setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect);\n\
281
187
  } else {\n\
282
- // When the ellipsoid is very large and thin it's possible for floating\n\
283
- // point math to cause the ray to intersect the inner ellipsoid before\n\
284
- // the outer ellipsoid. To prevent this from happening, clamp innerIntersect\n\
285
- // to outerIntersect and sandwhich the intersections like described above.\n\
286
- //\n\
188
+ // When the ellipsoid is large and thin it's possible for floating point math\n\
189
+ // to cause the ray to intersect the inner ellipsoid before the outer ellipsoid.\n\
190
+ // To prevent this from happening, clamp innerIntersect to outerIntersect and\n\
191
+ // sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection.\n\
192
+ \n\
193
+ // Without this special case,\n\
194
+ // [outerMin, outerMax, innerMin, innerMax] will bubble sort to\n\
195
+ // [outerMin, innerMin, outerMax, innerMax] which will cause the back\n\
196
+ // side of the ellipsoid to be invisible because it will think the ray\n\
197
+ // is still inside the inner (negative) ellipsoid after exiting the\n\
198
+ // outer (positive) ellipsoid.\n\
199
+ \n\
200
+ // With this special case,\n\
201
+ // [outerMin, innerMin, innerMax, outerMax] will bubble sort to\n\
202
+ // [outerMin, innerMin, innerMax, outerMax] which will work correctly.\n\
203
+ \n\
204
+ // Note: If initializeIntersections() changes its sorting function\n\
205
+ // from bubble sort to something else, this code may need to change.\n\
206
+ \n\
287
207
  // In theory a similar fix is needed for cylinders, however it's more\n\
288
208
  // complicated to implement because the inner shape is allowed to be\n\
289
209
  // intersected first.\n\
@@ -331,19 +251,18 @@ void intersectShape(in Ray ray, inout Intersections ix) {\n\
331
251
  \n\
332
252
  // Wedge\n\
333
253
  #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)\n\
334
- vec4 wedgeIntersect = intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x);\n\
335
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersect.xy);\n\
336
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersect.zw);\n\
254
+ RayShapeIntersection wedgeIntersects[2];\n\
255
+ intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects);\n\
256
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
257
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
337
258
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF)\n\
338
- vec2 wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax.x, u_ellipsoidRenderLongitudeMinMax.y);\n\
339
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
340
- #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_HALF)\n\
341
- vec2 wedgeIntersect = intersectHalfSpace(ray, u_ellipsoidRenderLongitudeMinMax.x);\n\
342
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
259
+ RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax);\n\
260
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect);\n\
343
261
  #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF)\n\
344
- vec4 wedgeIntersect = intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax.x, u_ellipsoidRenderLongitudeMinMax.y);\n\
345
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersect.xy);\n\
346
- setIntersectionPair(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersect.zw);\n\
262
+ RayShapeIntersection wedgeIntersects[2];\n\
263
+ intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects);\n\
264
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]);\n\
265
+ setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]);\n\
347
266
  #endif\n\
348
267
  }\n\
349
268
  ";
@@ -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
+ ";
@@ -9,7 +9,11 @@
9
9
  // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture
10
10
 
11
11
  #define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops
12
- #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0
12
+ #if defined(PICKING_VOXEL)
13
+ #define ALPHA_ACCUM_MAX 0.1
14
+ #else
15
+ #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0
16
+ #endif
13
17
 
14
18
  uniform mat3 u_transformDirectionViewToLocal;
15
19
  uniform vec3 u_cameraPositionUv;
@@ -42,6 +46,30 @@ vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersecti
42
46
  #endif
43
47
  }
44
48
 
49
+ vec2 packIntToVec2(int value) {
50
+ float shifted = float(value) / 255.0;
51
+ float lowBits = fract(shifted);
52
+ float highBits = floor(shifted) / 255.0;
53
+ return vec2(highBits, lowBits);
54
+ }
55
+
56
+ vec2 packFloatToVec2(float value) {
57
+ float lowBits = fract(value);
58
+ float highBits = floor(value) / 255.0;
59
+ return vec2(highBits, lowBits);
60
+ }
61
+
62
+ int getSampleIndex(in vec3 tileUv) {
63
+ ivec3 voxelDimensions = u_dimensions;
64
+ vec3 tileCoordinate = clamp(tileUv, 0.0, 1.0) * vec3(voxelDimensions);
65
+ ivec3 tileIndex = ivec3(floor(tileCoordinate));
66
+ #if defined(PADDING)
67
+ voxelDimensions += u_paddingBefore + u_paddingAfter;
68
+ tileIndex += u_paddingBefore;
69
+ #endif
70
+ return tileIndex.x + voxelDimensions.x * (tileIndex.y + voxelDimensions.y * tileIndex.z);
71
+ }
72
+
45
73
  void main()
46
74
  {
47
75
  vec4 fragCoord = gl_FragCoord;
@@ -102,6 +130,8 @@ void main()
102
130
  fragmentInput.voxel.viewDirWorld = viewDirWorld;
103
131
  fragmentInput.voxel.surfaceNormal = step.xyz;
104
132
  fragmentInput.voxel.travelDistance = step.w;
133
+ fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;
134
+ fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv);
105
135
 
106
136
  // Run the custom shader
107
137
  czm_modelMaterial materialOutput;
@@ -164,6 +194,14 @@ void main()
164
194
  discard;
165
195
  }
166
196
  out_FragColor = u_pickColor;
197
+ #elif defined(PICKING_VOXEL)
198
+ // If alpha is 0.0 there is nothing to pick
199
+ if (colorAccum.a == 0.0) {
200
+ discard;
201
+ }
202
+ vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);
203
+ vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv));
204
+ out_FragColor = vec4(megatextureId, sampleIndex);
167
205
  #else
168
206
  out_FragColor = colorAccum;
169
207
  #endif
@@ -10,7 +10,11 @@ export default "// See Intersection.glsl for the definition of intersectScene\n\
10
10
  // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture\n\
11
11
  \n\
12
12
  #define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops\n\
13
- #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0\n\
13
+ #if defined(PICKING_VOXEL)\n\
14
+ #define ALPHA_ACCUM_MAX 0.1\n\
15
+ #else\n\
16
+ #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0\n\
17
+ #endif\n\
14
18
  \n\
15
19
  uniform mat3 u_transformDirectionViewToLocal;\n\
16
20
  uniform vec3 u_cameraPositionUv;\n\
@@ -43,6 +47,30 @@ vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersecti
43
47
  #endif\n\
44
48
  }\n\
45
49
  \n\
50
+ vec2 packIntToVec2(int value) {\n\
51
+ float shifted = float(value) / 255.0;\n\
52
+ float lowBits = fract(shifted);\n\
53
+ float highBits = floor(shifted) / 255.0;\n\
54
+ return vec2(highBits, lowBits);\n\
55
+ }\n\
56
+ \n\
57
+ vec2 packFloatToVec2(float value) {\n\
58
+ float lowBits = fract(value);\n\
59
+ float highBits = floor(value) / 255.0;\n\
60
+ return vec2(highBits, lowBits);\n\
61
+ }\n\
62
+ \n\
63
+ int getSampleIndex(in vec3 tileUv) {\n\
64
+ ivec3 voxelDimensions = u_dimensions;\n\
65
+ vec3 tileCoordinate = clamp(tileUv, 0.0, 1.0) * vec3(voxelDimensions);\n\
66
+ ivec3 tileIndex = ivec3(floor(tileCoordinate));\n\
67
+ #if defined(PADDING)\n\
68
+ voxelDimensions += u_paddingBefore + u_paddingAfter;\n\
69
+ tileIndex += u_paddingBefore;\n\
70
+ #endif\n\
71
+ return tileIndex.x + voxelDimensions.x * (tileIndex.y + voxelDimensions.y * tileIndex.z);\n\
72
+ }\n\
73
+ \n\
46
74
  void main()\n\
47
75
  {\n\
48
76
  vec4 fragCoord = gl_FragCoord;\n\
@@ -103,6 +131,8 @@ void main()\n\
103
131
  fragmentInput.voxel.viewDirWorld = viewDirWorld;\n\
104
132
  fragmentInput.voxel.surfaceNormal = step.xyz;\n\
105
133
  fragmentInput.voxel.travelDistance = step.w;\n\
134
+ fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;\n\
135
+ fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv);\n\
106
136
  \n\
107
137
  // Run the custom shader\n\
108
138
  czm_modelMaterial materialOutput;\n\
@@ -165,6 +195,14 @@ void main()\n\
165
195
  discard;\n\
166
196
  }\n\
167
197
  out_FragColor = u_pickColor;\n\
198
+ #elif defined(PICKING_VOXEL)\n\
199
+ // If alpha is 0.0 there is nothing to pick\n\
200
+ if (colorAccum.a == 0.0) {\n\
201
+ discard;\n\
202
+ }\n\
203
+ vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);\n\
204
+ vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv));\n\
205
+ out_FragColor = vec4(megatextureId, sampleIndex);\n\
168
206
  #else\n\
169
207
  out_FragColor = colorAccum;\n\
170
208
  #endif\n\
@@ -1,10 +1,7 @@
1
1
  /* Cylinder defines (set in Scene/VoxelCylinderShape.js)
2
2
  #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS
3
- #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT
4
3
  #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT
5
- #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
6
4
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE
7
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
8
5
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY
9
6
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY
10
7
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED
@@ -29,46 +26,31 @@
29
26
  vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
30
27
  vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]
31
28
 
32
- // Compute radius
33
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT)
34
- float radius = 1.0;
35
- #else
36
- float radius = length(positionLocal.xy); // [0,1]
37
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
38
- radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset
39
- #endif
29
+ float radius = length(positionLocal.xy); // [0,1]
30
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
31
+ radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset
40
32
  #endif
41
33
 
42
- // Compute height
43
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)
44
- float height = 1.0;
45
- #else
46
- float height = positionUv.z; // [0,1]
47
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
48
- height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset
49
- #endif
34
+ float height = positionUv.z; // [0,1]
35
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
36
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset
50
37
  #endif
51
38
 
52
- // Compute angle
53
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)
54
- float angle = 1.0;
55
- #else
56
- float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]
57
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
58
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
59
- // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
60
- angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);
61
- #endif
62
-
63
- // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
64
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)
65
- angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;
66
- #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
67
- angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;
68
- #endif
39
+ float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]
40
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
41
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
42
+ // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
43
+ angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);
44
+ #endif
69
45
 
70
- angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset
46
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
47
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)
48
+ angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;
49
+ #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
50
+ angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;
71
51
  #endif
52
+
53
+ angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset
72
54
  #endif
73
55
 
74
56
  return vec3(radius, height, angle);