@cesium/engine 14.0.0 → 15.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 (156) hide show
  1. package/Build/Workers/{chunk-EWDGNOJE.js → chunk-25TOENEE.js} +7 -7
  2. package/Build/Workers/{chunk-OMXHEJTK.js → chunk-2AVIUB5H.js} +2 -2
  3. package/Build/Workers/{chunk-LJBJM6VI.js → chunk-3JZGPJMZ.js} +6 -6
  4. package/Build/Workers/{chunk-DT5NFR5C.js → chunk-3LHBH4TC.js} +7 -7
  5. package/Build/Workers/{chunk-3QLSKXKF.js → chunk-3LZF23RY.js} +6 -6
  6. package/Build/Workers/{chunk-ED6GLQTK.js → chunk-5S2B46UQ.js} +1 -1
  7. package/Build/Workers/{chunk-B4GSRXE3.js → chunk-67ONR44K.js} +6 -6
  8. package/Build/Workers/{chunk-LOZ4NKY3.js → chunk-6EDBC234.js} +11 -11
  9. package/Build/Workers/{chunk-7ZB2RVIQ.js → chunk-6EV4VOET.js} +10 -10
  10. package/Build/Workers/{chunk-KHWLAQVA.js → chunk-7ITUZTFH.js} +1 -1
  11. package/Build/Workers/{chunk-JHBPC4LK.js → chunk-ARVZCY6X.js} +7 -7
  12. package/Build/Workers/{chunk-FFBJDW4A.js → chunk-B2UQN3DH.js} +6 -6
  13. package/Build/Workers/{chunk-VCNOFQYH.js → chunk-B2Y4ZS6X.js} +9 -9
  14. package/Build/Workers/{chunk-Q4ZVWJXX.js → chunk-BD2TPFGC.js} +5 -5
  15. package/Build/Workers/{chunk-K4AH3TDT.js → chunk-CHX2K5AC.js} +10 -10
  16. package/Build/Workers/{chunk-3LYROPON.js → chunk-CJGVEABL.js} +13 -13
  17. package/Build/Workers/{chunk-KSYBJA4M.js → chunk-DYJHEP3B.js} +5 -5
  18. package/Build/Workers/{chunk-CI2HEJFC.js → chunk-E3H7AVMK.js} +13 -13
  19. package/Build/Workers/{chunk-F4CUH4MR.js → chunk-EZNAJPP5.js} +4 -4
  20. package/Build/Workers/{chunk-YJX7X577.js → chunk-F7ZI463G.js} +15 -15
  21. package/Build/Workers/{chunk-HEZHXDYB.js → chunk-FMZ5CX6V.js} +1 -1
  22. package/Build/Workers/{chunk-G3BVMPWG.js → chunk-FRAWHNSR.js} +2 -2
  23. package/Build/Workers/{chunk-J7IH4EYI.js → chunk-GGV2XJHE.js} +7 -7
  24. package/Build/Workers/{chunk-5KWRW7YL.js → chunk-GK4QU6QI.js} +2 -2
  25. package/Build/Workers/{chunk-77XPS7ZA.js → chunk-HYPB7FAV.js} +10 -10
  26. package/Build/Workers/{chunk-MVM4JV5U.js → chunk-I4HO2ED2.js} +9 -9
  27. package/Build/Workers/{chunk-FX4R4MTH.js → chunk-IGINOLDX.js} +6 -6
  28. package/Build/Workers/{chunk-PWF4EY5P.js → chunk-ISQSYLZY.js} +4 -4
  29. package/Build/Workers/{chunk-7UHKH6M3.js → chunk-JZAMRL5I.js} +6 -6
  30. package/Build/Workers/{chunk-HUFQVUMY.js → chunk-K5G2WELR.js} +7 -7
  31. package/Build/Workers/{chunk-5S5OOA6U.js → chunk-L5SO4Y5V.js} +1 -1
  32. package/Build/Workers/{chunk-LNSWJ43X.js → chunk-LCMJQVIF.js} +11 -11
  33. package/Build/Workers/{chunk-WVNLSTOF.js → chunk-MWJW37I7.js} +2 -2
  34. package/Build/Workers/{chunk-ZGFIT57T.js → chunk-NAGMYRDW.js} +27 -20
  35. package/Build/Workers/{chunk-SDIDRZDG.js → chunk-OYO6TKMU.js} +7 -7
  36. package/Build/Workers/{chunk-HKHQ3EDR.js → chunk-PUTA3AE2.js} +4 -4
  37. package/Build/Workers/{chunk-JPDKYBLF.js → chunk-Q5BHMNKU.js} +13 -13
  38. package/Build/Workers/{chunk-XK4OP6VA.js → chunk-QTEX3Y4V.js} +17 -17
  39. package/Build/Workers/{chunk-TVL3F7IU.js → chunk-QZKN2RXM.js} +1 -1
  40. package/Build/Workers/{chunk-Z3QWTHI7.js → chunk-RO2Z3LCR.js} +14 -14
  41. package/Build/Workers/{chunk-N2XAJBC6.js → chunk-RRN6LRDX.js} +12 -12
  42. package/Build/Workers/{chunk-FYGLNDKG.js → chunk-SLIA3GQP.js} +7 -7
  43. package/Build/Workers/{chunk-7EO56M5R.js → chunk-TFCOEX3W.js} +2 -2
  44. package/Build/Workers/{chunk-KM6MITPF.js → chunk-TU6ZXHVU.js} +5 -5
  45. package/Build/Workers/{chunk-LS3KVHYY.js → chunk-VJ2PDF64.js} +6 -6
  46. package/Build/Workers/{chunk-D7ZBZPHV.js → chunk-VMVPONIV.js} +5 -5
  47. package/Build/Workers/{chunk-3PIZQT3I.js → chunk-WPXU45PH.js} +4 -4
  48. package/Build/Workers/{chunk-WEHZP4SE.js → chunk-XDHM4G3P.js} +7 -7
  49. package/Build/Workers/{chunk-TY4DKOWR.js → chunk-XED3RXKO.js} +2 -2
  50. package/Build/Workers/{chunk-ZMNLEL6W.js → chunk-YNYCGTQH.js} +5 -5
  51. package/Build/Workers/{chunk-4CHMVQTQ.js → chunk-Z4SI54EB.js} +4 -4
  52. package/Build/Workers/{chunk-3JBEPBPL.js → chunk-ZVDLC3T4.js} +13 -13
  53. package/Build/Workers/combineGeometry.js +22 -22
  54. package/Build/Workers/createBoxGeometry.js +16 -16
  55. package/Build/Workers/createBoxOutlineGeometry.js +14 -14
  56. package/Build/Workers/createCircleGeometry.js +24 -24
  57. package/Build/Workers/createCircleOutlineGeometry.js +17 -17
  58. package/Build/Workers/createCoplanarPolygonGeometry.js +31 -31
  59. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
  60. package/Build/Workers/createCorridorGeometry.js +27 -27
  61. package/Build/Workers/createCorridorOutlineGeometry.js +26 -26
  62. package/Build/Workers/createCylinderGeometry.js +18 -18
  63. package/Build/Workers/createCylinderOutlineGeometry.js +16 -16
  64. package/Build/Workers/createEllipseGeometry.js +24 -24
  65. package/Build/Workers/createEllipseOutlineGeometry.js +17 -17
  66. package/Build/Workers/createEllipsoidGeometry.js +17 -17
  67. package/Build/Workers/createEllipsoidOutlineGeometry.js +16 -16
  68. package/Build/Workers/createFrustumGeometry.js +16 -16
  69. package/Build/Workers/createFrustumOutlineGeometry.js +16 -16
  70. package/Build/Workers/createGeometry.js +22 -22
  71. package/Build/Workers/createGroundPolylineGeometry.js +20 -20
  72. package/Build/Workers/createPlaneGeometry.js +14 -14
  73. package/Build/Workers/createPlaneOutlineGeometry.js +13 -13
  74. package/Build/Workers/createPolygonGeometry.js +30 -30
  75. package/Build/Workers/createPolygonOutlineGeometry.js +28 -28
  76. package/Build/Workers/createPolylineGeometry.js +23 -23
  77. package/Build/Workers/createPolylineVolumeGeometry.js +29 -29
  78. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
  79. package/Build/Workers/createRectangleGeometry.js +25 -25
  80. package/Build/Workers/createRectangleOutlineGeometry.js +18 -18
  81. package/Build/Workers/createSimplePolylineGeometry.js +21 -21
  82. package/Build/Workers/createSphereGeometry.js +17 -17
  83. package/Build/Workers/createSphereOutlineGeometry.js +16 -16
  84. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  85. package/Build/Workers/createVectorTileClampedPolylines.js +13 -13
  86. package/Build/Workers/createVectorTileGeometries.js +22 -22
  87. package/Build/Workers/createVectorTilePoints.js +12 -12
  88. package/Build/Workers/createVectorTilePolygons.js +20 -20
  89. package/Build/Workers/createVectorTilePolylines.js +13 -13
  90. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
  91. package/Build/Workers/createVerticesFromHeightmap.js +20 -20
  92. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
  93. package/Build/Workers/createWallGeometry.js +22 -22
  94. package/Build/Workers/createWallOutlineGeometry.js +21 -21
  95. package/Build/Workers/decodeDraco.js +11 -11
  96. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  97. package/Build/Workers/decodeI3S.js +10 -10
  98. package/Build/Workers/transcodeKTX2.js +50 -43
  99. package/Build/Workers/transferTypedArrayTest.js +1 -1
  100. package/Build/Workers/upsampleQuantizedTerrainMesh.js +20 -20
  101. package/Source/Core/EllipsoidRhumbLine.js +1 -1
  102. package/Source/Core/Ion.js +1 -1
  103. package/Source/Core/PolygonGeometryLibrary.js +26 -4
  104. package/Source/Core/TexturePacker.js +166 -0
  105. package/Source/DataSources/BillboardVisualizer.js +3 -3
  106. package/Source/DataSources/EntityCluster.js +44 -19
  107. package/Source/Renderer/Context.js +0 -4
  108. package/Source/Renderer/Texture.js +6 -5
  109. package/Source/Renderer/TextureAtlas.js +802 -0
  110. package/Source/Scene/ArcGisMapService.js +1 -1
  111. package/Source/Scene/Billboard.js +86 -141
  112. package/Source/Scene/BillboardCollection.js +132 -202
  113. package/Source/Scene/BillboardLoadState.js +44 -0
  114. package/Source/Scene/BillboardTexture.js +348 -0
  115. package/Source/Scene/Camera.js +2 -2
  116. package/Source/Scene/Cesium3DTilesVoxelProvider.js +380 -126
  117. package/Source/Scene/Cesium3DTilesetStatistics.js +0 -1
  118. package/Source/Scene/Expression.js +1 -0
  119. package/Source/Scene/GltfLoader.js +5 -7
  120. package/Source/Scene/ImplicitSubtree.js +2 -0
  121. package/Source/Scene/KeyframeNode.js +16 -2
  122. package/Source/Scene/LabelCollection.js +212 -182
  123. package/Source/Scene/Megatexture.js +145 -81
  124. package/Source/Scene/Model/CustomShader.js +0 -2
  125. package/Source/Scene/Model/Model.js +1 -1
  126. package/Source/Scene/Model/ModelUtility.js +5 -1
  127. package/Source/Scene/Scene.js +39 -15
  128. package/Source/Scene/ScreenSpaceCameraController.js +0 -8
  129. package/Source/Scene/SpatialNode.js +4 -11
  130. package/Source/Scene/Vector3DTilePoints.js +2 -5
  131. package/Source/Scene/VoxelBoxShape.js +12 -5
  132. package/Source/Scene/VoxelCell.js +6 -5
  133. package/Source/Scene/VoxelContent.js +171 -107
  134. package/Source/Scene/VoxelCylinderShape.js +65 -58
  135. package/Source/Scene/VoxelEllipsoidShape.js +15 -5
  136. package/Source/Scene/VoxelMetadataOrder.js +12 -0
  137. package/Source/Scene/VoxelPrimitive.js +122 -54
  138. package/Source/Scene/VoxelProvider.js +34 -29
  139. package/Source/Scene/VoxelRenderResources.js +30 -7
  140. package/Source/Scene/VoxelShape.js +10 -3
  141. package/Source/Scene/VoxelTraversal.js +264 -180
  142. package/Source/Scene/processVoxelProperties.js +3 -0
  143. package/Source/Shaders/GlobeFS.glsl +10 -1
  144. package/Source/Shaders/GlobeFS.js +10 -1
  145. package/Source/Shaders/Voxels/Megatexture.glsl +4 -16
  146. package/Source/Shaders/Voxels/Megatexture.js +4 -16
  147. package/Source/Shaders/Voxels/Octree.glsl +44 -7
  148. package/Source/Shaders/Voxels/Octree.js +44 -7
  149. package/Source/Shaders/Voxels/VoxelFS.glsl +9 -15
  150. package/Source/Shaders/Voxels/VoxelFS.js +9 -15
  151. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +15 -15
  152. package/Source/Shaders/Voxels/convertUvToCylinder.js +15 -15
  153. package/index.d.ts +176 -79
  154. package/index.js +413 -409
  155. package/package.json +2 -2
  156. package/Source/Scene/TextureAtlas.js +0 -558
@@ -286,7 +286,16 @@ vec3 computeEllipsoidPosition()\n\
286
286
  vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);\n\
287
287
  xy *= czm_viewport.zw * mpp * 0.5;\n\
288
288
  \n\
289
- vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x));\n\
289
+ vec3 direction;\n\
290
+ if (czm_orthographicIn3D == 1.0)\n\
291
+ {\n\
292
+ direction = vec3(0.0, 0.0, -1.0);\n\
293
+ }\n\
294
+ else\n\
295
+ {\n\
296
+ direction = normalize(vec3(xy, -czm_currentFrustum.x));\n\
297
+ }\n\
298
+ \n\
290
299
  czm_ray ray = czm_ray(vec3(0.0), direction);\n\
291
300
  \n\
292
301
  vec3 ellipsoid_center = czm_view[3].xyz;\n\
@@ -12,12 +12,6 @@ uniform vec2 u_megatextureVoxelSizeUv;
12
12
  uniform vec2 u_megatextureSliceSizeUv;
13
13
  uniform vec2 u_megatextureTileSizeUv;
14
14
 
15
- uniform ivec3 u_dimensions; // does not include padding
16
- #if defined(PADDING)
17
- uniform ivec3 u_paddingBefore;
18
- uniform ivec3 u_paddingAfter;
19
- #endif
20
-
21
15
  // Integer min, max, clamp: For WebGL1 only
22
16
  int intMin(int a, int b) {
23
17
  return a <= b ? a : b;
@@ -72,14 +66,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)
72
66
 
73
67
  Properties getPropertiesFromMegatexture(in SampleData sampleData) {
74
68
  int tileIndex = sampleData.megatextureIndex;
75
- vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);
76
- ivec3 voxelDimensions = u_dimensions;
77
-
78
- #if defined(PADDING)
79
- voxelDimensions += u_paddingBefore + u_paddingAfter;
80
- voxelCoord += vec3(u_paddingBefore);
81
- #endif
82
69
 
70
+ vec3 voxelCoord = sampleData.inputCoordinate;
83
71
  #if defined(NEAREST_SAMPLING)
84
72
  // Round to the center of the nearest voxel
85
73
  voxelCoord = floor(voxelCoord) + vec3(0.5);
@@ -91,11 +79,11 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {
91
79
  // Slice location
92
80
  float slice = voxelCoord.z - 0.5;
93
81
  int sliceIndex = int(floor(slice));
94
- int sliceIndex0 = intClamp(sliceIndex, 0, voxelDimensions.z - 1);
82
+ int sliceIndex0 = intClamp(sliceIndex, 0, u_inputDimensions.z - 1);
95
83
  vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);
96
84
 
97
85
  // Voxel location
98
- vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(voxelDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv;
86
+ vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(u_inputDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv;
99
87
 
100
88
  // Final location in the megatexture
101
89
  vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset;
@@ -104,7 +92,7 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {
104
92
  return getPropertiesFromMegatextureAtUv(uv0);
105
93
  #else
106
94
  float sliceLerp = fract(slice);
107
- int sliceIndex1 = intMin(sliceIndex + 1, voxelDimensions.z - 1);
95
+ int sliceIndex1 = intMin(sliceIndex + 1, u_inputDimensions.z - 1);
108
96
  vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);
109
97
  vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset;
110
98
  Properties properties0 = getPropertiesFromMegatextureAtUv(uv0);
@@ -13,12 +13,6 @@ uniform vec2 u_megatextureVoxelSizeUv;\n\
13
13
  uniform vec2 u_megatextureSliceSizeUv;\n\
14
14
  uniform vec2 u_megatextureTileSizeUv;\n\
15
15
  \n\
16
- uniform ivec3 u_dimensions; // does not include padding\n\
17
- #if defined(PADDING)\n\
18
- uniform ivec3 u_paddingBefore;\n\
19
- uniform ivec3 u_paddingAfter;\n\
20
- #endif\n\
21
- \n\
22
16
  // Integer min, max, clamp: For WebGL1 only\n\
23
17
  int intMin(int a, int b) {\n\
24
18
  return a <= b ? a : b;\n\
@@ -73,14 +67,8 @@ vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale)\n\
73
67
  \n\
74
68
  Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
75
69
  int tileIndex = sampleData.megatextureIndex;\n\
76
- vec3 voxelCoord = sampleData.tileUv * vec3(u_dimensions);\n\
77
- ivec3 voxelDimensions = u_dimensions;\n\
78
- \n\
79
- #if defined(PADDING)\n\
80
- voxelDimensions += u_paddingBefore + u_paddingAfter;\n\
81
- voxelCoord += vec3(u_paddingBefore);\n\
82
- #endif\n\
83
70
  \n\
71
+ vec3 voxelCoord = sampleData.inputCoordinate;\n\
84
72
  #if defined(NEAREST_SAMPLING)\n\
85
73
  // Round to the center of the nearest voxel\n\
86
74
  voxelCoord = floor(voxelCoord) + vec3(0.5);\n\
@@ -92,11 +80,11 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
92
80
  // Slice location\n\
93
81
  float slice = voxelCoord.z - 0.5;\n\
94
82
  int sliceIndex = int(floor(slice));\n\
95
- int sliceIndex0 = intClamp(sliceIndex, 0, voxelDimensions.z - 1);\n\
83
+ int sliceIndex0 = intClamp(sliceIndex, 0, u_inputDimensions.z - 1);\n\
96
84
  vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);\n\
97
85
  \n\
98
86
  // Voxel location\n\
99
- vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(voxelDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv;\n\
87
+ vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(u_inputDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv;\n\
100
88
  \n\
101
89
  // Final location in the megatexture\n\
102
90
  vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset;\n\
@@ -105,7 +93,7 @@ Properties getPropertiesFromMegatexture(in SampleData sampleData) {\n\
105
93
  return getPropertiesFromMegatextureAtUv(uv0);\n\
106
94
  #else\n\
107
95
  float sliceLerp = fract(slice);\n\
108
- int sliceIndex1 = intMin(sliceIndex + 1, voxelDimensions.z - 1);\n\
96
+ int sliceIndex1 = intMin(sliceIndex + 1, u_inputDimensions.z - 1);\n\
109
97
  vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv);\n\
110
98
  vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset;\n\
111
99
  Properties properties0 = getPropertiesFromMegatextureAtUv(uv0);\n\
@@ -13,6 +13,11 @@ uniform sampler2D u_octreeLeafNodeTexture;
13
13
  uniform vec2 u_octreeLeafNodeTexelSizeUv;
14
14
  uniform int u_octreeLeafNodeTilesPerRow;
15
15
  #endif
16
+ uniform ivec3 u_dimensions; // does not include padding, and is in the z-up orientation
17
+ uniform ivec3 u_inputDimensions; // includes padding, and is in the orientation of the input data
18
+ #if defined(PADDING)
19
+ uniform ivec3 u_paddingBefore;
20
+ #endif
16
21
 
17
22
  struct OctreeNodeData {
18
23
  int data;
@@ -28,6 +33,7 @@ struct SampleData {
28
33
  int megatextureIndex;
29
34
  ivec4 tileCoords;
30
35
  vec3 tileUv;
36
+ vec3 inputCoordinate;
31
37
  #if (SAMPLE_COUNT > 1)
32
38
  float weight;
33
39
  #endif
@@ -88,6 +94,37 @@ vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {
88
94
  return clamp(tileUv, vec3(0.0), vec3(1.0));
89
95
  }
90
96
 
97
+ void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) {
98
+ vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords);
99
+
100
+ vec3 inputCoordinate = tileUv * vec3(u_dimensions);
101
+ #if defined(PADDING)
102
+ inputCoordinate += vec3(u_paddingBefore);
103
+ #endif
104
+ #if defined(GLTF_METADATA_ORDER)
105
+ #if defined(SHAPE_BOX)
106
+ float inputY = inputCoordinate.y;
107
+ inputCoordinate.y = float(u_inputDimensions.y) - inputCoordinate.z;
108
+ inputCoordinate.z = inputY;
109
+ #elif defined(SHAPE_CYLINDER)
110
+ float angle = inputCoordinate.y;
111
+ float height = inputCoordinate.z;
112
+ #if (!defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE))
113
+ // Account for the different 0-angle convention in glTF vs 3DTiles
114
+ if (sampleData.tileCoords.w == 0) {
115
+ float angleCount = float(u_inputDimensions.z);
116
+ angle = mod(angle + angleCount / 2.0, angleCount);
117
+ }
118
+ #endif
119
+ inputCoordinate.y = height;
120
+ inputCoordinate.z = angle;
121
+ #endif
122
+ #endif
123
+
124
+ sampleData.tileUv = tileUv;
125
+ sampleData.inputCoordinate = inputCoordinate;
126
+ }
127
+
91
128
  void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {
92
129
  sampleData.megatextureIndex = data.data;
93
130
  sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)
@@ -172,11 +209,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
172
209
 
173
210
  #if (SAMPLE_COUNT == 1)
174
211
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
175
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
212
+ addSampleCoordinates(shapePosition, sampleDatas[0]);
176
213
  #else
177
214
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
178
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
179
- sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);
215
+ addSampleCoordinates(shapePosition, sampleDatas[0]);
216
+ addSampleCoordinates(shapePosition, sampleDatas[1]);
180
217
  #endif
181
218
  }
182
219
 
@@ -194,7 +231,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {
194
231
  void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {
195
232
  if (insideTile(shapePosition, traversalData.octreeCoords)) {
196
233
  for (int i = 0; i < SAMPLE_COUNT; i++) {
197
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
234
+ addSampleCoordinates(shapePosition, sampleDatas[i]);
198
235
  }
199
236
  return;
200
237
  }
@@ -216,10 +253,10 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
216
253
 
217
254
  #if (SAMPLE_COUNT == 1)
218
255
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);
219
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
256
+ addSampleCoordinates(shapePosition, sampleDatas[0]);
220
257
  #else
221
258
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);
222
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);
223
- sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);
259
+ addSampleCoordinates(shapePosition, sampleDatas[0]);
260
+ addSampleCoordinates(shapePosition, sampleDatas[1]);
224
261
  #endif
225
262
  }
@@ -14,6 +14,11 @@ uniform sampler2D u_octreeLeafNodeTexture;\n\
14
14
  uniform vec2 u_octreeLeafNodeTexelSizeUv;\n\
15
15
  uniform int u_octreeLeafNodeTilesPerRow;\n\
16
16
  #endif\n\
17
+ uniform ivec3 u_dimensions; // does not include padding, and is in the z-up orientation\n\
18
+ uniform ivec3 u_inputDimensions; // includes padding, and is in the orientation of the input data\n\
19
+ #if defined(PADDING)\n\
20
+ uniform ivec3 u_paddingBefore;\n\
21
+ #endif\n\
17
22
  \n\
18
23
  struct OctreeNodeData {\n\
19
24
  int data;\n\
@@ -29,6 +34,7 @@ struct SampleData {\n\
29
34
  int megatextureIndex;\n\
30
35
  ivec4 tileCoords;\n\
31
36
  vec3 tileUv;\n\
37
+ vec3 inputCoordinate;\n\
32
38
  #if (SAMPLE_COUNT > 1)\n\
33
39
  float weight;\n\
34
40
  #endif\n\
@@ -89,6 +95,37 @@ vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
89
95
  return clamp(tileUv, vec3(0.0), vec3(1.0));\n\
90
96
  }\n\
91
97
  \n\
98
+ void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) {\n\
99
+ vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords);\n\
100
+ \n\
101
+ vec3 inputCoordinate = tileUv * vec3(u_dimensions);\n\
102
+ #if defined(PADDING)\n\
103
+ inputCoordinate += vec3(u_paddingBefore);\n\
104
+ #endif\n\
105
+ #if defined(GLTF_METADATA_ORDER)\n\
106
+ #if defined(SHAPE_BOX)\n\
107
+ float inputY = inputCoordinate.y;\n\
108
+ inputCoordinate.y = float(u_inputDimensions.y) - inputCoordinate.z;\n\
109
+ inputCoordinate.z = inputY;\n\
110
+ #elif defined(SHAPE_CYLINDER)\n\
111
+ float angle = inputCoordinate.y;\n\
112
+ float height = inputCoordinate.z;\n\
113
+ #if (!defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE))\n\
114
+ // Account for the different 0-angle convention in glTF vs 3DTiles\n\
115
+ if (sampleData.tileCoords.w == 0) {\n\
116
+ float angleCount = float(u_inputDimensions.z);\n\
117
+ angle = mod(angle + angleCount / 2.0, angleCount);\n\
118
+ }\n\
119
+ #endif\n\
120
+ inputCoordinate.y = height;\n\
121
+ inputCoordinate.z = angle;\n\
122
+ #endif\n\
123
+ #endif\n\
124
+ \n\
125
+ sampleData.tileUv = tileUv;\n\
126
+ sampleData.inputCoordinate = inputCoordinate;\n\
127
+ }\n\
128
+ \n\
92
129
  void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) {\n\
93
130
  sampleData.megatextureIndex = data.data;\n\
94
131
  sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT)\n\
@@ -173,11 +210,11 @@ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traver
173
210
  \n\
174
211
  #if (SAMPLE_COUNT == 1)\n\
175
212
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
176
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
213
+ addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
177
214
  #else\n\
178
215
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
179
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
180
- sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
216
+ addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
217
+ addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
181
218
  #endif\n\
182
219
  }\n\
183
220
  \n\
@@ -195,7 +232,7 @@ bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
195
232
  void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
196
233
  if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
197
234
  for (int i = 0; i < SAMPLE_COUNT; i++) {\n\
198
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
235
+ addSampleCoordinates(shapePosition, sampleDatas[i]);\n\
199
236
  }\n\
200
237
  return;\n\
201
238
  }\n\
@@ -217,11 +254,11 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
217
254
  \n\
218
255
  #if (SAMPLE_COUNT == 1)\n\
219
256
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
220
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
257
+ addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
221
258
  #else\n\
222
259
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
223
- sampleDatas[0].tileUv = getClampedTileUv(shapePosition, sampleDatas[0].tileCoords);\n\
224
- sampleDatas[1].tileUv = getClampedTileUv(shapePosition, sampleDatas[1].tileCoords);\n\
260
+ addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
261
+ addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
225
262
  #endif\n\
226
263
  }\n\
227
264
  ";
@@ -100,21 +100,15 @@ vec2 packFloatToVec2(float value) {
100
100
  return vec2(highBits, lowBits);
101
101
  }
102
102
 
103
- int getSampleIndex(in vec3 tileUv) {
104
- ivec3 voxelDimensions = u_dimensions;
105
- vec3 sampleCoordinate = tileUv * vec3(voxelDimensions);
106
- // tileUv = 1.0 is a valid coordinate but sampleIndex = voxelDimensions is not.
107
- // (tileUv = 1.0 corresponds to the last sample, at index = voxelDimensions - 1).
103
+ int getSampleIndex(in SampleData sampleData) {
104
+ // tileUv = 1.0 is a valid coordinate but sampleIndex = u_inputDimensions is not.
105
+ // (tileUv = 1.0 corresponds to the far edge of the last sample, at index = u_inputDimensions - 1).
108
106
  // Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring
109
- vec3 maxCoordinate = vec3(voxelDimensions) - vec3(0.5);
110
- sampleCoordinate = clamp(sampleCoordinate, vec3(0.0), maxCoordinate);
111
- ivec3 sampleIndex = ivec3(floor(sampleCoordinate));
112
- #if defined(PADDING)
113
- voxelDimensions += u_paddingBefore + u_paddingAfter;
114
- sampleIndex += u_paddingBefore;
115
- #endif
107
+ vec3 maxCoordinate = vec3(u_inputDimensions) - vec3(0.5);
108
+ vec3 inputCoordinate = clamp(sampleData.inputCoordinate, vec3(0.0), maxCoordinate);
109
+ ivec3 sampleIndex = ivec3(floor(inputCoordinate));
116
110
  // Convert to a 1D index for lookup in a 1D data array
117
- return sampleIndex.x + voxelDimensions.x * (sampleIndex.y + voxelDimensions.y * sampleIndex.z);
111
+ return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);
118
112
  }
119
113
 
120
114
  void main()
@@ -181,7 +175,7 @@ void main()
181
175
  fragmentInput.voxel.travelDistance = step.w;
182
176
  fragmentInput.voxel.stepCount = stepCount;
183
177
  fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;
184
- fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv);
178
+ fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);
185
179
 
186
180
  // Run the custom shader
187
181
  czm_modelMaterial materialOutput;
@@ -250,7 +244,7 @@ void main()
250
244
  discard;
251
245
  }
252
246
  vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);
253
- vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv));
247
+ vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0]));
254
248
  out_FragColor = vec4(megatextureId, sampleIndex);
255
249
  #else
256
250
  out_FragColor = colorAccum;
@@ -101,21 +101,15 @@ vec2 packFloatToVec2(float value) {\n\
101
101
  return vec2(highBits, lowBits);\n\
102
102
  }\n\
103
103
  \n\
104
- int getSampleIndex(in vec3 tileUv) {\n\
105
- ivec3 voxelDimensions = u_dimensions;\n\
106
- vec3 sampleCoordinate = tileUv * vec3(voxelDimensions);\n\
107
- // tileUv = 1.0 is a valid coordinate but sampleIndex = voxelDimensions is not.\n\
108
- // (tileUv = 1.0 corresponds to the last sample, at index = voxelDimensions - 1).\n\
104
+ int getSampleIndex(in SampleData sampleData) {\n\
105
+ // tileUv = 1.0 is a valid coordinate but sampleIndex = u_inputDimensions is not.\n\
106
+ // (tileUv = 1.0 corresponds to the far edge of the last sample, at index = u_inputDimensions - 1).\n\
109
107
  // Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring\n\
110
- vec3 maxCoordinate = vec3(voxelDimensions) - vec3(0.5);\n\
111
- sampleCoordinate = clamp(sampleCoordinate, vec3(0.0), maxCoordinate);\n\
112
- ivec3 sampleIndex = ivec3(floor(sampleCoordinate));\n\
113
- #if defined(PADDING)\n\
114
- voxelDimensions += u_paddingBefore + u_paddingAfter;\n\
115
- sampleIndex += u_paddingBefore;\n\
116
- #endif\n\
108
+ vec3 maxCoordinate = vec3(u_inputDimensions) - vec3(0.5);\n\
109
+ vec3 inputCoordinate = clamp(sampleData.inputCoordinate, vec3(0.0), maxCoordinate);\n\
110
+ ivec3 sampleIndex = ivec3(floor(inputCoordinate));\n\
117
111
  // Convert to a 1D index for lookup in a 1D data array\n\
118
- return sampleIndex.x + voxelDimensions.x * (sampleIndex.y + voxelDimensions.y * sampleIndex.z);\n\
112
+ return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);\n\
119
113
  }\n\
120
114
  \n\
121
115
  void main()\n\
@@ -182,7 +176,7 @@ void main()\n\
182
176
  fragmentInput.voxel.travelDistance = step.w;\n\
183
177
  fragmentInput.voxel.stepCount = stepCount;\n\
184
178
  fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;\n\
185
- fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0].tileUv);\n\
179
+ fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);\n\
186
180
  \n\
187
181
  // Run the custom shader\n\
188
182
  czm_modelMaterial materialOutput;\n\
@@ -251,7 +245,7 @@ void main()\n\
251
245
  discard;\n\
252
246
  }\n\
253
247
  vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex);\n\
254
- vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0].tileUv));\n\
248
+ vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0]));\n\
255
249
  out_FragColor = vec4(megatextureId, sampleIndex);\n\
256
250
  #else\n\
257
251
  out_FragColor = colorAccum;\n\
@@ -37,7 +37,7 @@ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {
37
37
  float angle = atan(position.y, position.x);
38
38
  vec3 east = normalize(vec3(-position.y, position.x, 0.0));
39
39
 
40
- vec3 point = vec3(radius, height, angle);
40
+ vec3 point = vec3(radius, angle, height);
41
41
  mat3 jacobianT = mat3(radial, z, east / length(position.xy));
42
42
  return PointJacobianT(point, jacobianT);
43
43
  }
@@ -48,12 +48,7 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {
48
48
  radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y;
49
49
  #endif
50
50
 
51
- float height = positionShape.y;
52
- #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
53
- height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;
54
- #endif
55
-
56
- float angle = (positionShape.z + czm_pi) / czm_twoPi;
51
+ float angle = (positionShape.y + czm_pi) / czm_twoPi;
57
52
  #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
58
53
  #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
59
54
  // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
@@ -70,7 +65,12 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {
70
65
  angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y;
71
66
  #endif
72
67
 
73
- return vec3(radius, height, angle);
68
+ float height = positionShape.z;
69
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
70
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;
71
+ #endif
72
+
73
+ return vec3(radius, angle, height);
74
74
  }
75
75
 
76
76
  PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {
@@ -85,15 +85,15 @@ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {
85
85
  radius /= u_cylinderUvToShapeUvRadius.x;
86
86
  #endif
87
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;
88
+ float angle = shapeUv.y * czm_twoPi;
94
89
  #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
95
90
  angle /= u_cylinderUvToShapeUvAngle.x;
96
91
  #endif
97
92
 
98
- return vec3(radius, height, angle);
93
+ float height = shapeUv.z;
94
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
95
+ height /= u_cylinderUvToShapeUvHeight.x;
96
+ #endif
97
+
98
+ return vec3(radius, angle, height);
99
99
  }
@@ -38,7 +38,7 @@ PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) {\n\
38
38
  float angle = atan(position.y, position.x);\n\
39
39
  vec3 east = normalize(vec3(-position.y, position.x, 0.0));\n\
40
40
  \n\
41
- vec3 point = vec3(radius, height, angle);\n\
41
+ vec3 point = vec3(radius, angle, height);\n\
42
42
  mat3 jacobianT = mat3(radial, z, east / length(position.xy));\n\
43
43
  return PointJacobianT(point, jacobianT);\n\
44
44
  }\n\
@@ -49,12 +49,7 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {\n\
49
49
  radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y;\n\
50
50
  #endif\n\
51
51
  \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\
55
- #endif\n\
56
- \n\
57
- float angle = (positionShape.z + czm_pi) / czm_twoPi;\n\
52
+ float angle = (positionShape.y + czm_pi) / czm_twoPi;\n\
58
53
  #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
59
54
  #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)\n\
60
55
  // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.\n\
@@ -71,7 +66,12 @@ vec3 convertShapeToShapeUvSpace(in vec3 positionShape) {\n\
71
66
  angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y;\n\
72
67
  #endif\n\
73
68
  \n\
74
- return vec3(radius, height, angle);\n\
69
+ float height = positionShape.z;\n\
70
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
71
+ height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y;\n\
72
+ #endif\n\
73
+ \n\
74
+ return vec3(radius, angle, height);\n\
75
75
  }\n\
76
76
  \n\
77
77
  PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) {\n\
@@ -86,16 +86,16 @@ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {\n\
86
86
  radius /= u_cylinderUvToShapeUvRadius.x;\n\
87
87
  #endif\n\
88
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\
89
+ float angle = shapeUv.y * czm_twoPi;\n\
95
90
  #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)\n\
96
91
  angle /= u_cylinderUvToShapeUvAngle.x;\n\
97
92
  #endif\n\
98
93
  \n\
99
- return vec3(radius, height, angle);\n\
94
+ float height = shapeUv.z;\n\
95
+ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)\n\
96
+ height /= u_cylinderUvToShapeUvHeight.x;\n\
97
+ #endif\n\
98
+ \n\
99
+ return vec3(radius, angle, height);\n\
100
100
  }\n\
101
101
  ";