@cesium/engine 0.1.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 (217) 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/decodeGoogleEarthEnterprisePacket.js +95 -76
  80. package/Build/Workers/decodeI3S.js +1 -1
  81. package/Build/Workers/package.js +25 -1
  82. package/Build/Workers/transferTypedArrayTest.js +25 -1
  83. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  84. package/README.md +9 -9
  85. package/Source/Core/EarthOrientationParameters.js +67 -63
  86. package/Source/Core/Ion.js +1 -1
  87. package/Source/Core/Matrix2.js +2 -1
  88. package/Source/Core/Matrix3.js +2 -1
  89. package/Source/Core/Matrix4.js +1 -0
  90. package/Source/Core/OrientedBoundingBox.js +4 -4
  91. package/Source/Core/S2Cell.js +3 -3
  92. package/Source/Core/Transforms.js +3 -7
  93. package/Source/DataSources/GpxDataSource.js +4 -6
  94. package/Source/DataSources/KmlDataSource.js +3 -5
  95. package/Source/Renderer/Context.js +230 -177
  96. package/Source/Renderer/Pass.js +3 -2
  97. package/Source/Scene/Cesium3DTileContentType.js +19 -0
  98. package/Source/Scene/Cesium3DTilesVoxelProvider.js +482 -0
  99. package/Source/Scene/Cesium3DTilesetMetadata.js +2 -2
  100. package/Source/Scene/ContentMetadata.js +2 -2
  101. package/Source/Scene/DerivedCommand.js +7 -0
  102. package/Source/Scene/Expression.js +1 -1
  103. package/Source/Scene/Globe.js +10 -0
  104. package/Source/Scene/GlobeSurfaceTileProvider.js +7 -0
  105. package/Source/Scene/GltfImageLoader.js +1 -1
  106. package/Source/Scene/GltfVertexBufferLoader.js +10 -2
  107. package/Source/Scene/GroupMetadata.js +2 -2
  108. package/Source/Scene/I3SDataProvider.js +2 -1
  109. package/Source/Scene/I3SFeature.js +1 -1
  110. package/Source/Scene/I3SLayer.js +64 -2
  111. package/Source/Scene/I3SNode.js +50 -6
  112. package/Source/Scene/ImplicitMetadataView.js +2 -2
  113. package/Source/Scene/ImplicitSubtreeCache.js +127 -0
  114. package/Source/Scene/ImplicitSubtreeMetadata.js +2 -2
  115. package/Source/Scene/ImplicitTileset.js +3 -2
  116. package/Source/Scene/KeyframeNode.js +47 -0
  117. package/Source/Scene/Megatexture.js +490 -0
  118. package/Source/Scene/MetadataClass.js +60 -25
  119. package/Source/Scene/MetadataClassProperty.js +132 -68
  120. package/Source/Scene/MetadataComponentType.js +78 -57
  121. package/Source/Scene/MetadataEnum.js +59 -23
  122. package/Source/Scene/MetadataEnumValue.js +49 -15
  123. package/Source/Scene/MetadataSchema.js +53 -24
  124. package/Source/Scene/MetadataSchemaLoader.js +2 -2
  125. package/Source/Scene/MetadataTableProperty.js +2 -2
  126. package/Source/Scene/MetadataType.js +6 -14
  127. package/Source/Scene/Model/GeoJsonLoader.js +1 -1
  128. package/Source/Scene/Model/Model.js +38 -6
  129. package/Source/Scene/Model/buildDrawCommand.js +19 -11
  130. package/Source/Scene/PointCloud.js +1 -1
  131. package/Source/Scene/PropertyAttribute.js +2 -2
  132. package/Source/Scene/PropertyAttributeProperty.js +2 -2
  133. package/Source/Scene/PropertyTable.js +2 -2
  134. package/Source/Scene/PropertyTexture.js +2 -2
  135. package/Source/Scene/PropertyTextureProperty.js +2 -2
  136. package/Source/Scene/ResourceCache.js +9 -1
  137. package/Source/Scene/ResourceCacheKey.js +9 -1
  138. package/Source/Scene/Scene.js +20 -50
  139. package/Source/Scene/SpatialNode.js +375 -0
  140. package/Source/Scene/StructuralMetadata.js +2 -2
  141. package/Source/Scene/TileMetadata.js +2 -2
  142. package/Source/Scene/TilesetMetadata.js +2 -2
  143. package/Source/Scene/VoxelBoxShape.js +527 -0
  144. package/Source/Scene/VoxelContent.js +169 -0
  145. package/Source/Scene/VoxelCylinderShape.js +937 -0
  146. package/Source/Scene/VoxelEllipsoidShape.js +937 -0
  147. package/Source/Scene/VoxelPrimitive.js +1919 -0
  148. package/Source/Scene/VoxelProvider.js +255 -0
  149. package/Source/Scene/VoxelRenderResources.js +224 -0
  150. package/Source/Scene/VoxelShape.js +152 -0
  151. package/Source/Scene/VoxelShapeType.js +105 -0
  152. package/Source/Scene/VoxelTraversal.js +1144 -0
  153. package/Source/Scene/buildVoxelDrawCommands.js +116 -0
  154. package/Source/Scene/parseBatchTable.js +18 -2
  155. package/Source/Scene/preprocess3DTileContent.js +8 -0
  156. package/Source/Scene/processVoxelProperties.js +455 -0
  157. package/Source/Shaders/BillboardCollectionVS.glsl +1 -1
  158. package/Source/Shaders/BillboardCollectionVS.js +1 -1
  159. package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
  160. package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
  161. package/Source/Shaders/Builtin/Constants/passVoxels.glsl +9 -0
  162. package/Source/Shaders/Builtin/Constants/passVoxels.js +11 -0
  163. package/Source/Shaders/Builtin/CzmBuiltins.js +2 -0
  164. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.glsl +55 -43
  165. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +55 -43
  166. package/Source/Shaders/GlobeFS.glsl +2 -1
  167. package/Source/Shaders/GlobeFS.js +2 -1
  168. package/Source/Shaders/PointPrimitiveCollectionVS.glsl +5 -2
  169. package/Source/Shaders/PointPrimitiveCollectionVS.js +5 -2
  170. package/Source/Shaders/Voxels/IntersectBox.glsl +79 -0
  171. package/Source/Shaders/Voxels/IntersectBox.js +81 -0
  172. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +70 -0
  173. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +72 -0
  174. package/Source/Shaders/Voxels/IntersectCylinder.glsl +273 -0
  175. package/Source/Shaders/Voxels/IntersectCylinder.js +275 -0
  176. package/Source/Shaders/Voxels/IntersectDepth.glsl +23 -0
  177. package/Source/Shaders/Voxels/IntersectDepth.js +25 -0
  178. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +337 -0
  179. package/Source/Shaders/Voxels/IntersectEllipsoid.js +339 -0
  180. package/Source/Shaders/Voxels/Intersection.glsl +54 -0
  181. package/Source/Shaders/Voxels/Intersection.js +56 -0
  182. package/Source/Shaders/Voxels/IntersectionUtils.glsl +151 -0
  183. package/Source/Shaders/Voxels/IntersectionUtils.js +153 -0
  184. package/Source/Shaders/Voxels/Megatexture.glsl +136 -0
  185. package/Source/Shaders/Voxels/Megatexture.js +138 -0
  186. package/Source/Shaders/Voxels/Octree.glsl +221 -0
  187. package/Source/Shaders/Voxels/Octree.js +223 -0
  188. package/Source/Shaders/Voxels/VoxelFS.glsl +150 -0
  189. package/Source/Shaders/Voxels/VoxelFS.js +152 -0
  190. package/Source/Shaders/Voxels/VoxelVS.glsl +11 -0
  191. package/Source/Shaders/Voxels/VoxelVS.js +13 -0
  192. package/Source/Shaders/Voxels/convertUvToBox.glsl +16 -0
  193. package/Source/Shaders/Voxels/convertUvToBox.js +18 -0
  194. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +79 -0
  195. package/Source/Shaders/Voxels/convertUvToCylinder.js +81 -0
  196. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +133 -0
  197. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +135 -0
  198. package/Source/ThirdParty/Workers/draco_decoder_nodejs.js +100 -101
  199. package/Source/ThirdParty/Workers/pako_deflate.min.js +2 -2
  200. package/Source/ThirdParty/Workers/pako_inflate.min.js +2 -2
  201. package/Source/ThirdParty/draco_decoder.wasm +0 -0
  202. package/Source/Widget/CesiumWidget.js +1 -1
  203. package/index.d.ts +961 -56
  204. package/index.js +92 -60
  205. package/package.json +6 -4
  206. package/Build/ThirdParty/Workers/basis_transcoder.js +0 -2233
  207. package/Build/ThirdParty/Workers/draco_decoder_nodejs.js +0 -1872
  208. package/Build/ThirdParty/Workers/package.json +0 -1
  209. package/Build/ThirdParty/Workers/pako_deflate.min.js +0 -589
  210. package/Build/ThirdParty/Workers/pako_inflate.min.js +0 -798
  211. package/Build/ThirdParty/Workers/z-worker-pako.js +0 -503
  212. package/Build/ThirdParty/basis_transcoder.wasm +0 -0
  213. package/Build/ThirdParty/draco_decoder.wasm +0 -0
  214. package/Build/ThirdParty/google-earth-dbroot-parser.js +0 -8019
  215. package/Build/Widget/CesiumWidget.css +0 -120
  216. package/Build/Widget/lighter.css +0 -13
  217. package/Build/Workers/PolygonPipeline-774a8aaf.js +0 -1341
@@ -0,0 +1,152 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "// See Intersection.glsl for the definition of intersectScene\n\
3
+ // See IntersectionUtils.glsl for the definition of nextIntersection\n\
4
+ // See convertUvToBox.glsl, convertUvToCylinder.glsl, or convertUvToEllipsoid.glsl\n\
5
+ // for the definition of convertUvToShapeUvSpace. The appropriate function is \n\
6
+ // selected based on the VoxelPrimitive shape type, and added to the shader in\n\
7
+ // Scene/VoxelRenderResources.js.\n\
8
+ // See Octree.glsl for the definitions of TraversalData, SampleData,\n\
9
+ // traverseOctreeFromBeginning, and traverseOctreeFromExisting\n\
10
+ // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture\n\
11
+ \n\
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\
14
+ \n\
15
+ uniform mat3 u_transformDirectionViewToLocal;\n\
16
+ uniform vec3 u_cameraPositionUv;\n\
17
+ \n\
18
+ #if defined(PICKING)\n\
19
+ uniform vec4 u_pickColor;\n\
20
+ #endif\n\
21
+ \n\
22
+ #if defined(JITTER)\n\
23
+ float hash(vec2 p)\n\
24
+ {\n\
25
+ vec3 p3 = fract(vec3(p.xyx) * 50.0); // magic number = hashscale\n\
26
+ p3 += dot(p3, p3.yzx + 19.19);\n\
27
+ return fract((p3.x + p3.y) * p3.z);\n\
28
+ }\n\
29
+ #endif\n\
30
+ \n\
31
+ void main()\n\
32
+ {\n\
33
+ vec4 fragCoord = gl_FragCoord;\n\
34
+ vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]\n\
35
+ vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz);\n\
36
+ vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case\n\
37
+ vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case\n\
38
+ vec3 viewPosUv = u_cameraPositionUv;\n\
39
+ \n\
40
+ Intersections ix;\n\
41
+ vec2 entryExitT = intersectScene(screenCoord, viewPosUv, viewDirUv, ix);\n\
42
+ \n\
43
+ // Exit early if the scene was completely missed.\n\
44
+ if (entryExitT.x == NO_HIT) {\n\
45
+ discard;\n\
46
+ }\n\
47
+ \n\
48
+ float currT = entryExitT.x;\n\
49
+ float endT = entryExitT.y;\n\
50
+ vec3 positionUv = viewPosUv + currT * viewDirUv;\n\
51
+ // TODO: is it possible for this to be out of bounds, and does it matter?\n\
52
+ vec3 positionUvShapeSpace = convertUvToShapeUvSpace(positionUv);\n\
53
+ \n\
54
+ // Traverse the tree from the start position\n\
55
+ TraversalData traversalData;\n\
56
+ SampleData sampleDatas[SAMPLE_COUNT];\n\
57
+ traverseOctreeFromBeginning(positionUvShapeSpace, traversalData, sampleDatas);\n\
58
+ \n\
59
+ // TODO:\n\
60
+ // - jitter doesn't affect the first traversal?\n\
61
+ // - jitter is always > 0?\n\
62
+ // - jitter is only applied at one step?\n\
63
+ #if defined(JITTER)\n\
64
+ float noise = hash(screenCoord); // [0,1]\n\
65
+ currT += noise * traversalData.stepT;\n\
66
+ positionUv += noise * traversalData.stepT * viewDirUv;\n\
67
+ #endif\n\
68
+ \n\
69
+ FragmentInput fragmentInput;\n\
70
+ #if defined(STATISTICS)\n\
71
+ setStatistics(fragmentInput.metadata.statistics);\n\
72
+ #endif\n\
73
+ \n\
74
+ vec4 colorAccum =vec4(0.0);\n\
75
+ \n\
76
+ for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) {\n\
77
+ // Read properties from the megatexture based on the traversal state\n\
78
+ Properties properties = accumulatePropertiesFromMegatexture(sampleDatas);\n\
79
+ \n\
80
+ // Prepare the custom shader inputs\n\
81
+ copyPropertiesToMetadata(properties, fragmentInput.metadata);\n\
82
+ fragmentInput.voxel.positionUv = positionUv;\n\
83
+ fragmentInput.voxel.positionShapeUv = positionUvShapeSpace;\n\
84
+ fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv;\n\
85
+ fragmentInput.voxel.viewDirUv = viewDirUv;\n\
86
+ fragmentInput.voxel.viewDirWorld = viewDirWorld;\n\
87
+ fragmentInput.voxel.travelDistance = traversalData.stepT;\n\
88
+ \n\
89
+ // Run the custom shader\n\
90
+ czm_modelMaterial materialOutput;\n\
91
+ fragmentMain(fragmentInput, materialOutput);\n\
92
+ \n\
93
+ // Sanitize the custom shader output\n\
94
+ vec4 color = vec4(materialOutput.diffuse, materialOutput.alpha);\n\
95
+ color.rgb = max(color.rgb, vec3(0.0));\n\
96
+ color.a = clamp(color.a, 0.0, 1.0);\n\
97
+ \n\
98
+ // Pre-multiplied alpha blend\n\
99
+ colorAccum += (1.0 - colorAccum.a) * vec4(color.rgb * color.a, color.a);\n\
100
+ \n\
101
+ // Stop traversing if the alpha has been fully saturated\n\
102
+ if (colorAccum.a > ALPHA_ACCUM_MAX) {\n\
103
+ colorAccum.a = ALPHA_ACCUM_MAX;\n\
104
+ break;\n\
105
+ }\n\
106
+ \n\
107
+ if (traversalData.stepT == 0.0) {\n\
108
+ // Shape is infinitely thin, no need to traverse further\n\
109
+ break;\n\
110
+ }\n\
111
+ \n\
112
+ // Keep raymarching\n\
113
+ currT += traversalData.stepT;\n\
114
+ positionUv += traversalData.stepT * viewDirUv;\n\
115
+ \n\
116
+ // Check if there's more intersections.\n\
117
+ if (currT > endT) {\n\
118
+ #if (INTERSECTION_COUNT == 1)\n\
119
+ break;\n\
120
+ #else\n\
121
+ vec2 entryExitT = nextIntersection(ix);\n\
122
+ if (entryExitT.x == NO_HIT) {\n\
123
+ break;\n\
124
+ } else {\n\
125
+ // Found another intersection. Resume raymarching there\n\
126
+ currT = entryExitT.x;\n\
127
+ endT = entryExitT.y;\n\
128
+ positionUv = viewPosUv + currT * viewDirUv;\n\
129
+ }\n\
130
+ #endif\n\
131
+ }\n\
132
+ \n\
133
+ // Traverse the tree from the current ray position.\n\
134
+ // This is similar to traverseOctree but is faster when the ray is in the same tile as the previous step.\n\
135
+ positionUvShapeSpace = convertUvToShapeUvSpace(positionUv);\n\
136
+ traverseOctreeFromExisting(positionUvShapeSpace, traversalData, sampleDatas);\n\
137
+ }\n\
138
+ \n\
139
+ // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1]\n\
140
+ colorAccum.a /= ALPHA_ACCUM_MAX;\n\
141
+ \n\
142
+ #if defined(PICKING)\n\
143
+ // If alpha is 0.0 there is nothing to pick\n\
144
+ if (colorAccum.a == 0.0) {\n\
145
+ discard;\n\
146
+ }\n\
147
+ gl_FragColor = u_pickColor;\n\
148
+ #else\n\
149
+ gl_FragColor = colorAccum;\n\
150
+ #endif\n\
151
+ }\n\
152
+ ";
@@ -0,0 +1,11 @@
1
+ attribute vec2 position;
2
+
3
+ uniform vec4 u_ndcSpaceAxisAlignedBoundingBox;
4
+
5
+ void main() {
6
+ vec2 aabbMin = u_ndcSpaceAxisAlignedBoundingBox.xy;
7
+ vec2 aabbMax = u_ndcSpaceAxisAlignedBoundingBox.zw;
8
+ vec2 translation = 0.5 * (aabbMax + aabbMin);
9
+ vec2 scale = 0.5 * (aabbMax - aabbMin);
10
+ gl_Position = vec4(position * scale + translation, 0.0, 1.0);
11
+ }
@@ -0,0 +1,13 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "attribute vec2 position;\n\
3
+ \n\
4
+ uniform vec4 u_ndcSpaceAxisAlignedBoundingBox;\n\
5
+ \n\
6
+ void main() {\n\
7
+ vec2 aabbMin = u_ndcSpaceAxisAlignedBoundingBox.xy;\n\
8
+ vec2 aabbMax = u_ndcSpaceAxisAlignedBoundingBox.zw;\n\
9
+ vec2 translation = 0.5 * (aabbMax + aabbMin);\n\
10
+ vec2 scale = 0.5 * (aabbMax - aabbMin);\n\
11
+ gl_Position = vec4(position * scale + translation, 0.0, 1.0);\n\
12
+ }\n\
13
+ ";
@@ -0,0 +1,16 @@
1
+ /* Box defines (set in Scene/VoxelBoxShape.js)
2
+ #define BOX_HAS_SHAPE_BOUNDS
3
+ */
4
+
5
+ #if defined(BOX_HAS_SHAPE_BOUNDS)
6
+ uniform vec3 u_boxUvToShapeUvScale;
7
+ uniform vec3 u_boxUvToShapeUvTranslate;
8
+ #endif
9
+
10
+ vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
11
+ #if defined(BOX_HAS_SHAPE_BOUNDS)
12
+ return positionUv * u_boxUvToShapeUvScale + u_boxUvToShapeUvTranslate;
13
+ #else
14
+ return positionUv;
15
+ #endif
16
+ }
@@ -0,0 +1,18 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "/* Box defines (set in Scene/VoxelBoxShape.js)\n\
3
+ #define BOX_HAS_SHAPE_BOUNDS\n\
4
+ */\n\
5
+ \n\
6
+ #if defined(BOX_HAS_SHAPE_BOUNDS)\n\
7
+ uniform vec3 u_boxUvToShapeUvScale;\n\
8
+ uniform vec3 u_boxUvToShapeUvTranslate;\n\
9
+ #endif\n\
10
+ \n\
11
+ vec3 convertUvToShapeUvSpace(in vec3 positionUv) {\n\
12
+ #if defined(BOX_HAS_SHAPE_BOUNDS)\n\
13
+ return positionUv * u_boxUvToShapeUvScale + u_boxUvToShapeUvTranslate;\n\
14
+ #else\n\
15
+ return positionUv;\n\
16
+ #endif\n\
17
+ }\n\
18
+ ";
@@ -0,0 +1,79 @@
1
+ /* Cylinder defines (set in Scene/VoxelCylinderShape.js)
2
+ #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT
3
+ #define CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT
4
+ #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
5
+
6
+ #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS
7
+ #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT
8
+ #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT
9
+ #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
10
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE
11
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
12
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY
13
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY
14
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED
15
+ */
16
+
17
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
18
+ uniform vec2 u_cylinderUvToShapeUvRadius; // x = scale, y = offset
19
+ #endif
20
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
21
+ uniform vec2 u_cylinderUvToShapeUvHeight; // x = scale, y = offset
22
+ #endif
23
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
24
+ uniform vec2 u_cylinderUvToShapeUvAngle; // x = scale, y = offset
25
+ #endif
26
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
27
+ uniform vec2 u_cylinderShapeUvAngleMinMax;
28
+ #endif
29
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
30
+ uniform float u_cylinderShapeUvAngleRangeZeroMid;
31
+ #endif
32
+
33
+ vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
34
+ vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]
35
+
36
+ // Compute radius
37
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT) || defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT)
38
+ float radius = length(positionLocal.xy); // [0,1]
39
+ #else
40
+ float radius = length(positionLocal.xy); // [0,1]
41
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
42
+ radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset
43
+ #endif
44
+ #endif
45
+
46
+ // Compute height
47
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT) || defined(CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT)
48
+ float height = positionUv.z; // [0,1]
49
+ #else
50
+ float height = positionUv.z; // [0,1]
51
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
52
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset
53
+ #endif
54
+ #endif
55
+
56
+ // Compute angle
57
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO) || defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)
58
+ float angle = 1.0;
59
+ #else
60
+ float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]
61
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
62
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
63
+ // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
64
+ angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);
65
+ #endif
66
+
67
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
68
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)
69
+ angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;
70
+ #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
71
+ angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;
72
+ #endif
73
+
74
+ angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset
75
+ #endif
76
+ #endif
77
+
78
+ return vec3(radius, height, angle);
79
+ }
@@ -0,0 +1,81 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "/* Cylinder defines (set in Scene/VoxelCylinderShape.js)\n\
3
+ #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT\n\
4
+ #define CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
5
+ #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
6
+ \n\
7
+ #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS\n\
8
+ #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT\n\
9
+ #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT\n\
10
+ #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT\n\
11
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE\n\
12
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
13
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY\n\
14
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY\n\
15
+ #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED\n\
16
+ */\n\
17
+ \n\
18
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)\n\
19
+ uniform vec2 u_cylinderUvToShapeUvRadius; // x = scale, y = offset\n\
20
+ #endif\n\
21
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
22
+ uniform vec2 u_cylinderUvToShapeUvHeight; // x = scale, y = offset\n\
23
+ #endif\n\
24
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
25
+ uniform vec2 u_cylinderUvToShapeUvAngle; // x = scale, y = offset\n\
26
+ #endif\n\
27
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)\n\
28
+ uniform vec2 u_cylinderShapeUvAngleMinMax;\n\
29
+ #endif\n\
30
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)\n\
31
+ uniform float u_cylinderShapeUvAngleRangeZeroMid;\n\
32
+ #endif\n\
33
+ \n\
34
+ vec3 convertUvToShapeUvSpace(in vec3 positionUv) {\n\
35
+ vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]\n\
36
+ \n\
37
+ // Compute radius\n\
38
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT) || defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT)\n\
39
+ float radius = length(positionLocal.xy); // [0,1]\n\
40
+ #else\n\
41
+ float radius = length(positionLocal.xy); // [0,1]\n\
42
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)\n\
43
+ radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset\n\
44
+ #endif\n\
45
+ #endif\n\
46
+ \n\
47
+ // Compute height\n\
48
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT) || defined(CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT)\n\
49
+ float height = positionUv.z; // [0,1]\n\
50
+ #else\n\
51
+ float height = positionUv.z; // [0,1]\n\
52
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
53
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset\n\
54
+ #endif\n\
55
+ #endif\n\
56
+ \n\
57
+ // Compute angle\n\
58
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO) || defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)\n\
59
+ float angle = 1.0;\n\
60
+ #else\n\
61
+ float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]\n\
62
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
63
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)\n\
64
+ // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.\n\
65
+ angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);\n\
66
+ #endif\n\
67
+ \n\
68
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.\n\
69
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)\n\
70
+ angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;\n\
71
+ #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)\n\
72
+ angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;\n\
73
+ #endif\n\
74
+ \n\
75
+ angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset\n\
76
+ #endif\n\
77
+ #endif\n\
78
+ \n\
79
+ return vec3(radius, height, angle);\n\
80
+ }\n\
81
+ ";
@@ -0,0 +1,133 @@
1
+ /* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js)
2
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO
3
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY
4
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY
5
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE
6
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO
7
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED
8
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO
9
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE
10
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO
11
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT
12
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN
13
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
14
+ #define ELLIPSOID_IS_SPHERE
15
+ */
16
+
17
+ uniform vec3 u_ellipsoidRadiiUv; // [0,1]
18
+ #if !defined(ELLIPSOID_IS_SPHERE)
19
+ uniform vec3 u_ellipsoidInverseRadiiSquaredUv;
20
+ #endif
21
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) || defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED)
22
+ uniform vec3 u_ellipsoidShapeUvLongitudeMinMaxMid;
23
+ #endif
24
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)
25
+ uniform vec2 u_ellipsoidUvToShapeUvLongitude; // x = scale, y = offset
26
+ #endif
27
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)
28
+ uniform vec2 u_ellipsoidUvToShapeUvLatitude; // x = scale, y = offset
29
+ #endif
30
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN) && !defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)
31
+ uniform float u_ellipsoidInverseHeightDifferenceUv;
32
+ uniform vec2 u_ellipseInnerRadiiUv; // [0,1]
33
+ #endif
34
+
35
+ // robust iterative solution without trig functions
36
+ // https://github.com/0xfaded/ellipse_demo/issues/1
37
+ // https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse
38
+ // Pro: Good when radii.x ~= radii.y
39
+ // Con: Breaks at pos.x ~= 0.0, especially inside the ellipse
40
+ // Con: Inaccurate with exterior points and thin ellipses
41
+ float ellipseDistanceIterative (vec2 pos, vec2 radii) {
42
+ vec2 p = abs(pos);
43
+ vec2 invRadii = 1.0 / radii;
44
+ vec2 a = vec2(1.0, -1.0) * (radii.x * radii.x - radii.y * radii.y) * invRadii;
45
+ vec2 t = vec2(0.70710678118); // sqrt(2) / 2
46
+ vec2 v = radii * t;
47
+
48
+ const int iterations = 3;
49
+ for (int i = 0; i < iterations; ++i) {
50
+ vec2 e = a * pow(t, vec2(3.0));
51
+ vec2 q = normalize(p - e) * length(v - e);
52
+ t = normalize((q + e) * invRadii);
53
+ v = radii * t;
54
+ }
55
+ return length(v * sign(pos) - pos) * sign(p.y - v.y);
56
+ }
57
+
58
+ vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
59
+ // Compute position and normal.
60
+ // Convert positionUv [0,1] to local space [-1,+1] to "normalized" cartesian space [-a,+a] where a = (radii + height) / (max(radii) + height).
61
+ // A point on the largest ellipsoid axis would be [-1,+1] and everything else would be smaller.
62
+ vec3 positionLocal = positionUv * 2.0 - 1.0;
63
+ #if defined(ELLIPSOID_IS_SPHERE)
64
+ vec3 posEllipsoid = positionLocal * u_ellipsoidRadiiUv.x;
65
+ vec3 normal = normalize(posEllipsoid);
66
+ #else
67
+ vec3 posEllipsoid = positionLocal * u_ellipsoidRadiiUv;
68
+ vec3 normal = normalize(posEllipsoid * u_ellipsoidInverseRadiiSquaredUv); // geodetic surface normal
69
+ #endif
70
+
71
+ // Compute longitude
72
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)
73
+ float longitude = 1.0;
74
+ #else
75
+ float longitude = (atan(normal.y, normal.x) + czm_pi) / czm_twoPi;
76
+
77
+ // Correct the angle when max < min
78
+ // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space.
79
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED)
80
+ longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z);
81
+ #endif
82
+
83
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
84
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY)
85
+ longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude;
86
+ #endif
87
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY)
88
+ longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude;
89
+ #endif
90
+
91
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)
92
+ longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y;
93
+ #endif
94
+ #endif
95
+
96
+ // Compute latitude
97
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO)
98
+ float latitude = 1.0;
99
+ #else
100
+ float latitude = (asin(normal.z) + czm_piOverTwo) / czm_pi;
101
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)
102
+ latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y;
103
+ #endif
104
+ #endif
105
+
106
+ // Compute height
107
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT)
108
+ // TODO: This breaks down when minBounds == maxBounds. To fix it, this
109
+ // function would have to know if ray is intersecting the front or back of the shape
110
+ // and set the shape space position to 1 (front) or 0 (back) accordingly.
111
+ float height = 1.0;
112
+ #else
113
+ #if defined(ELLIPSOID_IS_SPHERE)
114
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN)
115
+ float height = (length(posEllipsoid) - u_ellipseInnerRadiiUv.x) * u_ellipsoidInverseHeightDifferenceUv;
116
+ #else
117
+ float height = length(posEllipsoid);
118
+ #endif
119
+ #else
120
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN)
121
+ // Convert the 3D position to a 2D position relative to the ellipse (radii.x, radii.z) (assuming radii.x == radii.y which is true for WGS84).
122
+ // This is an optimization so that math can be done with ellipses instead of ellipsoids.
123
+ vec2 posEllipse = vec2(length(posEllipsoid.xy), posEllipsoid.z);
124
+ float height = ellipseDistanceIterative(posEllipse, u_ellipseInnerRadiiUv) * u_ellipsoidInverseHeightDifferenceUv;
125
+ #else
126
+ // TODO: this is probably not correct
127
+ float height = length(posEllipsoid);
128
+ #endif
129
+ #endif
130
+ #endif
131
+
132
+ return vec3(longitude, latitude, height);
133
+ }
@@ -0,0 +1,135 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "/* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js)\n\
3
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO\n\
4
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY\n\
5
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY\n\
6
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE\n\
7
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO\n\
8
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED\n\
9
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO\n\
10
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE\n\
11
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO\n\
12
+ #define ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT\n\
13
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN\n\
14
+ #define ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT\n\
15
+ #define ELLIPSOID_IS_SPHERE\n\
16
+ */\n\
17
+ \n\
18
+ uniform vec3 u_ellipsoidRadiiUv; // [0,1]\n\
19
+ #if !defined(ELLIPSOID_IS_SPHERE)\n\
20
+ uniform vec3 u_ellipsoidInverseRadiiSquaredUv;\n\
21
+ #endif\n\
22
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) || defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED)\n\
23
+ uniform vec3 u_ellipsoidShapeUvLongitudeMinMaxMid;\n\
24
+ #endif\n\
25
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)\n\
26
+ uniform vec2 u_ellipsoidUvToShapeUvLongitude; // x = scale, y = offset\n\
27
+ #endif\n\
28
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)\n\
29
+ uniform vec2 u_ellipsoidUvToShapeUvLatitude; // x = scale, y = offset\n\
30
+ #endif\n\
31
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN) && !defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)\n\
32
+ uniform float u_ellipsoidInverseHeightDifferenceUv;\n\
33
+ uniform vec2 u_ellipseInnerRadiiUv; // [0,1]\n\
34
+ #endif\n\
35
+ \n\
36
+ // robust iterative solution without trig functions\n\
37
+ // https://github.com/0xfaded/ellipse_demo/issues/1\n\
38
+ // https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse\n\
39
+ // Pro: Good when radii.x ~= radii.y\n\
40
+ // Con: Breaks at pos.x ~= 0.0, especially inside the ellipse\n\
41
+ // Con: Inaccurate with exterior points and thin ellipses\n\
42
+ float ellipseDistanceIterative (vec2 pos, vec2 radii) {\n\
43
+ vec2 p = abs(pos);\n\
44
+ vec2 invRadii = 1.0 / radii;\n\
45
+ vec2 a = vec2(1.0, -1.0) * (radii.x * radii.x - radii.y * radii.y) * invRadii;\n\
46
+ vec2 t = vec2(0.70710678118); // sqrt(2) / 2\n\
47
+ vec2 v = radii * t;\n\
48
+ \n\
49
+ const int iterations = 3;\n\
50
+ for (int i = 0; i < iterations; ++i) {\n\
51
+ vec2 e = a * pow(t, vec2(3.0));\n\
52
+ vec2 q = normalize(p - e) * length(v - e);\n\
53
+ t = normalize((q + e) * invRadii);\n\
54
+ v = radii * t;\n\
55
+ }\n\
56
+ return length(v * sign(pos) - pos) * sign(p.y - v.y);\n\
57
+ }\n\
58
+ \n\
59
+ vec3 convertUvToShapeUvSpace(in vec3 positionUv) {\n\
60
+ // Compute position and normal.\n\
61
+ // Convert positionUv [0,1] to local space [-1,+1] to \"normalized\" cartesian space [-a,+a] where a = (radii + height) / (max(radii) + height).\n\
62
+ // A point on the largest ellipsoid axis would be [-1,+1] and everything else would be smaller.\n\
63
+ vec3 positionLocal = positionUv * 2.0 - 1.0;\n\
64
+ #if defined(ELLIPSOID_IS_SPHERE)\n\
65
+ vec3 posEllipsoid = positionLocal * u_ellipsoidRadiiUv.x;\n\
66
+ vec3 normal = normalize(posEllipsoid);\n\
67
+ #else\n\
68
+ vec3 posEllipsoid = positionLocal * u_ellipsoidRadiiUv;\n\
69
+ vec3 normal = normalize(posEllipsoid * u_ellipsoidInverseRadiiSquaredUv); // geodetic surface normal\n\
70
+ #endif\n\
71
+ \n\
72
+ // Compute longitude\n\
73
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)\n\
74
+ float longitude = 1.0;\n\
75
+ #else\n\
76
+ float longitude = (atan(normal.y, normal.x) + czm_pi) / czm_twoPi;\n\
77
+ \n\
78
+ // Correct the angle when max < min\n\
79
+ // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space.\n\
80
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED)\n\
81
+ longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z);\n\
82
+ #endif\n\
83
+ \n\
84
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.\n\
85
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY)\n\
86
+ longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude;\n\
87
+ #endif\n\
88
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY)\n\
89
+ longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude;\n\
90
+ #endif\n\
91
+ \n\
92
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)\n\
93
+ longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y;\n\
94
+ #endif\n\
95
+ #endif\n\
96
+ \n\
97
+ // Compute latitude\n\
98
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO)\n\
99
+ float latitude = 1.0;\n\
100
+ #else\n\
101
+ float latitude = (asin(normal.z) + czm_piOverTwo) / czm_pi;\n\
102
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)\n\
103
+ latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y;\n\
104
+ #endif\n\
105
+ #endif\n\
106
+ \n\
107
+ // Compute height\n\
108
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_HEIGHT_FLAT)\n\
109
+ // TODO: This breaks down when minBounds == maxBounds. To fix it, this\n\
110
+ // function would have to know if ray is intersecting the front or back of the shape\n\
111
+ // and set the shape space position to 1 (front) or 0 (back) accordingly.\n\
112
+ float height = 1.0;\n\
113
+ #else\n\
114
+ #if defined(ELLIPSOID_IS_SPHERE)\n\
115
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN)\n\
116
+ float height = (length(posEllipsoid) - u_ellipseInnerRadiiUv.x) * u_ellipsoidInverseHeightDifferenceUv;\n\
117
+ #else\n\
118
+ float height = length(posEllipsoid);\n\
119
+ #endif\n\
120
+ #else\n\
121
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN)\n\
122
+ // Convert the 3D position to a 2D position relative to the ellipse (radii.x, radii.z) (assuming radii.x == radii.y which is true for WGS84).\n\
123
+ // This is an optimization so that math can be done with ellipses instead of ellipsoids.\n\
124
+ vec2 posEllipse = vec2(length(posEllipsoid.xy), posEllipsoid.z);\n\
125
+ float height = ellipseDistanceIterative(posEllipse, u_ellipseInnerRadiiUv) * u_ellipsoidInverseHeightDifferenceUv;\n\
126
+ #else\n\
127
+ // TODO: this is probably not correct\n\
128
+ float height = length(posEllipsoid);\n\
129
+ #endif\n\
130
+ #endif\n\
131
+ #endif\n\
132
+ \n\
133
+ return vec3(longitude, latitude, height);\n\
134
+ }\n\
135
+ ";