@cesium/engine 20.0.2-ion.0 → 21.0.1-ion.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 (182) hide show
  1. package/Build/ThirdParty/Workers/zip-web-worker.js +637 -0
  2. package/Build/Workers/{chunk-AFKNTEMH.js → chunk-26ZRRKTU.js} +16 -16
  3. package/Build/Workers/{chunk-NKKNQMEH.js → chunk-2PX2ULSM.js} +3 -3
  4. package/Build/Workers/{chunk-OIMV4OE5.js → chunk-3K4DRV7Y.js} +9 -9
  5. package/Build/Workers/{chunk-IS5FETN7.js → chunk-3XTJC4CV.js} +5 -5
  6. package/Build/Workers/{chunk-Z2W7ZIGV.js → chunk-6KX3IUUT.js} +2 -2
  7. package/Build/Workers/{chunk-BHAATGZA.js → chunk-75UG66GR.js} +5 -5
  8. package/Build/Workers/{chunk-YXTWHLJA.js → chunk-ADADBRLI.js} +4 -4
  9. package/Build/Workers/{chunk-CUU3WGXJ.js → chunk-AGT6W3JS.js} +6 -6
  10. package/Build/Workers/{chunk-QID3DXQA.js → chunk-AQ4A5CMC.js} +7 -7
  11. package/Build/Workers/{chunk-MTBXKKSQ.js → chunk-B56XVJRS.js} +12 -12
  12. package/Build/Workers/{chunk-VODCZKV2.js → chunk-DTYIUWZU.js} +4 -4
  13. package/Build/Workers/{chunk-VSMKMGX4.js → chunk-E6T4LSM6.js} +5 -5
  14. package/Build/Workers/{chunk-WZKTQZUW.js → chunk-EEDSGIH7.js} +6 -6
  15. package/Build/Workers/{chunk-FNUSHLOY.js → chunk-EHMAKCWQ.js} +1 -1
  16. package/Build/Workers/{chunk-CYC7JX3P.js → chunk-ESPNIYL5.js} +8 -8
  17. package/Build/Workers/{chunk-LS63ERFB.js → chunk-EZJXK2UP.js} +4 -4
  18. package/Build/Workers/{chunk-Q3OWKSC5.js → chunk-G5RX7BPJ.js} +10 -10
  19. package/Build/Workers/{chunk-FAQ2XNFV.js → chunk-G74UMFQ4.js} +5 -5
  20. package/Build/Workers/{chunk-YUHWFX5H.js → chunk-H3G7OYZY.js} +2 -2
  21. package/Build/Workers/{chunk-6LULWCX3.js → chunk-HDBIC7IL.js} +1 -1
  22. package/Build/Workers/{chunk-WORBFT5H.js → chunk-JESBYOH5.js} +9 -9
  23. package/Build/Workers/{chunk-P2V7PVDH.js → chunk-KGL66RWW.js} +8 -8
  24. package/Build/Workers/{chunk-USK6ZAY2.js → chunk-L73TRTIG.js} +1 -1
  25. package/Build/Workers/{chunk-VA7LWA5Q.js → chunk-LEFV6H2V.js} +9 -9
  26. package/Build/Workers/{chunk-23B3EYUM.js → chunk-LK7H6V2E.js} +4 -4
  27. package/Build/Workers/{chunk-JVG6T2WE.js → chunk-LSNF6CIP.js} +12 -12
  28. package/Build/Workers/{chunk-ABTG74AR.js → chunk-MBIUW42A.js} +1 -1
  29. package/Build/Workers/{chunk-VZNF2GT7.js → chunk-MFPT34BC.js} +4 -4
  30. package/Build/Workers/{chunk-X6GXYB3M.js → chunk-MIFUV36K.js} +1 -1
  31. package/Build/Workers/{chunk-K6THSIDU.js → chunk-MJWRSKJV.js} +2 -2
  32. package/Build/Workers/{chunk-FYYP46TF.js → chunk-NWJRIJQG.js} +2 -2
  33. package/Build/Workers/{chunk-H5IQLAJP.js → chunk-OLH67Z2S.js} +82 -54
  34. package/Build/Workers/{chunk-FHLPYFIW.js → chunk-OWCFUM4Z.js} +13 -13
  35. package/Build/Workers/{chunk-66MGJQFZ.js → chunk-PQW63B2T.js} +2 -2
  36. package/Build/Workers/{chunk-UR36KLNW.js → chunk-RFZAUDYZ.js} +4 -4
  37. package/Build/Workers/{chunk-XWRUYDF6.js → chunk-SDFGZML6.js} +2 -2
  38. package/Build/Workers/{chunk-AHFTST3Q.js → chunk-SF2XXYOB.js} +12 -12
  39. package/Build/Workers/{chunk-QZGZIAK2.js → chunk-SGEAS4NZ.js} +6 -6
  40. package/Build/Workers/{chunk-MFXTB5I4.js → chunk-T7WXNKIA.js} +11 -11
  41. package/Build/Workers/{chunk-H7HFDM3G.js → chunk-TXK2FF6N.js} +5 -5
  42. package/Build/Workers/{chunk-D4XRQNUO.js → chunk-UTL4WVC3.js} +5 -5
  43. package/Build/Workers/{chunk-V6ZGOX4I.js → chunk-UTTKH2UG.js} +7 -7
  44. package/Build/Workers/{chunk-X55ZOYMS.js → chunk-VIDWZGD6.js} +12 -12
  45. package/Build/Workers/{chunk-TZDR2BAP.js → chunk-WIPOMPA5.js} +6 -6
  46. package/Build/Workers/{chunk-CEA3L7M7.js → chunk-WJV24LAS.js} +4 -4
  47. package/Build/Workers/{chunk-F4PS6RFF.js → chunk-WMG6UOCJ.js} +10 -10
  48. package/Build/Workers/{chunk-XIDMFHR4.js → chunk-XFS2ORSO.js} +14 -14
  49. package/Build/Workers/{chunk-VLGVUVJY.js → chunk-XPTKQIVN.js} +6 -6
  50. package/Build/Workers/{chunk-D5X2LOJ2.js → chunk-XYBFMHXA.js} +7 -7
  51. package/Build/Workers/{chunk-YNPZU55A.js → chunk-YFZMB6FZ.js} +6 -6
  52. package/Build/Workers/{chunk-YSDOO7AG.js → chunk-ZOVMWDPW.js} +5 -5
  53. package/Build/Workers/{chunk-5DF5RVIO.js → chunk-ZTGZMKAB.js} +16 -16
  54. package/Build/Workers/combineGeometry.js +21 -21
  55. package/Build/Workers/createBoxGeometry.js +15 -15
  56. package/Build/Workers/createBoxOutlineGeometry.js +13 -13
  57. package/Build/Workers/createCircleGeometry.js +23 -23
  58. package/Build/Workers/createCircleOutlineGeometry.js +16 -16
  59. package/Build/Workers/createCoplanarPolygonGeometry.js +30 -30
  60. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +28 -28
  61. package/Build/Workers/createCorridorGeometry.js +26 -26
  62. package/Build/Workers/createCorridorOutlineGeometry.js +25 -25
  63. package/Build/Workers/createCylinderGeometry.js +17 -17
  64. package/Build/Workers/createCylinderOutlineGeometry.js +15 -15
  65. package/Build/Workers/createEllipseGeometry.js +23 -23
  66. package/Build/Workers/createEllipseOutlineGeometry.js +16 -16
  67. package/Build/Workers/createEllipsoidGeometry.js +16 -16
  68. package/Build/Workers/createEllipsoidOutlineGeometry.js +15 -15
  69. package/Build/Workers/createFrustumGeometry.js +15 -15
  70. package/Build/Workers/createFrustumOutlineGeometry.js +15 -15
  71. package/Build/Workers/createGeometry.js +21 -21
  72. package/Build/Workers/createGroundPolylineGeometry.js +19 -19
  73. package/Build/Workers/createPlaneGeometry.js +13 -13
  74. package/Build/Workers/createPlaneOutlineGeometry.js +12 -12
  75. package/Build/Workers/createPolygonGeometry.js +29 -29
  76. package/Build/Workers/createPolygonOutlineGeometry.js +27 -27
  77. package/Build/Workers/createPolylineGeometry.js +22 -22
  78. package/Build/Workers/createPolylineVolumeGeometry.js +28 -28
  79. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +24 -24
  80. package/Build/Workers/createRectangleGeometry.js +24 -24
  81. package/Build/Workers/createRectangleOutlineGeometry.js +17 -17
  82. package/Build/Workers/createSimplePolylineGeometry.js +20 -20
  83. package/Build/Workers/createSphereGeometry.js +16 -16
  84. package/Build/Workers/createSphereOutlineGeometry.js +15 -15
  85. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  86. package/Build/Workers/createVectorTileClampedPolylines.js +12 -12
  87. package/Build/Workers/createVectorTileGeometries.js +21 -21
  88. package/Build/Workers/createVectorTilePoints.js +11 -11
  89. package/Build/Workers/createVectorTilePolygons.js +19 -19
  90. package/Build/Workers/createVectorTilePolylines.js +12 -12
  91. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +19 -19
  92. package/Build/Workers/createVerticesFromHeightmap.js +19 -19
  93. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +16 -16
  94. package/Build/Workers/createWallGeometry.js +21 -21
  95. package/Build/Workers/createWallOutlineGeometry.js +20 -20
  96. package/Build/Workers/decodeDraco.js +10 -10
  97. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  98. package/Build/Workers/decodeI3S.js +9 -9
  99. package/Build/Workers/gaussianSplatSorter.js +4 -4
  100. package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
  101. package/Build/Workers/transcodeKTX2.js +6 -6
  102. package/Build/Workers/transferTypedArrayTest.js +1 -1
  103. package/Build/Workers/upsampleQuantizedTerrainMesh.js +19 -19
  104. package/Source/Core/Event.js +94 -53
  105. package/Source/Core/GoogleMaps.js +2 -2
  106. package/Source/Core/Ion.js +1 -1
  107. package/Source/Core/IonResource.js +30 -4
  108. package/Source/Core/Resource.js +5 -1
  109. package/Source/DataSources/KmlDataSource.js +62 -63
  110. package/Source/DataSources/exportKml.js +27 -30
  111. package/Source/Scene/ArcGisMapService.js +1 -1
  112. package/Source/Scene/Azure2DImageryProvider.js +308 -0
  113. package/Source/Scene/Billboard.js +4 -0
  114. package/Source/Scene/BillboardCollection.js +9 -2
  115. package/Source/Scene/ClippingPlaneCollection.js +3 -3
  116. package/Source/Scene/ClippingPolygon.js +91 -2
  117. package/Source/Scene/CreditDisplay.js +1 -1
  118. package/Source/Scene/GaussianSplat3DTileContent.js +54 -9
  119. package/Source/Scene/GaussianSplatPrimitive.js +49 -50
  120. package/Source/Scene/Google2DImageryProvider.js +614 -0
  121. package/Source/Scene/IonImageryProvider.js +22 -1
  122. package/Source/Scene/LabelCollection.js +1 -0
  123. package/Source/Scene/Material.js +248 -80
  124. package/Source/Scene/Primitive.js +6 -0
  125. package/Source/Scene/PrimitiveState.js +123 -0
  126. package/Source/Scene/Scene.js +2 -2
  127. package/Source/Scene/VoxelBoundsCollection.js +494 -0
  128. package/Source/Scene/VoxelBoxShape.js +236 -101
  129. package/Source/Scene/VoxelCylinderShape.js +315 -204
  130. package/Source/Scene/VoxelEllipsoidShape.js +402 -119
  131. package/Source/Scene/VoxelPrimitive.js +119 -84
  132. package/Source/Scene/VoxelRenderResources.js +17 -10
  133. package/Source/Scene/VoxelShape.js +21 -6
  134. package/Source/Scene/buildVoxelDrawCommands.js +61 -20
  135. package/Source/Scene/createGooglePhotorealistic3DTileset.js +1 -1
  136. package/Source/Scene/getClippingFunction.js +79 -88
  137. package/Source/Shaders/BillboardCollectionVS.glsl +2 -0
  138. package/Source/Shaders/BillboardCollectionVS.js +2 -0
  139. package/Source/Shaders/Voxels/IntersectBox.glsl +20 -33
  140. package/Source/Shaders/Voxels/IntersectBox.js +20 -33
  141. package/Source/Shaders/Voxels/IntersectCylinder.glsl +28 -32
  142. package/Source/Shaders/Voxels/IntersectCylinder.js +28 -32
  143. package/Source/Shaders/Voxels/IntersectDepth.glsl +1 -4
  144. package/Source/Shaders/Voxels/IntersectDepth.js +1 -4
  145. package/Source/Shaders/Voxels/IntersectEllipsoid.glsl +12 -20
  146. package/Source/Shaders/Voxels/IntersectEllipsoid.js +12 -20
  147. package/Source/Shaders/Voxels/IntersectLongitude.glsl +21 -9
  148. package/Source/Shaders/Voxels/IntersectLongitude.js +21 -9
  149. package/Source/Shaders/Voxels/{IntersectClippingPlanes.glsl → IntersectPlane.glsl} +5 -3
  150. package/Source/Shaders/Voxels/{IntersectClippingPlanes.js → IntersectPlane.js} +5 -3
  151. package/Source/Shaders/Voxels/Intersection.glsl +3 -3
  152. package/Source/Shaders/Voxels/Intersection.js +3 -3
  153. package/Source/Shaders/Voxels/Octree.glsl +46 -51
  154. package/Source/Shaders/Voxels/Octree.js +46 -51
  155. package/Source/Shaders/Voxels/VoxelFS.glsl +50 -48
  156. package/Source/Shaders/Voxels/VoxelFS.js +50 -48
  157. package/Source/Shaders/Voxels/VoxelUtils.glsl +0 -19
  158. package/Source/Shaders/Voxels/VoxelUtils.js +0 -19
  159. package/Source/Shaders/Voxels/convertLocalToBoxUv.glsl +30 -0
  160. package/Source/Shaders/Voxels/convertLocalToBoxUv.js +32 -0
  161. package/Source/Shaders/Voxels/convertLocalToCylinderUv.glsl +97 -0
  162. package/Source/Shaders/Voxels/convertLocalToCylinderUv.js +99 -0
  163. package/Source/Shaders/Voxels/convertLocalToEllipsoidUv.glsl +193 -0
  164. package/Source/Shaders/Voxels/convertLocalToEllipsoidUv.js +195 -0
  165. package/Source/ThirdParty/Workers/zip-web-worker.js +1 -0
  166. package/Source/ThirdParty/zip-module.wasm +0 -0
  167. package/index.d.ts +317 -14
  168. package/index.js +177 -175
  169. package/package.json +2 -2
  170. package/Build/ThirdParty/Workers/pako_deflate.min.js +0 -503
  171. package/Build/ThirdParty/Workers/pako_inflate.min.js +0 -698
  172. package/Build/ThirdParty/Workers/z-worker-pako.js +0 -601
  173. package/Source/Core/defaultValue.js +0 -48
  174. package/Source/Shaders/Voxels/convertUvToBox.glsl +0 -45
  175. package/Source/Shaders/Voxels/convertUvToBox.js +0 -46
  176. package/Source/Shaders/Voxels/convertUvToCylinder.glsl +0 -99
  177. package/Source/Shaders/Voxels/convertUvToCylinder.js +0 -101
  178. package/Source/Shaders/Voxels/convertUvToEllipsoid.glsl +0 -139
  179. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +0 -141
  180. package/Source/ThirdParty/Workers/pako_deflate.min.js +0 -2
  181. package/Source/ThirdParty/Workers/pako_inflate.min.js +0 -2
  182. package/Source/ThirdParty/Workers/z-worker-pako.js +0 -1
@@ -30,6 +30,11 @@ struct TraversalData {\n\
30
30
  int parentOctreeIndex;\n\
31
31
  };\n\
32
32
  \n\
33
+ struct TileAndUvCoordinate {\n\
34
+ ivec4 tileCoords;\n\
35
+ vec3 tileUv;\n\
36
+ };\n\
37
+ \n\
33
38
  struct SampleData {\n\
34
39
  int megatextureIndex;\n\
35
40
  ivec4 tileCoords;\n\
@@ -80,23 +85,20 @@ int getOctreeParentIndex(in int octreeIndex) {\n\
80
85
  return parentOctreeIndex;\n\
81
86
  }\n\
82
87
  \n\
83
- /**\n\
84
- * Convert a position in the uv-space of the tileset bounding shape\n\
85
- * into the uv-space of a tile within the tileset\n\
86
- */\n\
87
- vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
88
- // PERFORMANCE_IDEA: use bit-shifting (only in WebGL2)\n\
89
- float dimAtLevel = exp2(float(octreeCoords.w));\n\
90
- return shapePosition * dimAtLevel - vec3(octreeCoords.xyz);\n\
88
+ vec3 getTileUv(in TileAndUvCoordinate tileAndUv, in ivec4 octreeCoords) {\n\
89
+ int levelDifference = tileAndUv.tileCoords.w - octreeCoords.w;\n\
90
+ float scalar = exp2(-1.0 * float(levelDifference));\n\
91
+ vec3 originShift = vec3(tileAndUv.tileCoords.xyz - (octreeCoords.xyz << levelDifference)) * scalar;\n\
92
+ return tileAndUv.tileUv * scalar + originShift;\n\
91
93
  }\n\
92
94
  \n\
93
- vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
94
- vec3 tileUv = getTileUv(shapePosition, octreeCoords);\n\
95
+ vec3 getClampedTileUv(in TileAndUvCoordinate tileAndUv, in ivec4 octreeCoords) {\n\
96
+ vec3 tileUv = getTileUv(tileAndUv, octreeCoords);\n\
95
97
  return clamp(tileUv, vec3(0.0), vec3(1.0));\n\
96
98
  }\n\
97
99
  \n\
98
- void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) {\n\
99
- vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords);\n\
100
+ void addSampleCoordinates(in TileAndUvCoordinate tileAndUv, inout SampleData sampleData) {\n\
101
+ vec3 tileUv = getClampedTileUv(tileAndUv, sampleData.tileCoords);\n\
100
102
  \n\
101
103
  vec3 inputCoordinate = tileUv * vec3(u_dimensions);\n\
102
104
  #if defined(PADDING)\n\
@@ -163,32 +165,25 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
163
165
  }\n\
164
166
  #endif\n\
165
167
  \n\
166
- OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) {\n\
167
- float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w));\n\
168
- vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel;\n\
169
- vec3 end = start + vec3(sizeAtLevel);\n\
168
+ OctreeNodeData traverseOctreeDownwards(in ivec4 tileCoordinate, inout TraversalData traversalData) {\n\
170
169
  OctreeNodeData childData;\n\
171
170
  \n\
172
171
  for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) {\n\
173
- // Find out which octree child contains the position\n\
174
- // 0 if before center, 1 if after\n\
175
- vec3 center = 0.5 * (start + end);\n\
176
- vec3 childCoord = step(center, shapePosition);\n\
177
- \n\
178
- // Get octree coords for the next level down\n\
179
- ivec4 octreeCoords = traversalData.octreeCoords;\n\
180
- traversalData.octreeCoords = ivec4(octreeCoords.xyz * 2 + ivec3(childCoord), octreeCoords.w + 1);\n\
172
+ // tileCoordinate.xyz is defined at the level of detail tileCoordinate.w.\n\
173
+ // Find the corresponding coordinate at the level traversalData.octreeCoords.w\n\
174
+ int level = traversalData.octreeCoords.w + 1;\n\
175
+ int levelDifference = tileCoordinate.w - level;\n\
176
+ ivec3 coordinateAtLevel = tileCoordinate.xyz >> levelDifference;\n\
177
+ traversalData.octreeCoords = ivec4(coordinateAtLevel, level);\n\
181
178
  \n\
182
- childData = getOctreeChildData(traversalData.parentOctreeIndex, ivec3(childCoord));\n\
179
+ ivec3 childCoordinate = coordinateAtLevel & 1;\n\
180
+ childData = getOctreeChildData(traversalData.parentOctreeIndex, childCoordinate);\n\
183
181
  \n\
184
182
  if (childData.flag != OCTREE_FLAG_INTERNAL) {\n\
185
183
  // leaf tile - stop traversing\n\
186
184
  break;\n\
187
185
  }\n\
188
186
  \n\
189
- // interior tile - keep going deeper\n\
190
- start = mix(start, center, childCoord);\n\
191
- end = mix(center, end, childCoord);\n\
192
187
  traversalData.parentOctreeIndex = childData.data;\n\
193
188
  }\n\
194
189
  \n\
@@ -199,50 +194,50 @@ OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalDat
199
194
  * Transform a given position to an octree tile coordinate and a position within that tile,\n\
200
195
  * and find the corresponding megatexture index and texture coordinates\n\
201
196
  */\n\
202
- void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) {\n\
197
+ void traverseOctreeFromBeginning(in TileAndUvCoordinate tileAndUv, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) {\n\
203
198
  traversalData.octreeCoords = ivec4(0);\n\
204
199
  traversalData.parentOctreeIndex = 0;\n\
205
200
  \n\
206
201
  OctreeNodeData nodeData = getOctreeNodeData(vec2(0.0));\n\
207
202
  if (nodeData.flag != OCTREE_FLAG_LEAF) {\n\
208
- nodeData = traverseOctreeDownwards(shapePosition, traversalData);\n\
203
+ nodeData = traverseOctreeDownwards(tileAndUv.tileCoords, traversalData);\n\
209
204
  }\n\
210
205
  \n\
211
206
  #if (SAMPLE_COUNT == 1)\n\
212
207
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
213
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
208
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
214
209
  #else\n\
215
210
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
216
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
217
- addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
211
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
212
+ addSampleCoordinates(tileAndUv, sampleDatas[1]);\n\
218
213
  #endif\n\
219
214
  }\n\
220
215
  \n\
221
- bool inRange(in vec3 v, in vec3 minVal, in vec3 maxVal) {\n\
222
- return clamp(v, minVal, maxVal) == v;\n\
223
- }\n\
224
- \n\
225
- bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
226
- vec3 tileUv = getTileUv(shapePosition, octreeCoords);\n\
227
- bool inside = inRange(tileUv, vec3(0.0), vec3(1.0));\n\
228
- // Assume (!) the position is always inside the root tile.\n\
229
- return inside || octreeCoords.w == 0;\n\
216
+ bool insideTile(in ivec4 tileCoordinate, in ivec4 octreeCoords) {\n\
217
+ int levelDifference = tileCoordinate.w - octreeCoords.w;\n\
218
+ if (levelDifference < 0) {\n\
219
+ return false;\n\
220
+ }\n\
221
+ ivec3 coordinateAtLevel = tileCoordinate.xyz >> levelDifference;\n\
222
+ return coordinateAtLevel == octreeCoords.xyz;\n\
230
223
  }\n\
231
224
  \n\
232
- void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
233
- if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
225
+ void traverseOctreeFromExisting(in TileAndUvCoordinate tileAndUv, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
226
+ ivec4 tileCoords = tileAndUv.tileCoords;\n\
227
+ if (insideTile(tileCoords, traversalData.octreeCoords)) {\n\
234
228
  for (int i = 0; i < SAMPLE_COUNT; i++) {\n\
235
- addSampleCoordinates(shapePosition, sampleDatas[i]);\n\
229
+ addSampleCoordinates(tileAndUv, sampleDatas[i]);\n\
236
230
  }\n\
237
231
  return;\n\
238
232
  }\n\
239
233
  \n\
240
- // Go up tree until we find a parent tile containing shapePosition\n\
234
+ // Go up tree until we find a parent tile containing tileCoords.\n\
235
+ // Assumes all parents are available all they way up to the root.\n\
241
236
  for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) {\n\
242
237
  traversalData.octreeCoords.xyz /= 2;\n\
243
238
  traversalData.octreeCoords.w -= 1;\n\
244
239
  \n\
245
- if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
240
+ if (insideTile(tileCoords, traversalData.octreeCoords)) {\n\
246
241
  break;\n\
247
242
  }\n\
248
243
  \n\
@@ -250,15 +245,15 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
250
245
  }\n\
251
246
  \n\
252
247
  // Go down tree\n\
253
- OctreeNodeData nodeData = traverseOctreeDownwards(shapePosition, traversalData);\n\
248
+ OctreeNodeData nodeData = traverseOctreeDownwards(tileCoords, traversalData);\n\
254
249
  \n\
255
250
  #if (SAMPLE_COUNT == 1)\n\
256
251
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
257
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
252
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
258
253
  #else\n\
259
254
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
260
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
261
- addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
255
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
256
+ addSampleCoordinates(tileAndUv, sampleDatas[1]);\n\
262
257
  #endif\n\
263
258
  }\n\
264
259
  ";
@@ -1,9 +1,9 @@
1
1
  // See Intersection.glsl for the definition of intersectScene
2
2
  // See IntersectionUtils.glsl for the definition of nextIntersection
3
- // See convertUvToBox.glsl, convertUvToCylinder.glsl, or convertUvToEllipsoid.glsl
4
- // for the definition of convertUvToShapeUvSpace. The appropriate function is
5
- // selected based on the VoxelPrimitive shape type, and added to the shader in
6
- // Scene/VoxelRenderResources.js.
3
+ // See convertLocalToBoxUv.glsl, convertLocalToCylinderUv.glsl, or convertLocalToEllipsoidUv.glsl
4
+ // for the definitions of convertLocalToShapeSpaceDerivative and getTileAndUvCoordinate.
5
+ // The appropriate functions are selected based on the VoxelPrimitive shape type,
6
+ // and added to the shader in Scene/VoxelRenderResources.js.
7
7
  // See Octree.glsl for the definitions of TraversalData, SampleData,
8
8
  // traverseOctreeFromBeginning, and traverseOctreeFromExisting
9
9
  // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture
@@ -15,10 +15,10 @@
15
15
  #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0
16
16
  #endif
17
17
 
18
- uniform mat4 u_transformPositionUvToView;
18
+ uniform mat4 u_transformPositionViewToLocal;
19
19
  uniform mat3 u_transformDirectionViewToLocal;
20
- uniform vec3 u_cameraPositionUv;
21
- uniform vec3 u_cameraDirectionUv;
20
+ uniform vec3 u_cameraPositionLocal;
21
+ uniform vec3 u_cameraDirectionLocal;
22
22
  uniform float u_stepSize;
23
23
 
24
24
  #if defined(PICKING)
@@ -63,16 +63,15 @@ RayShapeIntersection getVoxelIntersection(in vec3 tileUv, in vec3 sampleSizeAlon
63
63
  }
64
64
 
65
65
  vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersection shapeIntersection, in mat3 jacobianT, in float currentT) {
66
- // The Jacobian is computed in a space where the shape spans [-1, 1].
67
- // But the ray is marched in a space where the shape fills [0, 1].
68
- // So we need to scale the Jacobian by 2.
69
- vec3 gradient = 2.0 * viewRay.rawDir * jacobianT;
66
+ vec3 gradient = viewRay.dir * jacobianT;
70
67
  vec3 sampleSizeAlongRay = getSampleSize(sampleData.tileCoords.w) / gradient;
71
68
 
72
69
  RayShapeIntersection voxelIntersection = getVoxelIntersection(sampleData.tileUv, sampleSizeAlongRay);
73
70
 
74
- // Transform normal from shape space to Cartesian space
75
- vec3 voxelNormal = normalize(jacobianT * voxelIntersection.entry.xyz);
71
+ // Transform normal from shape space to Cartesian space to eye space
72
+ vec3 voxelNormal = jacobianT * voxelIntersection.entry.xyz;
73
+ voxelNormal = normalize(czm_normal * voxelNormal);
74
+
76
75
  // Compare with the shape intersection, to choose the appropriate normal
77
76
  vec4 voxelEntry = vec4(voxelNormal, currentT + voxelIntersection.entry.w);
78
77
  vec4 entry = intersectionMax(shapeIntersection.entry, voxelEntry);
@@ -114,37 +113,40 @@ int getSampleIndex(in SampleData sampleData) {
114
113
  }
115
114
 
116
115
  /**
117
- * Compute the view ray at the current fragment, in the local UV coordinates of the shape.
116
+ * Compute the view ray at the current fragment, in the local coordinates of the shape.
118
117
  */
119
- Ray getViewRayUv() {
118
+ Ray getViewRayLocal() {
120
119
  vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);
121
- vec3 viewDirUv;
122
- vec3 viewPosUv;
120
+ vec3 origin;
121
+ vec3 direction;
123
122
  if (czm_orthographicIn3D == 1.0) {
124
123
  eyeCoordinates.z = 0.0;
125
- viewPosUv = (u_transformPositionViewToUv * eyeCoordinates).xyz;
126
- viewDirUv = normalize(u_cameraDirectionUv);
124
+ origin = (u_transformPositionViewToLocal * eyeCoordinates).xyz;
125
+ direction = u_cameraDirectionLocal;
127
126
  } else {
128
- viewPosUv = u_cameraPositionUv;
129
- viewDirUv = normalize(u_transformDirectionViewToLocal * eyeCoordinates.xyz);
127
+ origin = u_cameraPositionLocal;
128
+ direction = u_transformDirectionViewToLocal * normalize(eyeCoordinates.xyz);
130
129
  }
131
- #if defined(SHAPE_ELLIPSOID)
132
- // viewDirUv has been scaled to a space where the ellipsoid is a sphere.
133
- // Undo this scaling to get the raw direction.
134
- vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv;
135
- return Ray(viewPosUv, viewDirUv, rawDir);
136
- #else
137
- return Ray(viewPosUv, viewDirUv, viewDirUv);
138
- #endif
130
+ return Ray(origin, direction);
131
+ }
132
+
133
+ Ray getViewRayEC() {
134
+ vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);
135
+ vec3 viewPosEC = (czm_orthographicIn3D == 1.0)
136
+ ? vec3(eyeCoordinates.xy, 0.0)
137
+ : vec3(0.0);
138
+ vec3 viewDirEC = normalize(eyeCoordinates.xyz);
139
+ return Ray(viewPosEC, viewDirEC);
139
140
  }
140
141
 
141
142
  void main()
142
143
  {
143
- Ray viewRayUv = getViewRayUv();
144
+ Ray viewRayLocal = getViewRayLocal();
145
+ Ray viewRayEC = getViewRayEC();
144
146
 
145
147
  Intersections ix;
146
148
  vec2 screenCoord = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]
147
- RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix);
149
+ RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayLocal, viewRayEC, ix);
148
150
  // Exit early if the scene was completely missed.
149
151
  if (shapeIntersection.entry.w == NO_HIT) {
150
152
  discard;
@@ -152,20 +154,17 @@ void main()
152
154
 
153
155
  float currentT = shapeIntersection.entry.w;
154
156
  float endT = shapeIntersection.exit.w;
155
- vec3 positionUv = viewRayUv.pos + currentT * viewRayUv.dir;
156
- PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);
157
+
158
+ vec3 positionEC = viewRayEC.pos + currentT * viewRayEC.dir;
159
+ TileAndUvCoordinate tileAndUv = getTileAndUvCoordinate(positionEC);
160
+ vec3 positionLocal = viewRayLocal.pos + currentT * viewRayLocal.dir;
161
+ mat3 jacobianT = convertLocalToShapeSpaceDerivative(positionLocal);
157
162
 
158
163
  // Traverse the tree from the start position
159
164
  TraversalData traversalData;
160
165
  SampleData sampleDatas[SAMPLE_COUNT];
161
- traverseOctreeFromBeginning(pointJacobian.point, traversalData, sampleDatas);
162
- vec4 step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT);
163
-
164
- #if defined(JITTER)
165
- float noise = hash(screenCoord); // [0,1]
166
- currentT += noise * step.w;
167
- positionUv += noise * step.w * viewRayUv.dir;
168
- #endif
166
+ traverseOctreeFromBeginning(tileAndUv, traversalData, sampleDatas);
167
+ vec4 step = getStepSize(sampleDatas[0], viewRayLocal, shapeIntersection, jacobianT, currentT);
169
168
 
170
169
  FragmentInput fragmentInput;
171
170
  #if defined(STATISTICS)
@@ -182,10 +181,11 @@ void main()
182
181
  // Prepare the custom shader inputs
183
182
  copyPropertiesToMetadata(properties, fragmentInput.metadata);
184
183
 
185
- fragmentInput.attributes.positionEC = vec3(u_transformPositionUvToView * vec4(positionUv, 1.0));
186
- fragmentInput.attributes.normalEC = normalize(czm_normal * step.xyz);
184
+ fragmentInput.attributes.positionEC = positionEC;
185
+ // Re-normalize normals: some shape intersections may have been scaled to encode positive/negative shapes
186
+ fragmentInput.attributes.normalEC = normalize(step.xyz);
187
187
 
188
- fragmentInput.voxel.viewDirUv = viewRayUv.dir;
188
+ fragmentInput.voxel.viewDirUv = viewRayLocal.dir;
189
189
 
190
190
  fragmentInput.voxel.travelDistance = step.w;
191
191
  fragmentInput.voxel.stepCount = stepCount;
@@ -233,13 +233,15 @@ void main()
233
233
  }
234
234
  #endif
235
235
  }
236
- positionUv = viewRayUv.pos + currentT * viewRayUv.dir;
236
+ positionEC = viewRayEC.pos + currentT * viewRayEC.dir;
237
+ tileAndUv = getTileAndUvCoordinate(positionEC);
238
+ positionLocal = viewRayLocal.pos + currentT * viewRayLocal.dir;
239
+ jacobianT = convertLocalToShapeSpaceDerivative(positionLocal);
237
240
 
238
241
  // Traverse the tree from the current ray position.
239
242
  // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step.
240
- pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);
241
- traverseOctreeFromExisting(pointJacobian.point, traversalData, sampleDatas);
242
- step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT);
243
+ traverseOctreeFromExisting(tileAndUv, traversalData, sampleDatas);
244
+ step = getStepSize(sampleDatas[0], viewRayLocal, shapeIntersection, jacobianT, currentT);
243
245
  }
244
246
 
245
247
  // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1]
@@ -1,10 +1,10 @@
1
1
  //This file is automatically rebuilt by the Cesium build process.
2
2
  export default "// See Intersection.glsl for the definition of intersectScene\n\
3
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\
4
+ // See convertLocalToBoxUv.glsl, convertLocalToCylinderUv.glsl, or convertLocalToEllipsoidUv.glsl\n\
5
+ // for the definitions of convertLocalToShapeSpaceDerivative and getTileAndUvCoordinate. \n\
6
+ // The appropriate functions are selected based on the VoxelPrimitive shape type, \n\
7
+ // and added to the shader in Scene/VoxelRenderResources.js.\n\
8
8
  // See Octree.glsl for the definitions of TraversalData, SampleData,\n\
9
9
  // traverseOctreeFromBeginning, and traverseOctreeFromExisting\n\
10
10
  // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture\n\
@@ -16,10 +16,10 @@ export default "// See Intersection.glsl for the definition of intersectScene\n\
16
16
  #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0\n\
17
17
  #endif\n\
18
18
  \n\
19
- uniform mat4 u_transformPositionUvToView;\n\
19
+ uniform mat4 u_transformPositionViewToLocal;\n\
20
20
  uniform mat3 u_transformDirectionViewToLocal;\n\
21
- uniform vec3 u_cameraPositionUv;\n\
22
- uniform vec3 u_cameraDirectionUv;\n\
21
+ uniform vec3 u_cameraPositionLocal;\n\
22
+ uniform vec3 u_cameraDirectionLocal;\n\
23
23
  uniform float u_stepSize;\n\
24
24
  \n\
25
25
  #if defined(PICKING)\n\
@@ -64,16 +64,15 @@ RayShapeIntersection getVoxelIntersection(in vec3 tileUv, in vec3 sampleSizeAlon
64
64
  }\n\
65
65
  \n\
66
66
  vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersection shapeIntersection, in mat3 jacobianT, in float currentT) {\n\
67
- // The Jacobian is computed in a space where the shape spans [-1, 1].\n\
68
- // But the ray is marched in a space where the shape fills [0, 1].\n\
69
- // So we need to scale the Jacobian by 2.\n\
70
- vec3 gradient = 2.0 * viewRay.rawDir * jacobianT;\n\
67
+ vec3 gradient = viewRay.dir * jacobianT;\n\
71
68
  vec3 sampleSizeAlongRay = getSampleSize(sampleData.tileCoords.w) / gradient;\n\
72
69
  \n\
73
70
  RayShapeIntersection voxelIntersection = getVoxelIntersection(sampleData.tileUv, sampleSizeAlongRay);\n\
74
71
  \n\
75
- // Transform normal from shape space to Cartesian space\n\
76
- vec3 voxelNormal = normalize(jacobianT * voxelIntersection.entry.xyz);\n\
72
+ // Transform normal from shape space to Cartesian space to eye space\n\
73
+ vec3 voxelNormal = jacobianT * voxelIntersection.entry.xyz;\n\
74
+ voxelNormal = normalize(czm_normal * voxelNormal);\n\
75
+ \n\
77
76
  // Compare with the shape intersection, to choose the appropriate normal\n\
78
77
  vec4 voxelEntry = vec4(voxelNormal, currentT + voxelIntersection.entry.w);\n\
79
78
  vec4 entry = intersectionMax(shapeIntersection.entry, voxelEntry);\n\
@@ -115,37 +114,40 @@ int getSampleIndex(in SampleData sampleData) {\n\
115
114
  }\n\
116
115
  \n\
117
116
  /**\n\
118
- * Compute the view ray at the current fragment, in the local UV coordinates of the shape.\n\
117
+ * Compute the view ray at the current fragment, in the local coordinates of the shape.\n\
119
118
  */\n\
120
- Ray getViewRayUv() {\n\
119
+ Ray getViewRayLocal() {\n\
121
120
  vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);\n\
122
- vec3 viewDirUv;\n\
123
- vec3 viewPosUv;\n\
121
+ vec3 origin;\n\
122
+ vec3 direction;\n\
124
123
  if (czm_orthographicIn3D == 1.0) {\n\
125
124
  eyeCoordinates.z = 0.0;\n\
126
- viewPosUv = (u_transformPositionViewToUv * eyeCoordinates).xyz;\n\
127
- viewDirUv = normalize(u_cameraDirectionUv);\n\
125
+ origin = (u_transformPositionViewToLocal * eyeCoordinates).xyz;\n\
126
+ direction = u_cameraDirectionLocal;\n\
128
127
  } else {\n\
129
- viewPosUv = u_cameraPositionUv;\n\
130
- viewDirUv = normalize(u_transformDirectionViewToLocal * eyeCoordinates.xyz);\n\
128
+ origin = u_cameraPositionLocal;\n\
129
+ direction = u_transformDirectionViewToLocal * normalize(eyeCoordinates.xyz);\n\
131
130
  }\n\
132
- #if defined(SHAPE_ELLIPSOID)\n\
133
- // viewDirUv has been scaled to a space where the ellipsoid is a sphere.\n\
134
- // Undo this scaling to get the raw direction.\n\
135
- vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv;\n\
136
- return Ray(viewPosUv, viewDirUv, rawDir);\n\
137
- #else\n\
138
- return Ray(viewPosUv, viewDirUv, viewDirUv);\n\
139
- #endif\n\
131
+ return Ray(origin, direction);\n\
132
+ }\n\
133
+ \n\
134
+ Ray getViewRayEC() {\n\
135
+ vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);\n\
136
+ vec3 viewPosEC = (czm_orthographicIn3D == 1.0)\n\
137
+ ? vec3(eyeCoordinates.xy, 0.0)\n\
138
+ : vec3(0.0);\n\
139
+ vec3 viewDirEC = normalize(eyeCoordinates.xyz);\n\
140
+ return Ray(viewPosEC, viewDirEC);\n\
140
141
  }\n\
141
142
  \n\
142
143
  void main()\n\
143
144
  {\n\
144
- Ray viewRayUv = getViewRayUv();\n\
145
+ Ray viewRayLocal = getViewRayLocal();\n\
146
+ Ray viewRayEC = getViewRayEC();\n\
145
147
  \n\
146
148
  Intersections ix;\n\
147
149
  vec2 screenCoord = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]\n\
148
- RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix);\n\
150
+ RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayLocal, viewRayEC, ix);\n\
149
151
  // Exit early if the scene was completely missed.\n\
150
152
  if (shapeIntersection.entry.w == NO_HIT) {\n\
151
153
  discard;\n\
@@ -153,20 +155,17 @@ void main()\n\
153
155
  \n\
154
156
  float currentT = shapeIntersection.entry.w;\n\
155
157
  float endT = shapeIntersection.exit.w;\n\
156
- vec3 positionUv = viewRayUv.pos + currentT * viewRayUv.dir;\n\
157
- PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);\n\
158
+ \n\
159
+ vec3 positionEC = viewRayEC.pos + currentT * viewRayEC.dir;\n\
160
+ TileAndUvCoordinate tileAndUv = getTileAndUvCoordinate(positionEC);\n\
161
+ vec3 positionLocal = viewRayLocal.pos + currentT * viewRayLocal.dir;\n\
162
+ mat3 jacobianT = convertLocalToShapeSpaceDerivative(positionLocal);\n\
158
163
  \n\
159
164
  // Traverse the tree from the start position\n\
160
165
  TraversalData traversalData;\n\
161
166
  SampleData sampleDatas[SAMPLE_COUNT];\n\
162
- traverseOctreeFromBeginning(pointJacobian.point, traversalData, sampleDatas);\n\
163
- vec4 step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT);\n\
164
- \n\
165
- #if defined(JITTER)\n\
166
- float noise = hash(screenCoord); // [0,1]\n\
167
- currentT += noise * step.w;\n\
168
- positionUv += noise * step.w * viewRayUv.dir;\n\
169
- #endif\n\
167
+ traverseOctreeFromBeginning(tileAndUv, traversalData, sampleDatas);\n\
168
+ vec4 step = getStepSize(sampleDatas[0], viewRayLocal, shapeIntersection, jacobianT, currentT);\n\
170
169
  \n\
171
170
  FragmentInput fragmentInput;\n\
172
171
  #if defined(STATISTICS)\n\
@@ -183,10 +182,11 @@ void main()\n\
183
182
  // Prepare the custom shader inputs\n\
184
183
  copyPropertiesToMetadata(properties, fragmentInput.metadata);\n\
185
184
  \n\
186
- fragmentInput.attributes.positionEC = vec3(u_transformPositionUvToView * vec4(positionUv, 1.0));\n\
187
- fragmentInput.attributes.normalEC = normalize(czm_normal * step.xyz);\n\
185
+ fragmentInput.attributes.positionEC = positionEC;\n\
186
+ // Re-normalize normals: some shape intersections may have been scaled to encode positive/negative shapes\n\
187
+ fragmentInput.attributes.normalEC = normalize(step.xyz);\n\
188
188
  \n\
189
- fragmentInput.voxel.viewDirUv = viewRayUv.dir;\n\
189
+ fragmentInput.voxel.viewDirUv = viewRayLocal.dir;\n\
190
190
  \n\
191
191
  fragmentInput.voxel.travelDistance = step.w;\n\
192
192
  fragmentInput.voxel.stepCount = stepCount;\n\
@@ -234,13 +234,15 @@ void main()\n\
234
234
  }\n\
235
235
  #endif\n\
236
236
  }\n\
237
- positionUv = viewRayUv.pos + currentT * viewRayUv.dir;\n\
237
+ positionEC = viewRayEC.pos + currentT * viewRayEC.dir;\n\
238
+ tileAndUv = getTileAndUvCoordinate(positionEC);\n\
239
+ positionLocal = viewRayLocal.pos + currentT * viewRayLocal.dir;\n\
240
+ jacobianT = convertLocalToShapeSpaceDerivative(positionLocal);\n\
238
241
  \n\
239
242
  // Traverse the tree from the current ray position.\n\
240
243
  // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step.\n\
241
- pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);\n\
242
- traverseOctreeFromExisting(pointJacobian.point, traversalData, sampleDatas);\n\
243
- step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT);\n\
244
+ traverseOctreeFromExisting(tileAndUv, traversalData, sampleDatas);\n\
245
+ step = getStepSize(sampleDatas[0], viewRayLocal, shapeIntersection, jacobianT, currentT);\n\
244
246
  }\n\
245
247
  \n\
246
248
  // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1]\n\
@@ -1,22 +1,8 @@
1
1
  struct Ray {
2
2
  vec3 pos;
3
3
  vec3 dir;
4
- vec3 rawDir;
5
4
  };
6
5
 
7
- #if defined(JITTER)
8
- /**
9
- * Generate a pseudo-random value for a given 2D screen coordinate.
10
- * Similar to https://www.shadertoy.com/view/4djSRW with a modified hashscale.
11
- */
12
- float hash(vec2 p)
13
- {
14
- vec3 p3 = fract(vec3(p.xyx) * 50.0);
15
- p3 += dot(p3, p3.yzx + 19.19);
16
- return fract((p3.x + p3.y) * p3.z);
17
- }
18
- #endif
19
-
20
6
  float minComponent(in vec3 v) {
21
7
  return min(min(v.x, v.y), v.z);
22
8
  }
@@ -24,8 +10,3 @@ float minComponent(in vec3 v) {
24
10
  float maxComponent(in vec3 v) {
25
11
  return max(max(v.x, v.y), v.z);
26
12
  }
27
-
28
- struct PointJacobianT {
29
- vec3 point;
30
- mat3 jacobianT;
31
- };
@@ -2,22 +2,8 @@
2
2
  export default "struct Ray {\n\
3
3
  vec3 pos;\n\
4
4
  vec3 dir;\n\
5
- vec3 rawDir;\n\
6
5
  };\n\
7
6
  \n\
8
- #if defined(JITTER)\n\
9
- /**\n\
10
- * Generate a pseudo-random value for a given 2D screen coordinate.\n\
11
- * Similar to https://www.shadertoy.com/view/4djSRW with a modified hashscale.\n\
12
- */\n\
13
- float hash(vec2 p)\n\
14
- {\n\
15
- vec3 p3 = fract(vec3(p.xyx) * 50.0);\n\
16
- p3 += dot(p3, p3.yzx + 19.19);\n\
17
- return fract((p3.x + p3.y) * p3.z);\n\
18
- }\n\
19
- #endif\n\
20
- \n\
21
7
  float minComponent(in vec3 v) {\n\
22
8
  return min(min(v.x, v.y), v.z);\n\
23
9
  }\n\
@@ -25,9 +11,4 @@ float minComponent(in vec3 v) {\n\
25
11
  float maxComponent(in vec3 v) {\n\
26
12
  return max(max(v.x, v.y), v.z);\n\
27
13
  }\n\
28
- \n\
29
- struct PointJacobianT {\n\
30
- vec3 point;\n\
31
- mat3 jacobianT;\n\
32
- };\n\
33
14
  ";
@@ -0,0 +1,30 @@
1
+ uniform vec3 u_boxLocalToShapeUvScale;
2
+ uniform vec3 u_boxLocalToShapeUvTranslate;
3
+
4
+ uniform ivec4 u_cameraTileCoordinates;
5
+ uniform vec3 u_cameraTileUv;
6
+ uniform mat3 u_boxEcToXyz;
7
+
8
+ mat3 convertLocalToShapeSpaceDerivative(in vec3 positionLocal) {
9
+ // For BOX, local space = shape space, so the Jacobian is the identity matrix.
10
+ return mat3(1.0);
11
+ }
12
+
13
+ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {
14
+ return shapeUv / u_boxLocalToShapeUvScale;
15
+ }
16
+
17
+ vec3 convertEcToDeltaTile(in vec3 positionEC) {
18
+ vec3 dPosition = u_boxEcToXyz * positionEC;
19
+ return u_boxLocalToShapeUvScale * dPosition * float(1 << u_cameraTileCoordinates.w);
20
+ }
21
+
22
+ TileAndUvCoordinate getTileAndUvCoordinate(in vec3 positionEC) {
23
+ vec3 deltaTileCoordinate = convertEcToDeltaTile(positionEC);
24
+ vec3 tileUvSum = u_cameraTileUv + deltaTileCoordinate;
25
+ ivec3 tileCoordinate = u_cameraTileCoordinates.xyz + ivec3(floor(tileUvSum));
26
+ tileCoordinate = min(max(ivec3(0), tileCoordinate), ivec3((1 << u_cameraTileCoordinates.w) - 1));
27
+ ivec3 tileCoordinateChange = tileCoordinate - u_cameraTileCoordinates.xyz;
28
+ vec3 tileUv = clamp(tileUvSum - vec3(tileCoordinateChange), 0.0, 1.0);
29
+ return TileAndUvCoordinate(ivec4(tileCoordinate, u_cameraTileCoordinates.w), tileUv);
30
+ }
@@ -0,0 +1,32 @@
1
+ //This file is automatically rebuilt by the Cesium build process.
2
+ export default "uniform vec3 u_boxLocalToShapeUvScale;\n\
3
+ uniform vec3 u_boxLocalToShapeUvTranslate;\n\
4
+ \n\
5
+ uniform ivec4 u_cameraTileCoordinates;\n\
6
+ uniform vec3 u_cameraTileUv;\n\
7
+ uniform mat3 u_boxEcToXyz;\n\
8
+ \n\
9
+ mat3 convertLocalToShapeSpaceDerivative(in vec3 positionLocal) {\n\
10
+ // For BOX, local space = shape space, so the Jacobian is the identity matrix.\n\
11
+ return mat3(1.0);\n\
12
+ }\n\
13
+ \n\
14
+ vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) {\n\
15
+ return shapeUv / u_boxLocalToShapeUvScale;\n\
16
+ }\n\
17
+ \n\
18
+ vec3 convertEcToDeltaTile(in vec3 positionEC) {\n\
19
+ vec3 dPosition = u_boxEcToXyz * positionEC;\n\
20
+ return u_boxLocalToShapeUvScale * dPosition * float(1 << u_cameraTileCoordinates.w);\n\
21
+ }\n\
22
+ \n\
23
+ TileAndUvCoordinate getTileAndUvCoordinate(in vec3 positionEC) {\n\
24
+ vec3 deltaTileCoordinate = convertEcToDeltaTile(positionEC);\n\
25
+ vec3 tileUvSum = u_cameraTileUv + deltaTileCoordinate;\n\
26
+ ivec3 tileCoordinate = u_cameraTileCoordinates.xyz + ivec3(floor(tileUvSum));\n\
27
+ tileCoordinate = min(max(ivec3(0), tileCoordinate), ivec3((1 << u_cameraTileCoordinates.w) - 1));\n\
28
+ ivec3 tileCoordinateChange = tileCoordinate - u_cameraTileCoordinates.xyz;\n\
29
+ vec3 tileUv = clamp(tileUvSum - vec3(tileCoordinateChange), 0.0, 1.0);\n\
30
+ return TileAndUvCoordinate(ivec4(tileCoordinate, u_cameraTileCoordinates.w), tileUv);\n\
31
+ }\n\
32
+ ";