@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,354 @@
1
+ import { MAX_POINT_LIGHTS } from '../lightBudget.js';
2
+ import { MAX_WATER_REFLECTION_FILTER_TAPS } from '../renderQuality.js';
3
+ import { GERSTNER_GLSL } from './gerstner.js';
4
+ import { FOG_GLSL } from './fog.js';
5
+ /**
6
+ * The sky-ocean, as an actual wave simulation rather than a tinted plane.
7
+ *
8
+ * Four summed Gerstner waves: unlike a sine heightfield, Gerstner displaces
9
+ * vertices *horizontally* toward crests as well as vertically, which is what
10
+ * produces sharp peaks and broad troughs instead of a rolling blanket. Normals
11
+ * come analytically from the same sum, so lighting matches the geometry exactly
12
+ * and needs no derivative tricks.
13
+ *
14
+ * The wave field itself lives in `gerstner.ts` because it is shared: the caustics
15
+ * in `caustics.ts` are the light *this* surface throws onto what covers it, and
16
+ * they must be the same water, not a lookalike animated separately.
17
+ *
18
+ * The grid follows the camera and is snapped to whole cells, giving an endless
19
+ * ocean from a fixed vertex budget without the surface sliding underfoot.
20
+ */
21
+ export const WATER_VERT = `#version 300 es
22
+ layout(location = 0) in vec2 aGrid;
23
+
24
+ uniform mat4 uViewProj;
25
+ uniform mat4 uReflectionViewProj;
26
+ uniform vec3 uCameraPos;
27
+ uniform float uTime;
28
+ /**
29
+ * Where the sheet is laid, in world XZ.
30
+ *
31
+ * The ocean passes its own camera position snapped to whole cells, which is what
32
+ * gives an endless sea from a fixed vertex budget without the surface sliding
33
+ * underfoot. A *bounded* sheet — a pool in a courtyard — passes the middle of the
34
+ * thing it is filling instead, and is world-fixed by construction.
35
+ *
36
+ * Snapped on the CPU rather than here so that one number is the only difference
37
+ * between an ocean and a basin, and the shader has no idea which it is drawing.
38
+ */
39
+ uniform vec2 uGridOrigin;
40
+ /**
41
+ * Metres per unit of the sheet's own grid, along each of the body's own axes.
42
+ *
43
+ * One and one for the ocean, whose grid is authored in metres and is two meshes wide.
44
+ * A bounded body — a pool, a tank, a puddle, a channel — is drawn from a unit sheet
45
+ * and scaled by its own half-extents, which is what lets one mesh and one material
46
+ * serve every body of water in the world.
47
+ *
48
+ * **Two numbers and not one since 2026-08-28.** A single span makes every bounded
49
+ * body square, and a square that contains a channel floods the ground either side
50
+ * of it. The ocean passes the same number twice and is bit-identical to what it was.
51
+ */
52
+ uniform vec2 uGridSpan;
53
+ uniform vec2 uGridHalf;
54
+ uniform vec2 uNearHalf;
55
+ /**
56
+ * The body's own +z, in world XZ, unit length. (0, 1) leaves the sheet unturned.
57
+ *
58
+ * A direction rather than an angle, so nothing here needs a trig call and a consumer
59
+ * bounding a channel can hand over the direction its run already takes. The across
60
+ * axis is world up crossed with this, \`(fz, -fx)\`, which is the basis
61
+ * \`MeshBuilder.addOrientedBox\` builds from a forward vector — one convention for an
62
+ * oriented thing, so a reader who has met one has met both.
63
+ */
64
+ uniform vec2 uGridForward;
65
+ /** Prevailing wind bearing, normalised. Waves are steered toward it. */
66
+ uniform vec2 uWindDir;
67
+ /** Multiplier on authored steepness — how built-up the sea is. */
68
+ uniform float uWaveGain;
69
+ uniform float uWaterLevel;
70
+
71
+ out vec3 vWorldPos;
72
+ out vec3 vNormal;
73
+ out float vCrest;
74
+ out vec4 vReflectionClip;
75
+ /** Grid-local offset, so the sheet can fade out its own boundary. */
76
+ out vec2 vGrid;
77
+
78
+ ${GERSTNER_GLSL}
79
+
80
+ void main() {
81
+ /*
82
+ * Waves must reach nothing by the near sheet's edge, because beyond it lies
83
+ * the flat skirt. A displaced rim meeting an undisplaced skirt would tear the
84
+ * surface open along a visible seam; fading first makes the two meshes agree
85
+ * exactly where they meet. Chebyshev distance, so the fade band follows the
86
+ * rectangular boundary rather than cutting an ellipse inside it.
87
+ *
88
+ * **Measured as a fraction of each axis' own extent**, which is what lets a
89
+ * channel three metres across and twenty-one long fade evenly at both its ends
90
+ * and both its sides. Against one shared extent the narrow axis would be inside
91
+ * the fade band along its whole length and the water would never reach its own
92
+ * bank. For the ocean, whose two extents are equal, this is the same arithmetic
93
+ * with the division moved one step earlier.
94
+ *
95
+ * It is also the honest thing to draw. At a few hundred metres a 1 m swell is
96
+ * well under a pixel, and out on the skirt a float32 phase argument has lost
97
+ * most of its meaningful bits — a calm horizon is what an ocean actually looks
98
+ * like from that far away.
99
+ */
100
+ vec2 grid = aGrid * uGridSpan;
101
+ /* The same offset the fragment stage fades the rim on, so the two cannot disagree. */
102
+ vGrid = grid;
103
+ vec2 rimFraction = abs(grid) / max(uNearHalf, vec2(1e-4));
104
+ float rimDistance = max(rimFraction.x, rimFraction.y);
105
+ float waveFade = 1.0 - smoothstep(0.35, 0.97, rimDistance);
106
+
107
+ /*
108
+ * Into the world: across the body, then along it. \`right = up x forward\` is
109
+ * \`(fz, -fx)\`, and getting that pair the wrong way round is a sheet mirrored
110
+ * about its own axis, which on a square is invisible and on a channel is a
111
+ * channel across the road instead of along it.
112
+ */
113
+ vec2 laid = vec2(uGridForward.y, -uGridForward.x) * grid.x + uGridForward * grid.y;
114
+
115
+ vec3 base = vec3(uGridOrigin.x + laid.x, uWaterLevel, uGridOrigin.y + laid.y);
116
+
117
+ GerstnerSurface sea = gerstnerSurface(base.xz, uTime, uWindDir, waveFade * uWaveGain);
118
+ vec3 pos = base + sea.offset;
119
+
120
+ vWorldPos = pos;
121
+ vNormal = normalize(sea.normal);
122
+ vCrest = sea.crest;
123
+ vReflectionClip = uReflectionViewProj * vec4(pos, 1.0);
124
+ gl_Position = uViewProj * vec4(pos, 1.0);
125
+ }
126
+ `;
127
+ export const WATER_FRAG = `#version 300 es
128
+ precision highp float;
129
+
130
+ in vec3 vWorldPos;
131
+ in vec3 vNormal;
132
+ in float vCrest;
133
+ in vec4 vReflectionClip;
134
+ in vec2 vGrid;
135
+
136
+ uniform vec2 uGridHalf;
137
+ uniform float uFoamGain;
138
+ /**
139
+ * How much of what is beneath it a body of water hides, looked straight down.
140
+ *
141
+ * The *density* of the water rather than a rendering trick: a sea hides its own
142
+ * floor, a fountain shows the tiles at the bottom of it, and a puddle is nearly
143
+ * clear. Only the nadir end is configurable — at a grazing angle every water
144
+ * surface goes reflective, which is Fresnel and not a property of the liquid.
145
+ */
146
+ uniform float uNadirOpacity;
147
+ /** The whole surface's visibility, 0 to 1. Zero draws nothing at all. */
148
+ uniform float uVisibility;
149
+ /**
150
+ * How much this body mirrors regardless of the angle it is seen at, 0 to 1.
151
+ *
152
+ * Zero is physics: reflection is Fresnel alone, which is right for an ocean seen
153
+ * across its own surface and which means *almost nothing* when you stand over a
154
+ * basin and look down into it — the angle is steep, the Fresnel term is a few
155
+ * percent, and a reflection nobody can see is the same as no reflection: the
156
+ * character's reflection is technically present and far too faint to perceive.
157
+ *
158
+ * So a body may declare itself more mirror than water. It is a lie about optics
159
+ * and an honest one about what a small pool is *for*: you look into it to see
160
+ * something. The sea keeps zero and behaves exactly as it always has.
161
+ */
162
+ uniform float uMirror;
163
+ uniform vec3 uDeepColor;
164
+ uniform vec3 uShallowColor;
165
+ uniform vec3 uDirectionalDir;
166
+ uniform vec3 uDirectionalColor;
167
+ uniform vec3 uAmbient;
168
+ /**
169
+ * The scene's point lights, which water is entitled to as much as stone is.
170
+ *
171
+ * The surface used to answer to the sun alone, on the reasonable assumption that water
172
+ * is a thing that sits under the sky. It is not: a flooded corridor, a cistern, an
173
+ * indoor pool and a harbour at night are all water lit entirely by lamps, and under
174
+ * those this shaded to flat ambient — a coloured plane, with the specular glitter that
175
+ * is the single strongest cue that a surface *is* water switched off because no
176
+ * directional source existed to make it. A lantern on a jetty threw nothing.
177
+ *
178
+ * Same slots, same weights and the same two falloff shapes as the surface shader, so a
179
+ * lamp behaves the same way over water as it does over the ground beside it.
180
+ */
181
+ #define MAX_LIGHTS ${MAX_POINT_LIGHTS}
182
+ uniform int uLightCount;
183
+ uniform vec3 uLightPos[MAX_LIGHTS];
184
+ uniform vec3 uLightColor[MAX_LIGHTS];
185
+ uniform float uLightRadius[MAX_LIGHTS];
186
+ uniform float uLightWeight[MAX_LIGHTS];
187
+ uniform int uLightFalloff;
188
+ ${FOG_GLSL}
189
+ uniform vec3 uCameraPos;
190
+ uniform sampler2D uReflectionMap;
191
+ uniform int uReflectionEnabled;
192
+ uniform vec2 uReflectionTexelSize;
193
+ uniform int uReflectionFilterTaps;
194
+
195
+ const vec2 REFLECTION_FILTER[${MAX_WATER_REFLECTION_FILTER_TAPS}] = vec2[${MAX_WATER_REFLECTION_FILTER_TAPS}](
196
+ vec2( 0.00, 0.00), vec2(-0.62, -0.31), vec2( 0.54, 0.43),
197
+ vec2(-0.34, 0.76), vec2( 0.78, -0.57), vec2(-0.88, 0.28),
198
+ vec2( 0.22, -0.91), vec2( 0.91, 0.08), vec2(-0.18, 0.94)
199
+ );
200
+ // Preserve small moving silhouettes such as a character while still spreading
201
+ // the surrounding taps enough to make the target read as rough water.
202
+ const float REFLECTION_FILTER_WEIGHT[${MAX_WATER_REFLECTION_FILTER_TAPS}] = float[${MAX_WATER_REFLECTION_FILTER_TAPS}](
203
+ 0.28, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09
204
+ );
205
+
206
+ out vec4 outColor;
207
+
208
+ void main() {
209
+ vec3 n = normalize(vNormal);
210
+ vec3 view = normalize(uCameraPos - vWorldPos);
211
+
212
+ // Fresnel: water is nearly a mirror at grazing angles and clear straight down.
213
+ // abs keeps the underside physically continuous with the top instead of
214
+ // turning the entire surface into an opaque mirror below the waterline.
215
+ float facing = clamp(abs(dot(n, view)), 0.0, 1.0);
216
+ float fresnel = 0.02 + 0.98 * pow(1.0 - facing, 5.0);
217
+
218
+ vec3 atmosphereColor = mediumColor();
219
+
220
+ vec3 col = mix(uDeepColor, uShallowColor, clamp(vCrest * 1.4 + 0.4, 0.0, 1.0));
221
+ vec3 incident = uAmbient +
222
+ uDirectionalColor * max(dot(n, uDirectionalDir), 0.0) * 0.6;
223
+
224
+ // Specular glitter along the crests — the strongest single cue that a surface
225
+ // is water rather than a coloured plane.
226
+ vec3 halfVec = normalize(uDirectionalDir + view);
227
+ float spec = pow(max(dot(n, halfVec), 0.0), 220.0);
228
+ vec3 highlight = uDirectionalColor * spec * 1.6;
229
+
230
+ /*
231
+ * And the same from every lamp in range: a light over water lights it, and glitters
232
+ * on it. Indoors this is the whole of the surface's lighting.
233
+ *
234
+ * The exponent is the sun's, so a crest picks a lamp out as tightly as it picks out
235
+ * the sky — which is what makes a strip light read as a *streak* across a pool rather
236
+ * than a broad sheen. Weighted by presence like every other consumer of these slots,
237
+ * so a light entering the set fades in instead of appearing.
238
+ */
239
+ for (int i = 0; i < MAX_LIGHTS; i++) {
240
+ if (i >= uLightCount) break;
241
+ vec3 toLight = uLightPos[i] - vWorldPos;
242
+ float lightDist = length(toLight);
243
+ float falloff;
244
+ if (uLightFalloff == 1) {
245
+ float window = clamp(1.0 - pow(lightDist / max(uLightRadius[i], 1e-4), 4.0), 0.0, 1.0);
246
+ falloff = window * window / max(lightDist * lightDist, 0.01);
247
+ } else {
248
+ falloff = clamp(1.0 - lightDist / max(uLightRadius[i], 1e-4), 0.0, 1.0);
249
+ }
250
+ if (falloff <= 0.0) continue;
251
+ vec3 lightDir = toLight / max(lightDist, 1e-4);
252
+ float shaped = falloff * uLightWeight[i];
253
+ incident += uLightColor[i] * max(dot(n, lightDir), 0.0) * shaped * 0.6;
254
+ vec3 lampHalf = normalize(lightDir + view);
255
+ highlight += uLightColor[i] * pow(max(dot(n, lampHalf), 0.0), 220.0) * shaped * 1.6;
256
+ }
257
+
258
+ col *= incident;
259
+ col += highlight;
260
+
261
+ // Foam where crests peak — and only when the wind is actually breaking them.
262
+ float foam = smoothstep(0.55, 0.85, vCrest) * uFoamGain;
263
+ col = mix(col, vec3(0.92, 0.96, 1.0), foam * 0.5);
264
+
265
+ float dist = distance(vWorldPos, uCameraPos);
266
+ float fog = mediumFog(dist, vWorldPos.y);
267
+ col = mix(col, atmosphereColor, fog);
268
+
269
+ // Transparency is angle-dependent, like real water: looking down you see
270
+ // straight through to the seabed, at grazing angles it turns reflective.
271
+ // This is computed before reflection because straight-alpha compositing must
272
+ // not attenuate reflected radiance a second time below.
273
+ float airOpacity = mix(uNadirOpacity, 0.96, fresnel);
274
+ float underwaterOpacity = mix(uNadirOpacity * 0.55, 0.88, fresnel);
275
+ float opacity = mix(airOpacity, underwaterOpacity, uUnderwaterFactor);
276
+ opacity = mix(opacity, 0.96, foam * 0.7);
277
+
278
+ // Project the displaced surface into the mirrored camera. The Gerstner
279
+ // displacement supplies broad distortion; the analytic normal adds the
280
+ // smaller ripples that make reflected silhouettes move with each crest.
281
+ vec3 reflected = atmosphereColor;
282
+ float reflectionValid = 0.0;
283
+ if (uReflectionEnabled != 0 && vReflectionClip.w > 0.0) {
284
+ vec2 reflectionUv = vReflectionClip.xy / vReflectionClip.w * 0.5 + 0.5;
285
+ reflectionUv += n.xz * mix(0.008, 0.022, fresnel);
286
+ vec2 border = min(reflectionUv, 1.0 - reflectionUv);
287
+ reflectionValid = smoothstep(0.0, 0.025, min(border.x, border.y));
288
+ // A planar target is optically sharp, which is correct for a mirror but
289
+ // wrong for a moving water surface. Broaden it over a Poisson footprint
290
+ // that grows gently with viewing distance; normal displacement above
291
+ // still makes every crest steer that softened image independently.
292
+ float blurPixels = 1.35 + min(dist * 0.022, 3.5);
293
+ vec3 sceneReflection = vec3(0.0);
294
+ float filterWeight = 0.0;
295
+ for (int i = 0; i < ${MAX_WATER_REFLECTION_FILTER_TAPS}; i++) {
296
+ if (i >= uReflectionFilterTaps) break;
297
+ vec2 sampleUv = reflectionUv +
298
+ REFLECTION_FILTER[i] * uReflectionTexelSize * blurPixels;
299
+ float weight = REFLECTION_FILTER_WEIGHT[i];
300
+ /*
301
+ * \`textureLod\` rather than \`texture\`, by the rule \`AGENTS.md\` records on 2026-08-07:
302
+ * this loop is reached through a branch on \`vReflectionClip\`, which is not uniform, and
303
+ * an implicit derivative there is undefined. **WGSL does not merely leave it undefined,
304
+ * it refuses to compile the module**: *"'textureSample' must only be called from uniform
305
+ * control flow"*, with the note that reading \`vReflectionClip\` may be non-uniform.
306
+ *
307
+ * Bit-identical on WebGL2: \`planarReflection.ts\` allocates one level and filters
308
+ * \`LINEAR\`, so there is no mip to select and level zero is the only thing \`texture\`
309
+ * could have read.
310
+ */
311
+ sceneReflection +=
312
+ textureLod(uReflectionMap, clamp(sampleUv, 0.0, 1.0), 0.0).rgb * weight;
313
+ filterWeight += weight;
314
+ }
315
+ sceneReflection /= max(filterWeight, 0.001);
316
+ reflected = mix(atmosphereColor, sceneReflection, reflectionValid);
317
+ }
318
+ // The atmosphere-colour fallback preserves the old sky reflection when a
319
+ // quality profile disables the extra scene pass. Foam scatters rather than
320
+ // mirroring, so it masks the reflection at breaking crests.
321
+ float sceneWeight = float(uReflectionEnabled) * reflectionValid;
322
+ float reflectionGain = mix(0.75, 0.94, sceneWeight);
323
+ // Angle-honest by default, and a mirror where a body says so. See uMirror above.
324
+ float reflectivity = mix(fresnel, 1.0, uMirror);
325
+ float reflectedRadiance = min(
326
+ reflectivity * reflectionGain * (1.0 - foam * 0.8),
327
+ opacity
328
+ );
329
+ // With SRC_ALPHA blending, mixing by Fresnel directly would multiply the
330
+ // reflection by opacity again. Divide it out here so the framebuffer gets
331
+ // the intended reflected fraction while the remainder stays transmissive.
332
+ float reflectionWeight = reflectedRadiance / max(opacity, 0.001);
333
+ col = mix(col, reflected, reflectionWeight);
334
+
335
+ /*
336
+ * Dissolve the sheet at its own boundary.
337
+ *
338
+ * Fading on fog alone made the horizon a function of the daily palette: a
339
+ * clear day never reached the threshold, so the grid's rim — corner and all —
340
+ * became the skyline. Fading on the grid coordinate cannot fail that way,
341
+ * because alpha reaches zero at the last row of vertices by construction.
342
+ * Chebyshev distance because the sheet is a rectangle, so the fade band
343
+ * follows its four edges instead of cutting an ellipse out of it — and it is
344
+ * measured per axis, or a channel's narrow sides would be one continuous fade
345
+ * and it would have no visible edge at all.
346
+ */
347
+ vec2 rimFraction = abs(vGrid) / max(uGridHalf, vec2(0.001));
348
+ float rimT = max(rimFraction.x, rimFraction.y);
349
+ float rim = 1.0 - smoothstep(0.9, 1.0, rimT);
350
+ // Fog still helps where it is thick, it just is no longer load-bearing.
351
+ float edge = 1.0 - smoothstep(0.82, 1.0, fog);
352
+ outColor = vec4(col, opacity * edge * rim * uVisibility);
353
+ }
354
+ `;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Visible wind: streaks of dust and debris carried past the camera.
3
+ *
4
+ * Wind you cannot see is a force from nowhere. Once it pushes the player even
5
+ * slightly, it has to be legible — otherwise a drift in the air reads as the
6
+ * controls being imprecise rather than as weather, which is the worst possible
7
+ * reading because it blames the game's feel for something that is deliberate.
8
+ *
9
+ * Entirely GPU-side: particles live on a repeating lattice that follows the
10
+ * camera, so there is no spawning, no pooling, no per-frame CPU work, and no
11
+ * bookkeeping that could disagree with the wind everything else is using.
12
+ */
13
+ export declare const WIND_STREAK_VERT = "#version 300 es\nlayout(location = 0) in vec2 aCorner;\nlayout(location = 1) in float aIndex;\n\nuniform mat4 uViewProj;\nuniform vec3 uCameraPos;\n/*\n * No uCameraRight. It was declared here and read nowhere, which GLSL answers by optimising the\n * location away \u2014 so the WebGL2 path never bound it and nothing was wrong. A uniform block is\n * laid out whole, though, so the generated WGSL carried sixteen bytes of it at offset 80 and\n * pushed everything after it along, leaving a field in the layout with no writer. That is the\n * shape AGENTS.md 2026-08-13 is about, arriving as dead weight rather than as a bug.\n */\nuniform vec2 uWind;\nuniform vec2 uDrift;\nuniform float uSpeed;\nuniform float uStrength;\nuniform float uCount;\nuniform float uCellSize;\nuniform float uTime;\n\nout float vFade;\nout float vAlong;\n\nvoid main() {\n float id = aIndex;\n float rx = fract(sin(id * 12.9898) * 43758.5453);\n float ry = fract(sin(id * 39.3467) * 24634.6345);\n float rz = fract(sin(id * 78.2330) * 12934.1234);\n\n /*\n * Scatter through a box that follows the camera, wrapped so a particle\n * leaving one side re-enters the other. That wrap is what makes a finite\n * count look like endless weather, and why nothing ever needs respawning.\n */\n /*\n * Biased low. You do not see air \u2014 you see what the wind has picked up, and\n * it picks things up from surfaces. Spreading debris evenly through a volume\n * puts streaks at head height in open sky, which is the single thing that\n * makes this read as an effect rather than as weather.\n */\n float lowBias = ry * ry;\n vec3 cell = vec3(rx * uCellSize, lowBias * uCellSize * 0.42, rz * uCellSize);\n vec3 base = vec3(\n uCameraPos.x + cell.x - uCellSize * 0.5 - uDrift.x,\n uCameraPos.y + cell.y - uCellSize * 0.3,\n uCameraPos.z + cell.z - uCellSize * 0.5 - uDrift.y\n );\n vec3 rel = base - uCameraPos;\n rel.x = mod(rel.x + uCellSize * 0.5, uCellSize) - uCellSize * 0.5;\n rel.z = mod(rel.z + uCellSize * 0.5, uCellSize) - uCellSize * 0.5;\n vec3 centre = uCameraPos + rel;\n\n // Streaks lie along the wind and lengthen with it: a smear is how speed\n // reads when the thing moving is too small to resolve.\n vec2 alongXZ = uSpeed > 0.001 ? uWind / uSpeed : vec2(1.0, 0.0);\n vec3 along = vec3(alongXZ.x, 0.0, alongXZ.y);\n vec3 across = normalize(cross(along, vec3(0.0, 1.0, 0.0)));\n\n /*\n * Turbulent, not ruled. A dead-straight line is the giveaway that something\n * was drawn rather than blown, so each streak curls on its own slow phase and\n * varies in length \u2014 a gust is made of eddies, and eddies are what the eye is\n * actually reading when it decides air is moving.\n */\n float curl = sin(uTime * 1.7 + id * 2.3) * 0.35 + sin(uTime * 0.9 + id) * 0.2;\n float length = (0.18 + uSpeed * 0.09) * (0.5 + rz);\n vec3 world = centre\n + along * (aCorner.y * length)\n + across * (aCorner.x * 0.012 + aCorner.y * curl * length * 0.35);\n\n // Fade with distance from the camera so the lattice edge is never a visible\n // boundary, and with strength so a calm day shows nothing at all.\n float dist = distance(centre, uCameraPos);\n /*\n * Three fades, all of which have to hold for a streak to be visible at all:\n * distance, so the lattice edge is never a boundary; a per-streak weight, so\n * they are not a uniform field; and a near fade, because debris a metre from\n * the eye is a smear across the screen rather than a cue.\n */\n /*\n * Fades spread across the whole volume rather than clipped into a band.\n *\n * Narrow near and far fades carve a spherical shell out of the lattice, and a\n * shell centred on the camera is seen as a curtain hanging in front of the\n * player \u2014 every particle at roughly the same distance, moving together. The\n * cure is depth: a long ramp at both ends, so density falls away gradually\n * and no distance is privileged.\n */\n float far = 1.0 - smoothstep(uCellSize * 0.12, uCellSize * 0.5, dist);\n float near = smoothstep(2.0, 16.0, dist);\n // Most particles are faint; a few carry the effect. A uniform field is a veil.\n float weight = rx * rx * rx;\n vFade = uStrength * far * near * weight;\n vAlong = aCorner.y * 0.5 + 0.5;\n\n gl_Position = uViewProj * vec4(world, 1.0);\n}\n";
14
+ export declare const WIND_STREAK_FRAG = "#version 300 es\nprecision highp float;\n\nin float vFade;\nin float vAlong;\nuniform vec3 uTint;\nout vec4 outColor;\n\nvoid main() {\n // Tapered at both ends, so a streak reads as motion rather than as a stick.\n // Squared taper: a streak should be a smear that thins to nothing, not a\n // capsule with visible ends.\n float taper = sin(vAlong * 3.14159);\n float alpha = vFade * taper * taper * 0.13;\n if (alpha <= 0.002) discard;\n outColor = vec4(uTint, alpha);\n}\n";
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Visible wind: streaks of dust and debris carried past the camera.
3
+ *
4
+ * Wind you cannot see is a force from nowhere. Once it pushes the player even
5
+ * slightly, it has to be legible — otherwise a drift in the air reads as the
6
+ * controls being imprecise rather than as weather, which is the worst possible
7
+ * reading because it blames the game's feel for something that is deliberate.
8
+ *
9
+ * Entirely GPU-side: particles live on a repeating lattice that follows the
10
+ * camera, so there is no spawning, no pooling, no per-frame CPU work, and no
11
+ * bookkeeping that could disagree with the wind everything else is using.
12
+ */
13
+ export const WIND_STREAK_VERT = `#version 300 es
14
+ layout(location = 0) in vec2 aCorner;
15
+ layout(location = 1) in float aIndex;
16
+
17
+ uniform mat4 uViewProj;
18
+ uniform vec3 uCameraPos;
19
+ /*
20
+ * No uCameraRight. It was declared here and read nowhere, which GLSL answers by optimising the
21
+ * location away — so the WebGL2 path never bound it and nothing was wrong. A uniform block is
22
+ * laid out whole, though, so the generated WGSL carried sixteen bytes of it at offset 80 and
23
+ * pushed everything after it along, leaving a field in the layout with no writer. That is the
24
+ * shape AGENTS.md 2026-08-13 is about, arriving as dead weight rather than as a bug.
25
+ */
26
+ uniform vec2 uWind;
27
+ uniform vec2 uDrift;
28
+ uniform float uSpeed;
29
+ uniform float uStrength;
30
+ uniform float uCount;
31
+ uniform float uCellSize;
32
+ uniform float uTime;
33
+
34
+ out float vFade;
35
+ out float vAlong;
36
+
37
+ void main() {
38
+ float id = aIndex;
39
+ float rx = fract(sin(id * 12.9898) * 43758.5453);
40
+ float ry = fract(sin(id * 39.3467) * 24634.6345);
41
+ float rz = fract(sin(id * 78.2330) * 12934.1234);
42
+
43
+ /*
44
+ * Scatter through a box that follows the camera, wrapped so a particle
45
+ * leaving one side re-enters the other. That wrap is what makes a finite
46
+ * count look like endless weather, and why nothing ever needs respawning.
47
+ */
48
+ /*
49
+ * Biased low. You do not see air — you see what the wind has picked up, and
50
+ * it picks things up from surfaces. Spreading debris evenly through a volume
51
+ * puts streaks at head height in open sky, which is the single thing that
52
+ * makes this read as an effect rather than as weather.
53
+ */
54
+ float lowBias = ry * ry;
55
+ vec3 cell = vec3(rx * uCellSize, lowBias * uCellSize * 0.42, rz * uCellSize);
56
+ vec3 base = vec3(
57
+ uCameraPos.x + cell.x - uCellSize * 0.5 - uDrift.x,
58
+ uCameraPos.y + cell.y - uCellSize * 0.3,
59
+ uCameraPos.z + cell.z - uCellSize * 0.5 - uDrift.y
60
+ );
61
+ vec3 rel = base - uCameraPos;
62
+ rel.x = mod(rel.x + uCellSize * 0.5, uCellSize) - uCellSize * 0.5;
63
+ rel.z = mod(rel.z + uCellSize * 0.5, uCellSize) - uCellSize * 0.5;
64
+ vec3 centre = uCameraPos + rel;
65
+
66
+ // Streaks lie along the wind and lengthen with it: a smear is how speed
67
+ // reads when the thing moving is too small to resolve.
68
+ vec2 alongXZ = uSpeed > 0.001 ? uWind / uSpeed : vec2(1.0, 0.0);
69
+ vec3 along = vec3(alongXZ.x, 0.0, alongXZ.y);
70
+ vec3 across = normalize(cross(along, vec3(0.0, 1.0, 0.0)));
71
+
72
+ /*
73
+ * Turbulent, not ruled. A dead-straight line is the giveaway that something
74
+ * was drawn rather than blown, so each streak curls on its own slow phase and
75
+ * varies in length — a gust is made of eddies, and eddies are what the eye is
76
+ * actually reading when it decides air is moving.
77
+ */
78
+ float curl = sin(uTime * 1.7 + id * 2.3) * 0.35 + sin(uTime * 0.9 + id) * 0.2;
79
+ float length = (0.18 + uSpeed * 0.09) * (0.5 + rz);
80
+ vec3 world = centre
81
+ + along * (aCorner.y * length)
82
+ + across * (aCorner.x * 0.012 + aCorner.y * curl * length * 0.35);
83
+
84
+ // Fade with distance from the camera so the lattice edge is never a visible
85
+ // boundary, and with strength so a calm day shows nothing at all.
86
+ float dist = distance(centre, uCameraPos);
87
+ /*
88
+ * Three fades, all of which have to hold for a streak to be visible at all:
89
+ * distance, so the lattice edge is never a boundary; a per-streak weight, so
90
+ * they are not a uniform field; and a near fade, because debris a metre from
91
+ * the eye is a smear across the screen rather than a cue.
92
+ */
93
+ /*
94
+ * Fades spread across the whole volume rather than clipped into a band.
95
+ *
96
+ * Narrow near and far fades carve a spherical shell out of the lattice, and a
97
+ * shell centred on the camera is seen as a curtain hanging in front of the
98
+ * player — every particle at roughly the same distance, moving together. The
99
+ * cure is depth: a long ramp at both ends, so density falls away gradually
100
+ * and no distance is privileged.
101
+ */
102
+ float far = 1.0 - smoothstep(uCellSize * 0.12, uCellSize * 0.5, dist);
103
+ float near = smoothstep(2.0, 16.0, dist);
104
+ // Most particles are faint; a few carry the effect. A uniform field is a veil.
105
+ float weight = rx * rx * rx;
106
+ vFade = uStrength * far * near * weight;
107
+ vAlong = aCorner.y * 0.5 + 0.5;
108
+
109
+ gl_Position = uViewProj * vec4(world, 1.0);
110
+ }
111
+ `;
112
+ export const WIND_STREAK_FRAG = `#version 300 es
113
+ precision highp float;
114
+
115
+ in float vFade;
116
+ in float vAlong;
117
+ uniform vec3 uTint;
118
+ out vec4 outColor;
119
+
120
+ void main() {
121
+ // Tapered at both ends, so a streak reads as motion rather than as a stick.
122
+ // Squared taper: a streak should be a smear that thins to nothing, not a
123
+ // capsule with visible ends.
124
+ float taper = sin(vAlong * 3.14159);
125
+ float alpha = vFade * taper * taper * 0.13;
126
+ if (alpha <= 0.002) discard;
127
+ outColor = vec4(uTint, alpha);
128
+ }
129
+ `;
@@ -0,0 +1,107 @@
1
+ import type { ReadonlyMat4 } from 'gl-matrix';
2
+ import type { InstanceData } from './instancedMesh.ts';
3
+ import type { InstancedHandle, MeshHandle, ScatterHandle } from './backend/api.ts';
4
+ import type { MeshInstances } from './instances.ts';
5
+ import type { SurfaceMaterial } from './surfaceTexture.ts';
6
+ import type { SurfaceTextureHandle } from './backend/api.ts';
7
+ /**
8
+ * What a shadow-caster enumeration may hand to a depth pass.
9
+ *
10
+ * **Occluding light and stopping a body are two independent properties of a piece
11
+ * of geometry, and this interface exists to keep them apart.** The set that
12
+ * collides is a physics question; the set that casts is an optics one. They overlap
13
+ * heavily — most solid things do both — but neither contains the other, and a
14
+ * renderer that derives one from the other gets a whole class of geometry wrong in
15
+ * one stroke.
16
+ *
17
+ * The failure this was written for: a tree's canopy is deliberately not a collider
18
+ * (nothing should be halted mid-run by leaves) and is therefore not merged into the
19
+ * static world mesh either, because it bends in the wind and merged geometry cannot.
20
+ * The only thing a depth pass could accept was a rigid `Mesh`, so the canopy had no
21
+ * way in — and a crown that occludes nothing reads as sunlight passing straight
22
+ * through several metres of solid foliage. Nothing was switched off; there was
23
+ * simply no route for that kind of geometry to travel.
24
+ *
25
+ * So a sink takes both kinds. A caller enumerates what casts, once, and the same
26
+ * enumeration serves the directional cascade and every point-light cubemap.
27
+ *
28
+ * **Every draw may also carry its material, which is what lets one enumeration serve a colour
29
+ * pass as well as a depth one.** A depth pass ignores it, correctly: a material cannot change a
30
+ * depth, which is why this interface was right to carry only a handle, a matrix and a palette for
31
+ * as long as depth was the only thing replaying it. What that cost was measured from outside. A
32
+ * consumer wanting the scene from a second viewpoint — a mirror, a probe face — had one option,
33
+ * which was to run its whole draw path again; the first attempt to avoid it replayed this sink
34
+ * into the mirror and got **every car unpainted**, because the list carries no material. So the
35
+ * game re-enters its own draw with a mirrored camera, and pays its heaviest phase twice.
36
+ *
37
+ * Optional, and for the reason `instanced` gives at length: this interface is implemented
38
+ * outwards, so a required parameter added in a minor stops every consumer's sink and every test
39
+ * double compiling. A sink that ignores it behaves exactly as it did.
40
+ */
41
+ export type SceneCasterMaterial = SurfaceMaterial<SurfaceTextureHandle> | null;
42
+ export interface ShadowCasterSink {
43
+ /** A rigid mesh at a model transform: the world, a prop, a static piece of scenery. */
44
+ mesh(mesh: MeshHandle, model: ReadonlyMat4, material?: SceneCasterMaterial): void;
45
+ /**
46
+ * A skinned mesh, deformed by the same palette the visible draw uses.
47
+ *
48
+ * **The palette is not optional in spirit**, for the reason `scatter` below states about the
49
+ * wind: handing the depth pass a different deformation from the colour pass is how a shadow
50
+ * comes loose from its caster. A skinned character submitted through `mesh` does not drift
51
+ * slightly — it casts its **bind pose**, so a running figure throws the shadow of a statue.
52
+ *
53
+ * Sixteen floats a joint, column-major, exactly as `Skeleton.palette` produces.
54
+ */
55
+ skinnedMesh(mesh: MeshHandle, model: ReadonlyMat4, palette: Float32Array, material?: SceneCasterMaterial): void;
56
+ /**
57
+ * An instanced batch of rigid meshes, placed by the same matrices the visible draw uses.
58
+ *
59
+ * **Not optional in spirit, for the reason `scatter` gives about the wind**: a batch whose
60
+ * depth pass read a different placement casts shadows that have come loose from the things
61
+ * casting them — and a batch submitted through `mesh` instead casts *one* shadow, from
62
+ * whichever matrix happened to be bound, with the other twenty-nine missing entirely.
63
+ *
64
+ * **Optional in the type, and only because this interface is implemented outwards.** A
65
+ * consumer's own sinks and its test doubles satisfy this type, so a required member added in a
66
+ * minor stops every one of them compiling — which is what happened: 3.29.0 broke three test
67
+ * doubles in a consumer that has no instanced batches at all. The renderer always supplies
68
+ * it, so `sink.instanced?.(batch, data)` never actually skips, and a consumer written before
69
+ * instanced draws existed has nothing to declare through it.
70
+ */
71
+ instanced?(batch: InstancedHandle, data: MeshInstances, material?: SceneCasterMaterial): void;
72
+ /**
73
+ * A scatter batch, deformed exactly as the visible draw deforms it.
74
+ *
75
+ * The wind and press arguments are the same values the matching `drawScatter`
76
+ * receives, and they are not optional in spirit: handing the depth pass a
77
+ * different gust from the colour pass is how a shadow comes loose from its
78
+ * caster. Positional rather than a bundled object, so a per-frame call site
79
+ * allocates nothing.
80
+ */
81
+ scatter(scatter: ScatterHandle, data: InstanceData, windX: number, windZ: number, windGust: number, timeSeconds: number, trample?: Float32Array | null): void;
82
+ }
83
+ /**
84
+ * A caller-supplied enumeration of everything that casts.
85
+ *
86
+ * Called once per directional layer and once per cubemap face, so it must be
87
+ * allocation-free — close over the meshes and read them, never build a list.
88
+ */
89
+ export type ShadowCasters = (sink: ShadowCasterSink) => void;
90
+ /**
91
+ * Replay a caster enumeration into the colour pass that is open, materials and all.
92
+ *
93
+ * The counterpart of `drawShadowCasters`, and the reason `ShadowCasterSink` carries a material at
94
+ * all. A consumer enumerates what its frame contains once and hands the same closure to the
95
+ * shadow cascade, to every cubemap face, and to a mirror or a probe face — rather than re-entering
96
+ * its own draw path with a second camera, which is what the alternative costs: a consumer
97
+ * measures the phase it would run twice at 2.3 to 9.4 ms, the largest single row in its frame.
98
+ *
99
+ * **Scatter is declined rather than drawn**, and visibly. A scatter batch's colour draw needs the
100
+ * camera and the environment of the frame it is being drawn into, and this enumeration carries
101
+ * neither — it records what a thing *is*, not what the pass around it looks like. Handing the
102
+ * colour path a stale camera would put the grass of the last pass into this one, which is the
103
+ * silent-plausible-picture failure the two-backends rule exists to forbid. So a replayed pass has
104
+ * no scatter in it, the absence is in the picture rather than in a comment, and a caller wanting
105
+ * grass in a mirror draws it itself with the camera it already has.
106
+ */
107
+ export type SceneCasters = ShadowCasters;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ export declare class ShadowMap {
2
+ readonly size: number;
3
+ readonly texture: WebGLTexture;
4
+ private readonly framebuffer;
5
+ constructor(gl: WebGL2RenderingContext, size?: number);
6
+ /** Bind as the render target and clear. Caller then draws the casters. */
7
+ begin(gl: WebGL2RenderingContext): void;
8
+ end(gl: WebGL2RenderingContext): void;
9
+ dispose(gl: WebGL2RenderingContext): void;
10
+ }