@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,242 @@
1
+ import { glslFarDepth } from '../depthConvention.js';
2
+ /**
3
+ * Procedural gradient sky drawn as a single attribute-less fullscreen triangle.
4
+ * Ray direction is reconstructed per-fragment from the inverse view-projection,
5
+ * so the sky is correct under any camera. Drawn last at the far plane, so early-z wins —
6
+ * and the far plane is 0 under reversed depth and 1 otherwise, which is why the value is
7
+ * interpolated rather than written. A sky that says 1.0 in a reversed engine is drawn at the
8
+ * *near* plane and covers the world; measured, that was 743,669 changed pixels of 921,600.
9
+ */
10
+ export const SKY_VERT = `#version 300 es
11
+ const vec2 POS[3] = vec2[3](vec2(-1., -1.), vec2(3., -1.), vec2(-1., 3.));
12
+
13
+ out vec2 vNdc;
14
+
15
+ void main() {
16
+ vNdc = POS[gl_VertexID];
17
+ /* The far plane, whichever way depth runs: see glslFarDepth. */
18
+ gl_Position = vec4(vNdc, ${glslFarDepth()}, 1.0);
19
+ }
20
+ `;
21
+ export const SKY_FRAG = `#version 300 es
22
+ precision highp float;
23
+
24
+ in vec2 vNdc;
25
+
26
+ uniform mat4 uInvViewProj;
27
+ uniform vec3 uCameraPos;
28
+ uniform vec3 uTopColor;
29
+ uniform vec3 uHorizonColor;
30
+ uniform vec3 uDeepColor;
31
+ uniform vec3 uSunDir;
32
+ uniform vec3 uSunColor;
33
+ uniform float uSunDiscExponent;
34
+ uniform vec3 uMoonDir;
35
+ uniform vec3 uMoonColor;
36
+ uniform float uMoonAngularRadius;
37
+ uniform float uMoonPhase;
38
+ uniform float uNightFactor;
39
+ uniform vec2 uCloudOffset;
40
+ uniform vec3 uUnderwaterColor;
41
+ uniform float uUnderwaterFactor;
42
+
43
+ out vec4 outColor;
44
+
45
+ float hash21(vec2 p) {
46
+ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
47
+ }
48
+
49
+ float valueNoise(vec2 p) {
50
+ vec2 i = floor(p);
51
+ vec2 f = fract(p);
52
+ vec2 u = f * f * (3.0 - 2.0 * f);
53
+ float a = hash21(i);
54
+ float b = hash21(i + vec2(1.0, 0.0));
55
+ float c = hash21(i + vec2(0.0, 1.0));
56
+ float d = hash21(i + vec2(1.0, 1.0));
57
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
58
+ }
59
+
60
+ /** Three octaves is the ceiling — drop to two before cutting anything else. */
61
+ float fbm(vec2 p) {
62
+ float v = valueNoise(p) * 0.5;
63
+ v += valueNoise(p * 2.03) * 0.3;
64
+ v += valueNoise(p * 4.01) * 0.2;
65
+ return v;
66
+ }
67
+
68
+ void main() {
69
+ vec4 world = uInvViewProj * vec4(vNdc, 1.0, 1.0);
70
+ vec3 dir = normalize(world.xyz / world.w - uCameraPos);
71
+
72
+ float t = dir.y;
73
+ vec3 col = t >= 0.0
74
+ ? mix(uHorizonColor, uTopColor, pow(min(t, 1.0), 0.55))
75
+ : mix(uHorizonColor, uDeepColor, min(-t * 1.8, 1.0));
76
+
77
+ // Celestial bodies belong to the sky, not to the void underneath. Seeing the
78
+ // sun below the horizon made the world read as unbounded in every direction;
79
+ // fading them out at the horizon leaves the deep reading as depth instead.
80
+ float aboveHorizon = smoothstep(-0.04, 0.06, dir.y);
81
+
82
+ /*
83
+ * Sunset.
84
+ *
85
+ * Low sunlight crosses far more atmosphere than high sunlight, and that path
86
+ * scatters the blue out of it — which is why the sun reddens as it drops and
87
+ * why the glow around it spreads into a band rather than staying a disc. Both
88
+ * effects peak right at the horizon and are gone within a few degrees of it,
89
+ * so they are driven by the sun's own elevation rather than by the clock.
90
+ *
91
+ * TWO EDGES, BECAUSE A SUNSET ENDS. This shipped with only the upper one, so every
92
+ * sun below the horizon read as maximum sunset and stayed there all the way to
93
+ * straight down — and a sun direction of (0, -1, 0) is what a night world writes to
94
+ * mean "there is no sun in this sky". A consumer measured the result on a black
95
+ * sun: 87% more red in the sky than the same frame with the sun pointing up, a warm
96
+ * band over a third of the picture in an arctic snowfield, and the world's own
97
+ * blue-grey horizon arriving with its channel order reversed. Four night worlds were
98
+ * not started over it, and this repository's own storm sea shipped it. The lower
99
+ * edge is where astronomical twilight ends, near -0.31, so the term now fades out
100
+ * over the same range the sky it models does.
101
+ *
102
+ * What it gives up: the glow is a function of the sun's elevation and nothing else,
103
+ * so a caller cannot place one where its own sun is not. That is deliberate — a knob
104
+ * here would let a world disagree with itself — but it is also what makes this wrong
105
+ * for a body that is not our sun in our atmosphere. A world lit by something that
106
+ * scatters differently needs its own term, not a wider edge here.
107
+ *
108
+ * Written ascending-and-inverted rather than as a descending smoothstep, whose
109
+ * result GLSL ES leaves undefined when edge0 >= edge1. Every implementation seen so
110
+ * far computes the ramp anybody would expect, which is why the descending form
111
+ * survived this long, but the spec does not owe us that.
112
+ */
113
+ float sunset = (1.0 - smoothstep(-0.03, 0.30, uSunDir.y)) *
114
+ smoothstep(-0.35, -0.05, uSunDir.y);
115
+ vec3 ember = vec3(1.0, 0.36, 0.13);
116
+
117
+ float s = max(dot(dir, uSunDir), 0.0);
118
+ // The disc itself reddens; the last sliver above the horizon is nearly blood
119
+ // orange, which is the moment the whole effect is remembered for.
120
+ vec3 discColor = mix(uSunColor, uSunColor * ember, sunset * 0.85);
121
+ col += discColor * (
122
+ pow(s, uSunDiscExponent) * 1.2 +
123
+ pow(s, max(uSunDiscExponent / 75.0, 1.0)) * 0.12
124
+ ) * aboveHorizon;
125
+
126
+ /*
127
+ * The band. Brightest toward the sun's bearing and hugging the horizon,
128
+ * falling off both with angle around the compass and with height — a sunset
129
+ * is a direction, not a uniform warm wash, and washing the whole dome is what
130
+ * makes a fake one look like a colour filter.
131
+ */
132
+ vec2 sunBearing = normalize(uSunDir.xz + vec2(1e-5));
133
+ vec2 viewBearing = normalize(dir.xz + vec2(1e-5));
134
+ float toward = max(dot(viewBearing, sunBearing), 0.0);
135
+ /*
136
+ * Measured from the horizon, and falling three times faster below it than above.
137
+ *
138
+ * This was abs(dir.y), which is symmetric, so the band was mirrored twenty-seven
139
+ * degrees down into the deep — visible in any world whose ground does not cover
140
+ * the lower half of the frame, and captured in the -Y face of every environment
141
+ * probe, where it tinted reflections warm. Nothing in the sky mirrors a sunset
142
+ * below the horizon; what is down there is ground, and the ground is drawn by
143
+ * somebody else.
144
+ *
145
+ * Not gated by aboveHorizon like the sun disc and the moon are: that factor is
146
+ * only 0.4 at a dir.y of zero, which is exactly where this term is brightest, so
147
+ * multiplying by it would cut the band's core to a third and change every sunset
148
+ * to fix a night. Falling faster below instead leaves everything at or above the
149
+ * horizon bit-for-bit as it was, and the horizon line itself unbroken. What it
150
+ * gives up: a camera under the world, or above a planet seen from outside its
151
+ * atmosphere, sees the glow end sooner than the geometry does.
152
+ */
153
+ float fromHorizon = dir.y >= 0.0 ? dir.y : -dir.y * 3.0;
154
+ float band = pow(1.0 - min(fromHorizon * 2.2, 1.0), 2.6);
155
+ col += ember * sunset * band * (0.18 + 0.75 * pow(toward, 2.2));
156
+
157
+ /*
158
+ * Belt of Venus: the sky opposite a setting sun takes a cool pink-violet from
159
+ * light already reddened on its way past. Subtle, but its absence is why an
160
+ * artificial sunset feels like it is only happening on one side.
161
+ */
162
+ float away = max(-dot(viewBearing, sunBearing), 0.0);
163
+ col += vec3(0.42, 0.28, 0.45) * sunset * band * away * 0.22;
164
+
165
+ /*
166
+ * Moon: a shaded procedural sphere-disc, not one dot subtracted from another.
167
+ * The local sphere normal gives a curved terminator and limb; lunar phase
168
+ * supplies the light direction around that sphere. Low-frequency noise adds
169
+ * maria without a texture file, while a faint earthshine keeps the dark limb
170
+ * just legible instead of cutting a mathematically black hole in the sky.
171
+ */
172
+ vec3 moonReference = abs(uMoonDir.y) < 0.98
173
+ ? vec3(0.0, 1.0, 0.0)
174
+ : vec3(1.0, 0.0, 0.0);
175
+ vec3 moonRight = normalize(cross(moonReference, uMoonDir));
176
+ vec3 moonUp = cross(uMoonDir, moonRight);
177
+ float moonRadius = clamp(uMoonAngularRadius, 0.001, 0.5);
178
+ vec2 moonUv = vec2(dot(dir, moonRight), dot(dir, moonUp)) / moonRadius;
179
+ float moonRadiusSq = dot(moonUv, moonUv);
180
+ float moonFacing = step(0.0, dot(dir, uMoonDir));
181
+ float moonDisc = (1.0 - smoothstep(0.90, 1.0, moonRadiusSq)) * moonFacing;
182
+ if (moonDisc > 0.0) {
183
+ float sphereZ = sqrt(max(1.0 - moonRadiusSq, 0.0));
184
+ vec3 surfaceNormal = normalize(vec3(moonUv, sphereZ));
185
+ float phaseAngle = uMoonPhase * 6.28318530718;
186
+ vec3 phaseLight = vec3(sin(phaseAngle), 0.0, -cos(phaseAngle));
187
+ float phaseShade = max(dot(surfaceNormal, phaseLight), 0.0);
188
+ float maria = valueNoise(moonUv * 3.2 + vec2(4.7, 9.1)) * 0.68 +
189
+ valueNoise(moonUv * 9.3 - vec2(7.4, 2.6)) * 0.32;
190
+ float albedo = mix(0.56, 1.02, maria);
191
+ float limb = mix(0.72, 1.0, sphereZ);
192
+ float earthshine = 0.035;
193
+ float lunarLight = earthshine + (1.0 - earthshine) * phaseShade;
194
+ col += uMoonColor * albedo * limb * lunarLight * moonDisc *
195
+ 1.35 * uNightFactor * aboveHorizon;
196
+ }
197
+ float phaseIllumination = 0.5 - cos(uMoonPhase * 6.28318530718) * 0.5;
198
+ float moonHalo = (1.0 - smoothstep(1.0, 3.0, length(moonUv))) * moonFacing;
199
+ col += uMoonColor * moonHalo * 0.08 * phaseIllumination *
200
+ uNightFactor * aboveHorizon;
201
+
202
+ if (dir.y > 0.0) {
203
+ // Stars. Stereographic projection: unlike dir.xz/dir.y it stays finite and
204
+ // near-uniform all the way to the horizon, so stars don't smear into grain.
205
+ // Each cell holds one jittered *point* — lighting the whole cell would draw
206
+ // square blocks, which is what "random pixels" looks like.
207
+ if (uNightFactor > 0.0) {
208
+ vec2 p = dir.xz / (1.0 + dir.y) * 26.0;
209
+ vec2 cell = floor(p);
210
+ float h = hash21(cell);
211
+ if (h > 0.93) {
212
+ vec2 jitter = vec2(hash21(cell + 17.3), hash21(cell + 41.7));
213
+ float d = length(fract(p) - jitter);
214
+ float star = smoothstep(0.10, 0.0, d) * (0.4 + h * 0.6);
215
+ // Fade out near the horizon, where haze would swallow them anyway.
216
+ col += vec3(0.86, 0.91, 1.0) * star * uNightFactor * smoothstep(0.03, 0.3, dir.y);
217
+ }
218
+ }
219
+
220
+ // Clouds: banded value noise on a layer above the camera, carried by the
221
+ // world's wind — the same signal the smoke and the grass answer to, so the
222
+ // largest moving thing in frame agrees with the smallest.
223
+ // The floor on dir.y bounds the perspective stretch near the horizon.
224
+ if (dir.y > 0.02) {
225
+ vec2 uv = dir.xz / max(dir.y, 0.16) * 0.09 + uCloudOffset * 0.012;
226
+ float band = smoothstep(0.46, 0.60, fbm(uv));
227
+ float fade = smoothstep(0.02, 0.30, dir.y);
228
+ vec3 cloudCol = mix(uHorizonColor, vec3(1.0), 0.45) * mix(1.0, 0.32, uNightFactor);
229
+ col = mix(col, cloudCol, band * fade * 0.8);
230
+ }
231
+ }
232
+
233
+ // There is no outdoor sky inside a water column. Retain a little vertical
234
+ // gradient so the surface remains legible above and depth reads darker
235
+ // below, while celestial bodies and clouds disappear with the same smooth
236
+ // surface transition used by the geometry passes.
237
+ float waterLight = mix(0.62, 1.08, clamp(dir.y * 0.5 + 0.5, 0.0, 1.0));
238
+ col = mix(col, uUnderwaterColor * waterLight, uUnderwaterFactor);
239
+
240
+ outColor = vec4(col, 1.0);
241
+ }
242
+ `;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Smoke: a column that rises, expands and dissipates. Shares the plume
3
+ * billboard vertex shader with fire — only the fragment behaviour differs.
4
+ *
5
+ * Alpha-blended rather than additive: smoke occludes what is behind it, and
6
+ * adding it would make it glow instead of darken.
7
+ */
8
+ export declare const SMOKE_FRAG = "#version 300 es\nprecision highp float;\n\nin vec2 vUv;\nin float vSeed;\nin float vDistance;\nin vec3 vWorldPos;\n\nuniform float uTime;\n\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\nuniform int uNoiseOctaves;\nuniform vec4 uClipPlane;\nuniform int uClipEnabled;\n\nout vec4 outColor;\n\nfloat hash21(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat valueNoise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash21(i), hash21(i + vec2(1.0, 0.0)), u.x),\n mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), u.x),\n u.y\n );\n}\n\nfloat billow(vec2 p, float t) {\n float v = valueNoise(p * 2.2 + vec2(0.0, -t * 0.55)) * 0.55;\n if (uNoiseOctaves == 1) return v / 0.55;\n v += valueNoise(p * 4.7 + vec2(t * 0.12, -t * 0.9)) * 0.29;\n if (uNoiseOctaves == 2) return v / 0.84;\n return v + valueNoise(p * 9.3 + vec2(-t * 0.09, -t * 1.4)) * 0.16;\n}\n\nvoid main() {\n if (uClipEnabled != 0 && dot(vec4(vWorldPos, 1.0), uClipPlane) < 0.0) discard;\n\n float t = uTime + vSeed * 53.0;\n float height = vUv.y;\n\n // Widens as it climbs: sample a compressed space low down, a stretched one up\n // top. Narrow at the bottom is what lets it sit inside the flame's tip.\n float spread = mix(0.5, 1.0, height);\n float centred = (vUv.x - 0.5) / spread + 0.5;\n\n // Soft horizontal falloff rather than a hard cut \u2014 a clipped edge here shows\n // the quad and is the single most obvious way smoke reads as fake.\n float sides = smoothstep(0.0, 0.55, 1.0 - clamp(abs(centred - 0.5) * 2.0, 0.0, 1.0));\n if (sides <= 0.001) discard;\n\n // Leans away over its height instead of rising ruler-straight.\n float drift = (valueNoise(vec2(t * 0.21, vSeed * 7.0)) - 0.5) * 0.6 * height * height;\n float n = billow(vec2(centred + drift, height), t);\n\n float density = n * sides * 1.35 - height * 0.88;\n if (density <= 0.02) discard;\n\n // Colour tells the story of the plume: ember-lit where it leaves the flame,\n // cooling through soot, then dispersing into the fog. Starting at flat grey\n // is what made it look like a separate object parked above the fire.\n vec3 col = mix(vec3(0.90, 0.42, 0.16), vec3(0.11, 0.10, 0.10), smoothstep(0.0, 0.34, height));\n vec3 atmosphereColor = mediumColor();\n col = mix(col, atmosphereColor, smoothstep(0.30, 0.95, height));\n\n // Fade in at the base so it emerges out of the flame, and out at the top so\n // it dissipates rather than ending.\n float emerge = smoothstep(0.0, 0.30, height);\n float dissipate = 1.0 - smoothstep(0.22, 0.75, height);\n\n float fog = mediumFog(vDistance, vWorldPos.y);\n col = mix(col, atmosphereColor, fog);\n float alpha = clamp(density * 0.95, 0.0, 1.0) * emerge * dissipate * 0.13;\n outColor = vec4(col, alpha * (1.0 - fog));\n}\n";
@@ -0,0 +1,88 @@
1
+ import { FOG_GLSL } from './fog.js';
2
+ /**
3
+ * Smoke: a column that rises, expands and dissipates. Shares the plume
4
+ * billboard vertex shader with fire — only the fragment behaviour differs.
5
+ *
6
+ * Alpha-blended rather than additive: smoke occludes what is behind it, and
7
+ * adding it would make it glow instead of darken.
8
+ */
9
+ export const SMOKE_FRAG = `#version 300 es
10
+ precision highp float;
11
+
12
+ in vec2 vUv;
13
+ in float vSeed;
14
+ in float vDistance;
15
+ in vec3 vWorldPos;
16
+
17
+ uniform float uTime;
18
+ ${FOG_GLSL}
19
+ uniform int uNoiseOctaves;
20
+ uniform vec4 uClipPlane;
21
+ uniform int uClipEnabled;
22
+
23
+ out vec4 outColor;
24
+
25
+ float hash21(vec2 p) {
26
+ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
27
+ }
28
+
29
+ float valueNoise(vec2 p) {
30
+ vec2 i = floor(p);
31
+ vec2 f = fract(p);
32
+ vec2 u = f * f * (3.0 - 2.0 * f);
33
+ return mix(
34
+ mix(hash21(i), hash21(i + vec2(1.0, 0.0)), u.x),
35
+ mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), u.x),
36
+ u.y
37
+ );
38
+ }
39
+
40
+ float billow(vec2 p, float t) {
41
+ float v = valueNoise(p * 2.2 + vec2(0.0, -t * 0.55)) * 0.55;
42
+ if (uNoiseOctaves == 1) return v / 0.55;
43
+ v += valueNoise(p * 4.7 + vec2(t * 0.12, -t * 0.9)) * 0.29;
44
+ if (uNoiseOctaves == 2) return v / 0.84;
45
+ return v + valueNoise(p * 9.3 + vec2(-t * 0.09, -t * 1.4)) * 0.16;
46
+ }
47
+
48
+ void main() {
49
+ if (uClipEnabled != 0 && dot(vec4(vWorldPos, 1.0), uClipPlane) < 0.0) discard;
50
+
51
+ float t = uTime + vSeed * 53.0;
52
+ float height = vUv.y;
53
+
54
+ // Widens as it climbs: sample a compressed space low down, a stretched one up
55
+ // top. Narrow at the bottom is what lets it sit inside the flame's tip.
56
+ float spread = mix(0.5, 1.0, height);
57
+ float centred = (vUv.x - 0.5) / spread + 0.5;
58
+
59
+ // Soft horizontal falloff rather than a hard cut — a clipped edge here shows
60
+ // the quad and is the single most obvious way smoke reads as fake.
61
+ float sides = smoothstep(0.0, 0.55, 1.0 - clamp(abs(centred - 0.5) * 2.0, 0.0, 1.0));
62
+ if (sides <= 0.001) discard;
63
+
64
+ // Leans away over its height instead of rising ruler-straight.
65
+ float drift = (valueNoise(vec2(t * 0.21, vSeed * 7.0)) - 0.5) * 0.6 * height * height;
66
+ float n = billow(vec2(centred + drift, height), t);
67
+
68
+ float density = n * sides * 1.35 - height * 0.88;
69
+ if (density <= 0.02) discard;
70
+
71
+ // Colour tells the story of the plume: ember-lit where it leaves the flame,
72
+ // cooling through soot, then dispersing into the fog. Starting at flat grey
73
+ // is what made it look like a separate object parked above the fire.
74
+ vec3 col = mix(vec3(0.90, 0.42, 0.16), vec3(0.11, 0.10, 0.10), smoothstep(0.0, 0.34, height));
75
+ vec3 atmosphereColor = mediumColor();
76
+ col = mix(col, atmosphereColor, smoothstep(0.30, 0.95, height));
77
+
78
+ // Fade in at the base so it emerges out of the flame, and out at the top so
79
+ // it dissipates rather than ending.
80
+ float emerge = smoothstep(0.0, 0.30, height);
81
+ float dissipate = 1.0 - smoothstep(0.22, 0.75, height);
82
+
83
+ float fog = mediumFog(vDistance, vWorldPos.y);
84
+ col = mix(col, atmosphereColor, fog);
85
+ float alpha = clamp(density * 0.95, 0.0, 1.0) * emerge * dissipate * 0.13;
86
+ outColor = vec4(col, alpha * (1.0 - fog));
87
+ }
88
+ `;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The screen-space reflection resolve: what the trace found, composited over the scene.
3
+ *
4
+ * **One fetch, because the compositing is the blend state.** The trace writes premultiplied colour
5
+ * and coverage into a target of its own — it has to, since it samples the scene and a pass that
6
+ * read the colour it was writing would be a feedback loop — and this hands those texels to a
7
+ * `(one, one-minus-src-alpha)` blend, which is `over`. So the resolve never samples the target it
8
+ * is compositing onto, which is the arrangement `oitResolve.ts` reaches by the same argument.
9
+ *
10
+ * Premultiplied is what makes several reflective surfaces overlapping accumulate the way two
11
+ * blended layers do rather than the way two independent guesses do.
12
+ *
13
+ * The vertex stage is `FULLSCREEN_VERT`, shared with the occlusion pass, its blur and the rush.
14
+ */
15
+ export declare const SSR_RESOLVE_FRAG = "#version 300 es\nprecision highp float;\n\nin vec2 vUv;\n\n/** Premultiplied reflection in rgb, coverage in a. Cleared to zero: nothing found is nothing. */\nuniform sampler2D uSsrReflection;\n\nout vec4 fragColor;\n\nvoid main() {\n fragColor = textureLod(uSsrReflection, vUv, 0.0);\n}\n";
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The screen-space reflection resolve: what the trace found, composited over the scene.
3
+ *
4
+ * **One fetch, because the compositing is the blend state.** The trace writes premultiplied colour
5
+ * and coverage into a target of its own — it has to, since it samples the scene and a pass that
6
+ * read the colour it was writing would be a feedback loop — and this hands those texels to a
7
+ * `(one, one-minus-src-alpha)` blend, which is `over`. So the resolve never samples the target it
8
+ * is compositing onto, which is the arrangement `oitResolve.ts` reaches by the same argument.
9
+ *
10
+ * Premultiplied is what makes several reflective surfaces overlapping accumulate the way two
11
+ * blended layers do rather than the way two independent guesses do.
12
+ *
13
+ * The vertex stage is `FULLSCREEN_VERT`, shared with the occlusion pass, its blur and the rush.
14
+ */
15
+ export const SSR_RESOLVE_FRAG = `#version 300 es
16
+ precision highp float;
17
+
18
+ in vec2 vUv;
19
+
20
+ /** Premultiplied reflection in rgb, coverage in a. Cleared to zero: nothing found is nothing. */
21
+ uniform sampler2D uSsrReflection;
22
+
23
+ out vec4 fragColor;
24
+
25
+ void main() {
26
+ fragColor = textureLod(uSsrReflection, vUv, 0.0);
27
+ }
28
+ `;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The screen-space reflection trace: a reflected ray marched against the frame's own depth.
3
+ *
4
+ * **This mirrors `traceScreenSpaceRay` line for line**, and that is the point of writing it twice.
5
+ * When a crossing counts as a hit, how far behind a surface it may land, what happens at the edge
6
+ * of the frame and what happens over a gap in the geometry are each a defect that draws a
7
+ * *plausible* picture rather than failing — and each of them is settled by arithmetic that needs no
8
+ * GPU. The TypeScript beside this file is the specification and its tests are where those cases are
9
+ * pinned; this is the same walk, in the language that can sample a depth buffer.
10
+ *
11
+ * **It writes into a target of its own rather than onto the scene**, because it samples the scene:
12
+ * a pass that read the colour it was writing would be a feedback loop, reported once per draw on
13
+ * WebGL2 and rejected outright on WebGPU. `ssrPass.ts` composites the result afterwards, which is
14
+ * the arrangement `oitPass.ts` already uses and for the same reason.
15
+ *
16
+ * **The derivatives come first and the march comes second.** The surface normal is the cross
17
+ * product of the reconstructed position's screen derivatives — there being no normal buffer to read
18
+ * one from — and a derivative taken inside non-uniform control flow is undefined. So everything
19
+ * that could branch happens after them, and every fetch inside the march takes an explicit level
20
+ * for the same rule read the other way.
21
+ */
22
+ export declare const SSR_TRACE_FRAG: string;
@@ -0,0 +1,230 @@
1
+ /**
2
+ * The screen-space reflection trace: a reflected ray marched against the frame's own depth.
3
+ *
4
+ * **This mirrors `traceScreenSpaceRay` line for line**, and that is the point of writing it twice.
5
+ * When a crossing counts as a hit, how far behind a surface it may land, what happens at the edge
6
+ * of the frame and what happens over a gap in the geometry are each a defect that draws a
7
+ * *plausible* picture rather than failing — and each of them is settled by arithmetic that needs no
8
+ * GPU. The TypeScript beside this file is the specification and its tests are where those cases are
9
+ * pinned; this is the same walk, in the language that can sample a depth buffer.
10
+ *
11
+ * **It writes into a target of its own rather than onto the scene**, because it samples the scene:
12
+ * a pass that read the colour it was writing would be a feedback loop, reported once per draw on
13
+ * WebGL2 and rejected outright on WebGPU. `ssrPass.ts` composites the result afterwards, which is
14
+ * the arrangement `oitPass.ts` already uses and for the same reason.
15
+ *
16
+ * **The derivatives come first and the march comes second.** The surface normal is the cross
17
+ * product of the reconstructed position's screen derivatives — there being no normal buffer to read
18
+ * one from — and a derivative taken inside non-uniform control flow is undefined. So everything
19
+ * that could branch happens after them, and every fetch inside the march takes an explicit level
20
+ * for the same rule read the other way.
21
+ */
22
+ import { glslIsFarDepth } from '../depthConvention.js';
23
+ /**
24
+ * The most samples the march may take. `uSsrSteps` breaks out early.
25
+ *
26
+ * A constant bound because a loop the compiler cannot bound is one it cannot unroll or budget, and
27
+ * because thirty-two two-metre steps is sixty-four metres — further than a screen-space method can
28
+ * usefully see, since a ray that long has almost certainly left the frame.
29
+ */
30
+ const MAX_STEPS = 32;
31
+ /** How many times a bracketed crossing is halved. Matches `REFINE_STEPS` in the TypeScript. */
32
+ const REFINE_STEPS = 6;
33
+ export const SSR_TRACE_FRAG = `#version 300 es
34
+ precision highp float;
35
+
36
+ in vec2 vUv;
37
+
38
+ /**
39
+ * The depth the frame drew, as a copy.
40
+ *
41
+ * \`highp\` because a sampler's default precision is lowp whatever \`precision highp float\` says,
42
+ * and every world position below is reconstructed by dividing through it.
43
+ */
44
+ uniform highp sampler2D uSsrDepth;
45
+ /** The finished scene colour — what a ray finds is a pixel of this. */
46
+ uniform sampler2D uSsrScene;
47
+ /** Screen position and stored depth back to the world. See \`DEPTH_01_TO_CLIP\`. */
48
+ uniform mat4 uSsrDepthToWorld;
49
+ /**
50
+ * World back to a screen position, with the framebuffer's own Y sense already in it.
51
+ *
52
+ * **The flip is in the matrix rather than in a branch here**, so the shader is one expression on
53
+ * both backends and the convention lives in one place — the lesson \`DEPTH_01_TO_CLIP_Y_DOWN\`
54
+ * records at length, arriving through the other door.
55
+ */
56
+ uniform mat4 uSsrViewProj;
57
+ /** World into the reflective box, \`[-1, 1]\` on each axis. */
58
+ uniform mat4 uWorldToSurface;
59
+ uniform vec3 uSsrEye;
60
+ /** The box's own axis. A surface reflects when it faces back along this. */
61
+ uniform vec3 uSsrAxis;
62
+ uniform vec3 uSsrTint;
63
+ uniform float uSsrStrength;
64
+ uniform float uSsrFacingCos;
65
+ uniform float uSsrReach;
66
+ uniform float uSsrThickness;
67
+ uniform float uSsrSteps;
68
+ /** How much of the frame each side is fade, as a fraction. */
69
+ uniform float uSsrEdgeFade;
70
+
71
+ out vec4 fragColor;
72
+
73
+ /** What the frame drew at a screen position, as a world point. */
74
+ vec3 worldAt(vec2 uv, float stored) {
75
+ vec4 world = uSsrDepthToWorld * vec4(uv * 2.0 - 1.0, stored, 1.0);
76
+ return world.xyz / world.w;
77
+ }
78
+
79
+ /**
80
+ * How far the eye is from whatever the frame drew there, and a huge number where it drew nothing.
81
+ *
82
+ * The sky is not a surface. A march that treated an untouched depth as one would reflect the whole
83
+ * world in the horizon, which is the failure that looks like a working effect from one angle.
84
+ */
85
+ float sceneDistanceAt(vec2 uv) {
86
+ float stored = textureLod(uSsrDepth, uv, 0.0).r;
87
+ if (${glslIsFarDepth('stored')}) return 1.0e9;
88
+ return length(worldAt(uv, stored) - uSsrEye);
89
+ }
90
+
91
+ /** A world point to a screen position. False where it is behind the eye or outside the frame. */
92
+ bool projectPoint(vec3 point, out vec2 uv) {
93
+ vec4 clip = uSsrViewProj * vec4(point, 1.0);
94
+ if (clip.w <= 0.0) return false;
95
+ uv = (clip.xy / clip.w) * 0.5 + 0.5;
96
+ return uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0;
97
+ }
98
+
99
+ void main() {
100
+ float stored = textureLod(uSsrDepth, vUv, 0.0).r;
101
+ vec3 point = worldAt(vUv, stored);
102
+
103
+ /*
104
+ * **The normal from the reconstruction's own derivatives, turned to face the eye.**
105
+ *
106
+ * There is no normal buffer here and adding one is a second colour attachment written by every
107
+ * draw path in the engine. Two neighbouring pixels of the same surface span its plane, so their
108
+ * cross product is its normal — noisy along a silhouette and exact everywhere else. Which way
109
+ * that cross product points depends on which way the framebuffer's rows run, and the two
110
+ * backends disagree about that; a visible surface faces the eye by definition, which is what
111
+ * fixes the sign. \`decalProject.ts\` carries the same pair of facts.
112
+ *
113
+ * Taken here, before anything branches, because a derivative in non-uniform control flow is
114
+ * undefined and the whole of the march below is a branch.
115
+ */
116
+ vec3 plane = cross(dFdx(point), dFdy(point));
117
+ float span = length(plane);
118
+ vec3 normal = span > 0.0 ? plane / span : -uSsrAxis;
119
+ vec3 toEye = uSsrEye - point;
120
+ normal *= sign(dot(toEye, normal));
121
+
122
+ vec3 box = (uWorldToSurface * vec4(point, 1.0)).xyz;
123
+ vec3 inside = step(abs(box), vec3(1.0));
124
+ float mask = inside.x * inside.y * inside.z;
125
+
126
+ /* A surface turned away from the box's axis is not the one the caller called reflective — a wall
127
+ inside the volume of a wet floor is still a wall. Faded rather than cut, so the edge of the
128
+ rule is not an edge in the picture. */
129
+ float facing = dot(normal, -uSsrAxis);
130
+ mask *= smoothstep(uSsrFacingCos, min(1.0, uSsrFacingCos + 0.25), facing);
131
+ /* Nothing was drawn here, so there is no surface to reflect in. */
132
+ mask *= ${glslIsFarDepth('stored')} ? 0.0 : 1.0;
133
+ mask *= uSsrStrength;
134
+
135
+ vec3 found = vec3(0.0);
136
+ float weight = 0.0;
137
+
138
+ if (mask > 0.0) {
139
+ vec3 view = normalize(point - uSsrEye);
140
+ vec3 ray = reflect(view, normal);
141
+
142
+ float steps = max(1.0, uSsrSteps);
143
+ /*
144
+ * Zero to begin with, because the ray starts on the surface it is reflecting off. A crossing
145
+ * needs the previous sample strictly in front, so the first step cannot form one on its own —
146
+ * which is the self-intersection guard, and without it every pixel of a reflective floor takes
147
+ * the comparison on rounding at once.
148
+ */
149
+ float behind = 0.0;
150
+ float previous = 0.0;
151
+ vec2 hitUv = vec2(0.0);
152
+ float hitDistance = 0.0;
153
+ bool found_hit = false;
154
+
155
+ for (int i = 1; i <= ${MAX_STEPS}; i++) {
156
+ if (float(i) > steps) break;
157
+ /* Quadratic rather than even: a first step of centimetres, where the contact seam is, and a
158
+ last step of nearly a metre, out where a reflection is faint and about to leave the frame.
159
+ \`marchDistance\` in the TypeScript is the same expression and the reason is written there. */
160
+ float at = float(i) / steps;
161
+ float t = uSsrReach * at * at;
162
+ vec3 sample_point = point + ray * t;
163
+ vec2 uv;
164
+ if (!projectPoint(sample_point, uv)) break;
165
+
166
+ float scene = sceneDistanceAt(uv);
167
+ float gap = length(sample_point - uSsrEye) - scene;
168
+
169
+ if (behind < 0.0 && gap >= 0.0) {
170
+ /* A crossing, bracketed. Halved rather than reported: the coarse answer is a whole step
171
+ out, which puts a reflection visibly beside the thing reflected. */
172
+ float near = previous;
173
+ float far = t;
174
+ vec2 refinedUv = uv;
175
+ float refinedGap = gap;
176
+ for (int refine = 0; refine < ${REFINE_STEPS}; refine++) {
177
+ float mid = (near + far) * 0.5;
178
+ vec3 midPoint = point + ray * mid;
179
+ vec2 midUv;
180
+ if (!projectPoint(midPoint, midUv)) break;
181
+ float midScene = sceneDistanceAt(midUv);
182
+ float midGap = length(midPoint - uSsrEye) - midScene;
183
+ if (midGap >= 0.0) {
184
+ far = mid;
185
+ refinedUv = midUv;
186
+ refinedGap = midGap;
187
+ } else {
188
+ near = mid;
189
+ }
190
+ }
191
+
192
+ /* Believed only if the refined crossing landed within the thickness. A depth buffer says
193
+ nothing about how thick the thing at a pixel is, so without this a ray that slides onto
194
+ a foreground object pastes that object into the reflection. */
195
+ if (refinedGap <= uSsrThickness) {
196
+ found_hit = true;
197
+ hitUv = refinedUv;
198
+ hitDistance = far;
199
+ }
200
+ break;
201
+ }
202
+
203
+ behind = gap;
204
+ previous = t;
205
+ }
206
+
207
+ if (found_hit) {
208
+ /*
209
+ * Three fades, and they are most of what keeps this from looking wrong.
210
+ *
211
+ * A hit near the edge of the frame is about to leave it, so it leaves gradually rather than
212
+ * along a line. A ray pointing back toward the eye can only find what is between the surface
213
+ * and the camera, which is usually nothing and occasionally the viewer's own geometry. And a
214
+ * hit at the far end of the reach is the least reliable one the march can report, since it
215
+ * had the most chances to slide onto something.
216
+ */
217
+ float edge = clamp(min(min(hitUv.x, 1.0 - hitUv.x), min(hitUv.y, 1.0 - hitUv.y)) /
218
+ max(uSsrEdgeFade, 1.0e-4), 0.0, 1.0);
219
+ float away = clamp((dot(normalize(ray), view) + 1.0) * 0.5, 0.0, 1.0);
220
+ float reach = 1.0 - clamp(hitDistance / max(uSsrReach, 1.0e-4), 0.0, 1.0);
221
+ weight = mask * edge * away * reach;
222
+ found = textureLod(uSsrScene, hitUv, 0.0).rgb * uSsrTint;
223
+ }
224
+ }
225
+
226
+ /* Premultiplied, so the pass composites with (one, one-minus-src-alpha) and several reflective
227
+ surfaces overlapping accumulate the way two blended layers do. */
228
+ fragColor = vec4(found * weight, weight);
229
+ }
230
+ `;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Which way is along the texture, at a fragment.
3
+ *
4
+ * Two sources and a selection. The attribute frame is what `geometry/tangents.ts` generated,
5
+ * interpolated across the triangle and re-orthogonalised here; the derived frame is the standard
6
+ * cotangent construction from screen-space derivatives, for a mesh that never went through the
7
+ * generator — which is every mesh `meshBuilder` makes procedurally.
8
+ *
9
+ * **Both are computed and one is chosen, rather than one being computed under a branch.** The
10
+ * derivatives below are legal only under uniform control flow, and `hasTangents` arrives as a
11
+ * varying — flat, but a compiler cannot prove a varying uniform. The caller puts this inside its
12
+ * branch on `uNormalStrength`, which is a real uniform, and the selection here is a ternary rather
13
+ * than a branch. `main.ts` carries the same arrangement for `fwidth(vWorldPos)` and the long
14
+ * reason beside it; `AGENTS.md` 2026-08-07 is the rule, and WGSL refuses the module outright
15
+ * rather than leaving a derivative in non-uniform control flow undefined.
16
+ */
17
+ export declare const TANGENT_FRAME_GLSL = "mat3 tangentFrame(vec3 n, vec3 worldPos, vec2 uv, vec4 tangent, int hasTangents) {\n /*\n * The derived frame: solve for the axis along u from how position and uv change together over\n * the pixel. Exact where the surface is locally planar, approximate where it curves, which is\n * the trade for working at all on geometry that carries no frame.\n */\n vec3 dp1 = dFdx(worldPos);\n vec3 dp2 = dFdy(worldPos);\n vec2 duv1 = dFdx(uv);\n vec2 duv2 = dFdy(uv);\n vec3 dp2perp = cross(dp2, n);\n vec3 dp1perp = cross(n, dp1);\n vec3 dt = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 db = dp2perp * duv1.y + dp1perp * duv2.y;\n /*\n * **The determinant's sign, which magnitude-normalising throws away \u2014 and it is the difference\n * between the two backends.**\n *\n * dFdy measures along *upward* window y in GLSL and along *downward* framebuffer y in WGSL, so\n * dp2 and duv2 both arrive negated on WebGPU. The system this solves is invariant under that \u2014\n * both sides of its second equation flip \u2014 but the closed form above is not: dt and db each come\n * out negated, and dividing by their *length* keeps the negation instead of cancelling it. The\n * frame then points the other way on one backend, which reads as a surface lit from the wrong\n * side and nothing else.\n *\n * The UV determinant flips with them, so folding its sign back in restores the invariance the\n * solve always had. Measured before and after on demo/dev/normal.html: the derived panel stood\n * 86 of 255 rms from the attribute panel on WebGPU and 8.8 on WebGL2; with this they agree.\n */\n float det = duv1.x * duv2.y - duv2.x * duv1.y;\n float handed = det < 0.0 ? -1.0 : 1.0;\n /* One scale for both axes, so a stretched UV layout does not shear the frame it produces. */\n float invmax = inversesqrt(max(max(dot(dt, dt), dot(db, db)), 1e-12)) * handed;\n vec3 derivedT = dt * invmax;\n vec3 derivedB = db * invmax;\n\n /*\n * The attribute frame, re-orthogonalised. Interpolating a tangent across a triangle leaves it\n * no longer square to the interpolated normal, and Gram-Schmidt is what puts it back \u2014\n * generateTangents does the same per vertex and says why: dropping it is a normal map that\n * shears wherever the geometry curves.\n */\n vec3 attrT = normalize(tangent.xyz - n * dot(n, tangent.xyz));\n /*\n * The bitangent's sign, which is the whole reason w is stored. An artist mapping the left and\n * right of a model onto one patch of texture gives one side a mirrored frame, and a bitangent\n * computed without the sign lights that side inside out.\n */\n vec3 attrB = cross(n, attrT) * tangent.w;\n\n vec3 t = hasTangents != 0 ? attrT : derivedT;\n vec3 b = hasTangents != 0 ? attrB : derivedB;\n return mat3(t, b, n);\n}";