@cesium/engine 7.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/Build/ThirdParty/Workers/z-worker-pako.js +1 -5
  2. package/Build/Workers/{chunk-7XEAYGZK.js → chunk-24YTYWNB.js} +10 -10
  3. package/Build/Workers/{chunk-IQBYFRVW.js → chunk-2632RVPI.js} +7 -7
  4. package/Build/Workers/chunk-2KACWKS4.js +501 -0
  5. package/Build/Workers/{chunk-QZAD5O7I.js → chunk-2XPLH3JY.js} +7 -7
  6. package/Build/Workers/{chunk-JY5YEZFA.js → chunk-2ZBL3MVO.js} +8 -8
  7. package/Build/Workers/{chunk-ZK5JOS3D.js → chunk-3NCVAGDA.js} +14 -14
  8. package/Build/Workers/{chunk-AR5DNBJ4.js → chunk-5R6VWLMH.js} +6 -6
  9. package/Build/Workers/{chunk-PTQQUQC3.js → chunk-5TIV3L26.js} +13 -13
  10. package/Build/Workers/{chunk-BZP4T2JJ.js → chunk-6WF3KIF5.js} +10 -10
  11. package/Build/Workers/{chunk-5WQ523AW.js → chunk-73FKKY52.js} +5 -5
  12. package/Build/Workers/{chunk-F6SE42BK.js → chunk-7COR472O.js} +15 -472
  13. package/Build/Workers/{chunk-72SANQJV.js → chunk-ADOVHYWO.js} +9 -5
  14. package/Build/Workers/{chunk-5YLJ77FF.js → chunk-BCU2LH5T.js} +12 -11
  15. package/Build/Workers/{chunk-4EBHOMFX.js → chunk-C3XBUYBO.js} +17 -17
  16. package/Build/Workers/{chunk-IX2JCCNM.js → chunk-C6OI26DR.js} +1 -1
  17. package/Build/Workers/{chunk-2HJWSU7B.js → chunk-CO35JNNE.js} +4 -4
  18. package/Build/Workers/{chunk-OVLG3FRS.js → chunk-DGDUKCJJ.js} +6 -6
  19. package/Build/Workers/{chunk-DTAIXKTO.js → chunk-DPUSFA7S.js} +6 -6
  20. package/Build/Workers/{chunk-R5X4OQT4.js → chunk-E6WXPSJS.js} +7 -7
  21. package/Build/Workers/{chunk-VK3EJHWI.js → chunk-EOXYZ34O.js} +2 -2
  22. package/Build/Workers/{chunk-RAEV7K66.js → chunk-EPKE7GE3.js} +5 -5
  23. package/Build/Workers/{chunk-GV56Q4LU.js → chunk-GFA4SMXV.js} +11 -11
  24. package/Build/Workers/{chunk-NKPBIX7F.js → chunk-GXUXEOE2.js} +1 -1
  25. package/Build/Workers/{chunk-NY3K4IM3.js → chunk-HBQPB6IH.js} +12 -12
  26. package/Build/Workers/{chunk-6HZQPRUS.js → chunk-I37B3MZ2.js} +1 -1
  27. package/Build/Workers/{chunk-VRGFV2UO.js → chunk-L4BW3RUA.js} +10 -10
  28. package/Build/Workers/{chunk-6VJVYK2V.js → chunk-LAQP3SCC.js} +2 -2
  29. package/Build/Workers/{chunk-PNBGBETF.js → chunk-LQJ5FFFR.js} +10 -10
  30. package/Build/Workers/{chunk-UAEW6HKG.js → chunk-M2AYBTNH.js} +13 -13
  31. package/Build/Workers/{chunk-YUCVWAY6.js → chunk-MWV7IZK4.js} +7 -7
  32. package/Build/Workers/{chunk-JXDC723O.js → chunk-N4KXMWQU.js} +2 -2
  33. package/Build/Workers/{chunk-XWXM2O2R.js → chunk-NP2GYYE5.js} +6 -6
  34. package/Build/Workers/{chunk-GEJTYLCO.js → chunk-NZWNZA6S.js} +5 -5
  35. package/Build/Workers/{chunk-LZGHD6NY.js → chunk-P2YAAMT2.js} +15 -15
  36. package/Build/Workers/{chunk-S6SKF6DT.js → chunk-P4XKB3QZ.js} +5 -5
  37. package/Build/Workers/{chunk-U2VCRRQW.js → chunk-PXB7T27O.js} +6 -6
  38. package/Build/Workers/{chunk-RV7ZYPFT.js → chunk-QCQUZGXI.js} +4 -4
  39. package/Build/Workers/{chunk-JJ4VBOQ3.js → chunk-QKBGRKKG.js} +4 -4
  40. package/Build/Workers/{chunk-ODW7WYM4.js → chunk-RMOEYCZW.js} +2 -2
  41. package/Build/Workers/{chunk-ZUA2UUNV.js → chunk-RSJXEO2A.js} +2 -2
  42. package/Build/Workers/{chunk-UDO6BFSF.js → chunk-RV7ZOSS6.js} +13 -13
  43. package/Build/Workers/{chunk-LZ7JIV3K.js → chunk-SE4PXOEA.js} +17 -17
  44. package/Build/Workers/{chunk-S4MAZ3SS.js → chunk-SS4ESNE3.js} +2 -2
  45. package/Build/Workers/{chunk-AIPU2VSX.js → chunk-TJBU6GML.js} +6 -6
  46. package/Build/Workers/{chunk-5M3U6ZMA.js → chunk-TZORKRNK.js} +1 -1
  47. package/Build/Workers/{chunk-MY3VNFGQ.js → chunk-VR5RBW52.js} +7 -7
  48. package/Build/Workers/{chunk-FP6GYBFX.js → chunk-WHUSTDIB.js} +10 -10
  49. package/Build/Workers/{chunk-5HDYHG3F.js → chunk-X2F6BEPY.js} +13 -13
  50. package/Build/Workers/{chunk-WZU2YLWG.js → chunk-X6XOMPWL.js} +3 -3
  51. package/Build/Workers/{chunk-UGK3FCDY.js → chunk-YDVSBWEO.js} +1 -1
  52. package/Build/Workers/{chunk-46UD5ABS.js → chunk-YV4H2Y7M.js} +4 -4
  53. package/Build/Workers/{chunk-WBQCVXR3.js → chunk-Z7FQLK6N.js} +4 -4
  54. package/Build/Workers/{chunk-L2ZN645J.js → chunk-ZNVSKMQ2.js} +6 -6
  55. package/Build/Workers/{chunk-JCNXK6EL.js → chunk-ZYPTP7GS.js} +11 -11
  56. package/Build/Workers/combineGeometry.js +24 -23
  57. package/Build/Workers/createBoxGeometry.js +18 -17
  58. package/Build/Workers/createBoxOutlineGeometry.js +16 -15
  59. package/Build/Workers/createCircleGeometry.js +26 -25
  60. package/Build/Workers/createCircleOutlineGeometry.js +19 -18
  61. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -32
  62. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -30
  63. package/Build/Workers/createCorridorGeometry.js +29 -28
  64. package/Build/Workers/createCorridorOutlineGeometry.js +28 -27
  65. package/Build/Workers/createCylinderGeometry.js +20 -19
  66. package/Build/Workers/createCylinderOutlineGeometry.js +18 -17
  67. package/Build/Workers/createEllipseGeometry.js +26 -25
  68. package/Build/Workers/createEllipseOutlineGeometry.js +19 -18
  69. package/Build/Workers/createEllipsoidGeometry.js +19 -18
  70. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -17
  71. package/Build/Workers/createFrustumGeometry.js +18 -17
  72. package/Build/Workers/createFrustumOutlineGeometry.js +18 -17
  73. package/Build/Workers/createGeometry.js +54 -33
  74. package/Build/Workers/createGroundPolylineGeometry.js +22 -21
  75. package/Build/Workers/createPlaneGeometry.js +16 -15
  76. package/Build/Workers/createPlaneOutlineGeometry.js +15 -14
  77. package/Build/Workers/createPolygonGeometry.js +33 -32
  78. package/Build/Workers/createPolygonOutlineGeometry.js +30 -29
  79. package/Build/Workers/createPolylineGeometry.js +25 -24
  80. package/Build/Workers/createPolylineVolumeGeometry.js +31 -30
  81. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -26
  82. package/Build/Workers/createRectangleGeometry.js +27 -26
  83. package/Build/Workers/createRectangleOutlineGeometry.js +20 -19
  84. package/Build/Workers/createSimplePolylineGeometry.js +23 -22
  85. package/Build/Workers/createSphereGeometry.js +19 -18
  86. package/Build/Workers/createSphereOutlineGeometry.js +18 -17
  87. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  88. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  89. package/Build/Workers/createVectorTileGeometries.js +24 -23
  90. package/Build/Workers/createVectorTilePoints.js +12 -12
  91. package/Build/Workers/createVectorTilePolygons.js +22 -21
  92. package/Build/Workers/createVectorTilePolylines.js +14 -14
  93. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -21
  94. package/Build/Workers/createVerticesFromHeightmap.js +22 -21
  95. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +19 -18
  96. package/Build/Workers/createWallGeometry.js +24 -23
  97. package/Build/Workers/createWallOutlineGeometry.js +23 -22
  98. package/Build/Workers/decodeDraco.js +11 -11
  99. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  100. package/Build/Workers/decodeI3S.js +601 -92
  101. package/Build/Workers/transcodeKTX2.js +7 -7
  102. package/Build/Workers/transferTypedArrayTest.js +1 -1
  103. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -21
  104. package/Source/Core/Check.d.ts +127 -0
  105. package/Source/Core/Check.js +0 -1
  106. package/Source/Core/Ellipsoid.js +6 -0
  107. package/Source/Core/Geometry.js +1 -1
  108. package/Source/Core/IntersectionTests.js +6 -3
  109. package/Source/Core/Ion.js +1 -1
  110. package/Source/Core/PixelFormat.js +5 -0
  111. package/Source/Core/PolygonGeometry.js +1 -1
  112. package/Source/Core/Transforms.js +3 -0
  113. package/Source/Core/VerticalExaggeration.js +2 -1
  114. package/Source/Core/srgbToLinear.js +32 -0
  115. package/Source/DataSources/CzmlDataSource.js +51 -23
  116. package/Source/DataSources/DataSourceDisplay.js +27 -0
  117. package/Source/DataSources/Entity.js +20 -2
  118. package/Source/DataSources/GeometryUpdaterSet.js +114 -0
  119. package/Source/DataSources/GeometryVisualizer.js +19 -83
  120. package/Source/Renderer/Context.js +10 -0
  121. package/Source/Renderer/ContextLimits.js +2 -0
  122. package/Source/Renderer/demodernizeShader.js +4 -1
  123. package/Source/Scene/ArcGisMapService.js +1 -1
  124. package/Source/Scene/Axis.js +12 -7
  125. package/Source/Scene/Billboard.js +32 -0
  126. package/Source/Scene/BillboardCollection.js +1 -1
  127. package/Source/Scene/BingMapsImageryProvider.js +4 -0
  128. package/Source/Scene/Camera.js +46 -4
  129. package/Source/Scene/Cesium3DTilesVoxelProvider.js +2 -9
  130. package/Source/Scene/Cesium3DTileset.js +10 -7
  131. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +2 -4
  132. package/Source/Scene/FrameState.js +5 -0
  133. package/Source/Scene/Globe.js +0 -67
  134. package/Source/Scene/GlobeTranslucencyState.js +1 -1
  135. package/Source/Scene/GltfPipeline/updateVersion.js +69 -68
  136. package/Source/Scene/I3SDataProvider.js +270 -53
  137. package/Source/Scene/I3SDecoder.js +8 -1
  138. package/Source/Scene/I3SFeature.js +2 -5
  139. package/Source/Scene/I3SField.js +136 -31
  140. package/Source/Scene/I3SGeometry.js +70 -2
  141. package/Source/Scene/I3SLayer.js +55 -10
  142. package/Source/Scene/I3SNode.js +175 -18
  143. package/Source/Scene/I3SStatistics.js +94 -0
  144. package/Source/Scene/I3SSublayer.js +176 -0
  145. package/Source/Scene/I3SSymbology.js +337 -0
  146. package/Source/Scene/KeyframeNode.js +1 -1
  147. package/Source/Scene/Label.js +33 -0
  148. package/Source/Scene/LabelCollection.js +2 -1
  149. package/Source/Scene/Model/pickModel.js +25 -7
  150. package/Source/Scene/PickFramebuffer.js +37 -2
  151. package/Source/Scene/Picking.js +113 -39
  152. package/Source/Scene/Primitive.js +6 -5
  153. package/Source/Scene/Scene.js +126 -42
  154. package/Source/Scene/ScreenSpaceCameraController.js +21 -7
  155. package/Source/Scene/SensorVolumePortionToDisplay.js +69 -0
  156. package/Source/Scene/SpatialNode.js +12 -19
  157. package/Source/Scene/StructuralMetadata.js +1 -1
  158. package/Source/Scene/VoxelBoxShape.js +67 -6
  159. package/Source/Scene/VoxelCell.js +273 -0
  160. package/Source/Scene/VoxelCylinderShape.js +117 -163
  161. package/Source/Scene/VoxelEllipsoidShape.js +255 -304
  162. package/Source/Scene/VoxelPrimitive.js +109 -15
  163. package/Source/Scene/VoxelRenderResources.js +12 -3
  164. package/Source/Scene/VoxelShape.js +7 -4
  165. package/Source/Scene/VoxelTraversal.js +76 -54
  166. package/Source/Scene/buildVoxelDrawCommands.js +23 -0
  167. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -0
  168. package/Source/Scene/processVoxelProperties.js +3 -0
  169. package/Source/Shaders/Voxels/IntersectBox.glsl +21 -47
  170. package/Source/Shaders/Voxels/IntersectBox.js +21 -47
  171. package/Source/Shaders/Voxels/IntersectClippingPlanes.glsl +1 -1
  172. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +1 -1
  173. package/Source/Shaders/Voxels/IntersectCylinder.glsl +76 -203
  174. package/Source/Shaders/Voxels/IntersectCylinder.js +76 -203
  175. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +220 -229
  176. package/Source/Shaders/Voxels/IntersectEllipsoid.js +220 -229
  177. package/Source/Shaders/Voxels/IntersectLongitude.glsl +102 -0
  178. package/Source/Shaders/Voxels/IntersectLongitude.js +104 -0
  179. package/Source/Shaders/Voxels/IntersectionUtils.glsl +33 -11
  180. package/Source/Shaders/Voxels/IntersectionUtils.js +33 -11
  181. package/Source/Shaders/Voxels/Megatexture.glsl +1 -2
  182. package/Source/Shaders/Voxels/Megatexture.js +1 -2
  183. package/Source/Shaders/Voxels/Octree.glsl +14 -9
  184. package/Source/Shaders/Voxels/Octree.js +14 -9
  185. package/Source/Shaders/Voxels/VoxelFS.glsl +128 -40
  186. package/Source/Shaders/Voxels/VoxelFS.js +128 -40
  187. package/Source/Shaders/Voxels/VoxelUtils.glsl +31 -0
  188. package/Source/Shaders/Voxels/VoxelUtils.js +33 -0
  189. package/Source/Shaders/Voxels/convertUvToBox.glsl +24 -3
  190. package/Source/Shaders/Voxels/convertUvToBox.js +24 -4
  191. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +64 -40
  192. package/Source/Shaders/Voxels/convertUvToCylinder.js +64 -40
  193. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +100 -91
  194. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +100 -91
  195. package/Source/ThirdParty/Workers/z-worker-pako.js +1 -1
  196. package/Source/Workers/createGeometry.js +40 -11
  197. package/Source/Workers/decodeI3S.js +720 -94
  198. package/index.d.ts +542 -40
  199. package/index.js +75 -66
  200. package/package.json +2 -2
@@ -1,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
@@ -26,49 +23,76 @@
26
23
  uniform float u_cylinderShapeUvAngleRangeZeroMid;
27
24
  #endif
28
25
 
29
- vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
30
- vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]
26
+ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {
27
+ // Convert from Cartesian UV space [0, 1] to Cartesian local space [-1, 1]
28
+ vec3 position = positionUv * 2.0 - 1.0;
31
29
 
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
30
+ float radius = length(position.xy); // [0, 1]
31
+ vec3 radial = normalize(vec3(position.xy, 0.0));
32
+
33
+ // Shape space height is defined within [0, 1]
34
+ float height = positionUv.z; // [0, 1]
35
+ vec3 z = vec3(0.0, 0.0, 1.0);
36
+
37
+ float angle = atan(position.y, position.x);
38
+ vec3 east = normalize(vec3(-position.y, position.x, 0.0));
39
+
40
+ vec3 point = vec3(radius, height, angle);
41
+ mat3 jacobianT = mat3(radial, z, east / length(position.xy));
42
+ return PointJacobianT(point, jacobianT);
43
+ }
44
+
45
+ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {
46
+ float radius = positionShape.x;
47
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
48
+ radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y;
40
49
  #endif
41
50
 
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
51
+ float height = positionShape.y;
52
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
53
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;
50
54
  #endif
51
55
 
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
69
-
70
- angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset
56
+ float angle = (positionShape.z + czm_pi) / czm_twoPi;
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;
71
68
  #endif
69
+
70
+ angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y;
71
+ #endif
72
+
73
+ return vec3(radius, height, angle);
74
+ }
75
+
76
+ PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {
77
+ PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv);
78
+ pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point);
79
+ return pointJacobian;
80
+ }
81
+
82
+ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {
83
+ float radius = shapeUv.x;
84
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
85
+ radius /= u_cylinderUvToShapeUvRadius.x;
86
+ #endif
87
+
88
+ float height = shapeUv.y;
89
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
90
+ height /= u_cylinderUvToShapeUvHeight.x;
91
+ #endif
92
+
93
+ float angle = shapeUv.z * czm_twoPi;
94
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
95
+ angle /= u_cylinderUvToShapeUvAngle.x;
72
96
  #endif
73
97
 
74
98
  return vec3(radius, height, angle);
@@ -1,11 +1,8 @@
1
1
  //This file is automatically rebuilt by the Cesium build process.
2
2
  export default "/* Cylinder defines (set in Scene/VoxelCylinderShape.js)\n\
3
3
  #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS\n\
4
- #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT\n\
5
4
  #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT\n\
6
- #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT\n\
7
5
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE\n\
8
- #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO\n\
9
6
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY\n\
10
7
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY\n\
11
8
  #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED\n\
@@ -27,49 +24,76 @@ export default "/* Cylinder defines (set in Scene/VoxelCylinderShape.js)\n\
27
24
  uniform float u_cylinderShapeUvAngleRangeZeroMid;\n\
28
25
  #endif\n\
29
26
  \n\
30
- vec3 convertUvToShapeUvSpace(in vec3 positionUv) {\n\
31
- vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]\n\
27
+ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {\n\
28
+ // Convert from Cartesian UV space [0, 1] to Cartesian local space [-1, 1]\n\
29
+ vec3 position = positionUv * 2.0 - 1.0;\n\
32
30
  \n\
33
- // Compute radius\n\
34
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT)\n\
35
- float radius = 1.0;\n\
36
- #else\n\
37
- float radius = length(positionLocal.xy); // [0,1]\n\
38
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)\n\
39
- radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset\n\
40
- #endif\n\
31
+ float radius = length(position.xy); // [0, 1]\n\
32
+ vec3 radial = normalize(vec3(position.xy, 0.0));\n\
33
+ \n\
34
+ // Shape space height is defined within [0, 1]\n\
35
+ float height = positionUv.z; // [0, 1]\n\
36
+ vec3 z = vec3(0.0, 0.0, 1.0);\n\
37
+ \n\
38
+ float angle = atan(position.y, position.x);\n\
39
+ vec3 east = normalize(vec3(-position.y, position.x, 0.0));\n\
40
+ \n\
41
+ vec3 point = vec3(radius, height, angle);\n\
42
+ mat3 jacobianT = mat3(radial, z, east / length(position.xy));\n\
43
+ return PointJacobianT(point, jacobianT);\n\
44
+ }\n\
45
+ \n\
46
+ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {\n\
47
+ float radius = positionShape.x;\n\
48
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)\n\
49
+ radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y;\n\
41
50
  #endif\n\
42
51
  \n\
43
- // Compute height\n\
44
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)\n\
45
- float height = 1.0;\n\
46
- #else\n\
47
- float height = positionUv.z; // [0,1]\n\
48
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
49
- height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset\n\
50
- #endif\n\
52
+ float height = positionShape.y;\n\
53
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
54
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;\n\
51
55
  #endif\n\
52
56
  \n\
53
- // Compute angle\n\
54
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)\n\
55
- float angle = 1.0;\n\
56
- #else\n\
57
- float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]\n\
58
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
59
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)\n\
60
- // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.\n\
61
- angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);\n\
62
- #endif\n\
63
- \n\
64
- // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.\n\
65
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)\n\
66
- angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;\n\
67
- #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)\n\
68
- angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;\n\
69
- #endif\n\
70
- \n\
71
- angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset\n\
57
+ float angle = (positionShape.z + czm_pi) / czm_twoPi;\n\
58
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
59
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)\n\
60
+ // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.\n\
61
+ angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);\n\
62
+ #endif\n\
63
+ \n\
64
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.\n\
65
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)\n\
66
+ angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;\n\
67
+ #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)\n\
68
+ angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;\n\
72
69
  #endif\n\
70
+ \n\
71
+ angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y;\n\
72
+ #endif\n\
73
+ \n\
74
+ return vec3(radius, height, angle);\n\
75
+ }\n\
76
+ \n\
77
+ PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {\n\
78
+ PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv);\n\
79
+ pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point);\n\
80
+ return pointJacobian;\n\
81
+ }\n\
82
+ \n\
83
+ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {\n\
84
+ float radius = shapeUv.x;\n\
85
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)\n\
86
+ radius /= u_cylinderUvToShapeUvRadius.x;\n\
87
+ #endif\n\
88
+ \n\
89
+ float height = shapeUv.y;\n\
90
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
91
+ height /= u_cylinderUvToShapeUvHeight.x;\n\
92
+ #endif\n\
93
+ \n\
94
+ float angle = shapeUv.z * czm_twoPi;\n\
95
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
96
+ angle /= u_cylinderUvToShapeUvAngle.x;\n\
73
97
  #endif\n\
74
98
  \n\
75
99
  return vec3(radius, height, angle);\n\
@@ -2,19 +2,13 @@
2
2
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY
3
3
  #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY
4
4
  #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE
5
- #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO
6
5
  #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED
7
6
  #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE
8
- #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO
9
- #define ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN
10
- #define ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
11
- #define ELLIPSOID_IS_SPHERE
12
7
  */
13
8
 
14
9
  uniform vec3 u_ellipsoidRadiiUv; // [0,1]
15
- #if !defined(ELLIPSOID_IS_SPHERE)
16
- uniform vec3 u_ellipsoidInverseRadiiSquaredUv;
17
- #endif
10
+ uniform vec2 u_evoluteScale; // (radiiUv.x ^ 2 - radiiUv.z ^ 2) * vec2(1.0, -1.0) / radiiUv;
11
+ uniform vec3 u_ellipsoidInverseRadiiSquaredUv;
18
12
  #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)
19
13
  uniform vec3 u_ellipsoidShapeUvLongitudeMinMaxMid;
20
14
  #endif
@@ -24,107 +18,122 @@ uniform vec3 u_ellipsoidRadiiUv; // [0,1]
24
18
  #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)
25
19
  uniform vec2 u_ellipsoidUvToShapeUvLatitude; // x = scale, y = offset
26
20
  #endif
27
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN) && !defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)
28
- uniform float u_ellipsoidInverseHeightDifferenceUv;
29
- uniform vec2 u_ellipseInnerRadiiUv; // [0,1]
30
- #endif
21
+ uniform float u_ellipsoidInverseHeightDifferenceUv;
31
22
 
32
23
  // robust iterative solution without trig functions
33
24
  // https://github.com/0xfaded/ellipse_demo/issues/1
34
25
  // https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse
35
- // Pro: Good when radii.x ~= radii.y
36
- // Con: Breaks at pos.x ~= 0.0, especially inside the ellipse
37
- // Con: Inaccurate with exterior points and thin ellipses
38
- float ellipseDistanceIterative (vec2 pos, vec2 radii) {
26
+ // Extended to return radius of curvature along with the point
27
+ vec3 nearestPointAndRadiusOnEllipse(vec2 pos, vec2 radii) {
39
28
  vec2 p = abs(pos);
40
- vec2 invRadii = 1.0 / radii;
41
- vec2 a = vec2(1.0, -1.0) * (radii.x * radii.x - radii.y * radii.y) * invRadii;
42
- vec2 t = vec2(0.70710678118); // sqrt(2) / 2
43
- vec2 v = radii * t;
29
+ vec2 inverseRadii = 1.0 / radii;
30
+
31
+ // We describe the ellipse parametrically: v = radii * vec2(cos(t), sin(t))
32
+ // but store the cos and sin of t in a vec2 for efficiency.
33
+ // Initial guess: t = pi/4
34
+ vec2 tTrigs = vec2(0.7071067811865476);
35
+ // Initial guess of point on ellipsoid
36
+ vec2 v = radii * tTrigs;
37
+ // Center of curvature of the ellipse at v
38
+ vec2 evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs;
44
39
 
45
40
  const int iterations = 3;
46
41
  for (int i = 0; i < iterations; ++i) {
47
- vec2 e = a * pow(t, vec2(3.0));
48
- vec2 q = normalize(p - e) * length(v - e);
49
- t = normalize((q + e) * invRadii);
50
- v = radii * t;
42
+ // Find the (approximate) intersection of p - evolute with the ellipsoid.
43
+ vec2 q = normalize(p - evolute) * length(v - evolute);
44
+ // Update the estimate of t.
45
+ tTrigs = (q + evolute) * inverseRadii;
46
+ tTrigs = normalize(clamp(tTrigs, 0.0, 1.0));
47
+ v = radii * tTrigs;
48
+ evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs;
51
49
  }
52
- return length(v * sign(pos) - pos) * sign(p.y - v.y);
50
+
51
+ return vec3(v * sign(pos), length(v - evolute));
52
+ }
53
+
54
+ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {
55
+ // Convert from UV space [0, 1] to local space [-1, 1]
56
+ vec3 position = positionUv * 2.0 - 1.0;
57
+ // Undo the scaling from ellipsoid to sphere
58
+ position = position * u_ellipsoidRadiiUv;
59
+
60
+ float longitude = atan(position.y, position.x);
61
+ vec3 east = normalize(vec3(-position.y, position.x, 0.0));
62
+
63
+ // Convert the 3D position to a 2D position relative to the ellipse (radii.x, radii.z)
64
+ // (assume radii.y == radii.x) and find the nearest point on the ellipse and its normal
65
+ float distanceFromZAxis = length(position.xy);
66
+ vec2 posEllipse = vec2(distanceFromZAxis, position.z);
67
+ vec3 surfacePointAndRadius = nearestPointAndRadiusOnEllipse(posEllipse, u_ellipsoidRadiiUv.xz);
68
+ vec2 surfacePoint = surfacePointAndRadius.xy;
69
+
70
+ vec2 normal2d = normalize(surfacePoint * u_ellipsoidInverseRadiiSquaredUv.xz);
71
+ float latitude = atan(normal2d.y, normal2d.x);
72
+ vec3 north = vec3(-normal2d.y * normalize(position.xy), abs(normal2d.x));
73
+
74
+ float heightSign = length(posEllipse) < length(surfacePoint) ? -1.0 : 1.0;
75
+ float height = heightSign * length(posEllipse - surfacePoint);
76
+ vec3 up = normalize(cross(east, north));
77
+
78
+ vec3 point = vec3(longitude, latitude, height);
79
+ mat3 jacobianT = mat3(east / distanceFromZAxis, north / (surfacePointAndRadius.z + height), up);
80
+ return PointJacobianT(point, jacobianT);
53
81
  }
54
82
 
55
- vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
56
- // Compute position and normal.
57
- // Convert positionUv [0,1] to local space [-1,+1] to "normalized" cartesian space [-a,+a] where a = (radii + height) / (max(radii) + height).
58
- // A point on the largest ellipsoid axis would be [-1,+1] and everything else would be smaller.
59
- vec3 positionLocal = positionUv * 2.0 - 1.0;
60
- #if defined(ELLIPSOID_IS_SPHERE)
61
- vec3 posEllipsoid = positionLocal * u_ellipsoidRadiiUv.x;
62
- vec3 normal = normalize(posEllipsoid);
63
- #else
64
- vec3 posEllipsoid = positionLocal * u_ellipsoidRadiiUv;
65
- vec3 normal = normalize(posEllipsoid * u_ellipsoidInverseRadiiSquaredUv); // geodetic surface normal
83
+ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {
84
+ // Longitude: shift & scale to [0, 1]
85
+ float longitude = (positionShape.x + czm_pi) / czm_twoPi;
86
+
87
+ // Correct the angle when max < min
88
+ // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space.
89
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED)
90
+ longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z);
66
91
  #endif
67
92
 
68
- // Compute longitude
69
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO)
70
- float longitude = 1.0;
71
- #else
72
- float longitude = (atan(normal.y, normal.x) + czm_pi) / czm_twoPi;
73
-
74
- // Correct the angle when max < min
75
- // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space.
76
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED)
77
- longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z);
78
- #endif
79
-
80
- // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
81
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY)
82
- longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude;
83
- #endif
84
- #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY)
85
- longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude;
86
- #endif
87
-
88
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)
89
- longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y;
90
- #endif
93
+ // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
94
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY)
95
+ longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude;
91
96
  #endif
97
+ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY)
98
+ longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude;
99
+ #endif
100
+
101
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)
102
+ longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y;
103
+ #endif
104
+
105
+ // Latitude: shift and scale to [0, 1]
106
+ float latitude = (positionShape.y + czm_piOverTwo) / czm_pi;
107
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)
108
+ latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y;
109
+ #endif
110
+
111
+ // Height: scale to the range [0, 1]
112
+ float height = 1.0 + positionShape.z * u_ellipsoidInverseHeightDifferenceUv;
113
+
114
+ return vec3(longitude, latitude, height);
115
+ }
116
+
117
+ PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {
118
+ PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv);
119
+ pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point);
120
+ return pointJacobian;
121
+ }
92
122
 
93
- // Compute latitude
94
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE_RANGE_EQUAL_ZERO)
95
- float latitude = 1.0;
96
- #else
97
- float latitude = (asin(normal.z) + czm_piOverTwo) / czm_pi;
98
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)
99
- latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y;
100
- #endif
123
+ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {
124
+ // Convert from [0, 1] to radians [-pi, pi]
125
+ float longitude = shapeUv.x * czm_twoPi;
126
+ #if defined (ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE)
127
+ longitude /= u_ellipsoidUvToShapeUvLongitude.x;
101
128
  #endif
102
129
 
103
- // Compute height
104
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)
105
- // TODO: This breaks down when minBounds == maxBounds. To fix it, this
106
- // function would have to know if ray is intersecting the front or back of the shape
107
- // and set the shape space position to 1 (front) or 0 (back) accordingly.
108
- float height = 1.0;
109
- #else
110
- #if defined(ELLIPSOID_IS_SPHERE)
111
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN)
112
- float height = (length(posEllipsoid) - u_ellipseInnerRadiiUv.x) * u_ellipsoidInverseHeightDifferenceUv;
113
- #else
114
- float height = length(posEllipsoid);
115
- #endif
116
- #else
117
- #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_HEIGHT_MIN)
118
- // 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).
119
- // This is an optimization so that math can be done with ellipses instead of ellipsoids.
120
- vec2 posEllipse = vec2(length(posEllipsoid.xy), posEllipsoid.z);
121
- float height = ellipseDistanceIterative(posEllipse, u_ellipseInnerRadiiUv) * u_ellipsoidInverseHeightDifferenceUv;
122
- #else
123
- // TODO: this is probably not correct
124
- float height = length(posEllipsoid);
125
- #endif
126
- #endif
130
+ // Convert from [0, 1] to radians [-pi/2, pi/2]
131
+ float latitude = shapeUv.y * czm_pi;
132
+ #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE)
133
+ latitude /= u_ellipsoidUvToShapeUvLatitude.x;
127
134
  #endif
135
+
136
+ float height = shapeUv.z / u_ellipsoidInverseHeightDifferenceUv;
128
137
 
129
138
  return vec3(longitude, latitude, height);
130
139
  }