deeptwins-cesium-engine 0.1.2 → 0.1.4

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 (219) hide show
  1. package/Build/Workers/chunk-2HWLF3FT.js +837 -0
  2. package/Build/Workers/chunk-2KXMJ5XS.js +3792 -0
  3. package/Build/Workers/chunk-2NPCLB3H.js +56 -0
  4. package/Build/Workers/chunk-2ZHQTIBH.js +1483 -0
  5. package/Build/Workers/chunk-3GLYOW63.js +352 -0
  6. package/Build/Workers/chunk-3L22KMPU.js +219 -0
  7. package/Build/Workers/chunk-3Q6V2B2I.js +73 -0
  8. package/Build/Workers/chunk-3QOKKRIG.js +387 -0
  9. package/Build/Workers/chunk-44YZFGRH.js +1800 -0
  10. package/Build/Workers/chunk-45VV4SBO.js +2342 -0
  11. package/Build/Workers/chunk-4EJ4AA2S.js +368 -0
  12. package/Build/Workers/chunk-4IJFHUL6.js +414 -0
  13. package/Build/Workers/chunk-4K3V5CGW.js +454 -0
  14. package/Build/Workers/chunk-4M4QL6KJ.js +305 -0
  15. package/Build/Workers/chunk-4YNRIEQ6.js +288 -0
  16. package/Build/Workers/chunk-56CVDPH5.js +352 -0
  17. package/Build/Workers/chunk-5CTAAPXH.js +1483 -0
  18. package/Build/Workers/chunk-5ISZ6NJD.js +102 -0
  19. package/Build/Workers/chunk-5SDHYIOS.js +56 -0
  20. package/Build/Workers/chunk-66TGUMCU.js +2719 -0
  21. package/Build/Workers/chunk-6EJMTDQJ.js +163 -0
  22. package/Build/Workers/chunk-6VWXYSMH.js +959 -0
  23. package/Build/Workers/chunk-6VZ7VB2Q.js +241 -0
  24. package/Build/Workers/chunk-7AMRE57Q.js +301 -0
  25. package/Build/Workers/chunk-7DH6C33H.js +398 -0
  26. package/Build/Workers/chunk-7VUS3FVE.js +38 -0
  27. package/Build/Workers/chunk-7Y3ZA6H3.js +198 -0
  28. package/Build/Workers/chunk-A6BMHZNA.js +38 -0
  29. package/Build/Workers/chunk-A7XY2MN7.js +171 -0
  30. package/Build/Workers/chunk-AC7ND63S.js +57 -0
  31. package/Build/Workers/chunk-AHCZ757M.js +9230 -0
  32. package/Build/Workers/chunk-ANOA7E7F.js +56 -0
  33. package/Build/Workers/chunk-AYO5HHV6.js +789 -0
  34. package/Build/Workers/chunk-BE2N56VZ.js +1344 -0
  35. package/Build/Workers/chunk-BR3BPM64.js +9230 -0
  36. package/Build/Workers/chunk-BVMRWGOK.js +455 -0
  37. package/Build/Workers/chunk-BXEL2NX7.js +455 -0
  38. package/Build/Workers/chunk-C5BO2JCG.js +278 -0
  39. package/Build/Workers/chunk-CIRQNZVR.js +301 -0
  40. package/Build/Workers/chunk-CM67CQME.js +305 -0
  41. package/Build/Workers/chunk-D3QIW4DH.js +630 -0
  42. package/Build/Workers/chunk-E5W7QIGZ.js +511 -0
  43. package/Build/Workers/chunk-E6CYGUJI.js +1054 -0
  44. package/Build/Workers/chunk-EIZ23IOX.js +414 -0
  45. package/Build/Workers/chunk-EIZJUMQY.js +101 -0
  46. package/Build/Workers/chunk-EXTMZJXB.js +82 -0
  47. package/Build/Workers/chunk-EYOOSIBW.js +682 -0
  48. package/Build/Workers/chunk-F37WADVC.js +1054 -0
  49. package/Build/Workers/chunk-FIWPJFHX.js +101 -0
  50. package/Build/Workers/chunk-FM32TNGT.js +198 -0
  51. package/Build/Workers/chunk-FOMYIEIB.js +476 -0
  52. package/Build/Workers/chunk-FWYDLSVQ.js +97 -0
  53. package/Build/Workers/chunk-HGZR6CZF.js +1067 -0
  54. package/Build/Workers/chunk-HIXHDABG.js +288 -0
  55. package/Build/Workers/chunk-HMCCZZWE.js +97 -0
  56. package/Build/Workers/chunk-HW54WHGM.js +2719 -0
  57. package/Build/Workers/chunk-IHYAI7GF.js +973 -0
  58. package/Build/Workers/chunk-INLQ7LVK.js +837 -0
  59. package/Build/Workers/chunk-IQMESTCB.js +124 -0
  60. package/Build/Workers/chunk-J4PISUNT.js +2342 -0
  61. package/Build/Workers/chunk-JSWU557I.js +693 -0
  62. package/Build/Workers/chunk-KHONDSQ7.js +693 -0
  63. package/Build/Workers/chunk-KLUL2SOE.js +352 -0
  64. package/Build/Workers/chunk-KMBLKQCC.js +1992 -0
  65. package/Build/Workers/chunk-KOTWWQN7.js +171 -0
  66. package/Build/Workers/chunk-KWV6ZTF4.js +163 -0
  67. package/Build/Workers/chunk-LSEFPQHG.js +476 -0
  68. package/Build/Workers/chunk-M66X4O24.js +44 -0
  69. package/Build/Workers/chunk-M6IXKBC7.js +1992 -0
  70. package/Build/Workers/chunk-MFUC3D5C.js +162 -0
  71. package/Build/Workers/chunk-MRMNELAH.js +82 -0
  72. package/Build/Workers/chunk-N3NUA5H2.js +3792 -0
  73. package/Build/Workers/chunk-NFB2NXJN.js +138 -0
  74. package/Build/Workers/chunk-NQAXBK4K.js +789 -0
  75. package/Build/Workers/chunk-NUGQWV6S.js +352 -0
  76. package/Build/Workers/chunk-O7S7WL7K.js +278 -0
  77. package/Build/Workers/chunk-ODZYB26X.js +1287 -0
  78. package/Build/Workers/chunk-OEHJY463.js +3201 -0
  79. package/Build/Workers/chunk-OMMRNMXF.js +44 -0
  80. package/Build/Workers/chunk-OZ3CQDO3.js +138 -0
  81. package/Build/Workers/chunk-PNXBG64I.js +219 -0
  82. package/Build/Workers/chunk-PYR35GK4.js +973 -0
  83. package/Build/Workers/chunk-Q4CXGW74.js +57 -0
  84. package/Build/Workers/chunk-QGISLKCW.js +147 -0
  85. package/Build/Workers/chunk-QQHVOJW6.js +497 -0
  86. package/Build/Workers/chunk-QWCMMRJW.js +58 -0
  87. package/Build/Workers/chunk-RDEZCHF4.js +398 -0
  88. package/Build/Workers/chunk-SJTE7FVN.js +778 -0
  89. package/Build/Workers/chunk-SM5T67LR.js +162 -0
  90. package/Build/Workers/chunk-T27NNXEU.js +58 -0
  91. package/Build/Workers/chunk-T4J5BWUO.js +511 -0
  92. package/Build/Workers/chunk-T6JS4BRN.js +140 -0
  93. package/Build/Workers/chunk-UH6DUQBW.js +140 -0
  94. package/Build/Workers/chunk-UJAH6XKF.js +73 -0
  95. package/Build/Workers/chunk-UKSTJ2PH.js +454 -0
  96. package/Build/Workers/chunk-UQCDCCZ7.js +368 -0
  97. package/Build/Workers/chunk-UXIFNEA3.js +1287 -0
  98. package/Build/Workers/chunk-UXJ6J5L7.js +56 -0
  99. package/Build/Workers/chunk-V4VUAZXI.js +1800 -0
  100. package/Build/Workers/chunk-VQH2YXO2.js +497 -0
  101. package/Build/Workers/chunk-VXKCLSE4.js +241 -0
  102. package/Build/Workers/chunk-W3U6YBEI.js +280 -0
  103. package/Build/Workers/chunk-W75ZVFKP.js +778 -0
  104. package/Build/Workers/chunk-WCDFJYFB.js +1344 -0
  105. package/Build/Workers/chunk-WME5M6W3.js +630 -0
  106. package/Build/Workers/chunk-XDQBQB64.js +1067 -0
  107. package/Build/Workers/chunk-Y6HOIWE5.js +959 -0
  108. package/Build/Workers/chunk-YEMC2ZOR.js +147 -0
  109. package/Build/Workers/chunk-YWNF3TPE.js +682 -0
  110. package/Build/Workers/chunk-Z55VGWJP.js +280 -0
  111. package/Build/Workers/chunk-Z5YWP24C.js +124 -0
  112. package/Build/Workers/chunk-ZHXCWUJB.js +387 -0
  113. package/Build/Workers/chunk-ZIMPUF2I.js +102 -0
  114. package/Build/Workers/chunk-ZKDWYQKC.js +3201 -0
  115. package/Build/Workers/combineGeometry.js +24 -22
  116. package/Build/Workers/createBoxGeometry.js +18 -16
  117. package/Build/Workers/createBoxOutlineGeometry.js +23 -25
  118. package/Build/Workers/createCircleGeometry.js +29 -27
  119. package/Build/Workers/createCircleOutlineGeometry.js +22 -20
  120. package/Build/Workers/createCoplanarPolygonGeometry.js +43 -43
  121. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +37 -35
  122. package/Build/Workers/createCorridorGeometry.js +46 -49
  123. package/Build/Workers/createCorridorOutlineGeometry.js +40 -43
  124. package/Build/Workers/createCylinderGeometry.js +20 -18
  125. package/Build/Workers/createCylinderOutlineGeometry.js +27 -25
  126. package/Build/Workers/createEllipseGeometry.js +28 -25
  127. package/Build/Workers/createEllipseOutlineGeometry.js +21 -18
  128. package/Build/Workers/createEllipsoidGeometry.js +19 -17
  129. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -16
  130. package/Build/Workers/createFrustumGeometry.js +18 -16
  131. package/Build/Workers/createFrustumOutlineGeometry.js +21 -21
  132. package/Build/Workers/createGeometry.js +31 -26
  133. package/Build/Workers/createGroundPolylineGeometry.js +188 -135
  134. package/Build/Workers/createPlaneGeometry.js +22 -21
  135. package/Build/Workers/createPlaneOutlineGeometry.js +15 -13
  136. package/Build/Workers/createPolygonGeometry.js +51 -52
  137. package/Build/Workers/createPolygonOutlineGeometry.js +43 -44
  138. package/Build/Workers/createPolylineGeometry.js +37 -40
  139. package/Build/Workers/createPolylineVolumeGeometry.js +41 -44
  140. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +36 -39
  141. package/Build/Workers/createRectangleGeometry.js +47 -53
  142. package/Build/Workers/createRectangleOutlineGeometry.js +32 -33
  143. package/Build/Workers/createSimplePolylineGeometry.js +33 -34
  144. package/Build/Workers/createSphereGeometry.js +20 -20
  145. package/Build/Workers/createSphereOutlineGeometry.js +19 -19
  146. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  147. package/Build/Workers/createVectorTileClampedPolylines.js +16 -14
  148. package/Build/Workers/createVectorTileGeometries.js +24 -22
  149. package/Build/Workers/createVectorTilePoints.js +15 -13
  150. package/Build/Workers/createVectorTilePolygons.js +24 -21
  151. package/Build/Workers/createVectorTilePolylines.js +16 -14
  152. package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +25 -25
  153. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +29 -27
  154. package/Build/Workers/createVerticesFromHeightmap.js +42 -63
  155. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -280
  156. package/Build/Workers/createWallGeometry.js +35 -36
  157. package/Build/Workers/createWallOutlineGeometry.js +33 -34
  158. package/Build/Workers/decodeDraco.js +10 -11
  159. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  160. package/Build/Workers/decodeI3S.js +16 -20
  161. package/Build/Workers/gaussianSplatSorter.js +4 -4
  162. package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
  163. package/Build/Workers/incrementallyBuildTerrainPicker.js +20 -12
  164. package/Build/Workers/transcodeKTX2.js +42 -14
  165. package/Build/Workers/transferTypedArrayTest.js +1 -1
  166. package/Build/Workers/upsampleQuantizedTerrainMesh.js +24 -21
  167. package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +25 -25
  168. package/Source/Shaders/BillboardCollectionFS.js +85 -81
  169. package/Source/Shaders/BillboardCollectionVS.js +60 -118
  170. package/Source/Shaders/Builtin/Constants/passCesium3DTile.js +1 -1
  171. package/Source/Shaders/Builtin/Constants/passCesium3DTileClassification.js +1 -1
  172. package/Source/Shaders/Builtin/Constants/passCesium3DTileClassificationIgnoreShow.js +1 -1
  173. package/Source/Shaders/Builtin/Constants/passCesium3DTileEdges.js +12 -0
  174. package/Source/Shaders/Builtin/Constants/passCesium3DTileEdgesDirect.js +11 -0
  175. package/Source/Shaders/Builtin/Constants/passGaussianSplats.js +11 -0
  176. package/Source/Shaders/Builtin/Constants/passOpaque.js +1 -1
  177. package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
  178. package/Source/Shaders/Builtin/Constants/passTranslucent.js +1 -1
  179. package/Source/Shaders/Builtin/Constants/passVoxels.js +1 -1
  180. package/Source/Shaders/Builtin/CzmBuiltins.js +12 -0
  181. package/Source/Shaders/Builtin/Functions/columbusViewMorph.js +8 -1
  182. package/Source/Shaders/Builtin/Functions/computeTextureTransform.js +25 -0
  183. package/Source/Shaders/Builtin/Functions/decodeRGB8.js +24 -0
  184. package/Source/Shaders/Builtin/Functions/modelToWindowCoordinates.js +2 -1
  185. package/Source/Shaders/Builtin/Functions/unpackTexture.js +37 -0
  186. package/Source/Shaders/Builtin/Functions/windowToEyeCoordinates.js +0 -1
  187. package/Source/Shaders/EllipsoidVS.js +4 -4
  188. package/Source/Shaders/FXAA3_11.js +2 -0
  189. package/Source/Shaders/GlobeFS.js +22 -0
  190. package/Source/Shaders/GlobeVS.js +3 -2
  191. package/Source/Shaders/Model/MaterialStageFS.js +50 -20
  192. package/Source/Shaders/Model/MetadataStageFS.js +2 -1
  193. package/Source/Shaders/Model/MetadataStageVS.js +2 -1
  194. package/Source/Shaders/Model/ModelFS.js +32 -2
  195. package/Source/Shaders/Model/ModelVS.js +15 -1
  196. package/Source/Shaders/Model/PointCloudStylingStageVS.js +2 -1
  197. package/Source/Shaders/Model/PrimitiveOutlineStageFS.js +0 -1
  198. package/Source/Shaders/PointPrimitiveCollectionVS.js +8 -39
  199. package/Source/Shaders/PolygonSignedDistanceFS.js +64 -33
  200. package/Source/Shaders/PolylineCommon.js +1 -1
  201. package/Source/Shaders/ShadowVolumeAppearanceFS.js +7 -15
  202. package/Source/Shaders/SkyAtmosphereVS.js +2 -1
  203. package/Source/Shaders/Voxels/IntersectBox.js +20 -33
  204. package/Source/Shaders/Voxels/IntersectCylinder.js +28 -32
  205. package/Source/Shaders/Voxels/IntersectDepth.js +10 -6
  206. package/Source/Shaders/Voxels/IntersectEllipsoid.js +12 -20
  207. package/Source/Shaders/Voxels/IntersectLongitude.js +21 -9
  208. package/Source/Shaders/Voxels/Intersection.js +3 -5
  209. package/Source/Shaders/Voxels/IntersectionUtils.js +2 -1
  210. package/Source/Shaders/Voxels/Megatexture.js +15 -83
  211. package/Source/Shaders/Voxels/Octree.js +53 -61
  212. package/Source/Shaders/Voxels/VoxelFS.js +67 -52
  213. package/Source/Shaders/Voxels/VoxelUtils.js +0 -19
  214. package/index.js +346 -261
  215. package/package.json +1 -1
  216. package/Source/Shaders/Voxels/IntersectClippingPlanes.js +0 -80
  217. package/Source/Shaders/Voxels/convertUvToBox.js +0 -46
  218. package/Source/Shaders/Voxels/convertUvToCylinder.js +0 -101
  219. package/Source/Shaders/Voxels/convertUvToEllipsoid.js +0 -141
@@ -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\
@@ -40,10 +45,6 @@ struct SampleData {\n\
40
45
  #endif\n\
41
46
  };\n\
42
47
  \n\
43
- // Integer mod: For WebGL1 only\n\
44
- int intMod(in int a, in int b) {\n\
45
- return a - (b * (a / b));\n\
46
- }\n\
47
48
  int normU8_toInt(in float value) {\n\
48
49
  return int(value * 255.0);\n\
49
50
  }\n\
@@ -65,14 +66,14 @@ OctreeNodeData getOctreeNodeData(in vec2 octreeUv) {\n\
65
66
  \n\
66
67
  OctreeNodeData getOctreeChildData(in int parentOctreeIndex, in ivec3 childCoord) {\n\
67
68
  int childIndex = childCoord.z * 4 + childCoord.y * 2 + childCoord.x;\n\
68
- int octreeCoordX = intMod(parentOctreeIndex, u_octreeInternalNodeTilesPerRow) * 9 + 1 + childIndex;\n\
69
+ int octreeCoordX = (parentOctreeIndex % u_octreeInternalNodeTilesPerRow) * 9 + 1 + childIndex;\n\
69
70
  int octreeCoordY = parentOctreeIndex / u_octreeInternalNodeTilesPerRow;\n\
70
71
  vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5);\n\
71
72
  return getOctreeNodeData(octreeUv);\n\
72
73
  }\n\
73
74
  \n\
74
75
  int getOctreeParentIndex(in int octreeIndex) {\n\
75
- int octreeCoordX = intMod(octreeIndex, u_octreeInternalNodeTilesPerRow) * 9;\n\
76
+ int octreeCoordX = (octreeIndex % u_octreeInternalNodeTilesPerRow) * 9;\n\
76
77
  int octreeCoordY = octreeIndex / u_octreeInternalNodeTilesPerRow;\n\
77
78
  vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5);\n\
78
79
  vec4 parentData = texture(u_octreeInternalNodeTexture, octreeUv);\n\
@@ -80,33 +81,31 @@ int getOctreeParentIndex(in int octreeIndex) {\n\
80
81
  return parentOctreeIndex;\n\
81
82
  }\n\
82
83
  \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\
84
+ vec3 getTileUv(in TileAndUvCoordinate tileAndUv, in ivec4 octreeCoords) {\n\
85
+ int levelDifference = tileAndUv.tileCoords.w - octreeCoords.w;\n\
86
+ float scalar = exp2(-1.0 * float(levelDifference));\n\
87
+ vec3 originShift = vec3(tileAndUv.tileCoords.xyz - (octreeCoords.xyz << levelDifference)) * scalar;\n\
88
+ return tileAndUv.tileUv * scalar + originShift;\n\
91
89
  }\n\
92
90
  \n\
93
- vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) {\n\
94
- vec3 tileUv = getTileUv(shapePosition, octreeCoords);\n\
91
+ vec3 getClampedTileUv(in TileAndUvCoordinate tileAndUv, in ivec4 octreeCoords) {\n\
92
+ vec3 tileUv = getTileUv(tileAndUv, octreeCoords);\n\
95
93
  return clamp(tileUv, vec3(0.0), vec3(1.0));\n\
96
94
  }\n\
97
95
  \n\
98
- void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) {\n\
99
- vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords);\n\
96
+ void addSampleCoordinates(in TileAndUvCoordinate tileAndUv, inout SampleData sampleData) {\n\
97
+ vec3 tileUv = getClampedTileUv(tileAndUv, sampleData.tileCoords);\n\
100
98
  \n\
101
99
  vec3 inputCoordinate = tileUv * vec3(u_dimensions);\n\
102
100
  #if defined(PADDING)\n\
103
101
  inputCoordinate += vec3(u_paddingBefore);\n\
104
102
  #endif\n\
105
- #if defined(GLTF_METADATA_ORDER)\n\
103
+ #if defined(Y_UP_METADATA_ORDER)\n\
106
104
  #if defined(SHAPE_BOX)\n\
107
105
  float inputY = inputCoordinate.y;\n\
108
- inputCoordinate.y = float(u_inputDimensions.y) - inputCoordinate.z;\n\
109
- inputCoordinate.z = inputY;\n\
106
+ inputCoordinate.y = inputCoordinate.z;\n\
107
+ // u_inputDimensions.z is the y-up dimension along the 3D Tiles y-axis.\n\
108
+ inputCoordinate.z = float(u_inputDimensions.z) - inputY;\n\
110
109
  #elif defined(SHAPE_CYLINDER)\n\
111
110
  float angle = inputCoordinate.y;\n\
112
111
  float height = inputCoordinate.z;\n\
@@ -138,7 +137,7 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
138
137
  int leafIndex = data.data;\n\
139
138
  int leafNodeTexelCount = 2;\n\
140
139
  // Adding 0.5 moves to the center of the texel\n\
141
- float leafCoordXStart = float(intMod(leafIndex, u_octreeLeafNodeTilesPerRow) * leafNodeTexelCount) + 0.5;\n\
140
+ float leafCoordXStart = float((leafIndex % u_octreeLeafNodeTilesPerRow) * leafNodeTexelCount) + 0.5;\n\
142
141
  float leafCoordY = float(leafIndex / u_octreeLeafNodeTilesPerRow) + 0.5;\n\
143
142
  \n\
144
143
  // Get an interpolation weight and a flag to determine whether to read the parent texture\n\
@@ -163,32 +162,25 @@ void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out
163
162
  }\n\
164
163
  #endif\n\
165
164
  \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\
165
+ OctreeNodeData traverseOctreeDownwards(in ivec4 tileCoordinate, inout TraversalData traversalData) {\n\
170
166
  OctreeNodeData childData;\n\
171
167
  \n\
172
168
  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\
169
+ // tileCoordinate.xyz is defined at the level of detail tileCoordinate.w.\n\
170
+ // Find the corresponding coordinate at the level traversalData.octreeCoords.w\n\
171
+ int level = traversalData.octreeCoords.w + 1;\n\
172
+ int levelDifference = tileCoordinate.w - level;\n\
173
+ ivec3 coordinateAtLevel = tileCoordinate.xyz >> levelDifference;\n\
174
+ traversalData.octreeCoords = ivec4(coordinateAtLevel, level);\n\
181
175
  \n\
182
- childData = getOctreeChildData(traversalData.parentOctreeIndex, ivec3(childCoord));\n\
176
+ ivec3 childCoordinate = coordinateAtLevel & 1;\n\
177
+ childData = getOctreeChildData(traversalData.parentOctreeIndex, childCoordinate);\n\
183
178
  \n\
184
179
  if (childData.flag != OCTREE_FLAG_INTERNAL) {\n\
185
180
  // leaf tile - stop traversing\n\
186
181
  break;\n\
187
182
  }\n\
188
183
  \n\
189
- // interior tile - keep going deeper\n\
190
- start = mix(start, center, childCoord);\n\
191
- end = mix(center, end, childCoord);\n\
192
184
  traversalData.parentOctreeIndex = childData.data;\n\
193
185
  }\n\
194
186
  \n\
@@ -199,50 +191,50 @@ OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalDat
199
191
  * Transform a given position to an octree tile coordinate and a position within that tile,\n\
200
192
  * and find the corresponding megatexture index and texture coordinates\n\
201
193
  */\n\
202
- void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) {\n\
194
+ void traverseOctreeFromBeginning(in TileAndUvCoordinate tileAndUv, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) {\n\
203
195
  traversalData.octreeCoords = ivec4(0);\n\
204
196
  traversalData.parentOctreeIndex = 0;\n\
205
197
  \n\
206
198
  OctreeNodeData nodeData = getOctreeNodeData(vec2(0.0));\n\
207
199
  if (nodeData.flag != OCTREE_FLAG_LEAF) {\n\
208
- nodeData = traverseOctreeDownwards(shapePosition, traversalData);\n\
200
+ nodeData = traverseOctreeDownwards(tileAndUv.tileCoords, traversalData);\n\
209
201
  }\n\
210
202
  \n\
211
203
  #if (SAMPLE_COUNT == 1)\n\
212
204
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
213
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
205
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
214
206
  #else\n\
215
207
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
216
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
217
- addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
208
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
209
+ addSampleCoordinates(tileAndUv, sampleDatas[1]);\n\
218
210
  #endif\n\
219
211
  }\n\
220
212
  \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\
213
+ bool insideTile(in ivec4 tileCoordinate, in ivec4 octreeCoords) {\n\
214
+ int levelDifference = tileCoordinate.w - octreeCoords.w;\n\
215
+ if (levelDifference < 0) {\n\
216
+ return false;\n\
217
+ }\n\
218
+ ivec3 coordinateAtLevel = tileCoordinate.xyz >> levelDifference;\n\
219
+ return coordinateAtLevel == octreeCoords.xyz;\n\
230
220
  }\n\
231
221
  \n\
232
- void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
233
- if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
222
+ void traverseOctreeFromExisting(in TileAndUvCoordinate tileAndUv, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) {\n\
223
+ ivec4 tileCoords = tileAndUv.tileCoords;\n\
224
+ if (insideTile(tileCoords, traversalData.octreeCoords)) {\n\
234
225
  for (int i = 0; i < SAMPLE_COUNT; i++) {\n\
235
- addSampleCoordinates(shapePosition, sampleDatas[i]);\n\
226
+ addSampleCoordinates(tileAndUv, sampleDatas[i]);\n\
236
227
  }\n\
237
228
  return;\n\
238
229
  }\n\
239
230
  \n\
240
- // Go up tree until we find a parent tile containing shapePosition\n\
231
+ // Go up tree until we find a parent tile containing tileCoords.\n\
232
+ // Assumes all parents are available all they way up to the root.\n\
241
233
  for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) {\n\
242
234
  traversalData.octreeCoords.xyz /= 2;\n\
243
235
  traversalData.octreeCoords.w -= 1;\n\
244
236
  \n\
245
- if (insideTile(shapePosition, traversalData.octreeCoords)) {\n\
237
+ if (insideTile(tileCoords, traversalData.octreeCoords)) {\n\
246
238
  break;\n\
247
239
  }\n\
248
240
  \n\
@@ -250,15 +242,15 @@ void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData trave
250
242
  }\n\
251
243
  \n\
252
244
  // Go down tree\n\
253
- OctreeNodeData nodeData = traverseOctreeDownwards(shapePosition, traversalData);\n\
245
+ OctreeNodeData nodeData = traverseOctreeDownwards(tileCoords, traversalData);\n\
254
246
  \n\
255
247
  #if (SAMPLE_COUNT == 1)\n\
256
248
  getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]);\n\
257
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
249
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
258
250
  #else\n\
259
251
  getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas);\n\
260
- addSampleCoordinates(shapePosition, sampleDatas[0]);\n\
261
- addSampleCoordinates(shapePosition, sampleDatas[1]);\n\
252
+ addSampleCoordinates(tileAndUv, sampleDatas[0]);\n\
253
+ addSampleCoordinates(tileAndUv, sampleDatas[1]);\n\
262
254
  #endif\n\
263
255
  }\n\
264
256
  ";
@@ -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,8 +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_transformPositionViewToLocal;\n\
19
20
  uniform mat3 u_transformDirectionViewToLocal;\n\
20
- uniform vec3 u_cameraPositionUv;\n\
21
+ uniform vec3 u_cameraPositionLocal;\n\
22
+ uniform vec3 u_cameraDirectionLocal;\n\
21
23
  uniform float u_stepSize;\n\
22
24
  \n\
23
25
  #if defined(PICKING)\n\
@@ -62,16 +64,15 @@ RayShapeIntersection getVoxelIntersection(in vec3 tileUv, in vec3 sampleSizeAlon
62
64
  }\n\
63
65
  \n\
64
66
  vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersection shapeIntersection, in mat3 jacobianT, in float currentT) {\n\
65
- // The Jacobian is computed in a space where the shape spans [-1, 1].\n\
66
- // But the ray is marched in a space where the shape fills [0, 1].\n\
67
- // So we need to scale the Jacobian by 2.\n\
68
- vec3 gradient = 2.0 * viewRay.rawDir * jacobianT;\n\
67
+ vec3 gradient = viewRay.dir * jacobianT;\n\
69
68
  vec3 sampleSizeAlongRay = getSampleSize(sampleData.tileCoords.w) / gradient;\n\
70
69
  \n\
71
70
  RayShapeIntersection voxelIntersection = getVoxelIntersection(sampleData.tileUv, sampleSizeAlongRay);\n\
72
71
  \n\
73
- // Transform normal from shape space to Cartesian space\n\
74
- 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\
75
76
  // Compare with the shape intersection, to choose the appropriate normal\n\
76
77
  vec4 voxelEntry = vec4(voxelNormal, currentT + voxelIntersection.entry.w);\n\
77
78
  vec4 entry = intersectionMax(shapeIntersection.entry, voxelEntry);\n\
@@ -112,26 +113,41 @@ int getSampleIndex(in SampleData sampleData) {\n\
112
113
  return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z);\n\
113
114
  }\n\
114
115
  \n\
116
+ /**\n\
117
+ * Compute the view ray at the current fragment, in the local coordinates of the shape.\n\
118
+ */\n\
119
+ Ray getViewRayLocal() {\n\
120
+ vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord);\n\
121
+ vec3 origin;\n\
122
+ vec3 direction;\n\
123
+ if (czm_orthographicIn3D == 1.0) {\n\
124
+ eyeCoordinates.z = 0.0;\n\
125
+ origin = (u_transformPositionViewToLocal * eyeCoordinates).xyz;\n\
126
+ direction = u_cameraDirectionLocal;\n\
127
+ } else {\n\
128
+ origin = u_cameraPositionLocal;\n\
129
+ direction = u_transformDirectionViewToLocal * normalize(eyeCoordinates.xyz);\n\
130
+ }\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\
141
+ }\n\
142
+ \n\
115
143
  void main()\n\
116
144
  {\n\
117
- vec4 fragCoord = gl_FragCoord;\n\
118
- vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]\n\
119
- vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz);\n\
120
- vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case\n\
121
- vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case\n\
122
- vec3 viewPosUv = u_cameraPositionUv;\n\
123
- #if defined(SHAPE_ELLIPSOID)\n\
124
- // viewDirUv has been scaled to a space where the ellipsoid is a sphere.\n\
125
- // Undo this scaling to get the raw direction.\n\
126
- vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv;\n\
127
- Ray viewRayUv = Ray(viewPosUv, viewDirUv, rawDir);\n\
128
- #else\n\
129
- Ray viewRayUv = Ray(viewPosUv, viewDirUv, viewDirUv);\n\
130
- #endif\n\
145
+ Ray viewRayLocal = getViewRayLocal();\n\
146
+ Ray viewRayEC = getViewRayEC();\n\
131
147
  \n\
132
148
  Intersections ix;\n\
133
- RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix);\n\
134
- \n\
149
+ vec2 screenCoord = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1]\n\
150
+ RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayLocal, viewRayEC, ix);\n\
135
151
  // Exit early if the scene was completely missed.\n\
136
152
  if (shapeIntersection.entry.w == NO_HIT) {\n\
137
153
  discard;\n\
@@ -139,26 +155,24 @@ void main()\n\
139
155
  \n\
140
156
  float currentT = shapeIntersection.entry.w;\n\
141
157
  float endT = shapeIntersection.exit.w;\n\
142
- vec3 positionUv = viewPosUv + currentT * viewDirUv;\n\
143
- 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\
144
163
  \n\
145
164
  // Traverse the tree from the start position\n\
146
165
  TraversalData traversalData;\n\
147
166
  SampleData sampleDatas[SAMPLE_COUNT];\n\
148
- traverseOctreeFromBeginning(pointJacobian.point, traversalData, sampleDatas);\n\
149
- vec4 step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT);\n\
150
- \n\
151
- #if defined(JITTER)\n\
152
- float noise = hash(screenCoord); // [0,1]\n\
153
- currentT += noise * step.w;\n\
154
- positionUv += noise * step.w * viewDirUv;\n\
155
- #endif\n\
167
+ traverseOctreeFromBeginning(tileAndUv, traversalData, sampleDatas);\n\
168
+ vec4 step = getStepSize(sampleDatas[0], viewRayLocal, shapeIntersection, jacobianT, currentT);\n\
156
169
  \n\
157
170
  FragmentInput fragmentInput;\n\
158
171
  #if defined(STATISTICS)\n\
159
- setStatistics(fragmentInput.metadata.statistics);\n\
172
+ setStatistics(fragmentInput.metadataStatistics);\n\
160
173
  #endif\n\
161
174
  \n\
175
+ czm_modelMaterial materialOutput;\n\
162
176
  vec4 colorAccum = vec4(0.0);\n\
163
177
  \n\
164
178
  for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) {\n\
@@ -167,19 +181,20 @@ void main()\n\
167
181
  \n\
168
182
  // Prepare the custom shader inputs\n\
169
183
  copyPropertiesToMetadata(properties, fragmentInput.metadata);\n\
170
- fragmentInput.voxel.positionUv = positionUv;\n\
171
- fragmentInput.voxel.positionShapeUv = pointJacobian.point;\n\
172
- fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv;\n\
173
- fragmentInput.voxel.viewDirUv = viewDirUv;\n\
174
- fragmentInput.voxel.viewDirWorld = viewDirWorld;\n\
175
- fragmentInput.voxel.surfaceNormal = step.xyz;\n\
184
+ \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
+ \n\
189
+ fragmentInput.voxel.viewDirUv = viewRayLocal.dir;\n\
190
+ \n\
176
191
  fragmentInput.voxel.travelDistance = step.w;\n\
177
192
  fragmentInput.voxel.stepCount = stepCount;\n\
178
193
  fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex;\n\
179
194
  fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]);\n\
195
+ fragmentInput.voxel.distanceToDepthBuffer = ix.distanceToDepthBuffer - currentT;\n\
180
196
  \n\
181
197
  // Run the custom shader\n\
182
- czm_modelMaterial materialOutput;\n\
183
198
  fragmentMain(fragmentInput, materialOutput);\n\
184
199
  \n\
185
200
  // Sanitize the custom shader output\n\
@@ -199,13 +214,11 @@ void main()\n\
199
214
  if (step.w == 0.0) {\n\
200
215
  // Shape is infinitely thin. The ray may have hit the edge of a\n\
201
216
  // foreground voxel. Step ahead slightly to check for more voxels\n\
202
- step.w == 0.00001;\n\
217
+ step.w = 0.001;\n\
203
218
  }\n\
204
219
  \n\
205
220
  // Keep raymarching\n\
206
221
  currentT += step.w;\n\
207
- positionUv = viewPosUv + currentT * viewDirUv;\n\
208
- \n\
209
222
  // Check if there's more intersections.\n\
210
223
  if (currentT > endT) {\n\
211
224
  #if (INTERSECTION_COUNT == 1)\n\
@@ -218,16 +231,18 @@ void main()\n\
218
231
  // Found another intersection. Resume raymarching there\n\
219
232
  currentT = shapeIntersection.entry.w;\n\
220
233
  endT = shapeIntersection.exit.w;\n\
221
- positionUv = viewPosUv + currentT * viewDirUv;\n\
222
234
  }\n\
223
235
  #endif\n\
224
236
  }\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\
225
241
  \n\
226
242
  // Traverse the tree from the current ray position.\n\
227
243
  // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step.\n\
228
- pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv);\n\
229
- traverseOctreeFromExisting(pointJacobian.point, traversalData, sampleDatas);\n\
230
- 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\
231
246
  }\n\
232
247
  \n\
233
248
  // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1]\n\
@@ -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
  ";