@driftengine/core 3.61.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 (955) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +9 -0
  4. package/dist/behavior/behaviorTree.d.ts +140 -0
  5. package/dist/behavior/behaviorTree.js +289 -0
  6. package/dist/build/shaderComments.d.ts +64 -0
  7. package/dist/build/shaderComments.js +0 -0
  8. package/dist/cinematic/player.d.ts +80 -0
  9. package/dist/cinematic/player.js +184 -0
  10. package/dist/cinematic/script.d.ts +63 -0
  11. package/dist/cinematic/script.js +141 -0
  12. package/dist/core/bootGate.d.ts +37 -0
  13. package/dist/core/bootGate.js +47 -0
  14. package/dist/core/loadTracker.d.ts +78 -0
  15. package/dist/core/loadTracker.js +106 -0
  16. package/dist/core/loop.d.ts +118 -0
  17. package/dist/core/loop.js +84 -0
  18. package/dist/core/messageQueue.d.ts +61 -0
  19. package/dist/core/messageQueue.js +104 -0
  20. package/dist/core/onceSet.d.ts +27 -0
  21. package/dist/core/onceSet.js +62 -0
  22. package/dist/core/preferences.d.ts +47 -0
  23. package/dist/core/preferences.js +140 -0
  24. package/dist/core/remoteSave.d.ts +154 -0
  25. package/dist/core/remoteSave.js +249 -0
  26. package/dist/core/rng.d.ts +64 -0
  27. package/dist/core/rng.js +72 -0
  28. package/dist/core/stepBudget.d.ts +91 -0
  29. package/dist/core/stepBudget.js +105 -0
  30. package/dist/core/storage.d.ts +52 -0
  31. package/dist/core/storage.js +85 -0
  32. package/dist/core/tickTrace.d.ts +72 -0
  33. package/dist/core/tickTrace.js +102 -0
  34. package/dist/core/timeCurve.d.ts +83 -0
  35. package/dist/core/timeCurve.js +107 -0
  36. package/dist/core/withDefaults.d.ts +21 -0
  37. package/dist/core/withDefaults.js +29 -0
  38. package/dist/dev/contactProbe.d.ts +41 -0
  39. package/dist/dev/contactProbe.js +58 -0
  40. package/dist/dev/fpsMeter.d.ts +45 -0
  41. package/dist/dev/fpsMeter.js +86 -0
  42. package/dist/environment/celestialClock.d.ts +141 -0
  43. package/dist/environment/celestialClock.js +262 -0
  44. package/dist/geometry/decal.d.ts +61 -0
  45. package/dist/geometry/decal.js +178 -0
  46. package/dist/geometry/filmPatch.d.ts +35 -0
  47. package/dist/geometry/filmPatch.js +112 -0
  48. package/dist/geometry/growable.d.ts +70 -0
  49. package/dist/geometry/growable.js +167 -0
  50. package/dist/geometry/lightVolume.d.ts +76 -0
  51. package/dist/geometry/lightVolume.js +65 -0
  52. package/dist/geometry/meshBuilder.d.ts +426 -0
  53. package/dist/geometry/meshBuilder.js +1184 -0
  54. package/dist/geometry/pixelFont.d.ts +59 -0
  55. package/dist/geometry/pixelFont.js +179 -0
  56. package/dist/geometry/ribbon.d.ts +101 -0
  57. package/dist/geometry/ribbon.js +546 -0
  58. package/dist/geometry/shellFill.d.ts +101 -0
  59. package/dist/geometry/shellFill.js +203 -0
  60. package/dist/geometry/spline.d.ts +162 -0
  61. package/dist/geometry/spline.js +527 -0
  62. package/dist/geometry/tangents.d.ts +30 -0
  63. package/dist/geometry/tangents.js +142 -0
  64. package/dist/geometry/textMesh.d.ts +51 -0
  65. package/dist/geometry/textMesh.js +57 -0
  66. package/dist/geometry/treeBuilder.d.ts +37 -0
  67. package/dist/geometry/treeBuilder.js +56 -0
  68. package/dist/host/display.d.ts +135 -0
  69. package/dist/host/display.js +114 -0
  70. package/dist/host/files.d.ts +25 -0
  71. package/dist/host/files.js +44 -0
  72. package/dist/host/lifecycle.d.ts +45 -0
  73. package/dist/host/lifecycle.js +28 -0
  74. package/dist/host/platformServices.d.ts +23 -0
  75. package/dist/host/platformServices.js +1 -0
  76. package/dist/host/screen.d.ts +49 -0
  77. package/dist/host/screen.js +90 -0
  78. package/dist/index.d.ts +289 -0
  79. package/dist/index.js +320 -0
  80. package/dist/input/actionMap.d.ts +181 -0
  81. package/dist/input/actionMap.js +314 -0
  82. package/dist/input/activeDevice.d.ts +55 -0
  83. package/dist/input/activeDevice.js +83 -0
  84. package/dist/input/gamepadIdentity.d.ts +43 -0
  85. package/dist/input/gamepadIdentity.js +108 -0
  86. package/dist/input/gamepadMapping.d.ts +56 -0
  87. package/dist/input/gamepadMapping.js +91 -0
  88. package/dist/input/input.d.ts +281 -0
  89. package/dist/input/input.js +703 -0
  90. package/dist/input/inputHarness.d.ts +42 -0
  91. package/dist/input/inputHarness.js +193 -0
  92. package/dist/input/rightGesture.d.ts +57 -0
  93. package/dist/input/rightGesture.js +49 -0
  94. package/dist/input/rumble.d.ts +71 -0
  95. package/dist/input/rumble.js +119 -0
  96. package/dist/input/touchControls.d.ts +138 -0
  97. package/dist/input/touchControls.js +352 -0
  98. package/dist/input/typingTarget.d.ts +6 -0
  99. package/dist/input/typingTarget.js +27 -0
  100. package/dist/math/bounds.d.ts +61 -0
  101. package/dist/math/bounds.js +121 -0
  102. package/dist/math/color.d.ts +8 -0
  103. package/dist/math/color.js +35 -0
  104. package/dist/math/exact.d.ts +66 -0
  105. package/dist/math/exact.js +262 -0
  106. package/dist/math/frustum.d.ts +44 -0
  107. package/dist/math/frustum.js +90 -0
  108. package/dist/math/intersect.d.ts +76 -0
  109. package/dist/math/intersect.js +185 -0
  110. package/dist/math/scalar.d.ts +51 -0
  111. package/dist/math/scalar.js +99 -0
  112. package/dist/math/spring.d.ts +59 -0
  113. package/dist/math/spring.js +88 -0
  114. package/dist/nav/navGraph.d.ts +71 -0
  115. package/dist/nav/navGraph.js +111 -0
  116. package/dist/nav/navPath.d.ts +93 -0
  117. package/dist/nav/navPath.js +162 -0
  118. package/dist/nav/navSearch.d.ts +74 -0
  119. package/dist/nav/navSearch.js +198 -0
  120. package/dist/physics/boxSurface.d.ts +48 -0
  121. package/dist/physics/boxSurface.js +73 -0
  122. package/dist/physics/colliderSurface.d.ts +46 -0
  123. package/dist/physics/colliderSurface.js +146 -0
  124. package/dist/physics/compositeSurface.d.ts +33 -0
  125. package/dist/physics/compositeSurface.js +108 -0
  126. package/dist/physics/heightSurface.d.ts +103 -0
  127. package/dist/physics/heightSurface.js +153 -0
  128. package/dist/physics/ribbonSurface.d.ts +239 -0
  129. package/dist/physics/ribbonSurface.js +522 -0
  130. package/dist/render/ambientOcclusionPass.d.ts +53 -0
  131. package/dist/render/ambientOcclusionPass.js +179 -0
  132. package/dist/render/areaLights.d.ts +116 -0
  133. package/dist/render/areaLights.js +91 -0
  134. package/dist/render/areaShadowSet.d.ts +184 -0
  135. package/dist/render/areaShadowSet.js +277 -0
  136. package/dist/render/atmosphere.d.ts +94 -0
  137. package/dist/render/atmosphere.js +91 -0
  138. package/dist/render/backend/api.d.ts +496 -0
  139. package/dist/render/backend/api.js +1 -0
  140. package/dist/render/backend/budget.d.ts +82 -0
  141. package/dist/render/backend/budget.js +99 -0
  142. package/dist/render/backend/createRenderer.d.ts +135 -0
  143. package/dist/render/backend/createRenderer.js +201 -0
  144. package/dist/render/backend/deadline.d.ts +24 -0
  145. package/dist/render/backend/deadline.js +38 -0
  146. package/dist/render/backend/probe.d.ts +30 -0
  147. package/dist/render/backend/probe.js +129 -0
  148. package/dist/render/backend/select.d.ts +70 -0
  149. package/dist/render/backend/select.js +249 -0
  150. package/dist/render/backend/timer.d.ts +50 -0
  151. package/dist/render/backend/timer.js +1 -0
  152. package/dist/render/backend/webgl2/instanced.d.ts +21 -0
  153. package/dist/render/backend/webgl2/instanced.js +42 -0
  154. package/dist/render/backend/webgl2/morphTexture.d.ts +21 -0
  155. package/dist/render/backend/webgl2/morphTexture.js +55 -0
  156. package/dist/render/backend/webgl2/renderer.d.ts +3027 -0
  157. package/dist/render/backend/webgl2/renderer.js +6041 -0
  158. package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +32 -0
  159. package/dist/render/backend/webgl2/skinPaletteTexture.js +68 -0
  160. package/dist/render/backend/webgpu/boltPass.d.ts +42 -0
  161. package/dist/render/backend/webgpu/boltPass.js +160 -0
  162. package/dist/render/backend/webgpu/buffers.d.ts +159 -0
  163. package/dist/render/backend/webgpu/buffers.js +402 -0
  164. package/dist/render/backend/webgpu/causticsPass.d.ts +36 -0
  165. package/dist/render/backend/webgpu/causticsPass.js +138 -0
  166. package/dist/render/backend/webgpu/clusterBinner.d.ts +51 -0
  167. package/dist/render/backend/webgpu/clusterBinner.js +206 -0
  168. package/dist/render/backend/webgpu/depthPass.d.ts +114 -0
  169. package/dist/render/backend/webgpu/depthPass.js +228 -0
  170. package/dist/render/backend/webgpu/device.d.ts +52 -0
  171. package/dist/render/backend/webgpu/device.js +121 -0
  172. package/dist/render/backend/webgpu/drawCommand.d.ts +43 -0
  173. package/dist/render/backend/webgpu/drawCommand.js +54 -0
  174. package/dist/render/backend/webgpu/environmentTexels.d.ts +28 -0
  175. package/dist/render/backend/webgpu/environmentTexels.js +79 -0
  176. package/dist/render/backend/webgpu/filmPass.d.ts +29 -0
  177. package/dist/render/backend/webgpu/filmPass.js +97 -0
  178. package/dist/render/backend/webgpu/flatPass.d.ts +213 -0
  179. package/dist/render/backend/webgpu/flatPass.js +482 -0
  180. package/dist/render/backend/webgpu/flockPass.d.ts +34 -0
  181. package/dist/render/backend/webgpu/flockPass.js +129 -0
  182. package/dist/render/backend/webgpu/gpuTimestamps.d.ts +94 -0
  183. package/dist/render/backend/webgpu/gpuTimestamps.js +213 -0
  184. package/dist/render/backend/webgpu/insetPass.d.ts +19 -0
  185. package/dist/render/backend/webgpu/insetPass.js +108 -0
  186. package/dist/render/backend/webgpu/instanced.d.ts +27 -0
  187. package/dist/render/backend/webgpu/instanced.js +49 -0
  188. package/dist/render/backend/webgpu/lightVolumePass.d.ts +75 -0
  189. package/dist/render/backend/webgpu/lightVolumePass.js +154 -0
  190. package/dist/render/backend/webgpu/linePass.d.ts +90 -0
  191. package/dist/render/backend/webgpu/linePass.js +220 -0
  192. package/dist/render/backend/webgpu/morphTexture.d.ts +18 -0
  193. package/dist/render/backend/webgpu/morphTexture.js +51 -0
  194. package/dist/render/backend/webgpu/panelPass.d.ts +37 -0
  195. package/dist/render/backend/webgpu/panelPass.js +114 -0
  196. package/dist/render/backend/webgpu/particlePass.d.ts +89 -0
  197. package/dist/render/backend/webgpu/particlePass.js +280 -0
  198. package/dist/render/backend/webgpu/pipelineCache.d.ts +93 -0
  199. package/dist/render/backend/webgpu/pipelineCache.js +140 -0
  200. package/dist/render/backend/webgpu/plumePass.d.ts +69 -0
  201. package/dist/render/backend/webgpu/plumePass.js +213 -0
  202. package/dist/render/backend/webgpu/pointShadowPass.d.ts +88 -0
  203. package/dist/render/backend/webgpu/pointShadowPass.js +280 -0
  204. package/dist/render/backend/webgpu/postPass.d.ts +342 -0
  205. package/dist/render/backend/webgpu/postPass.js +366 -0
  206. package/dist/render/backend/webgpu/probePass.d.ts +108 -0
  207. package/dist/render/backend/webgpu/probePass.js +188 -0
  208. package/dist/render/backend/webgpu/reflectionPass.d.ts +29 -0
  209. package/dist/render/backend/webgpu/reflectionPass.js +87 -0
  210. package/dist/render/backend/webgpu/renderer.d.ts +3082 -0
  211. package/dist/render/backend/webgpu/renderer.js +10911 -0
  212. package/dist/render/backend/webgpu/scatterPass.d.ts +95 -0
  213. package/dist/render/backend/webgpu/scatterPass.js +266 -0
  214. package/dist/render/backend/webgpu/sdfTextPass.d.ts +86 -0
  215. package/dist/render/backend/webgpu/sdfTextPass.js +190 -0
  216. package/dist/render/backend/webgpu/shaderModules.d.ts +9 -0
  217. package/dist/render/backend/webgpu/shaderModules.js +45 -0
  218. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +23 -0
  219. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.js +208 -0
  220. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +67 -0
  221. package/dist/render/backend/webgpu/skinPaletteRing.js +97 -0
  222. package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +17 -0
  223. package/dist/render/backend/webgpu/skinPaletteTexture.js +68 -0
  224. package/dist/render/backend/webgpu/skyPass.d.ts +102 -0
  225. package/dist/render/backend/webgpu/skyPass.js +70 -0
  226. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +41 -0
  227. package/dist/render/backend/webgpu/surfaceTexturePass.js +228 -0
  228. package/dist/render/backend/webgpu/textPass.d.ts +73 -0
  229. package/dist/render/backend/webgpu/textPass.js +190 -0
  230. package/dist/render/backend/webgpu/uniformRing.d.ts +133 -0
  231. package/dist/render/backend/webgpu/uniformRing.js +208 -0
  232. package/dist/render/backend/webgpu/waterPass.d.ts +73 -0
  233. package/dist/render/backend/webgpu/waterPass.js +160 -0
  234. package/dist/render/backend/webgpu/windStreakPass.d.ts +46 -0
  235. package/dist/render/backend/webgpu/windStreakPass.js +153 -0
  236. package/dist/render/billboard.d.ts +27 -0
  237. package/dist/render/billboard.js +79 -0
  238. package/dist/render/bloomChain.d.ts +66 -0
  239. package/dist/render/bloomChain.js +83 -0
  240. package/dist/render/bloomPass.d.ts +54 -0
  241. package/dist/render/bloomPass.js +219 -0
  242. package/dist/render/boltBatch.d.ts +39 -0
  243. package/dist/render/boltBatch.js +121 -0
  244. package/dist/render/boltPool.d.ts +135 -0
  245. package/dist/render/boltPool.js +259 -0
  246. package/dist/render/boom.d.ts +46 -0
  247. package/dist/render/boom.js +81 -0
  248. package/dist/render/camera.d.ts +119 -0
  249. package/dist/render/camera.js +304 -0
  250. package/dist/render/causticsRenderer.d.ts +63 -0
  251. package/dist/render/causticsRenderer.js +119 -0
  252. package/dist/render/cinematicCamera.d.ts +102 -0
  253. package/dist/render/cinematicCamera.js +227 -0
  254. package/dist/render/clusteredLights.d.ts +260 -0
  255. package/dist/render/clusteredLights.js +479 -0
  256. package/dist/render/colourGrade.d.ts +62 -0
  257. package/dist/render/colourGrade.js +91 -0
  258. package/dist/render/compute.d.ts +74 -0
  259. package/dist/render/compute.js +8 -0
  260. package/dist/render/contextLoss.d.ts +32 -0
  261. package/dist/render/contextLoss.js +46 -0
  262. package/dist/render/debugLines.d.ts +75 -0
  263. package/dist/render/debugLines.js +281 -0
  264. package/dist/render/decalPass.d.ts +34 -0
  265. package/dist/render/decalPass.js +103 -0
  266. package/dist/render/decalProjector.d.ts +140 -0
  267. package/dist/render/decalProjector.js +282 -0
  268. package/dist/render/decalQueue.d.ts +53 -0
  269. package/dist/render/decalQueue.js +87 -0
  270. package/dist/render/depthConvention.d.ts +314 -0
  271. package/dist/render/depthConvention.js +346 -0
  272. package/dist/render/drawingBuffer.d.ts +52 -0
  273. package/dist/render/drawingBuffer.js +67 -0
  274. package/dist/render/emptyTexture.d.ts +60 -0
  275. package/dist/render/emptyTexture.js +103 -0
  276. package/dist/render/envProbeArray.d.ts +85 -0
  277. package/dist/render/envProbeArray.js +164 -0
  278. package/dist/render/equirectToCube.d.ts +54 -0
  279. package/dist/render/equirectToCube.js +123 -0
  280. package/dist/render/flockGeometry.d.ts +23 -0
  281. package/dist/render/flockGeometry.js +43 -0
  282. package/dist/render/flockRenderer.d.ts +37 -0
  283. package/dist/render/flockRenderer.js +70 -0
  284. package/dist/render/frame/arena.d.ts +32 -0
  285. package/dist/render/frame/arena.js +65 -0
  286. package/dist/render/frame/index.d.ts +18 -0
  287. package/dist/render/frame/index.js +4 -0
  288. package/dist/render/frame/replay.d.ts +34 -0
  289. package/dist/render/frame/replay.js +48 -0
  290. package/dist/render/frame/resources.d.ts +25 -0
  291. package/dist/render/frame/resources.js +55 -0
  292. package/dist/render/frame/schedule.d.ts +37 -0
  293. package/dist/render/frame/schedule.js +61 -0
  294. package/dist/render/frameView.d.ts +19 -0
  295. package/dist/render/frameView.js +1 -0
  296. package/dist/render/gizmo.d.ts +236 -0
  297. package/dist/render/gizmo.js +727 -0
  298. package/dist/render/globalMedium.d.ts +124 -0
  299. package/dist/render/globalMedium.js +100 -0
  300. package/dist/render/globalMediumPass.d.ts +101 -0
  301. package/dist/render/globalMediumPass.js +250 -0
  302. package/dist/render/gpuCapability.d.ts +111 -0
  303. package/dist/render/gpuCapability.js +194 -0
  304. package/dist/render/gpuTimer.d.ts +87 -0
  305. package/dist/render/gpuTimer.js +145 -0
  306. package/dist/render/halfFloat.d.ts +4 -0
  307. package/dist/render/halfFloat.js +38 -0
  308. package/dist/render/handleRegistry.d.ts +54 -0
  309. package/dist/render/handleRegistry.js +84 -0
  310. package/dist/render/iesProfile.d.ts +64 -0
  311. package/dist/render/iesProfile.js +179 -0
  312. package/dist/render/imageTexels.d.ts +50 -0
  313. package/dist/render/imageTexels.js +91 -0
  314. package/dist/render/instancedMesh.d.ts +48 -0
  315. package/dist/render/instancedMesh.js +127 -0
  316. package/dist/render/instances.d.ts +69 -0
  317. package/dist/render/instances.js +52 -0
  318. package/dist/render/lightBudget.d.ts +397 -0
  319. package/dist/render/lightBudget.js +524 -0
  320. package/dist/render/lightMatrix.d.ts +3 -0
  321. package/dist/render/lightMatrix.js +45 -0
  322. package/dist/render/lightVolumeDraw.d.ts +132 -0
  323. package/dist/render/lightVolumeDraw.js +181 -0
  324. package/dist/render/lineBatch.d.ts +60 -0
  325. package/dist/render/lineBatch.js +160 -0
  326. package/dist/render/linePoints.d.ts +33 -0
  327. package/dist/render/linePoints.js +46 -0
  328. package/dist/render/livePointShadowSet.d.ts +72 -0
  329. package/dist/render/livePointShadowSet.js +258 -0
  330. package/dist/render/lod.d.ts +35 -0
  331. package/dist/render/lod.js +65 -0
  332. package/dist/render/mesh.d.ts +177 -0
  333. package/dist/render/mesh.js +466 -0
  334. package/dist/render/occlusion.d.ts +81 -0
  335. package/dist/render/occlusion.js +378 -0
  336. package/dist/render/oitPass.d.ts +67 -0
  337. package/dist/render/oitPass.js +213 -0
  338. package/dist/render/orderIndependent.d.ts +92 -0
  339. package/dist/render/orderIndependent.js +108 -0
  340. package/dist/render/particleBatch.d.ts +140 -0
  341. package/dist/render/particleBatch.js +186 -0
  342. package/dist/render/particleMaterial.d.ts +54 -0
  343. package/dist/render/particleMaterial.js +42 -0
  344. package/dist/render/particlePool.d.ts +124 -0
  345. package/dist/render/particlePool.js +182 -0
  346. package/dist/render/pass.d.ts +195 -0
  347. package/dist/render/pass.js +9 -0
  348. package/dist/render/passTarget.d.ts +86 -0
  349. package/dist/render/passTarget.js +121 -0
  350. package/dist/render/pickable.d.ts +31 -0
  351. package/dist/render/pickable.js +172 -0
  352. package/dist/render/planarReflection.d.ts +59 -0
  353. package/dist/render/planarReflection.js +194 -0
  354. package/dist/render/planarReflectionDraw.d.ts +31 -0
  355. package/dist/render/planarReflectionDraw.js +65 -0
  356. package/dist/render/plumeGeometry.d.ts +25 -0
  357. package/dist/render/plumeGeometry.js +61 -0
  358. package/dist/render/plumeMaterial.d.ts +31 -0
  359. package/dist/render/plumeMaterial.js +64 -0
  360. package/dist/render/plumeRenderer.d.ts +96 -0
  361. package/dist/render/plumeRenderer.js +185 -0
  362. package/dist/render/pointLightSelection.d.ts +175 -0
  363. package/dist/render/pointLightSelection.js +301 -0
  364. package/dist/render/pointShadowArray.d.ts +95 -0
  365. package/dist/render/pointShadowArray.js +219 -0
  366. package/dist/render/pointShadowBudget.d.ts +118 -0
  367. package/dist/render/pointShadowBudget.js +221 -0
  368. package/dist/render/pointShadowImage.d.ts +265 -0
  369. package/dist/render/pointShadowImage.js +339 -0
  370. package/dist/render/pointShadowMap.d.ts +93 -0
  371. package/dist/render/pointShadowMap.js +167 -0
  372. package/dist/render/pointShadowSystem.d.ts +195 -0
  373. package/dist/render/pointShadowSystem.js +336 -0
  374. package/dist/render/prefilterEnvMap.d.ts +124 -0
  375. package/dist/render/prefilterEnvMap.js +146 -0
  376. package/dist/render/prefilterPass.d.ts +44 -0
  377. package/dist/render/prefilterPass.js +98 -0
  378. package/dist/render/probeGrid.d.ts +122 -0
  379. package/dist/render/probeGrid.js +174 -0
  380. package/dist/render/rainField.d.ts +99 -0
  381. package/dist/render/rainField.js +168 -0
  382. package/dist/render/reflectionProbe.d.ts +188 -0
  383. package/dist/render/reflectionProbe.js +437 -0
  384. package/dist/render/renderQuality.d.ts +699 -0
  385. package/dist/render/renderQuality.js +293 -0
  386. package/dist/render/rendererHarness.d.ts +39 -0
  387. package/dist/render/rendererHarness.js +185 -0
  388. package/dist/render/resolutionGovernor.d.ts +107 -0
  389. package/dist/render/resolutionGovernor.js +144 -0
  390. package/dist/render/scatterDeform.d.ts +17 -0
  391. package/dist/render/scatterDeform.js +46 -0
  392. package/dist/render/sceneTarget.d.ts +288 -0
  393. package/dist/render/sceneTarget.js +856 -0
  394. package/dist/render/screenSpaceReflection.d.ts +233 -0
  395. package/dist/render/screenSpaceReflection.js +415 -0
  396. package/dist/render/sdfFont.d.ts +77 -0
  397. package/dist/render/sdfFont.js +86 -0
  398. package/dist/render/sdfTextLayout.d.ts +46 -0
  399. package/dist/render/sdfTextLayout.js +145 -0
  400. package/dist/render/sdfTextRenderer.d.ts +75 -0
  401. package/dist/render/sdfTextRenderer.js +194 -0
  402. package/dist/render/seaState.d.ts +25 -0
  403. package/dist/render/seaState.js +34 -0
  404. package/dist/render/segmentQuads.d.ts +29 -0
  405. package/dist/render/segmentQuads.js +75 -0
  406. package/dist/render/shader.d.ts +5 -0
  407. package/dist/render/shader.js +172 -0
  408. package/dist/render/shaders/ambientOcclusion.d.ts +45 -0
  409. package/dist/render/shaders/ambientOcclusion.js +352 -0
  410. package/dist/render/shaders/arcane.d.ts +19 -0
  411. package/dist/render/shaders/arcane.js +102 -0
  412. package/dist/render/shaders/bloom.d.ts +70 -0
  413. package/dist/render/shaders/bloom.js +227 -0
  414. package/dist/render/shaders/bolt.d.ts +17 -0
  415. package/dist/render/shaders/bolt.js +161 -0
  416. package/dist/render/shaders/caustics.d.ts +38 -0
  417. package/dist/render/shaders/caustics.js +167 -0
  418. package/dist/render/shaders/conditionals.d.ts +21 -0
  419. package/dist/render/shaders/conditionals.js +55 -0
  420. package/dist/render/shaders/decalProject.d.ts +25 -0
  421. package/dist/render/shaders/decalProject.js +125 -0
  422. package/dist/render/shaders/depth.d.ts +14 -0
  423. package/dist/render/shaders/depth.js +114 -0
  424. package/dist/render/shaders/depthOfField.d.ts +41 -0
  425. package/dist/render/shaders/depthOfField.js +139 -0
  426. package/dist/render/shaders/film.d.ts +15 -0
  427. package/dist/render/shaders/film.js +283 -0
  428. package/dist/render/shaders/fire.d.ts +12 -0
  429. package/dist/render/shaders/fire.js +178 -0
  430. package/dist/render/shaders/flat/directionalShadow.d.ts +1 -0
  431. package/dist/render/shaders/flat/directionalShadow.js +195 -0
  432. package/dist/render/shaders/flat/index.d.ts +135 -0
  433. package/dist/render/shaders/flat/index.js +387 -0
  434. package/dist/render/shaders/flat/lobes.d.ts +1 -0
  435. package/dist/render/shaders/flat/lobes.js +398 -0
  436. package/dist/render/shaders/flat/main.d.ts +2 -0
  437. package/dist/render/shaders/flat/main.js +1630 -0
  438. package/dist/render/shaders/flat/pointShadow.d.ts +1 -0
  439. package/dist/render/shaders/flat/pointShadow.js +322 -0
  440. package/dist/render/shaders/flat/preamble.d.ts +15 -0
  441. package/dist/render/shaders/flat/preamble.js +864 -0
  442. package/dist/render/shaders/flat/probeGrid.d.ts +21 -0
  443. package/dist/render/shaders/flat/probeGrid.js +151 -0
  444. package/dist/render/shaders/flat/surface.d.ts +2 -0
  445. package/dist/render/shaders/flat/surface.js +40 -0
  446. package/dist/render/shaders/flock.d.ts +11 -0
  447. package/dist/render/shaders/flock.js +102 -0
  448. package/dist/render/shaders/fog.d.ts +37 -0
  449. package/dist/render/shaders/fog.js +98 -0
  450. package/dist/render/shaders/fullscreen.d.ts +16 -0
  451. package/dist/render/shaders/fullscreen.js +27 -0
  452. package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +65 -0
  453. package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +71 -0
  454. package/dist/render/shaders/generated/arcane.wgsl.d.ts +90 -0
  455. package/dist/render/shaders/generated/arcane.wgsl.js +96 -0
  456. package/dist/render/shaders/generated/bloom.wgsl.d.ts +69 -0
  457. package/dist/render/shaders/generated/bloom.wgsl.js +75 -0
  458. package/dist/render/shaders/generated/bolt.wgsl.d.ts +118 -0
  459. package/dist/render/shaders/generated/bolt.wgsl.js +124 -0
  460. package/dist/render/shaders/generated/caustics.wgsl.d.ts +118 -0
  461. package/dist/render/shaders/generated/caustics.wgsl.js +124 -0
  462. package/dist/render/shaders/generated/decalProject.wgsl.d.ts +61 -0
  463. package/dist/render/shaders/generated/decalProject.wgsl.js +67 -0
  464. package/dist/render/shaders/generated/depth.wgsl.d.ts +131 -0
  465. package/dist/render/shaders/generated/depth.wgsl.js +137 -0
  466. package/dist/render/shaders/generated/film.wgsl.d.ts +134 -0
  467. package/dist/render/shaders/generated/film.wgsl.js +140 -0
  468. package/dist/render/shaders/generated/fire.wgsl.d.ts +128 -0
  469. package/dist/render/shaders/generated/fire.wgsl.js +134 -0
  470. package/dist/render/shaders/generated/flat.wgsl.d.ts +9163 -0
  471. package/dist/render/shaders/generated/flat.wgsl.js +9192 -0
  472. package/dist/render/shaders/generated/flock.wgsl.d.ts +73 -0
  473. package/dist/render/shaders/generated/flock.wgsl.js +79 -0
  474. package/dist/render/shaders/generated/fullscreen.wgsl.d.ts +12 -0
  475. package/dist/render/shaders/generated/fullscreen.wgsl.js +18 -0
  476. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +130 -0
  477. package/dist/render/shaders/generated/globalMedium.wgsl.js +136 -0
  478. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +230 -0
  479. package/dist/render/shaders/generated/lightVolume.wgsl.js +239 -0
  480. package/dist/render/shaders/generated/line.wgsl.d.ts +128 -0
  481. package/dist/render/shaders/generated/line.wgsl.js +134 -0
  482. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +51 -0
  483. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +57 -0
  484. package/dist/render/shaders/generated/oitResolve.wgsl.d.ts +23 -0
  485. package/dist/render/shaders/generated/oitResolve.wgsl.js +29 -0
  486. package/dist/render/shaders/generated/panel.wgsl.d.ts +48 -0
  487. package/dist/render/shaders/generated/panel.wgsl.js +54 -0
  488. package/dist/render/shaders/generated/particle.wgsl.d.ts +332 -0
  489. package/dist/render/shaders/generated/particle.wgsl.js +338 -0
  490. package/dist/render/shaders/generated/prefilter.wgsl.d.ts +61 -0
  491. package/dist/render/shaders/generated/prefilter.wgsl.js +67 -0
  492. package/dist/render/shaders/generated/rush.wgsl.d.ts +131 -0
  493. package/dist/render/shaders/generated/rush.wgsl.js +137 -0
  494. package/dist/render/shaders/generated/scatter.wgsl.d.ts +195 -0
  495. package/dist/render/shaders/generated/scatter.wgsl.js +201 -0
  496. package/dist/render/shaders/generated/sdfText.wgsl.d.ts +69 -0
  497. package/dist/render/shaders/generated/sdfText.wgsl.js +75 -0
  498. package/dist/render/shaders/generated/sky.wgsl.d.ts +100 -0
  499. package/dist/render/shaders/generated/sky.wgsl.js +106 -0
  500. package/dist/render/shaders/generated/smoke.wgsl.d.ts +85 -0
  501. package/dist/render/shaders/generated/smoke.wgsl.js +91 -0
  502. package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +18 -0
  503. package/dist/render/shaders/generated/ssrResolve.wgsl.js +24 -0
  504. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +86 -0
  505. package/dist/render/shaders/generated/ssrTrace.wgsl.js +92 -0
  506. package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +46 -0
  507. package/dist/render/shaders/generated/temporalResolve.wgsl.js +52 -0
  508. package/dist/render/shaders/generated/text.wgsl.d.ts +98 -0
  509. package/dist/render/shaders/generated/text.wgsl.js +104 -0
  510. package/dist/render/shaders/generated/water.wgsl.d.ts +247 -0
  511. package/dist/render/shaders/generated/water.wgsl.js +253 -0
  512. package/dist/render/shaders/generated/windStreaks.wgsl.d.ts +73 -0
  513. package/dist/render/shaders/generated/windStreaks.wgsl.js +79 -0
  514. package/dist/render/shaders/gerstner.d.ts +21 -0
  515. package/dist/render/shaders/gerstner.js +110 -0
  516. package/dist/render/shaders/globalMedium.d.ts +56 -0
  517. package/dist/render/shaders/globalMedium.js +393 -0
  518. package/dist/render/shaders/lightVolume.d.ts +61 -0
  519. package/dist/render/shaders/lightVolume.js +527 -0
  520. package/dist/render/shaders/line.d.ts +18 -0
  521. package/dist/render/shaders/line.js +122 -0
  522. package/dist/render/shaders/morph.d.ts +26 -0
  523. package/dist/render/shaders/morph.js +61 -0
  524. package/dist/render/shaders/octahedral.d.ts +76 -0
  525. package/dist/render/shaders/octahedral.js +161 -0
  526. package/dist/render/shaders/octahedralResolve.d.ts +25 -0
  527. package/dist/render/shaders/octahedralResolve.js +81 -0
  528. package/dist/render/shaders/oitResolve.d.ts +17 -0
  529. package/dist/render/shaders/oitResolve.js +42 -0
  530. package/dist/render/shaders/outputTransform.d.ts +37 -0
  531. package/dist/render/shaders/outputTransform.js +106 -0
  532. package/dist/render/shaders/panel.d.ts +17 -0
  533. package/dist/render/shaders/panel.js +50 -0
  534. package/dist/render/shaders/particle.d.ts +82 -0
  535. package/dist/render/shaders/particle.js +431 -0
  536. package/dist/render/shaders/prefilter.d.ts +37 -0
  537. package/dist/render/shaders/prefilter.js +276 -0
  538. package/dist/render/shaders/rush.d.ts +21 -0
  539. package/dist/render/shaders/rush.js +355 -0
  540. package/dist/render/shaders/scatter.d.ts +14 -0
  541. package/dist/render/shaders/scatter.js +206 -0
  542. package/dist/render/shaders/sdfText.d.ts +9 -0
  543. package/dist/render/shaders/sdfText.js +65 -0
  544. package/dist/render/shaders/skinning.d.ts +17 -0
  545. package/dist/render/shaders/skinning.js +59 -0
  546. package/dist/render/shaders/sky.d.ts +10 -0
  547. package/dist/render/shaders/sky.js +242 -0
  548. package/dist/render/shaders/smoke.d.ts +8 -0
  549. package/dist/render/shaders/smoke.js +88 -0
  550. package/dist/render/shaders/ssrResolve.d.ts +15 -0
  551. package/dist/render/shaders/ssrResolve.js +28 -0
  552. package/dist/render/shaders/ssrTrace.d.ts +22 -0
  553. package/dist/render/shaders/ssrTrace.js +230 -0
  554. package/dist/render/shaders/tangentFrame.d.ts +17 -0
  555. package/dist/render/shaders/tangentFrame.js +70 -0
  556. package/dist/render/shaders/temporalResolve.d.ts +1 -0
  557. package/dist/render/shaders/temporalResolve.js +150 -0
  558. package/dist/render/shaders/text.d.ts +17 -0
  559. package/dist/render/shaders/text.js +155 -0
  560. package/dist/render/shaders/vertexChannel.d.ts +39 -0
  561. package/dist/render/shaders/vertexChannel.js +69 -0
  562. package/dist/render/shaders/water.d.ts +18 -0
  563. package/dist/render/shaders/water.js +354 -0
  564. package/dist/render/shaders/windStreaks.d.ts +14 -0
  565. package/dist/render/shaders/windStreaks.js +129 -0
  566. package/dist/render/shadowCasters.d.ts +107 -0
  567. package/dist/render/shadowCasters.js +1 -0
  568. package/dist/render/shadowMap.d.ts +10 -0
  569. package/dist/render/shadowMap.js +80 -0
  570. package/dist/render/shotPlacement.d.ts +80 -0
  571. package/dist/render/shotPlacement.js +183 -0
  572. package/dist/render/skinPalette.d.ts +90 -0
  573. package/dist/render/skinPalette.js +136 -0
  574. package/dist/render/ssrPass.d.ts +59 -0
  575. package/dist/render/ssrPass.js +196 -0
  576. package/dist/render/surfaceSheet.d.ts +52 -0
  577. package/dist/render/surfaceSheet.js +99 -0
  578. package/dist/render/surfaceTexture.d.ts +197 -0
  579. package/dist/render/surfaceTexture.js +116 -0
  580. package/dist/render/temporalAa.d.ts +104 -0
  581. package/dist/render/temporalAa.js +194 -0
  582. package/dist/render/temporalPass.d.ts +54 -0
  583. package/dist/render/temporalPass.js +135 -0
  584. package/dist/render/textLayout.d.ts +88 -0
  585. package/dist/render/textLayout.js +201 -0
  586. package/dist/render/textRenderer.d.ts +32 -0
  587. package/dist/render/textRenderer.js +176 -0
  588. package/dist/render/thirdPersonCamera.d.ts +272 -0
  589. package/dist/render/thirdPersonCamera.js +479 -0
  590. package/dist/render/trample.d.ts +57 -0
  591. package/dist/render/trample.js +134 -0
  592. package/dist/render/translucentQueue.d.ts +76 -0
  593. package/dist/render/translucentQueue.js +90 -0
  594. package/dist/render/uniformVectorBudget.d.ts +105 -0
  595. package/dist/render/uniformVectorBudget.js +201 -0
  596. package/dist/render/uploadStep.d.ts +14 -0
  597. package/dist/render/uploadStep.js +14 -0
  598. package/dist/render/vertexDefaults.d.ts +48 -0
  599. package/dist/render/vertexDefaults.js +111 -0
  600. package/dist/render/visibility.d.ts +22 -0
  601. package/dist/render/visibility.js +47 -0
  602. package/dist/render/waterDraw.d.ts +57 -0
  603. package/dist/render/waterDraw.js +102 -0
  604. package/dist/render/waterGrid.d.ts +62 -0
  605. package/dist/render/waterGrid.js +151 -0
  606. package/dist/render/waterRenderer.d.ts +163 -0
  607. package/dist/render/waterRenderer.js +165 -0
  608. package/dist/render/wind.d.ts +45 -0
  609. package/dist/render/wind.js +32 -0
  610. package/dist/render/windField.d.ts +34 -0
  611. package/dist/render/windField.js +13 -0
  612. package/dist/render/windStreakDraw.d.ts +73 -0
  613. package/dist/render/windStreakDraw.js +86 -0
  614. package/dist/render/windStreakRenderer.d.ts +37 -0
  615. package/dist/render/windStreakRenderer.js +86 -0
  616. package/dist/scene/node.d.ts +128 -0
  617. package/dist/scene/node.js +319 -0
  618. package/dist/scene/visit.d.ts +38 -0
  619. package/dist/scene/visit.js +43 -0
  620. package/dist/ui/clipMime.d.ts +46 -0
  621. package/dist/ui/clipMime.js +88 -0
  622. package/dist/ui/exportTarget.d.ts +305 -0
  623. package/dist/ui/exportTarget.js +368 -0
  624. package/dist/ui/frameOverlay.d.ts +59 -0
  625. package/dist/ui/frameOverlay.js +76 -0
  626. package/dist/ui/framePacer.d.ts +142 -0
  627. package/dist/ui/framePacer.js +284 -0
  628. package/dist/ui/frameRecorder.d.ts +188 -0
  629. package/dist/ui/frameRecorder.js +221 -0
  630. package/dist/ui/fullscreen.d.ts +72 -0
  631. package/dist/ui/fullscreen.js +92 -0
  632. package/dist/ui/pixelCursor.d.ts +28 -0
  633. package/dist/ui/pixelCursor.js +66 -0
  634. package/dist/ui/splash.d.ts +86 -0
  635. package/dist/ui/splash.js +300 -0
  636. package/dist/ui/stillFrame.d.ts +22 -0
  637. package/dist/ui/stillFrame.js +40 -0
  638. package/package.json +60 -0
  639. package/src/behavior/behaviorTree.ts +346 -0
  640. package/src/build/shaderComments.ts +0 -0
  641. package/src/cinematic/player.ts +209 -0
  642. package/src/cinematic/script.ts +231 -0
  643. package/src/core/bootGate.ts +49 -0
  644. package/src/core/loadTracker.ts +144 -0
  645. package/src/core/loop.ts +211 -0
  646. package/src/core/messageQueue.ts +145 -0
  647. package/src/core/onceSet.ts +65 -0
  648. package/src/core/preferences.ts +177 -0
  649. package/src/core/remoteSave.ts +347 -0
  650. package/src/core/rng.ts +101 -0
  651. package/src/core/stepBudget.ts +136 -0
  652. package/src/core/storage.ts +114 -0
  653. package/src/core/tickTrace.ts +129 -0
  654. package/src/core/timeCurve.ts +175 -0
  655. package/src/core/withDefaults.ts +28 -0
  656. package/src/dev/contactProbe.ts +115 -0
  657. package/src/dev/fpsMeter.ts +101 -0
  658. package/src/environment/celestialClock.ts +385 -0
  659. package/src/geometry/decal.ts +260 -0
  660. package/src/geometry/filmPatch.ts +158 -0
  661. package/src/geometry/growable.ts +165 -0
  662. package/src/geometry/lightVolume.ts +161 -0
  663. package/src/geometry/meshBuilder.ts +1397 -0
  664. package/src/geometry/pixelFont.ts +189 -0
  665. package/src/geometry/ribbon.ts +790 -0
  666. package/src/geometry/shellFill.ts +265 -0
  667. package/src/geometry/spline.ts +659 -0
  668. package/src/geometry/tangents.ts +173 -0
  669. package/src/geometry/textMesh.ts +96 -0
  670. package/src/geometry/treeBuilder.ts +114 -0
  671. package/src/host/display.ts +180 -0
  672. package/src/host/files.ts +77 -0
  673. package/src/host/lifecycle.ts +63 -0
  674. package/src/host/platformServices.ts +23 -0
  675. package/src/host/screen.ts +134 -0
  676. package/src/index.ts +730 -0
  677. package/src/input/actionMap.ts +377 -0
  678. package/src/input/activeDevice.ts +86 -0
  679. package/src/input/gamepadIdentity.ts +131 -0
  680. package/src/input/gamepadMapping.ts +121 -0
  681. package/src/input/input.ts +872 -0
  682. package/src/input/inputHarness.ts +226 -0
  683. package/src/input/rightGesture.ts +76 -0
  684. package/src/input/rumble.ts +138 -0
  685. package/src/input/touchControls.ts +451 -0
  686. package/src/input/typingTarget.ts +26 -0
  687. package/src/math/bounds.ts +153 -0
  688. package/src/math/color.ts +37 -0
  689. package/src/math/exact.ts +274 -0
  690. package/src/math/frustum.ts +115 -0
  691. package/src/math/intersect.ts +228 -0
  692. package/src/math/scalar.ts +109 -0
  693. package/src/math/spring.ts +106 -0
  694. package/src/nav/navGraph.ts +168 -0
  695. package/src/nav/navPath.ts +217 -0
  696. package/src/nav/navSearch.ts +200 -0
  697. package/src/physics/boxSurface.ts +96 -0
  698. package/src/physics/colliderSurface.ts +213 -0
  699. package/src/physics/compositeSurface.ts +111 -0
  700. package/src/physics/heightSurface.ts +234 -0
  701. package/src/physics/ribbonSurface.ts +642 -0
  702. package/src/render/ambientOcclusionPass.ts +200 -0
  703. package/src/render/areaLights.ts +194 -0
  704. package/src/render/areaShadowSet.ts +405 -0
  705. package/src/render/atmosphere.ts +186 -0
  706. package/src/render/backend/api.ts +802 -0
  707. package/src/render/backend/budget.ts +139 -0
  708. package/src/render/backend/createRenderer.ts +343 -0
  709. package/src/render/backend/deadline.ts +37 -0
  710. package/src/render/backend/probe.ts +152 -0
  711. package/src/render/backend/select.ts +288 -0
  712. package/src/render/backend/timer.ts +59 -0
  713. package/src/render/backend/webgl2/instanced.ts +46 -0
  714. package/src/render/backend/webgl2/morphTexture.ts +58 -0
  715. package/src/render/backend/webgl2/renderer.ts +7484 -0
  716. package/src/render/backend/webgl2/skinPaletteTexture.ts +70 -0
  717. package/src/render/backend/webgpu/boltPass.ts +205 -0
  718. package/src/render/backend/webgpu/buffers.ts +553 -0
  719. package/src/render/backend/webgpu/causticsPass.ts +174 -0
  720. package/src/render/backend/webgpu/clusterBinner.ts +259 -0
  721. package/src/render/backend/webgpu/depthPass.ts +261 -0
  722. package/src/render/backend/webgpu/device.ts +148 -0
  723. package/src/render/backend/webgpu/drawCommand.ts +79 -0
  724. package/src/render/backend/webgpu/environmentTexels.ts +96 -0
  725. package/src/render/backend/webgpu/filmPass.ts +123 -0
  726. package/src/render/backend/webgpu/flatPass.ts +635 -0
  727. package/src/render/backend/webgpu/flockPass.ts +163 -0
  728. package/src/render/backend/webgpu/gpuTimestamps.ts +255 -0
  729. package/src/render/backend/webgpu/insetPass.ts +123 -0
  730. package/src/render/backend/webgpu/instanced.ts +55 -0
  731. package/src/render/backend/webgpu/lightVolumePass.ts +203 -0
  732. package/src/render/backend/webgpu/linePass.ts +270 -0
  733. package/src/render/backend/webgpu/morphTexture.ts +61 -0
  734. package/src/render/backend/webgpu/panelPass.ts +138 -0
  735. package/src/render/backend/webgpu/particlePass.ts +370 -0
  736. package/src/render/backend/webgpu/pipelineCache.ts +152 -0
  737. package/src/render/backend/webgpu/plumePass.ts +292 -0
  738. package/src/render/backend/webgpu/pointShadowPass.ts +368 -0
  739. package/src/render/backend/webgpu/postPass.ts +470 -0
  740. package/src/render/backend/webgpu/probePass.ts +218 -0
  741. package/src/render/backend/webgpu/reflectionPass.ts +137 -0
  742. package/src/render/backend/webgpu/renderer.ts +13004 -0
  743. package/src/render/backend/webgpu/scatterPass.ts +354 -0
  744. package/src/render/backend/webgpu/sdfTextPass.ts +220 -0
  745. package/src/render/backend/webgpu/shaderModules.ts +49 -0
  746. package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +219 -0
  747. package/src/render/backend/webgpu/skinPaletteRing.ts +105 -0
  748. package/src/render/backend/webgpu/skinPaletteTexture.ts +79 -0
  749. package/src/render/backend/webgpu/skyPass.ts +85 -0
  750. package/src/render/backend/webgpu/surfaceTexturePass.ts +257 -0
  751. package/src/render/backend/webgpu/textPass.ts +224 -0
  752. package/src/render/backend/webgpu/uniformRing.ts +228 -0
  753. package/src/render/backend/webgpu/waterPass.ts +211 -0
  754. package/src/render/backend/webgpu/windStreakPass.ts +196 -0
  755. package/src/render/billboard.ts +108 -0
  756. package/src/render/bloomChain.ts +101 -0
  757. package/src/render/bloomPass.ts +256 -0
  758. package/src/render/boltBatch.ts +141 -0
  759. package/src/render/boltPool.ts +360 -0
  760. package/src/render/boom.ts +123 -0
  761. package/src/render/camera.ts +348 -0
  762. package/src/render/causticsRenderer.ts +171 -0
  763. package/src/render/cinematicCamera.ts +278 -0
  764. package/src/render/clusteredLights.ts +598 -0
  765. package/src/render/colourGrade.ts +109 -0
  766. package/src/render/compute.ts +83 -0
  767. package/src/render/contextLoss.ts +50 -0
  768. package/src/render/debugLines.ts +411 -0
  769. package/src/render/decalPass.ts +124 -0
  770. package/src/render/decalProjector.ts +390 -0
  771. package/src/render/decalQueue.ts +110 -0
  772. package/src/render/depthConvention.ts +383 -0
  773. package/src/render/drawingBuffer.ts +89 -0
  774. package/src/render/emptyTexture.ts +130 -0
  775. package/src/render/envProbeArray.ts +201 -0
  776. package/src/render/equirectToCube.ts +160 -0
  777. package/src/render/flockGeometry.ts +53 -0
  778. package/src/render/flockRenderer.ts +111 -0
  779. package/src/render/frame/arena.ts +93 -0
  780. package/src/render/frame/index.ts +29 -0
  781. package/src/render/frame/replay.ts +50 -0
  782. package/src/render/frame/resources.ts +61 -0
  783. package/src/render/frame/schedule.ts +85 -0
  784. package/src/render/frameView.ts +20 -0
  785. package/src/render/gizmo.ts +923 -0
  786. package/src/render/globalMedium.ts +154 -0
  787. package/src/render/globalMediumPass.ts +323 -0
  788. package/src/render/gpuCapability.ts +244 -0
  789. package/src/render/gpuTimer.ts +182 -0
  790. package/src/render/halfFloat.ts +39 -0
  791. package/src/render/handleRegistry.ts +96 -0
  792. package/src/render/iesProfile.ts +215 -0
  793. package/src/render/imageTexels.ts +109 -0
  794. package/src/render/instancedMesh.ts +187 -0
  795. package/src/render/instances.ts +92 -0
  796. package/src/render/lightBudget.ts +655 -0
  797. package/src/render/lightMatrix.ts +69 -0
  798. package/src/render/lightVolumeDraw.ts +216 -0
  799. package/src/render/lineBatch.ts +180 -0
  800. package/src/render/linePoints.ts +61 -0
  801. package/src/render/livePointShadowSet.ts +285 -0
  802. package/src/render/lod.ts +86 -0
  803. package/src/render/mesh.ts +536 -0
  804. package/src/render/occlusion.ts +406 -0
  805. package/src/render/oitPass.ts +230 -0
  806. package/src/render/orderIndependent.ts +136 -0
  807. package/src/render/particleBatch.ts +299 -0
  808. package/src/render/particleMaterial.ts +84 -0
  809. package/src/render/particlePool.ts +291 -0
  810. package/src/render/pass.ts +203 -0
  811. package/src/render/passTarget.ts +225 -0
  812. package/src/render/pickable.ts +222 -0
  813. package/src/render/planarReflection.ts +233 -0
  814. package/src/render/planarReflectionDraw.ts +87 -0
  815. package/src/render/plumeGeometry.ts +75 -0
  816. package/src/render/plumeMaterial.ts +99 -0
  817. package/src/render/plumeRenderer.ts +272 -0
  818. package/src/render/pointLightSelection.ts +447 -0
  819. package/src/render/pointShadowArray.ts +276 -0
  820. package/src/render/pointShadowBudget.ts +305 -0
  821. package/src/render/pointShadowImage.ts +470 -0
  822. package/src/render/pointShadowMap.ts +228 -0
  823. package/src/render/pointShadowSystem.ts +408 -0
  824. package/src/render/prefilterEnvMap.ts +162 -0
  825. package/src/render/prefilterPass.ts +115 -0
  826. package/src/render/probeGrid.ts +248 -0
  827. package/src/render/rainField.ts +240 -0
  828. package/src/render/reflectionProbe.ts +530 -0
  829. package/src/render/renderQuality.ts +1054 -0
  830. package/src/render/rendererHarness.ts +214 -0
  831. package/src/render/resolutionGovernor.ts +189 -0
  832. package/src/render/scatterDeform.ts +72 -0
  833. package/src/render/sceneTarget.ts +1032 -0
  834. package/src/render/screenSpaceReflection.ts +524 -0
  835. package/src/render/sdfFont.ts +157 -0
  836. package/src/render/sdfTextLayout.ts +206 -0
  837. package/src/render/sdfTextRenderer.ts +233 -0
  838. package/src/render/seaState.ts +55 -0
  839. package/src/render/segmentQuads.ts +92 -0
  840. package/src/render/shader.ts +190 -0
  841. package/src/render/shaders/ambientOcclusion.ts +354 -0
  842. package/src/render/shaders/arcane.ts +103 -0
  843. package/src/render/shaders/bloom.ts +232 -0
  844. package/src/render/shaders/bolt.ts +164 -0
  845. package/src/render/shaders/caustics.ts +169 -0
  846. package/src/render/shaders/conditionals.ts +58 -0
  847. package/src/render/shaders/decalProject.ts +127 -0
  848. package/src/render/shaders/depth.ts +131 -0
  849. package/src/render/shaders/depthOfField.ts +141 -0
  850. package/src/render/shaders/film.ts +285 -0
  851. package/src/render/shaders/fire.ts +180 -0
  852. package/src/render/shaders/flat/directionalShadow.ts +196 -0
  853. package/src/render/shaders/flat/index.ts +502 -0
  854. package/src/render/shaders/flat/lobes.ts +399 -0
  855. package/src/render/shaders/flat/main.ts +1631 -0
  856. package/src/render/shaders/flat/pointShadow.ts +323 -0
  857. package/src/render/shaders/flat/preamble.ts +875 -0
  858. package/src/render/shaders/flat/probeGrid.ts +152 -0
  859. package/src/render/shaders/flat/surface.ts +41 -0
  860. package/src/render/shaders/flock.ts +103 -0
  861. package/src/render/shaders/fog.ts +99 -0
  862. package/src/render/shaders/fullscreen.ts +28 -0
  863. package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +74 -0
  864. package/src/render/shaders/generated/arcane.wgsl.ts +98 -0
  865. package/src/render/shaders/generated/bloom.wgsl.ts +79 -0
  866. package/src/render/shaders/generated/bolt.wgsl.ts +127 -0
  867. package/src/render/shaders/generated/caustics.wgsl.ts +127 -0
  868. package/src/render/shaders/generated/decalProject.wgsl.ts +69 -0
  869. package/src/render/shaders/generated/depth.wgsl.ts +142 -0
  870. package/src/render/shaders/generated/film.wgsl.ts +143 -0
  871. package/src/render/shaders/generated/fire.wgsl.ts +137 -0
  872. package/src/render/shaders/generated/flat.wgsl.ts +9195 -0
  873. package/src/render/shaders/generated/flock.wgsl.ts +82 -0
  874. package/src/render/shaders/generated/fullscreen.wgsl.ts +20 -0
  875. package/src/render/shaders/generated/globalMedium.wgsl.ts +139 -0
  876. package/src/render/shaders/generated/lightVolume.wgsl.ts +242 -0
  877. package/src/render/shaders/generated/line.wgsl.ts +137 -0
  878. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +60 -0
  879. package/src/render/shaders/generated/oitResolve.wgsl.ts +31 -0
  880. package/src/render/shaders/generated/panel.wgsl.ts +57 -0
  881. package/src/render/shaders/generated/particle.wgsl.ts +343 -0
  882. package/src/render/shaders/generated/prefilter.wgsl.ts +69 -0
  883. package/src/render/shaders/generated/rush.wgsl.ts +139 -0
  884. package/src/render/shaders/generated/scatter.wgsl.ts +205 -0
  885. package/src/render/shaders/generated/sdfText.wgsl.ts +78 -0
  886. package/src/render/shaders/generated/sky.wgsl.ts +109 -0
  887. package/src/render/shaders/generated/smoke.wgsl.ts +93 -0
  888. package/src/render/shaders/generated/ssrResolve.wgsl.ts +26 -0
  889. package/src/render/shaders/generated/ssrTrace.wgsl.ts +94 -0
  890. package/src/render/shaders/generated/temporalResolve.wgsl.ts +54 -0
  891. package/src/render/shaders/generated/text.wgsl.ts +107 -0
  892. package/src/render/shaders/generated/water.wgsl.ts +256 -0
  893. package/src/render/shaders/generated/windStreaks.wgsl.ts +82 -0
  894. package/src/render/shaders/gerstner.ts +110 -0
  895. package/src/render/shaders/globalMedium.ts +396 -0
  896. package/src/render/shaders/lightVolume.ts +546 -0
  897. package/src/render/shaders/line.ts +125 -0
  898. package/src/render/shaders/morph.ts +62 -0
  899. package/src/render/shaders/octahedral.ts +170 -0
  900. package/src/render/shaders/octahedralResolve.ts +83 -0
  901. package/src/render/shaders/oitResolve.ts +42 -0
  902. package/src/render/shaders/outputTransform.ts +107 -0
  903. package/src/render/shaders/panel.ts +51 -0
  904. package/src/render/shaders/particle.ts +438 -0
  905. package/src/render/shaders/prefilter.ts +278 -0
  906. package/src/render/shaders/rush.ts +357 -0
  907. package/src/render/shaders/scatter.ts +211 -0
  908. package/src/render/shaders/sdfText.ts +68 -0
  909. package/src/render/shaders/skinning.ts +59 -0
  910. package/src/render/shaders/sky.ts +243 -0
  911. package/src/render/shaders/smoke.ts +89 -0
  912. package/src/render/shaders/ssrResolve.ts +28 -0
  913. package/src/render/shaders/ssrTrace.ts +233 -0
  914. package/src/render/shaders/tangentFrame.ts +70 -0
  915. package/src/render/shaders/temporalResolve.ts +151 -0
  916. package/src/render/shaders/text.ts +156 -0
  917. package/src/render/shaders/vertexChannel.ts +71 -0
  918. package/src/render/shaders/water.ts +356 -0
  919. package/src/render/shaders/windStreaks.ts +130 -0
  920. package/src/render/shadowCasters.ts +124 -0
  921. package/src/render/shadowMap.ts +89 -0
  922. package/src/render/shotPlacement.ts +266 -0
  923. package/src/render/skinPalette.ts +157 -0
  924. package/src/render/ssrPass.ts +241 -0
  925. package/src/render/surfaceSheet.ts +158 -0
  926. package/src/render/surfaceTexture.ts +310 -0
  927. package/src/render/temporalAa.ts +221 -0
  928. package/src/render/temporalPass.ts +153 -0
  929. package/src/render/textLayout.ts +239 -0
  930. package/src/render/textRenderer.ts +201 -0
  931. package/src/render/thirdPersonCamera.ts +578 -0
  932. package/src/render/trample.ts +140 -0
  933. package/src/render/translucentQueue.ts +161 -0
  934. package/src/render/uniformVectorBudget.ts +246 -0
  935. package/src/render/uploadStep.ts +14 -0
  936. package/src/render/vertexDefaults.ts +115 -0
  937. package/src/render/visibility.ts +56 -0
  938. package/src/render/waterDraw.ts +167 -0
  939. package/src/render/waterGrid.ts +180 -0
  940. package/src/render/waterRenderer.ts +352 -0
  941. package/src/render/wind.ts +79 -0
  942. package/src/render/windField.ts +50 -0
  943. package/src/render/windStreakDraw.ts +131 -0
  944. package/src/render/windStreakRenderer.ts +130 -0
  945. package/src/scene/node.ts +336 -0
  946. package/src/scene/visit.ts +82 -0
  947. package/src/ui/clipMime.ts +109 -0
  948. package/src/ui/exportTarget.ts +491 -0
  949. package/src/ui/frameOverlay.ts +159 -0
  950. package/src/ui/framePacer.ts +351 -0
  951. package/src/ui/frameRecorder.ts +333 -0
  952. package/src/ui/fullscreen.ts +113 -0
  953. package/src/ui/pixelCursor.ts +99 -0
  954. package/src/ui/splash.ts +347 -0
  955. package/src/ui/stillFrame.ts +44 -0
@@ -0,0 +1,21 @@
1
+ /** Reading the probe array: which layers a point sits between, and what each of them holds. */
2
+ /**
3
+ * The lit pass's half of the grid, and the two things it has to get right.
4
+ *
5
+ * **A layer index is arithmetic rather than a lookup.** Probes stand on a lattice, so the cell a
6
+ * point is in comes out of one multiply and a floor, and the eight corner weights are three lerps.
7
+ * `probeGrid.ts` computes the same thing in TypeScript for a caller pacing its bakes, and the two
8
+ * expressions have to agree or every fragment reads a probe that was baked somewhere else.
9
+ *
10
+ * **Levels are mixed by hand, and the gutter is why.** A level's gutter is one texel, so its inset
11
+ * in normalised coordinates is `1 / edge` and differs between levels. Hardware trilinear applies
12
+ * one coordinate to both levels it blends, so one of the two would be read at the wrong inset — by
13
+ * a thirty-second of the map at the top of the chain, which is a visible slide in a reflection as
14
+ * roughness rises. Two fetches at their own insets, mixed, is the price of the fold.
15
+ *
16
+ * **What it costs**, at the counts below: eight fetches for the diffuse term and four for the
17
+ * reflection. The diffuse eight are of an eight-texel image and land in the same cache line; the
18
+ * reflection's four are two probes at two levels. A grid of one collapses to one and two, because
19
+ * every corner resolves to the same layer and the zero-weight ones are skipped.
20
+ */
21
+ export declare const PROBEGRID_GLSL = "#if ENVIRONMENT_PROBE\n/**\n * Where a direction lands in one layer at one level, inset past that level's gutter.\n *\n * The level's own edge rather than the map's, since a gutter is one texel at every level and its\n * share of the map doubles as the chain coarsens.\n */\nvec3 probeCoord(vec3 dir, float level, float layer) {\n float levelEdge = max(uEnvironmentEdge / exp2(level), 4.0);\n return vec3(octInsetUv(dir, levelEdge), layer);\n}\n\n/**\n * A layer index from whole lattice coordinates: x fastest, then y, then z.\n *\n * Clamped, which is what makes an axis one probe wide safe: the second corner of a pair that does\n * not exist resolves to the first, at a weight the caller has already set to zero.\n */\nfloat probeLayer(vec3 index) {\n vec3 top = max(uProbeGridCounts - 1.0, vec3(0.0));\n vec3 held = clamp(index, vec3(0.0), top);\n return held.x + uProbeGridCounts.x * (held.y + uProbeGridCounts.y * held.z);\n}\n\n/**\n * The cell a world position is in, as a base corner and the fraction past it.\n *\n * **Clamped rather than wrapped**, so a point outside the grid takes the nearest probes at full\n * weight \u2014 the environment it would have had one step inside. Wrapping would light one end of a\n * world with the probe from the other end, which is invisible in any test that stays indoors.\n *\n * An axis one probe wide has its fraction forced to zero, so that axis contributes a factor of one\n * to every corner weight and the eight corners collapse onto fewer layers whose weights still sum\n * to one.\n */\nvoid probeCell(vec3 worldPos, out vec3 base, out vec3 frac) {\n vec3 top = max(uProbeGridCounts - 1.0, vec3(0.0));\n vec3 local = clamp((worldPos - uProbeGridOrigin) * uProbeGridInvSpacing, vec3(0.0), top);\n base = min(floor(local), max(top - 1.0, vec3(0.0)));\n frac = local - base;\n frac *= step(vec3(1.5), uProbeGridCounts);\n}\n\n/** One probe's diffuse light: the cosine convolution, at its own level, in one fetch. */\nvec3 probeIrradiance(vec3 dir, float layer) {\n float level = uEnvironmentIrradianceLevel;\n return textureLod(uEnvironment, probeCoord(dir, level, layer), level).rgb;\n}\n\n/**\n * One probe's reflection at a roughness, as two levels mixed by hand.\n *\n * textureLod rather than texture throughout, per the 2026-08-07 rule and for a second reason on\n * top of it: the level is wanted here, and the fetches sit inside a loop that no compiler can\n * prove uniform.\n */\nvec3 probeRadiance(vec3 dir, float lod, float layer) {\n float lo = clamp(floor(lod), 0.0, uEnvironmentMaxLod);\n float hi = min(lo + 1.0, uEnvironmentMaxLod);\n vec3 coarse = textureLod(uEnvironment, probeCoord(dir, hi, layer), hi).rgb;\n vec3 fine = textureLod(uEnvironment, probeCoord(dir, lo, layer), lo).rgb;\n return mix(fine, coarse, clamp(lod - lo, 0.0, 1.0));\n}\n\n/**\n * The grid's diffuse light at a point, trilinear over the eight probes around it.\n *\n * **Eight, because diffuse is the term a grid exists for.** A floor spanning four probes is the\n * case the whole row was costed against, and a hard selection steps visibly across it \u2014 which is\n * exactly where a lit surface has nothing else going on to hide the seam.\n *\n * Zero-weight corners are skipped, so a grid of one does one fetch rather than eight.\n *\n * The cell is recomputed here rather than passed in, because the two terms sit in separate\n * conditional blocks of the lit pass and threading a pair of vectors between them would mean a\n * third. Six arithmetic operations against that.\n */\nvec3 gridIrradiance(vec3 dir, vec3 worldPos) {\n vec3 base;\n vec3 frac;\n probeCell(worldPos, base, frac);\n vec3 sum = vec3(0.0);\n for (int c = 0; c < 8; c++) {\n vec3 corner = vec3(float(c & 1), float((c >> 1) & 1), float((c >> 2) & 1));\n vec3 axisWeight = mix(1.0 - frac, frac, corner);\n float weight = axisWeight.x * axisWeight.y * axisWeight.z;\n if (weight <= 0.0) continue;\n sum += probeIrradiance(dir, probeLayer(base + corner)) * weight;\n }\n return sum;\n}\n\n/**\n * The grid's reflection at a point: two probes along the axis the point is most between.\n *\n * **Two rather than eight, and the axis is chosen rather than fixed.** Sixteen fetches for a\n * reflection is not affordable on the parts this engine targets, and a single probe pops as a\n * smooth surface crosses a cell boundary. Blending along the axis with the largest betweenness\n * removes the pop where it is largest for one extra pair of fetches; the other two axes take their\n * nearest probe, where the switch happens at the point the blend would have been half and half.\n *\n * Full trilinear here is recorded as deferred rather than refused, with its reversal condition: a\n * consumer measuring the remaining seam as their constraint.\n */\nvec3 gridRadiance(vec3 dir, float lod, vec3 worldPos) {\n vec3 base;\n vec3 frac;\n probeCell(worldPos, base, frac);\n vec3 between = min(frac, 1.0 - frac);\n vec3 nearest = base + step(vec3(0.5), frac);\n vec3 low = nearest;\n vec3 high = nearest;\n float t = 0.0;\n if (between.x >= between.y && between.x >= between.z) {\n low.x = base.x;\n high.x = base.x + 1.0;\n t = frac.x;\n } else if (between.y >= between.z) {\n low.y = base.y;\n high.y = base.y + 1.0;\n t = frac.y;\n } else {\n low.z = base.z;\n high.z = base.z + 1.0;\n t = frac.z;\n }\n vec3 near = probeRadiance(dir, lod, probeLayer(low));\n if (t <= 0.0) return near;\n return mix(near, probeRadiance(dir, lod, probeLayer(high)), t);\n}\n#endif";
@@ -0,0 +1,151 @@
1
+ /** Reading the probe array: which layers a point sits between, and what each of them holds. */
2
+ /**
3
+ * The lit pass's half of the grid, and the two things it has to get right.
4
+ *
5
+ * **A layer index is arithmetic rather than a lookup.** Probes stand on a lattice, so the cell a
6
+ * point is in comes out of one multiply and a floor, and the eight corner weights are three lerps.
7
+ * `probeGrid.ts` computes the same thing in TypeScript for a caller pacing its bakes, and the two
8
+ * expressions have to agree or every fragment reads a probe that was baked somewhere else.
9
+ *
10
+ * **Levels are mixed by hand, and the gutter is why.** A level's gutter is one texel, so its inset
11
+ * in normalised coordinates is `1 / edge` and differs between levels. Hardware trilinear applies
12
+ * one coordinate to both levels it blends, so one of the two would be read at the wrong inset — by
13
+ * a thirty-second of the map at the top of the chain, which is a visible slide in a reflection as
14
+ * roughness rises. Two fetches at their own insets, mixed, is the price of the fold.
15
+ *
16
+ * **What it costs**, at the counts below: eight fetches for the diffuse term and four for the
17
+ * reflection. The diffuse eight are of an eight-texel image and land in the same cache line; the
18
+ * reflection's four are two probes at two levels. A grid of one collapses to one and two, because
19
+ * every corner resolves to the same layer and the zero-weight ones are skipped.
20
+ */
21
+ export const PROBEGRID_GLSL = `#if ENVIRONMENT_PROBE
22
+ /**
23
+ * Where a direction lands in one layer at one level, inset past that level's gutter.
24
+ *
25
+ * The level's own edge rather than the map's, since a gutter is one texel at every level and its
26
+ * share of the map doubles as the chain coarsens.
27
+ */
28
+ vec3 probeCoord(vec3 dir, float level, float layer) {
29
+ float levelEdge = max(uEnvironmentEdge / exp2(level), 4.0);
30
+ return vec3(octInsetUv(dir, levelEdge), layer);
31
+ }
32
+
33
+ /**
34
+ * A layer index from whole lattice coordinates: x fastest, then y, then z.
35
+ *
36
+ * Clamped, which is what makes an axis one probe wide safe: the second corner of a pair that does
37
+ * not exist resolves to the first, at a weight the caller has already set to zero.
38
+ */
39
+ float probeLayer(vec3 index) {
40
+ vec3 top = max(uProbeGridCounts - 1.0, vec3(0.0));
41
+ vec3 held = clamp(index, vec3(0.0), top);
42
+ return held.x + uProbeGridCounts.x * (held.y + uProbeGridCounts.y * held.z);
43
+ }
44
+
45
+ /**
46
+ * The cell a world position is in, as a base corner and the fraction past it.
47
+ *
48
+ * **Clamped rather than wrapped**, so a point outside the grid takes the nearest probes at full
49
+ * weight — the environment it would have had one step inside. Wrapping would light one end of a
50
+ * world with the probe from the other end, which is invisible in any test that stays indoors.
51
+ *
52
+ * An axis one probe wide has its fraction forced to zero, so that axis contributes a factor of one
53
+ * to every corner weight and the eight corners collapse onto fewer layers whose weights still sum
54
+ * to one.
55
+ */
56
+ void probeCell(vec3 worldPos, out vec3 base, out vec3 frac) {
57
+ vec3 top = max(uProbeGridCounts - 1.0, vec3(0.0));
58
+ vec3 local = clamp((worldPos - uProbeGridOrigin) * uProbeGridInvSpacing, vec3(0.0), top);
59
+ base = min(floor(local), max(top - 1.0, vec3(0.0)));
60
+ frac = local - base;
61
+ frac *= step(vec3(1.5), uProbeGridCounts);
62
+ }
63
+
64
+ /** One probe's diffuse light: the cosine convolution, at its own level, in one fetch. */
65
+ vec3 probeIrradiance(vec3 dir, float layer) {
66
+ float level = uEnvironmentIrradianceLevel;
67
+ return textureLod(uEnvironment, probeCoord(dir, level, layer), level).rgb;
68
+ }
69
+
70
+ /**
71
+ * One probe's reflection at a roughness, as two levels mixed by hand.
72
+ *
73
+ * textureLod rather than texture throughout, per the 2026-08-07 rule and for a second reason on
74
+ * top of it: the level is wanted here, and the fetches sit inside a loop that no compiler can
75
+ * prove uniform.
76
+ */
77
+ vec3 probeRadiance(vec3 dir, float lod, float layer) {
78
+ float lo = clamp(floor(lod), 0.0, uEnvironmentMaxLod);
79
+ float hi = min(lo + 1.0, uEnvironmentMaxLod);
80
+ vec3 coarse = textureLod(uEnvironment, probeCoord(dir, hi, layer), hi).rgb;
81
+ vec3 fine = textureLod(uEnvironment, probeCoord(dir, lo, layer), lo).rgb;
82
+ return mix(fine, coarse, clamp(lod - lo, 0.0, 1.0));
83
+ }
84
+
85
+ /**
86
+ * The grid's diffuse light at a point, trilinear over the eight probes around it.
87
+ *
88
+ * **Eight, because diffuse is the term a grid exists for.** A floor spanning four probes is the
89
+ * case the whole row was costed against, and a hard selection steps visibly across it — which is
90
+ * exactly where a lit surface has nothing else going on to hide the seam.
91
+ *
92
+ * Zero-weight corners are skipped, so a grid of one does one fetch rather than eight.
93
+ *
94
+ * The cell is recomputed here rather than passed in, because the two terms sit in separate
95
+ * conditional blocks of the lit pass and threading a pair of vectors between them would mean a
96
+ * third. Six arithmetic operations against that.
97
+ */
98
+ vec3 gridIrradiance(vec3 dir, vec3 worldPos) {
99
+ vec3 base;
100
+ vec3 frac;
101
+ probeCell(worldPos, base, frac);
102
+ vec3 sum = vec3(0.0);
103
+ for (int c = 0; c < 8; c++) {
104
+ vec3 corner = vec3(float(c & 1), float((c >> 1) & 1), float((c >> 2) & 1));
105
+ vec3 axisWeight = mix(1.0 - frac, frac, corner);
106
+ float weight = axisWeight.x * axisWeight.y * axisWeight.z;
107
+ if (weight <= 0.0) continue;
108
+ sum += probeIrradiance(dir, probeLayer(base + corner)) * weight;
109
+ }
110
+ return sum;
111
+ }
112
+
113
+ /**
114
+ * The grid's reflection at a point: two probes along the axis the point is most between.
115
+ *
116
+ * **Two rather than eight, and the axis is chosen rather than fixed.** Sixteen fetches for a
117
+ * reflection is not affordable on the parts this engine targets, and a single probe pops as a
118
+ * smooth surface crosses a cell boundary. Blending along the axis with the largest betweenness
119
+ * removes the pop where it is largest for one extra pair of fetches; the other two axes take their
120
+ * nearest probe, where the switch happens at the point the blend would have been half and half.
121
+ *
122
+ * Full trilinear here is recorded as deferred rather than refused, with its reversal condition: a
123
+ * consumer measuring the remaining seam as their constraint.
124
+ */
125
+ vec3 gridRadiance(vec3 dir, float lod, vec3 worldPos) {
126
+ vec3 base;
127
+ vec3 frac;
128
+ probeCell(worldPos, base, frac);
129
+ vec3 between = min(frac, 1.0 - frac);
130
+ vec3 nearest = base + step(vec3(0.5), frac);
131
+ vec3 low = nearest;
132
+ vec3 high = nearest;
133
+ float t = 0.0;
134
+ if (between.x >= between.y && between.x >= between.z) {
135
+ low.x = base.x;
136
+ high.x = base.x + 1.0;
137
+ t = frac.x;
138
+ } else if (between.y >= between.z) {
139
+ low.y = base.y;
140
+ high.y = base.y + 1.0;
141
+ t = frac.y;
142
+ } else {
143
+ low.z = base.z;
144
+ high.z = base.z + 1.0;
145
+ t = frac.z;
146
+ }
147
+ vec3 near = probeRadiance(dir, lod, probeLayer(low));
148
+ if (t <= 0.0) return near;
149
+ return mix(near, probeRadiance(dir, lod, probeLayer(high)), t);
150
+ }
151
+ #endif`;
@@ -0,0 +1,2 @@
1
+ /** Grain and relief: the two terms that come from the surface rather than from the light. */
2
+ export declare const SURFACE_GLSL = "float grainHash(vec3 p) {\n p = fract(p * 0.1031);\n p += dot(p, p.zyx + 31.32);\n return fract((p.x + p.y) * p.z);\n}\n\nfloat grain(vec3 p) {\n vec3 i = floor(p);\n vec3 f = fract(p);\n vec3 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(\n mix(grainHash(i + vec3(0.0, 0.0, 0.0)), grainHash(i + vec3(1.0, 0.0, 0.0)), u.x),\n mix(grainHash(i + vec3(0.0, 1.0, 0.0)), grainHash(i + vec3(1.0, 1.0, 0.0)), u.x),\n u.y\n ),\n mix(\n mix(grainHash(i + vec3(0.0, 0.0, 1.0)), grainHash(i + vec3(1.0, 0.0, 1.0)), u.x),\n mix(grainHash(i + vec3(0.0, 1.0, 1.0)), grainHash(i + vec3(1.0, 1.0, 1.0)), u.x),\n u.y\n ),\n u.z\n );\n}\n\n/**\n * A colour read as a height, for `uTextureRelief`.\n *\n * Luminance rather than three.js's red channel alone, because the image doing this job here is\n * the *colour* image and a red-only reading ties how tall a bump is to what colour it happens\n * to be \u2014 a rust streak on grey rock would stand proud of it for no reason a surface has. On the\n * greyscale tile a dedicated bump map usually is, the two agree exactly.\n *\n * Rec. 709 weights, matching `bloom.ts`'s own discussion of the same coefficients.\n */\nfloat surfaceHeight(vec3 rgb) {\n return dot(rgb, vec3(0.2126, 0.7152, 0.0722));\n}\n";
@@ -0,0 +1,40 @@
1
+ /** Grain and relief: the two terms that come from the surface rather than from the light. */
2
+ export const SURFACE_GLSL = `float grainHash(vec3 p) {
3
+ p = fract(p * 0.1031);
4
+ p += dot(p, p.zyx + 31.32);
5
+ return fract((p.x + p.y) * p.z);
6
+ }
7
+
8
+ float grain(vec3 p) {
9
+ vec3 i = floor(p);
10
+ vec3 f = fract(p);
11
+ vec3 u = f * f * (3.0 - 2.0 * f);
12
+ return mix(
13
+ mix(
14
+ mix(grainHash(i + vec3(0.0, 0.0, 0.0)), grainHash(i + vec3(1.0, 0.0, 0.0)), u.x),
15
+ mix(grainHash(i + vec3(0.0, 1.0, 0.0)), grainHash(i + vec3(1.0, 1.0, 0.0)), u.x),
16
+ u.y
17
+ ),
18
+ mix(
19
+ mix(grainHash(i + vec3(0.0, 0.0, 1.0)), grainHash(i + vec3(1.0, 0.0, 1.0)), u.x),
20
+ mix(grainHash(i + vec3(0.0, 1.0, 1.0)), grainHash(i + vec3(1.0, 1.0, 1.0)), u.x),
21
+ u.y
22
+ ),
23
+ u.z
24
+ );
25
+ }
26
+
27
+ /**
28
+ * A colour read as a height, for \`uTextureRelief\`.
29
+ *
30
+ * Luminance rather than three.js's red channel alone, because the image doing this job here is
31
+ * the *colour* image and a red-only reading ties how tall a bump is to what colour it happens
32
+ * to be — a rust streak on grey rock would stand proud of it for no reason a surface has. On the
33
+ * greyscale tile a dedicated bump map usually is, the two agree exactly.
34
+ *
35
+ * Rec. 709 weights, matching \`bloom.ts\`'s own discussion of the same coefficients.
36
+ */
37
+ float surfaceHeight(vec3 rgb) {
38
+ return dot(rgb, vec3(0.2126, 0.7152, 0.0722));
39
+ }
40
+ `;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Birds: two triangles each, circling on a path computed entirely in the vertex
3
+ * shader.
4
+ *
5
+ * No simulation, no CPU work per frame, no collision. A flock is scenery, and
6
+ * scenery that costs frame time is a bad trade — what it buys is the sense that
7
+ * the world exists without the player, which needs motion and silhouette, not
8
+ * behaviour.
9
+ */
10
+ export declare const FLOCK_VERT = "#version 300 es\nlayout(location = 0) in vec2 aCorner;\nlayout(location = 1) in float aWing;\nlayout(location = 2) in float aIndex;\n\nuniform mat4 uViewProj;\nuniform vec3 uCenter;\nuniform float uRadius;\nuniform float uHeight;\nuniform float uSpeed;\nuniform float uTime;\nuniform float uCount;\nuniform float uScale;\n/** Horizontal wind, m/s. Birds hold station against it rather than riding it. */\nuniform vec2 uWind;\n\nout float vShade;\n\nvoid main() {\n // Each bird gets its own orbit: radius, height and rate all vary with index,\n // so the flock drifts apart and re-gathers instead of turning as one rigid\n // ring \u2014 which is what a shared angle alone produces.\n float id = aIndex;\n /*\n * Hashed from id + 1, and that +1 is a bug fix rather than a flourish.\n *\n * fract(sin(x) * k) has a fixed point at zero: sin(0) is 0, so bird 0 came out with spin\n * and lift of exactly 0 while every other bird got a scattered value. Zero is not a\n * middling result here, it is the floor of all three ranges at once \u2014 the innermost\n * orbit of the whole flock, the lowest height and the slowest wingbeat. Measured on the\n * storm scene: bird 0 orbited at 8.25 m while birds 1 to 33 spread over 8.34 to 15.72 m.\n * One bird in every flock, in every scene, permanently unlike the rest.\n */\n float seed = id + 1.0;\n float spin = fract(sin(seed * 12.9898) * 43758.5453);\n float lift = fract(sin(seed * 78.233) * 24634.6345);\n\n float radius = uRadius * (0.55 + spin * 0.5);\n float rate = uSpeed * (0.8 + lift * 0.45) / max(radius, 0.001);\n float angle = uTime * rate + id * 6.2831 / max(uCount, 1.0);\n\n vec3 heading = vec3(-sin(angle), 0.0, cos(angle));\n\n /*\n * Birds are not leaves. They hold station against a wind rather than being\n * carried off by it, so the wind does not translate them \u2014 it costs them\n * ground speed when they turn into it and gives it back downwind, and it\n * pushes the whole circuit slightly to leeward. The read is that they are\n * working, which is the only reason a bird is interesting at this distance.\n */\n float into = -dot(normalize(heading.xz + vec2(1e-5)), uWind) * 0.06;\n float driftAngle = angle + into;\n\n vec3 centre = uCenter + vec3(\n cos(driftAngle) * radius + uWind.x * 1.1,\n uHeight * (0.7 + lift * 0.6) + sin(uTime * 0.6 + id) * 1.4,\n sin(driftAngle) * radius + uWind.y * 1.1\n );\n\n // Wings beat about the bird's own travel direction, so the flap axis follows\n // the turn rather than staying locked to the world.\n vec3 forward = vec3(-sin(driftAngle), 0.0, cos(driftAngle));\n vec3 side = normalize(cross(forward, vec3(0.0, 1.0, 0.0)));\n\n // Harder into the wind: the beat rate rises with how much of the heading\n // opposes it, which is what makes the effort legible without any simulation.\n float effort = 1.0 + max(into, 0.0) * 22.0;\n float beat = sin(uTime * (9.0 + spin * 4.0) * effort + id) * 0.5 + 0.5;\n // aWing is 0 at the body and 1 at the tip, so only the tip rises.\n float fold = aWing * beat * 0.55;\n\n vec3 offset = side * (aCorner.x * uScale)\n + forward * (aCorner.y * uScale * 0.6)\n + vec3(0.0, fold * uScale, 0.0);\n\n vec3 world = centre + offset;\n // Silhouette only: a bird at this distance is a shape against the sky, and\n // shading it properly would just make it grey.\n vShade = 0.55 + beat * 0.25;\n gl_Position = uViewProj * vec4(world, 1.0);\n}\n";
11
+ export declare const FLOCK_FRAG = "#version 300 es\nprecision highp float;\n\nin float vShade;\nuniform vec3 uTint;\nout vec4 outColor;\n\nvoid main() {\n outColor = vec4(uTint * vShade, 1.0);\n}\n";
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Birds: two triangles each, circling on a path computed entirely in the vertex
3
+ * shader.
4
+ *
5
+ * No simulation, no CPU work per frame, no collision. A flock is scenery, and
6
+ * scenery that costs frame time is a bad trade — what it buys is the sense that
7
+ * the world exists without the player, which needs motion and silhouette, not
8
+ * behaviour.
9
+ */
10
+ export const FLOCK_VERT = `#version 300 es
11
+ layout(location = 0) in vec2 aCorner;
12
+ layout(location = 1) in float aWing;
13
+ layout(location = 2) in float aIndex;
14
+
15
+ uniform mat4 uViewProj;
16
+ uniform vec3 uCenter;
17
+ uniform float uRadius;
18
+ uniform float uHeight;
19
+ uniform float uSpeed;
20
+ uniform float uTime;
21
+ uniform float uCount;
22
+ uniform float uScale;
23
+ /** Horizontal wind, m/s. Birds hold station against it rather than riding it. */
24
+ uniform vec2 uWind;
25
+
26
+ out float vShade;
27
+
28
+ void main() {
29
+ // Each bird gets its own orbit: radius, height and rate all vary with index,
30
+ // so the flock drifts apart and re-gathers instead of turning as one rigid
31
+ // ring — which is what a shared angle alone produces.
32
+ float id = aIndex;
33
+ /*
34
+ * Hashed from id + 1, and that +1 is a bug fix rather than a flourish.
35
+ *
36
+ * fract(sin(x) * k) has a fixed point at zero: sin(0) is 0, so bird 0 came out with spin
37
+ * and lift of exactly 0 while every other bird got a scattered value. Zero is not a
38
+ * middling result here, it is the floor of all three ranges at once — the innermost
39
+ * orbit of the whole flock, the lowest height and the slowest wingbeat. Measured on the
40
+ * storm scene: bird 0 orbited at 8.25 m while birds 1 to 33 spread over 8.34 to 15.72 m.
41
+ * One bird in every flock, in every scene, permanently unlike the rest.
42
+ */
43
+ float seed = id + 1.0;
44
+ float spin = fract(sin(seed * 12.9898) * 43758.5453);
45
+ float lift = fract(sin(seed * 78.233) * 24634.6345);
46
+
47
+ float radius = uRadius * (0.55 + spin * 0.5);
48
+ float rate = uSpeed * (0.8 + lift * 0.45) / max(radius, 0.001);
49
+ float angle = uTime * rate + id * 6.2831 / max(uCount, 1.0);
50
+
51
+ vec3 heading = vec3(-sin(angle), 0.0, cos(angle));
52
+
53
+ /*
54
+ * Birds are not leaves. They hold station against a wind rather than being
55
+ * carried off by it, so the wind does not translate them — it costs them
56
+ * ground speed when they turn into it and gives it back downwind, and it
57
+ * pushes the whole circuit slightly to leeward. The read is that they are
58
+ * working, which is the only reason a bird is interesting at this distance.
59
+ */
60
+ float into = -dot(normalize(heading.xz + vec2(1e-5)), uWind) * 0.06;
61
+ float driftAngle = angle + into;
62
+
63
+ vec3 centre = uCenter + vec3(
64
+ cos(driftAngle) * radius + uWind.x * 1.1,
65
+ uHeight * (0.7 + lift * 0.6) + sin(uTime * 0.6 + id) * 1.4,
66
+ sin(driftAngle) * radius + uWind.y * 1.1
67
+ );
68
+
69
+ // Wings beat about the bird's own travel direction, so the flap axis follows
70
+ // the turn rather than staying locked to the world.
71
+ vec3 forward = vec3(-sin(driftAngle), 0.0, cos(driftAngle));
72
+ vec3 side = normalize(cross(forward, vec3(0.0, 1.0, 0.0)));
73
+
74
+ // Harder into the wind: the beat rate rises with how much of the heading
75
+ // opposes it, which is what makes the effort legible without any simulation.
76
+ float effort = 1.0 + max(into, 0.0) * 22.0;
77
+ float beat = sin(uTime * (9.0 + spin * 4.0) * effort + id) * 0.5 + 0.5;
78
+ // aWing is 0 at the body and 1 at the tip, so only the tip rises.
79
+ float fold = aWing * beat * 0.55;
80
+
81
+ vec3 offset = side * (aCorner.x * uScale)
82
+ + forward * (aCorner.y * uScale * 0.6)
83
+ + vec3(0.0, fold * uScale, 0.0);
84
+
85
+ vec3 world = centre + offset;
86
+ // Silhouette only: a bird at this distance is a shape against the sky, and
87
+ // shading it properly would just make it grey.
88
+ vShade = 0.55 + beat * 0.25;
89
+ gl_Position = uViewProj * vec4(world, 1.0);
90
+ }
91
+ `;
92
+ export const FLOCK_FRAG = `#version 300 es
93
+ precision highp float;
94
+
95
+ in float vShade;
96
+ uniform vec3 uTint;
97
+ out vec4 outColor;
98
+
99
+ void main() {
100
+ outColor = vec4(uTint * vShade, 1.0);
101
+ }
102
+ `;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The medium between the camera and everything it can see: haze in the air, and
3
+ * the water column when the camera is under it.
4
+ *
5
+ * One GLSL string rather than a copy in each program. Seven fragment shaders were
6
+ * carrying the same seven uniform declarations and the same four lines of fog, which
7
+ * is seven chances for the mesh under a slick to recede at a different rate than the
8
+ * slick does — and it had already happened: the oil film's own comment claimed *"the
9
+ * same fog every other pass applies"* while it ran a different curve.
10
+ */
11
+ /**
12
+ * Air is **Beer–Lambert through a haze layer that thins with height**, water keeps its
13
+ * own squared law, and `uUnderwaterFactor` crossfades them across the surface.
14
+ *
15
+ * **Why the air law changed (2026-08-04).** It used to be `1 − exp(−(σd)²)`, the
16
+ * fixed-function `GL_EXP2` curve, whose optical depth grows with the *square* of
17
+ * distance — which is not an extinction law, it is a medium that gets denser the
18
+ * further you look. It saturates viciously: at the day-3 density it reached 50% at
19
+ * 63 m and **99.9% at 200 m**, so when the world grew from a 44 m band to a 232 m one
20
+ * the whole of a 200 m descent, the sea and the islands were a single flat wash of sky
21
+ * colour. Beer–Lambert spends the same near field over a far longer range — and it has
22
+ * a *non-zero gradient at zero distance*, where the squared law is flat, so the first
23
+ * twenty metres actually gain depth rather than lose it.
24
+ *
25
+ * **Why height matters.** Haze sits on the sea and thins upward; there is less air
26
+ * above you the higher you stand. That is the difference between looking along a valley
27
+ * and looking down a mountain, which is exactly the distinction this world acquired
28
+ * when it got tall. Density is `σ₀·exp(−(y − y₀)/H)`, and the optical depth along a ray
29
+ * is that integrated between the two endpoint heights — which collapses to the density
30
+ * at the eye times `(1 − e⁻ᵗ)/t`, with `t` the height climbed in scale heights. The eye
31
+ * density and `1/H` arrive precomputed from `bindAtmosphere`.
32
+ *
33
+ * `uFogEyeY` rather than `uCameraPos.y` because two of the seven programs (the plumes)
34
+ * never needed the camera position in their fragment stage, and a block that declares
35
+ * everything it uses can be pasted anywhere.
36
+ */
37
+ export declare const FOG_GLSL = "\nuniform vec3 uFogColor;\n/** Extinction per metre **at the camera's own height**, not at the base. */\nuniform float uFogDensity;\n/** Reciprocal scale height of the haze, per metre. 0 is a uniform medium. */\nuniform float uFogHeightFalloff;\n/** The camera's height, so a fragment's own height is one subtraction away. */\nuniform float uFogEyeY;\nuniform vec3 uUnderwaterColor;\nuniform float uUnderwaterFogDensity;\nuniform float uUnderwaterFactor;\n/** 0 integrates a medium (Beer-Lambert); 1 ramps linearly between near and far. */\nuniform int uFogMode;\n/** Linear mode only: where haze begins, and where it is total. */\nuniform float uFogNear;\nuniform float uFogFar;\n\n/** What distance converges toward: the day's haze, or the water column. */\nvec3 mediumColor() {\n return mix(uFogColor, uUnderwaterColor, uUnderwaterFactor);\n}\n\n/**\n * How much of a surface standing at height pointY, dist metres away, is lost to\n * the medium in between. 0 is perfectly clear, 1 is the medium's own colour.\n */\nfloat mediumFog(float dist, float pointY) {\n /*\n * A depth ramp rather than a medium, for worlds authored against one.\n *\n * Beer-Lambert is the honest model and stays the default: it integrates something\n * physically there, so extinction begins at the eye and never stops. A linear near/far\n * fog is not that \u2014 it is a *look*, with a hard start distance before which the air is\n * perfectly clear, and it is what the fixed-function pipeline offered and what several\n * renderers still expose. Approximating one with the other is not a matter of tuning:\n * matched at half occlusion, the exponential curve still lays haze over everything\n * inside near, where the ramp lays none, and near-field colour desaturates toward the\n * fog colour with nothing to show for it.\n *\n * Height falloff has no meaning here and is ignored: a ramp is defined on distance\n * alone.\n */\n if (uFogMode == 1) {\n float span = max(uFogFar - uFogNear, 1e-4);\n float ramp = clamp((dist - uFogNear) / span, 0.0, 1.0);\n if (uUnderwaterFactor <= 0.0) return ramp;\n float wetLinear = uUnderwaterFogDensity * dist;\n return mix(ramp, 1.0 - exp2(-wetLinear * wetLinear * 1.442695), uUnderwaterFactor);\n }\n\n float t = (pointY - uFogEyeY) * uFogHeightFalloff;\n // (1 - e^-t)/t, which tends to 1 as the ray levels out. Guarded rather than\n // branched: at t = 0 the quotient is 0/0, and 1e-4 of a scale height is 8 mm.\n float denom = abs(t) < 1e-4 ? 1e-4 : t;\n float air = 1.0 - exp(-uFogDensity * dist * (1.0 - exp(-denom)) / denom);\n if (uUnderwaterFactor <= 0.0) return air;\n // Water is its own medium and keeps its own curve, so crossing the surface\n // changes nothing about how the water column reads.\n float wet = uUnderwaterFogDensity * dist;\n return mix(air, 1.0 - exp2(-wet * wet * 1.442695), uUnderwaterFactor);\n}\n";
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The medium between the camera and everything it can see: haze in the air, and
3
+ * the water column when the camera is under it.
4
+ *
5
+ * One GLSL string rather than a copy in each program. Seven fragment shaders were
6
+ * carrying the same seven uniform declarations and the same four lines of fog, which
7
+ * is seven chances for the mesh under a slick to recede at a different rate than the
8
+ * slick does — and it had already happened: the oil film's own comment claimed *"the
9
+ * same fog every other pass applies"* while it ran a different curve.
10
+ */
11
+ /**
12
+ * Air is **Beer–Lambert through a haze layer that thins with height**, water keeps its
13
+ * own squared law, and `uUnderwaterFactor` crossfades them across the surface.
14
+ *
15
+ * **Why the air law changed (2026-08-04).** It used to be `1 − exp(−(σd)²)`, the
16
+ * fixed-function `GL_EXP2` curve, whose optical depth grows with the *square* of
17
+ * distance — which is not an extinction law, it is a medium that gets denser the
18
+ * further you look. It saturates viciously: at the day-3 density it reached 50% at
19
+ * 63 m and **99.9% at 200 m**, so when the world grew from a 44 m band to a 232 m one
20
+ * the whole of a 200 m descent, the sea and the islands were a single flat wash of sky
21
+ * colour. Beer–Lambert spends the same near field over a far longer range — and it has
22
+ * a *non-zero gradient at zero distance*, where the squared law is flat, so the first
23
+ * twenty metres actually gain depth rather than lose it.
24
+ *
25
+ * **Why height matters.** Haze sits on the sea and thins upward; there is less air
26
+ * above you the higher you stand. That is the difference between looking along a valley
27
+ * and looking down a mountain, which is exactly the distinction this world acquired
28
+ * when it got tall. Density is `σ₀·exp(−(y − y₀)/H)`, and the optical depth along a ray
29
+ * is that integrated between the two endpoint heights — which collapses to the density
30
+ * at the eye times `(1 − e⁻ᵗ)/t`, with `t` the height climbed in scale heights. The eye
31
+ * density and `1/H` arrive precomputed from `bindAtmosphere`.
32
+ *
33
+ * `uFogEyeY` rather than `uCameraPos.y` because two of the seven programs (the plumes)
34
+ * never needed the camera position in their fragment stage, and a block that declares
35
+ * everything it uses can be pasted anywhere.
36
+ */
37
+ export const FOG_GLSL = `
38
+ uniform vec3 uFogColor;
39
+ /** Extinction per metre **at the camera's own height**, not at the base. */
40
+ uniform float uFogDensity;
41
+ /** Reciprocal scale height of the haze, per metre. 0 is a uniform medium. */
42
+ uniform float uFogHeightFalloff;
43
+ /** The camera's height, so a fragment's own height is one subtraction away. */
44
+ uniform float uFogEyeY;
45
+ uniform vec3 uUnderwaterColor;
46
+ uniform float uUnderwaterFogDensity;
47
+ uniform float uUnderwaterFactor;
48
+ /** 0 integrates a medium (Beer-Lambert); 1 ramps linearly between near and far. */
49
+ uniform int uFogMode;
50
+ /** Linear mode only: where haze begins, and where it is total. */
51
+ uniform float uFogNear;
52
+ uniform float uFogFar;
53
+
54
+ /** What distance converges toward: the day's haze, or the water column. */
55
+ vec3 mediumColor() {
56
+ return mix(uFogColor, uUnderwaterColor, uUnderwaterFactor);
57
+ }
58
+
59
+ /**
60
+ * How much of a surface standing at height pointY, dist metres away, is lost to
61
+ * the medium in between. 0 is perfectly clear, 1 is the medium's own colour.
62
+ */
63
+ float mediumFog(float dist, float pointY) {
64
+ /*
65
+ * A depth ramp rather than a medium, for worlds authored against one.
66
+ *
67
+ * Beer-Lambert is the honest model and stays the default: it integrates something
68
+ * physically there, so extinction begins at the eye and never stops. A linear near/far
69
+ * fog is not that — it is a *look*, with a hard start distance before which the air is
70
+ * perfectly clear, and it is what the fixed-function pipeline offered and what several
71
+ * renderers still expose. Approximating one with the other is not a matter of tuning:
72
+ * matched at half occlusion, the exponential curve still lays haze over everything
73
+ * inside near, where the ramp lays none, and near-field colour desaturates toward the
74
+ * fog colour with nothing to show for it.
75
+ *
76
+ * Height falloff has no meaning here and is ignored: a ramp is defined on distance
77
+ * alone.
78
+ */
79
+ if (uFogMode == 1) {
80
+ float span = max(uFogFar - uFogNear, 1e-4);
81
+ float ramp = clamp((dist - uFogNear) / span, 0.0, 1.0);
82
+ if (uUnderwaterFactor <= 0.0) return ramp;
83
+ float wetLinear = uUnderwaterFogDensity * dist;
84
+ return mix(ramp, 1.0 - exp2(-wetLinear * wetLinear * 1.442695), uUnderwaterFactor);
85
+ }
86
+
87
+ float t = (pointY - uFogEyeY) * uFogHeightFalloff;
88
+ // (1 - e^-t)/t, which tends to 1 as the ray levels out. Guarded rather than
89
+ // branched: at t = 0 the quotient is 0/0, and 1e-4 of a scale height is 8 mm.
90
+ float denom = abs(t) < 1e-4 ? 1e-4 : t;
91
+ float air = 1.0 - exp(-uFogDensity * dist * (1.0 - exp(-denom)) / denom);
92
+ if (uUnderwaterFactor <= 0.0) return air;
93
+ // Water is its own medium and keeps its own curve, so crossing the surface
94
+ // changes nothing about how the water column reads.
95
+ float wet = uUnderwaterFogDensity * dist;
96
+ return mix(air, 1.0 - exp2(-wet * wet * 1.442695), uUnderwaterFactor);
97
+ }
98
+ `;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The vertex stage every full-viewport pass shares.
3
+ *
4
+ * One module because there is one right answer and three programs want it: the composite,
5
+ * the ambient-occlusion estimate and its blur. Copying it into each would be three places
6
+ * for the winding, the UV convention and the triangle-versus-quad decision to drift apart,
7
+ * and a post chain whose passes disagree about which way up the image is fails in a way that
8
+ * looks like every effect being wrong at once.
9
+ */
10
+ /**
11
+ * A fullscreen triangle from `gl_VertexID` alone — no vertex buffer, no VAO contents.
12
+ *
13
+ * Three vertices covering the viewport beats two triangles: the shared diagonal of a quad
14
+ * makes some GPUs rasterise the seam twice, and a triangle has no seam.
15
+ */
16
+ export declare const FULLSCREEN_VERT = "#version 300 es\nprecision highp float;\n\nout vec2 vUv;\n\nvoid main() {\n // (-1,-1), (3,-1), (-1,3): a triangle whose clipped interior is exactly the viewport.\n vec2 corner = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2) * 2.0 - 1.0;\n vUv = corner * 0.5 + 0.5;\n gl_Position = vec4(corner, 0.0, 1.0);\n}\n";
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The vertex stage every full-viewport pass shares.
3
+ *
4
+ * One module because there is one right answer and three programs want it: the composite,
5
+ * the ambient-occlusion estimate and its blur. Copying it into each would be three places
6
+ * for the winding, the UV convention and the triangle-versus-quad decision to drift apart,
7
+ * and a post chain whose passes disagree about which way up the image is fails in a way that
8
+ * looks like every effect being wrong at once.
9
+ */
10
+ /**
11
+ * A fullscreen triangle from `gl_VertexID` alone — no vertex buffer, no VAO contents.
12
+ *
13
+ * Three vertices covering the viewport beats two triangles: the shared diagonal of a quad
14
+ * makes some GPUs rasterise the seam twice, and a triangle has no seam.
15
+ */
16
+ export const FULLSCREEN_VERT = `#version 300 es
17
+ precision highp float;
18
+
19
+ out vec2 vUv;
20
+
21
+ void main() {
22
+ // (-1,-1), (3,-1), (-1,3): a triangle whose clipped interior is exactly the viewport.
23
+ vec2 corner = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2) * 2.0 - 1.0;
24
+ vUv = corner * 0.5 + 0.5;
25
+ gl_Position = vec4(corner, 0.0, 1.0);
26
+ }
27
+ `;
@@ -0,0 +1,65 @@
1
+ export declare const AO_BLUR_FRAG_WGSL = "struct Uniforms {\n uStep: vec2<f32>,\n uDepthToViewZ: vec4<f32>,\n}\n\n@group(0) @binding(1) \nvar<uniform> unnamed: Uniforms;\n@group(0) @binding(34) \nvar uDepth_t: texture_2d<f32>;\n@group(0) @binding(35) \nvar uDepth_s: sampler;\nvar<private> vUv_1: vec2<f32>;\n@group(0) @binding(32) \nvar uAo_t: texture_2d<f32>;\n@group(0) @binding(33) \nvar uAo_s: sampler;\nvar<private> fragColor: f32;\n\nfn viewZ_u0028_f1_u003b(depth: ptr<function, f32>) -> f32 {\n var ndc: f32;\n\n let _e22 = (*depth);\n ndc = (1f - (_e22 * 2f));\n let _e27 = unnamed.uDepthToViewZ[0u];\n let _e28 = ndc;\n let _e32 = unnamed.uDepthToViewZ[1u];\n let _e36 = unnamed.uDepthToViewZ[2u];\n let _e37 = ndc;\n let _e41 = unnamed.uDepthToViewZ[3u];\n return (((_e27 * _e28) + _e32) / ((_e36 * _e37) + _e41));\n}\n\nfn main_1() {\n var centre: f32;\n var param: f32;\n var tolerance: f32;\n var sum: f32;\n var weight: f32;\n var i: i32;\n var uv: vec2<f32>;\n var z: f32;\n var param_1: f32;\n var w: f32;\n var local: f32;\n\n let _e31 = vUv_1;\n let _e32 = textureSampleLevel(uDepth_t, uDepth_s, _e31, 0f);\n param = _e32.x;\n let _e34 = viewZ_u0028_f1_u003b((&param));\n centre = _e34;\n let _e35 = centre;\n tolerance = ((0.02f * abs(_e35)) + 0.0001f);\n sum = 0f;\n weight = 0f;\n i = -3i;\n loop {\n let _e39 = i;\n if (_e39 <= 4i) {\n let _e41 = vUv_1;\n let _e43 = unnamed.uStep;\n let _e44 = i;\n uv = (_e41 + (_e43 * f32(_e44)));\n let _e48 = uv;\n let _e49 = textureSampleLevel(uDepth_t, uDepth_s, _e48, 0f);\n param_1 = _e49.x;\n let _e51 = viewZ_u0028_f1_u003b((&param_1));\n z = _e51;\n let _e52 = z;\n let _e53 = centre;\n let _e56 = tolerance;\n w = max(0f, (1f - (abs((_e52 - _e53)) / _e56)));\n let _e60 = uv;\n let _e61 = textureSampleLevel(uAo_t, uAo_s, _e60, 0f);\n let _e63 = w;\n let _e65 = sum;\n sum = (_e65 + (_e61.x * _e63));\n let _e67 = w;\n let _e68 = weight;\n weight = (_e68 + _e67);\n continue;\n } else {\n break;\n }\n continuing {\n let _e70 = i;\n i = (_e70 + 1i);\n }\n }\n let _e72 = weight;\n if (_e72 > 0f) {\n let _e74 = sum;\n let _e75 = weight;\n local = (_e74 / _e75);\n } else {\n let _e77 = vUv_1;\n let _e78 = textureSampleLevel(uAo_t, uAo_s, _e77, 0f);\n local = _e78.x;\n }\n let _e80 = local;\n fragColor = _e80;\n return;\n}\n\n@fragment \nfn main(@location(0) vUv: vec2<f32>) -> @location(0) f32 {\n vUv_1 = vUv;\n main_1();\n let _e3 = fragColor;\n return _e3;\n}\n";
2
+ export declare const AO_FRAG_WGSL = "struct Uniforms {\n uProjScale: vec2<f32>,\n uInvProjection: mat4x4<f32>,\n uRadius: f32,\n}\n\n@group(0) @binding(1) \nvar<uniform> unnamed: Uniforms;\nvar<private> vUv_1: vec2<f32>;\n@group(0) @binding(32) \nvar uDepth_t: texture_2d<f32>;\n@group(0) @binding(33) \nvar uDepth_s: sampler;\nvar<private> fragColor: f32;\nvar<private> gl_FragCoord_1: vec4<f32>;\n\nfn viewPosition_u0028_vf2_u003b_f1_u003b(uv: ptr<function, vec2<f32>>, depth: ptr<function, f32>) -> vec3<f32> {\n var clip: vec4<f32>;\n var view: vec4<f32>;\n\n let _e33 = (*uv);\n let _e36 = ((_e33 * 2f) - vec2(1f));\n let _e37 = (*depth);\n clip = vec4<f32>(_e36.x, _e36.y, (1f - (_e37 * 2f)), 1f);\n let _e44 = unnamed.uInvProjection;\n let _e45 = clip;\n view = (_e44 * _e45);\n let _e47 = view;\n let _e50 = view[3u];\n return (_e47.xyz / vec3(_e50));\n}\n\nfn main_1() {\n var stepX: vec2<f32>;\n var stepY: vec2<f32>;\n var depth_1: f32;\n var p: vec3<f32>;\n var param: vec2<f32>;\n var param_1: f32;\n var dpdx_: vec3<f32>;\n var dpdy_: vec3<f32>;\n var right: vec3<f32>;\n var param_2: vec2<f32>;\n var param_3: f32;\n var left: vec3<f32>;\n var param_4: vec2<f32>;\n var param_5: f32;\n var down: vec3<f32>;\n var param_6: vec2<f32>;\n var param_7: f32;\n var up: vec3<f32>;\n var param_8: vec2<f32>;\n var param_9: f32;\n var here: f32;\n var edgeFloor: f32;\n var rightGap: f32;\n var leftGap: f32;\n var downGap: f32;\n var upGap: f32;\n var n: vec3<f32>;\n var reach: vec2<f32>;\n var tile: f32;\n var turn: f32;\n var sum: f32;\n var i: i32;\n var t: f32;\n var angle: f32;\n var uv_1: vec2<f32>;\n var sampled: f32;\n var v: vec3<f32>;\n var param_10: vec2<f32>;\n var param_11: f32;\n var vv: f32;\n\n let _e69 = vUv_1;\n let _e70 = dpdx(_e69);\n stepX = _e70;\n let _e71 = vUv_1;\n let _e72 = dpdy(_e71);\n stepY = _e72;\n let _e73 = vUv_1;\n let _e74 = textureSampleLevel(uDepth_t, uDepth_s, _e73, 0f);\n depth_1 = _e74.x;\n let _e76 = vUv_1;\n param = _e76;\n let _e77 = depth_1;\n param_1 = _e77;\n let _e78 = viewPosition_u0028_vf2_u003b_f1_u003b((&param), (&param_1));\n p = _e78;\n let _e79 = p;\n let _e80 = dpdx(_e79);\n dpdx_ = _e80;\n let _e81 = p;\n let _e82 = dpdy(_e81);\n dpdy_ = _e82;\n let _e83 = depth_1;\n if (_e83 <= 0f) {\n fragColor = 1f;\n return;\n }\n let _e85 = vUv_1;\n let _e86 = stepX;\n let _e88 = vUv_1;\n let _e89 = stepX;\n let _e91 = textureSampleLevel(uDepth_t, uDepth_s, (_e88 + _e89), 0f);\n param_2 = (_e85 + _e86);\n param_3 = _e91.x;\n let _e93 = viewPosition_u0028_vf2_u003b_f1_u003b((&param_2), (&param_3));\n right = _e93;\n let _e94 = vUv_1;\n let _e95 = stepX;\n let _e97 = vUv_1;\n let _e98 = stepX;\n let _e100 = textureSampleLevel(uDepth_t, uDepth_s, (_e97 - _e98), 0f);\n param_4 = (_e94 - _e95);\n param_5 = _e100.x;\n let _e102 = viewPosition_u0028_vf2_u003b_f1_u003b((&param_4), (&param_5));\n left = _e102;\n let _e103 = vUv_1;\n let _e104 = stepY;\n let _e106 = vUv_1;\n let _e107 = stepY;\n let _e109 = textureSampleLevel(uDepth_t, uDepth_s, (_e106 + _e107), 0f);\n param_6 = (_e103 + _e104);\n param_7 = _e109.x;\n let _e111 = viewPosition_u0028_vf2_u003b_f1_u003b((&param_6), (&param_7));\n down = _e111;\n let _e112 = vUv_1;\n let _e113 = stepY;\n let _e115 = vUv_1;\n let _e116 = stepY;\n let _e118 = textureSampleLevel(uDepth_t, uDepth_s, (_e115 - _e116), 0f);\n param_8 = (_e112 - _e113);\n param_9 = _e118.x;\n let _e120 = viewPosition_u0028_vf2_u003b_f1_u003b((&param_8), (&param_9));\n up = _e120;\n let _e122 = p[2u];\n here = -(_e122);\n let _e124 = here;\n edgeFloor = (0.05f * _e124);\n let _e127 = right[2u];\n let _e129 = here;\n rightGap = abs((-(_e127) - _e129));\n let _e133 = left[2u];\n let _e135 = here;\n leftGap = abs((-(_e133) - _e135));\n let _e139 = down[2u];\n let _e141 = here;\n downGap = abs((-(_e139) - _e141));\n let _e145 = up[2u];\n let _e147 = here;\n upGap = abs((-(_e145) - _e147));\n let _e150 = rightGap;\n let _e151 = leftGap;\n let _e153 = edgeFloor;\n if (_e150 > ((_e151 * 8f) + _e153)) {\n let _e156 = p;\n let _e157 = left;\n dpdx_ = (_e156 - _e157);\n } else {\n let _e159 = leftGap;\n let _e160 = rightGap;\n let _e162 = edgeFloor;\n if (_e159 > ((_e160 * 8f) + _e162)) {\n let _e165 = right;\n let _e166 = p;\n dpdx_ = (_e165 - _e166);\n }\n }\n let _e168 = downGap;\n let _e169 = upGap;\n let _e171 = edgeFloor;\n if (_e168 > ((_e169 * 8f) + _e171)) {\n let _e174 = p;\n let _e175 = up;\n dpdy_ = (_e174 - _e175);\n } else {\n let _e177 = upGap;\n let _e178 = downGap;\n let _e180 = edgeFloor;\n if (_e177 > ((_e178 * 8f) + _e180)) {\n let _e183 = down;\n let _e184 = p;\n dpdy_ = (_e183 - _e184);\n }\n }\n let _e186 = dpdx_;\n let _e187 = dpdy_;\n n = normalize(cross(_e186, _e187));\n let _e190 = n;\n let _e191 = p;\n if (dot(_e190, _e191) > 0f) {\n let _e194 = n;\n n = -(_e194);\n }\n let _e197 = unnamed.uRadius;\n let _e199 = unnamed.uProjScale;\n let _e203 = p[2u];\n reach = min((((_e199 * _e197) * 0.5f) / vec2(max(-(_e203), 0.001f))), vec2<f32>(0.06f, 0.06f));\n let _e210 = gl_FragCoord_1[0u];\n let _e216 = gl_FragCoord_1[1u];\n tile = ((_e210 - (floor((_e210 / 4f)) * 4f)) + (4f * (_e216 - (floor((_e216 / 4f)) * 4f))));\n let _e223 = tile;\n turn = (_e223 * 0.3926991f);\n sum = 0f;\n i = 0i;\n loop {\n let _e225 = i;\n if (_e225 < 12i) {\n let _e227 = i;\n t = ((f32(_e227) + 0.5f) / 12f);\n let _e231 = turn;\n let _e232 = i;\n angle = (_e231 + (f32(_e232) * 2.3999631f));\n let _e236 = vUv_1;\n let _e237 = angle;\n let _e239 = angle;\n let _e242 = t;\n let _e245 = reach;\n uv_1 = (_e236 + ((vec2<f32>(cos(_e237), sin(_e239)) * sqrt(_e242)) * _e245));\n let _e248 = uv_1;\n let _e249 = textureSampleLevel(uDepth_t, uDepth_s, _e248, 0f);\n sampled = _e249.x;\n let _e251 = sampled;\n if (_e251 <= 0f) {\n continue;\n }\n let _e253 = uv_1;\n param_10 = _e253;\n let _e254 = sampled;\n param_11 = _e254;\n let _e255 = viewPosition_u0028_vf2_u003b_f1_u003b((&param_10), (&param_11));\n let _e256 = p;\n v = (_e255 - _e256);\n let _e258 = v;\n let _e259 = v;\n vv = dot(_e258, _e259);\n let _e261 = vv;\n let _e263 = unnamed.uRadius;\n let _e265 = unnamed.uRadius;\n if (_e261 > (_e263 * _e265)) {\n continue;\n }\n let _e268 = v;\n let _e269 = n;\n let _e272 = p[2u];\n let _e277 = vv;\n let _e280 = sum;\n sum = (_e280 + (max(0f, (dot(_e268, _e269) - (0.004f * -(_e272)))) / (_e277 + 0.01f)));\n continue;\n } else {\n break;\n }\n continuing {\n let _e282 = i;\n i = (_e282 + 1i);\n }\n }\n let _e285 = unnamed.uRadius;\n let _e287 = sum;\n fragColor = clamp((1f - (((2f * _e285) * _e287) / 12f)), 0f, 1f);\n return;\n}\n\n@fragment \nfn main(@location(0) vUv: vec2<f32>, @builtin(position) gl_FragCoord: vec4<f32>) -> @location(0) f32 {\n vUv_1 = vUv;\n gl_FragCoord_1 = gl_FragCoord;\n main_1();\n let _e5 = fragColor;\n return _e5;\n}\n";
3
+ /**
4
+ * What the transform assigned, so the renderer binds the same numbers.
5
+ *
6
+ * A permuted shader has one entry per variant, keyed as `FLAT_FRAG_WGSL` is.
7
+ */
8
+ export declare const AMBIENTOCCLUSION_BINDINGS: {
9
+ readonly AO_BLUR_FRAG: {
10
+ readonly uniforms: 1;
11
+ readonly uniformSize: 32;
12
+ readonly fields: {
13
+ readonly uStep: {
14
+ readonly offset: 0;
15
+ readonly size: 8;
16
+ readonly type: "vec2";
17
+ };
18
+ readonly uDepthToViewZ: {
19
+ readonly offset: 16;
20
+ readonly size: 16;
21
+ readonly type: "vec4";
22
+ };
23
+ };
24
+ readonly textures: {
25
+ readonly uAo: {
26
+ readonly texture: 32;
27
+ readonly sampler: 33;
28
+ readonly type: "sampler2D";
29
+ };
30
+ readonly uDepth: {
31
+ readonly texture: 34;
32
+ readonly sampler: 35;
33
+ readonly type: "sampler2D";
34
+ };
35
+ };
36
+ };
37
+ readonly AO_FRAG: {
38
+ readonly uniforms: 1;
39
+ readonly uniformSize: 96;
40
+ readonly fields: {
41
+ readonly uProjScale: {
42
+ readonly offset: 0;
43
+ readonly size: 8;
44
+ readonly type: "vec2";
45
+ };
46
+ readonly uInvProjection: {
47
+ readonly offset: 16;
48
+ readonly size: 64;
49
+ readonly type: "mat4";
50
+ };
51
+ readonly uRadius: {
52
+ readonly offset: 80;
53
+ readonly size: 4;
54
+ readonly type: "float";
55
+ };
56
+ };
57
+ readonly textures: {
58
+ readonly uDepth: {
59
+ readonly texture: 32;
60
+ readonly sampler: 33;
61
+ readonly type: "sampler2D";
62
+ };
63
+ };
64
+ };
65
+ };