@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,408 @@
1
+ import { LIVE_POINT_SHADOW_MAPS, MAX_POINT_LIGHTS, POINT_SHADOW_POOL } from './lightBudget.ts';
2
+ import { LivePointShadowSet } from './livePointShadowSet.ts';
3
+ import type { PointShadowSource, ResolvedPointShadows } from './pointShadowImage.ts';
4
+
5
+ /**
6
+ * A pool of point-light shadow maps and the fixed set the shader samples.
7
+ *
8
+ * World lights do not own maps. They borrow one from a pool of
9
+ * `POINT_SHADOW_POOL`, handed out to whichever lights the shading pass chose and
10
+ * reclaimed from whichever was sampled least recently. Live maps contain moving
11
+ * casters only, so they compose with the borrowed maps rather than overwriting
12
+ * them. Normally one is active; both are used briefly while ownership crossfades
13
+ * to another light.
14
+ *
15
+ * **It used to be one permanent map per light**, which read as the generous
16
+ * choice and was the renderer's worst bug: a world with 50 lights allocated
17
+ * roughly 327 MB of cubemaps so that eight of them could be read. See
18
+ * `POINT_SHADOW_POOL` for what that did to integrated GPUs. Borrowing costs a
19
+ * six-face bake when a light enters the sampled set after being away, and buys
20
+ * back memory that scales with the light *budget* rather than with how many lamps
21
+ * the day's world happened to generate.
22
+ *
23
+ * Nothing is lost visually, and that is the point rather than a hope: a light
24
+ * outside the sampled set has no `samplerCube` bound to it and could not be read
25
+ * however long its map was kept.
26
+ *
27
+ * Selection is adopted from the shading pass verbatim. If lighting and shadow
28
+ * code choose independently, a small camera movement can reorder the two sets
29
+ * and make a lamp's static shadow switch off while its illumination remains.
30
+ */
31
+ export interface ShadowLight {
32
+ x: number;
33
+ y: number;
34
+ z: number;
35
+ /** Distance at which the light falls to zero; the map's far plane. */
36
+ radius: number;
37
+ /** Where casting begins. Keep small — it clips every caster, not just fixtures. */
38
+ shadowNear: number;
39
+ /** Physical emitter radius in metres; it controls penumbra width. */
40
+ sourceRadius: number;
41
+ /**
42
+ * Whether this light is worth a cubemap at all. Defaults to true.
43
+ *
44
+ * The same flag `PointLightSource` carries, declared here because the renderer checks
45
+ * it against the *shaded* set before handing out a pool slot. It used to be read only
46
+ * while building the eligible list, so a light that declined to cast still got a map
47
+ * whenever it was one of the lights being shaded — which is every light near the
48
+ * camera, and so every light whose bake anybody would notice.
49
+ */
50
+ castsShadow?: boolean;
51
+ }
52
+
53
+ /**
54
+ * The shader's own name for the point-shadow array.
55
+ *
56
+ * Exported because *both* backends address it: WebGL2 looks it up in its uniform table and
57
+ * WebGPU looks it up in the generated binding table. One name, so the two cannot bind different
58
+ * things.
59
+ *
60
+ * **It was twelve names, one per cubemap sampler**, because GLSL ES cannot index a sampler
61
+ * array with a non-constant expression and the shader therefore declared each map separately.
62
+ * One array texture with a layer per light needs one.
63
+ */
64
+ export const POINT_SHADOW_SAMPLER = 'uPointShadows';
65
+
66
+ export class PointShadowSystem<M extends PointShadowSource> {
67
+ /** The pool. Indexed by pool slot, never by world light. */
68
+ private readonly maps: M[] = [];
69
+ private readonly live: LivePointShadowSet<M>;
70
+ private staticLightCount = 0;
71
+
72
+ /** Which world light currently holds each pool slot, or -1 while free. */
73
+ private readonly slotOwner = new Int32Array(POINT_SHADOW_POOL).fill(-1);
74
+ /** The lights held ready but not shaded, so joining the sampled set costs no bake. */
75
+ private readonly warm = new Int32Array(POINT_SHADOW_POOL);
76
+ private warmCount = 0;
77
+
78
+ /** Frame stamp of the last time each slot was wanted, for the eviction choice. */
79
+ private readonly slotUsed = new Float64Array(POINT_SHADOW_POOL);
80
+ /** Reverse of `slotOwner`: pool slot per world light, or -1 while unassigned. */
81
+ private lightSlot = new Int32Array(0);
82
+ private useStamp = 0;
83
+
84
+ private readonly chosen = new Int32Array(MAX_POINT_LIGHTS);
85
+ /** Shader light slot each chosen world map belongs to. */
86
+ private readonly slots = new Int32Array(MAX_POINT_LIGHTS);
87
+ private chosenCount = 0;
88
+
89
+ /** Batched array uniforms; WebGL exposes each array at its `[0]` location. */
90
+ private readonly far = new Float32Array(MAX_POINT_LIGHTS);
91
+ private readonly near = new Float32Array(MAX_POINT_LIGHTS);
92
+ private readonly sourceRadius = new Float32Array(MAX_POINT_LIGHTS);
93
+ /** How present each bound map is, so a re-baked one arrives rather than appears. */
94
+ private readonly presence = new Float32Array(MAX_POINT_LIGHTS);
95
+
96
+ /**
97
+ * `createMap` rather than a context and a size, so the pool never names a device.
98
+ *
99
+ * The whole of this class is pooling, staleness and selection — decisions a second backend
100
+ * must make identically or its shadows change hands at different moments. Taking a factory is
101
+ * what lets both share it; see `PointShadowSource`.
102
+ */
103
+ constructor(
104
+ private readonly createMap: (layer: number) => M,
105
+ private readonly releaseMap: (map: M) => void,
106
+ ) {
107
+ this.live = new LivePointShadowSet(createMap, releaseMap);
108
+ }
109
+
110
+ /**
111
+ * Size the pool and forget every assignment. Called once the light count is known.
112
+ *
113
+ * The pool is capped at `POINT_SHADOW_POOL` however many lights the caller has,
114
+ * and at the light count when that is smaller — a world with three lamps has no
115
+ * use for twelve cubemaps.
116
+ */
117
+ prepareStaticMaps(lightCount: number): void {
118
+ const wanted = Math.min(lightCount, POINT_SHADOW_POOL);
119
+ while (this.maps.length < wanted) {
120
+ /* Pool slot i takes layer LIVE + i; the live maps hold 0 and 1. See PointShadowArray. */
121
+ this.maps.push(this.createMap(LIVE_POINT_SHADOW_MAPS + this.maps.length));
122
+ }
123
+ if (this.lightSlot.length < lightCount) this.lightSlot = new Int32Array(lightCount);
124
+ this.lightSlot.fill(-1);
125
+ this.slotOwner.fill(-1);
126
+ this.slotUsed.fill(0);
127
+ this.staticLightCount = lightCount;
128
+ }
129
+
130
+ /**
131
+ * The map a light is currently borrowing, if any.
132
+ *
133
+ * A pure lookup: assignment happens once a frame in `sync`, because handing out
134
+ * slots from here would let a caller iterating lights evict the map it is about
135
+ * to read.
136
+ */
137
+ mapForLight(lightIndex: number): M | undefined {
138
+ if (lightIndex < 0 || lightIndex >= this.staticLightCount) return undefined;
139
+ const slot = this.lightSlot[lightIndex] ?? -1;
140
+ return slot < 0 ? undefined : this.maps[slot];
141
+ }
142
+
143
+ /** Adopt the shading pass's world-light list, including its exact order. */
144
+ sync(
145
+ activeWorldIndices: Int32Array,
146
+ activeCount: number,
147
+ warmWorldIndices?: Int32Array,
148
+ warmCount = 0,
149
+ ): void {
150
+ this.chosenCount = 0;
151
+ const limit = Math.min(activeCount, MAX_POINT_LIGHTS);
152
+ for (let shaderSlot = 0; shaderSlot < limit; shaderSlot++) {
153
+ const worldIndex = activeWorldIndices[shaderSlot] ?? -1;
154
+ if (worldIndex < 0 || worldIndex >= this.staticLightCount) continue;
155
+ this.chosen[this.chosenCount] = worldIndex;
156
+ this.slots[this.chosenCount] = shaderSlot;
157
+ this.chosenCount++;
158
+ }
159
+
160
+ /*
161
+ * The lights about to be wanted, given slots and baked before they are.
162
+ *
163
+ * Every light owned a permanent map before the pool, so joining the sampled set
164
+ * meant its shadow was already correct. Borrowing broke that: joining meant
165
+ * evicting somebody and baking six faces at two a frame, which is the on/off as a
166
+ * lamp comes into range. The pool has always carried four slots more than the
167
+ * shader can bind, and until now they only absorbed churn — these are the lights
168
+ * they were for.
169
+ *
170
+ * Warm lights hold a slot and take bake budget. They are never bound: `sampledCount`
171
+ * still counts only what the shader reads.
172
+ */
173
+ this.warmCount = 0;
174
+ if (warmWorldIndices !== undefined) {
175
+ const warmLimit = Math.min(warmCount, this.maps.length);
176
+ for (let i = 0; i < warmLimit; i++) {
177
+ const worldIndex = warmWorldIndices[i] ?? -1;
178
+ if (worldIndex < 0 || worldIndex >= this.staticLightCount) continue;
179
+ /*
180
+ * Already being shaded, so it is not warming for anything: it holds its slot
181
+ * from the loop above and it is baked across `pooledCount` either way.
182
+ *
183
+ * Without this the two lists overlap almost entirely — the shadow list is the
184
+ * lights inside their own radius, and a light that close is nearly always in
185
+ * the shaded set already — so `pooledCount` counted the same lights twice, and
186
+ * `bakeStale` being pool-length meant the genuinely extra ones fell off the
187
+ * end. The spare slots the pool carries for exactly this never held anything.
188
+ */
189
+ let shaded = false;
190
+ for (let k = 0; k < this.chosenCount; k++) {
191
+ if (this.chosen[k] === worldIndex) {
192
+ shaded = true;
193
+ break;
194
+ }
195
+ }
196
+ if (shaded) continue;
197
+ this.warm[this.warmCount] = worldIndex;
198
+ this.warmCount++;
199
+ }
200
+ }
201
+
202
+ this.assignSlots();
203
+ }
204
+
205
+ /**
206
+ * Give every chosen light a pool slot, evicting the least recently wanted.
207
+ *
208
+ * One stamp for the whole call, so every light chosen this frame is equally
209
+ * recent and `claimSlot` can refuse to evict any of them.
210
+ */
211
+ private assignSlots(): void {
212
+ this.useStamp++;
213
+ // Sampled first, so a warm light can never take a slot from one being shaded.
214
+ for (let k = 0; k < this.chosenCount; k++) this.give(this.chosen[k] ?? -1);
215
+ for (let k = 0; k < this.warmCount; k++) this.give(this.warm[k] ?? -1);
216
+ }
217
+
218
+ private give(light: number): void {
219
+ if (light < 0) return;
220
+ const existing = this.lightSlot[light] ?? -1;
221
+ const slot = existing >= 0 ? existing : this.claimSlot(light);
222
+ if (slot >= 0) this.slotUsed[slot] = this.useStamp;
223
+ }
224
+
225
+ /**
226
+ * Take a free slot, or the one wanted longest ago.
227
+ *
228
+ * Slots already stamped with this frame belong to lights the shader is about to
229
+ * read, so they are never candidates. The pool has more slots than
230
+ * `MAX_POINT_LIGHTS`, so a candidate always exists.
231
+ */
232
+ private claimSlot(light: number): number {
233
+ let best = -1;
234
+ let bestStamp = Infinity;
235
+ for (let slot = 0; slot < this.maps.length; slot++) {
236
+ if ((this.slotUsed[slot] ?? 0) === this.useStamp) continue;
237
+ if ((this.slotOwner[slot] ?? -1) < 0) {
238
+ best = slot;
239
+ break;
240
+ }
241
+ const stamp = this.slotUsed[slot] ?? 0;
242
+ if (stamp < bestStamp) {
243
+ bestStamp = stamp;
244
+ best = slot;
245
+ }
246
+ }
247
+ if (best < 0) return -1;
248
+ const previous = this.slotOwner[best] ?? -1;
249
+ if (previous >= 0) {
250
+ this.lightSlot[previous] = -1;
251
+ // The image belongs to the light losing the slot, not to the one taking it.
252
+ // Left in place it is sampled as the new light's shadow until a re-bake lands.
253
+ this.maps[best]?.forget();
254
+ }
255
+ this.slotOwner[best] = light;
256
+ this.lightSlot[light] = best;
257
+ return best;
258
+ }
259
+
260
+ /** Ramp every pooled image toward full presence. See `PointShadowMap.advance`. */
261
+ /**
262
+ * Ramp every image toward full presence: the pool's, **and the live pair's**.
263
+ *
264
+ * The second half was missing, and it is the whole of why a moving caster was never shadowed by
265
+ * a point light. `this.maps` is the pool; the live pair belongs to `LivePointShadowSet`, which
266
+ * publishes `crossfade weight * presence` and therefore published zero for ever. Every other
267
+ * part of that path reports itself healthy, which is what made it survive.
268
+ */
269
+ advance(dt: number): void {
270
+ for (const map of this.maps) map.advance(dt);
271
+ this.live.advance(dt);
272
+ }
273
+
274
+ get sampledCount(): number {
275
+ return this.chosenCount;
276
+ }
277
+
278
+ /** How many lights hold a slot this frame: the shaded ones plus the warming ones. */
279
+ get pooledCount(): number {
280
+ return this.chosenCount + this.warmCount;
281
+ }
282
+
283
+ /**
284
+ * A light holding a slot, shaded ones first.
285
+ *
286
+ * The renderer bakes across this rather than across `sampledCount`, which is the
287
+ * whole point: a warm light's map is baked *before* it is bound, so being chosen
288
+ * for shading never costs six face passes.
289
+ */
290
+ pooledLight(index: number): number {
291
+ if (index < this.chosenCount) return this.chosen[index] ?? -1;
292
+ return this.warm[index - this.chosenCount] ?? -1;
293
+ }
294
+
295
+ sampledLight(slot: number): number {
296
+ return slot >= 0 && slot < this.chosenCount ? (this.chosen[slot] ?? -1) : -1;
297
+ }
298
+
299
+ /**
300
+ * Select the live shadow around a moving caster and advance any ownership
301
+ * crossfade. The position is caller-provided and has no gameplay meaning to
302
+ * the engine.
303
+ */
304
+ updateLiveSelection(
305
+ lights: readonly ShadowLight[],
306
+ x: number,
307
+ y: number,
308
+ z: number,
309
+ frameDt: number,
310
+ ): void {
311
+ this.live.update(lights, this.chosen, this.chosenCount, x, y, z, frameDt);
312
+ }
313
+
314
+ get liveMapCount(): number {
315
+ return LIVE_POINT_SHADOW_MAPS;
316
+ }
317
+
318
+ liveOwner(slot: number): number {
319
+ return this.live.owner(slot, this.chosen, this.chosenCount);
320
+ }
321
+
322
+ liveMap(slot: number): M | undefined {
323
+ return this.live.map(slot);
324
+ }
325
+
326
+ /**
327
+ * Bind every selected map and upload its metadata as whole arrays.
328
+ *
329
+ * WebGL reports an active uniform array only as `name[0]`. Looking up
330
+ * `name[1]` in the cached uniform table therefore returns nothing; uploading
331
+ * each element that way left slots 1–7 at zero and made their shadows vanish.
332
+ */
333
+ /**
334
+ * Settle every shader slot's map choice and parameters into the caller's arrays.
335
+ *
336
+ * **The arrays are the decision and the cubemaps are the binding.** Which light samples which
337
+ * slot, whether its image has landed and how present it is are answers this pool computes;
338
+ * turning them into `uniform1fv` or into bytes of a uniform block is all that differs between
339
+ * backends. A caller walks `mapForShaderSlot` for the textures.
340
+ */
341
+ resolve(out: ResolvedPointShadows): void {
342
+ out.layers.fill(-1);
343
+ out.far.fill(1);
344
+ out.near.fill(0.01);
345
+ out.sourceRadius.fill(0);
346
+ out.presence.fill(0);
347
+
348
+ for (let k = 0; k < MAX_POINT_LIGHTS; k++) {
349
+ const map = this.mapForShaderSlot(k);
350
+ /*
351
+ * A map with no image yet contributes nothing, exactly as an unassigned one does.
352
+ *
353
+ * Bakes are spread over frames rather than all done the moment they are noticed (see
354
+ * `pointShadowBudget.ts`), so a light can be selected a frame or two before its cubemap
355
+ * exists. Sampling it then would read whatever the pool slot held previously — another
356
+ * lamp's shadow, from somewhere else entirely — which is far worse than the light simply
357
+ * not casting for two frames. The index stays −1, which is the path the shader already
358
+ * takes for a light with no map at all.
359
+ */
360
+ if (map === undefined || !map.hasBaked) continue;
361
+ /*
362
+ * `slots[k]` is the shading pass's own index for this light, which is the `i` the shader
363
+ * loops over — so it is the index everything about this map is written under. The chosen
364
+ * order and the shading order are not the same order, and writing under `k` here would
365
+ * hand light 2 the parameters of light 0 in any scene where they differ.
366
+ */
367
+ const light = this.slots[k] ?? -1;
368
+ if (light < 0 || light >= out.layers.length) continue;
369
+ out.far[light] = map.far;
370
+ out.near[light] = map.near;
371
+ out.sourceRadius[light] = map.sourceRadius;
372
+ out.presence[light] = map.presence;
373
+ out.layers[light] = map.layer;
374
+ }
375
+
376
+ this.live.resolve(this.chosen, this.slots, this.chosenCount, out);
377
+ }
378
+
379
+ /**
380
+ * The map a shader slot samples, or undefined.
381
+ *
382
+ * Separate from `resolve` because a backend needs it for the *texture* while the arrays are
383
+ * already settled, and because a slot with no map still has to be filled with something —
384
+ * see `emptyTexture.ts` on one side and the one-texel cube on the other.
385
+ */
386
+ mapForShaderSlot(slot: number): M | undefined {
387
+ const lightIndex = slot < this.chosenCount ? (this.chosen[slot] ?? -1) : -1;
388
+ return this.mapForLight(lightIndex);
389
+ }
390
+
391
+ /**
392
+ * Throw away every baked image, keeping the maps and their layers.
393
+ *
394
+ * For a backend that had to rebuild the storage under them — the array is immutable once
395
+ * allocated, so growing it for a bigger world replaces the pixels with nothing. A map that
396
+ * still reported `hasBaked` afterwards would be sampled, and what it would read is whatever
397
+ * the new allocation happens to contain.
398
+ */
399
+ forgetEveryImage(): void {
400
+ for (const map of this.maps) map.forget();
401
+ this.live.forgetEveryImage();
402
+ }
403
+
404
+ dispose(): void {
405
+ for (const map of this.maps) this.releaseMap(map);
406
+ this.live.dispose();
407
+ }
408
+ }
@@ -0,0 +1,162 @@
1
+ /**
2
+ * What a GGX prefilter has to decide before any device is involved: which roughness a mip level
3
+ * stands for, and which source level one importance sample is allowed to read.
4
+ *
5
+ * **Backend-neutral, and that is the 2026-08-13 rule rather than tidiness.** A helper taking a
6
+ * `WebGL2RenderingContext` is a decision the other backend cannot reach, so it gets reimplemented
7
+ * there and the two drift. Both backends convolve the same cube by the same lobe; only the binding
8
+ * differs. It is also what makes the arithmetic testable without a GPU, which is where the
9
+ * hand-derived numbers in the test beside this file come from.
10
+ *
11
+ * **What a prefilter is, against what shipped before it.** A box filter averages a square of
12
+ * texels. A GGX lobe is not square, is not symmetric about the reflection direction at grazing
13
+ * angles, and widens with roughness in a way that has an analytic form. Sampling a box-filtered
14
+ * chain by roughness is an approximation whose error is largest exactly where a surface looks most
15
+ * interesting, and `uEnvironmentGain` is the control that has been correcting it by brute force.
16
+ *
17
+ * **What it costs:** a bake goes from six passes plus a mip chain to six passes plus a convolution
18
+ * per level. That is affordable only because a bake is once per scene rather than once per frame,
19
+ * and the sample count is a quality option for the same reason a phone and a workstation should
20
+ * not agree on it. **What would make it wrong** is a caller baking per frame; at that point the
21
+ * convolution is the frame's cost and the box chain it replaced was the right trade.
22
+ */
23
+
24
+ /**
25
+ * Samples per texel, per quality tier.
26
+ *
27
+ * **Powers of two, because the Hammersley sequence's radical inverse is a bit reversal.** A count
28
+ * that is not a power of two leaves the sequence unevenly stratified, which does not error — it
29
+ * shows as a faint directional bias in the rough levels that reads as the environment being
30
+ * slightly wrong rather than as a sampling fault.
31
+ *
32
+ * 32 is where a rough level stops showing individual bright sources as separate blobs on the
33
+ * scenes in this repository; 128 is where doubling it again stopped being visible. **What would
34
+ * make these wrong** is a much brighter environment than any tested here — a small sun in an
35
+ * otherwise dark sky is the worst case for variance, and it wants the high tier or a source level
36
+ * chosen more conservatively than `sourceLevelForSample` does.
37
+ */
38
+ export const PREFILTER_SAMPLE_COUNTS = {
39
+ low: 16,
40
+ medium: 32,
41
+ high: 128,
42
+ } as const satisfies Readonly<Record<string, number>>;
43
+
44
+ /** The tier names, so a quality option can take one without restating them. */
45
+ export type PrefilterQuality = keyof typeof PREFILTER_SAMPLE_COUNTS;
46
+
47
+ /**
48
+ * The octahedral edge a probe of a given cube face size gets.
49
+ *
50
+ * **Twice the face, which is the ratio `OCTAHEDRAL_EDGE` already chose** for the point-shadow
51
+ * array and for the reason written down there: matching a cube face's angular density needs
52
+ * `face * sqrt(6)`, so twice the face is about **1.22x coarser in the worst direction**, taken
53
+ * because the filtering this unlocks is blurring the result anyway. 1024 for a 512 face there,
54
+ * 256 for the default 128 face here — one rule, so the two octahedral resources in this engine
55
+ * are calibrated against each other rather than each to taste.
56
+ */
57
+ export function octahedralEdgeFor(faceSize: number): number {
58
+ return Math.max(32, Math.trunc(faceSize) * 2);
59
+ }
60
+
61
+ /**
62
+ * The irradiance image's edge, and why the diffuse term is a level of the same chain.
63
+ *
64
+ * **Eight, which is what a probe's diffuse light actually needs.** A cosine convolution removes
65
+ * everything above the second band, so the image it produces has no detail an eighth of a sphere
66
+ * across to lose — the size irradiance probes are conventionally stored at, arrived at from the
67
+ * same place. It replaces nine spherical-harmonic coefficients, and 64 octahedral texels carry at
68
+ * least what nine coefficients did.
69
+ *
70
+ * **What this buys is the last texture unit.** A second array would be a second sampler, and
71
+ * WebGL2 guarantees sixteen units of which fifteen are spent. Folding the diffuse term into a
72
+ * level of the radiance chain is what `REFRACT_SCENE_TEXTURE_UNIT`'s comment asks the next
73
+ * sampler to do, and it leaves unit 15 free.
74
+ */
75
+ export const IRRADIANCE_EDGE = 8;
76
+
77
+ /**
78
+ * Which level of a chain holds the cosine convolution.
79
+ *
80
+ * The level whose image is `IRRADIANCE_EDGE` across. For the default 256 edge that is level 5, and
81
+ * **the chain stops there rather than carrying unread levels above it** — `texStorage3D` takes a
82
+ * level count, so the three that would hold sixteen, four and one texel are never created. Six
83
+ * levels, 87,360 texels, 683 KB a layer at half float.
84
+ */
85
+ export function irradianceLevelFor(edge: number): number {
86
+ return Math.max(1, Math.round(Math.log2(Math.max(IRRADIANCE_EDGE * 2, edge) / IRRADIANCE_EDGE)));
87
+ }
88
+
89
+ /**
90
+ * The coarsest level the GGX chain reaches, which is one below the irradiance level.
91
+ *
92
+ * This is `uEnvironmentMaxLod`, and it is what `roughnessForLevel` maps roughness 1 onto. For the
93
+ * default edge it is 4, so the roughest level is 16 texels across.
94
+ *
95
+ * **That is better at high roughness than the cube it replaces, not worse.** A 128 cube's chain
96
+ * ends at one texel a face, which the lit pass's own comment complains about — "one texel a face
97
+ * and therefore one colour for every direction". What is given up is roughness granularity, five
98
+ * stops against eight, and the level blend interpolates between them exactly as the cube's mip
99
+ * filter did.
100
+ */
101
+ export function ggxMaxLevelFor(edge: number): number {
102
+ return Math.max(1, irradianceLevelFor(edge) - 1);
103
+ }
104
+
105
+ /**
106
+ * The roughness mip level `level` is convolved for.
107
+ *
108
+ * **Linear in the level index, and it has to be**, because the lit pass already picks its level
109
+ * with `surfaceRoughness * uEnvironmentMaxLod`. This is that relation read backwards. A different
110
+ * curve here would not be an improvement in isolation — it would be the two halves disagreeing
111
+ * about what level three means, which reads as roughness being subtly miscalibrated everywhere and
112
+ * points at nothing.
113
+ *
114
+ * **What would make it wrong** is the lit pass changing how it selects a level; the two move
115
+ * together or neither moves.
116
+ */
117
+ export function roughnessForLevel(level: number, maxLevel: number): number {
118
+ /*
119
+ * A single-level chain has nowhere to go, and dividing by its zero top level is NaN — a
120
+ * roughness the convolution would carry into every sample, producing a picture nobody could
121
+ * attribute to a divide. A mirror is what one level honestly is.
122
+ */
123
+ if (maxLevel <= 0) return 0;
124
+ return Math.min(1, Math.max(0, level / maxLevel));
125
+ }
126
+
127
+ /**
128
+ * Which level of the source cube one importance sample may read.
129
+ *
130
+ * **Filtered importance sampling, and the whole point of it is variance rather than speed.** A
131
+ * sample drawn from the GGX distribution covers a solid angle of `1 / (count * pdf)`; one texel of
132
+ * a cube with `faceTexels`-wide faces covers `4*pi / (6 * faceTexels^2)`. When a sample is much
133
+ * wider than a texel, reading the base level lets a few very bright texels land in some samples and
134
+ * not others, and that variance survives the average as fireflies. Reading a level where the sample
135
+ * covers roughly one texel is what removes them without raising the count.
136
+ *
137
+ * The half in front of the logarithm is not a fudge: a level step doubles a texel's width and so
138
+ * quadruples its solid angle, and the level is a length ratio rather than an area one.
139
+ *
140
+ * **What it costs** is that the source has to be a box-filtered chain, which is why the capture
141
+ * keeps its `generateMipmap` and the convolution writes a second cube. **What would make it wrong**
142
+ * is convolving from a source that is itself already convolved: the lobe would be applied twice and
143
+ * the error compounds up the chain, which is precisely the reason the two cubes are separate
144
+ * objects rather than one written in place.
145
+ */
146
+ export function sourceLevelForSample(
147
+ pdf: number,
148
+ faceTexels: number,
149
+ count: number,
150
+ maxLevel: number,
151
+ ): number {
152
+ /* Guard the logarithm's arguments rather than its result; a zero here is a caller's bug. */
153
+ const texels = Math.max(1, faceTexels);
154
+ const samples = Math.max(1, count);
155
+ const density = Math.max(1e-12, pdf);
156
+
157
+ const texelSolidAngle = (4 * Math.PI) / (6 * texels * texels);
158
+ const sampleSolidAngle = 1 / (samples * density);
159
+ const level = 0.5 * Math.log2(sampleSolidAngle / texelSolidAngle);
160
+
161
+ return Math.min(maxLevel, Math.max(0, level));
162
+ }
@@ -0,0 +1,115 @@
1
+ /** WebGL2's half of the environment prefilter: the program, and the draw for one level of a layer. */
2
+
3
+ import { compileProgram, uniformLocations } from './shader.ts';
4
+ import { PREFILTER_FRAG } from './shaders/prefilter.ts';
5
+ import { FULLSCREEN_VERT } from './shaders/fullscreen.ts';
6
+ import type { EnvProbeArray } from './envProbeArray.ts';
7
+ import type { ReflectionProbe } from './reflectionProbe.ts';
8
+
9
+ /**
10
+ * Convolves a captured probe's box chain into one layer of the grid's array, once per bake.
11
+ *
12
+ * **Its own module rather than more of the renderer**, following `ambientOcclusionPass.ts` and
13
+ * `bloomPass.ts`: a program, its uniforms, a vertex array and one draw. The renderer owns when
14
+ * this happens; this owns what it is.
15
+ *
16
+ * **What it costs** is one program compile at construction and **one draw per level per bake**,
17
+ * where the cube it replaced needed six — an octahedral map has no faces, so the six-way loop is
18
+ * gone rather than moved. A bake is once per scene per probe, which is the whole reason a
19
+ * convolution is affordable where a per-frame version of it would not be. **What would make it
20
+ * wrong** is a caller baking every frame; at that point this is the frame's cost and the box chain
21
+ * it replaced was the right trade.
22
+ *
23
+ * **A grid multiplies a bake by its probe count**, which is the real budget question rather than
24
+ * the texture units. The caller drives one probe at a time for exactly that reason.
25
+ */
26
+ export class EnvironmentPrefilterPass {
27
+ private readonly program: WebGLProgram;
28
+ private readonly uniforms: Record<string, WebGLUniformLocation>;
29
+ private readonly vao: WebGLVertexArrayObject;
30
+
31
+ constructor(gl: WebGL2RenderingContext) {
32
+ this.program = compileProgram(gl, FULLSCREEN_VERT, PREFILTER_FRAG, 'envPrefilter');
33
+ this.uniforms = uniformLocations(gl, this.program, 'envPrefilter');
34
+
35
+ const vao = gl.createVertexArray();
36
+ if (vao === null) throw new Error('EnvironmentPrefilterPass: createVertexArray failed');
37
+ this.vao = vao;
38
+ }
39
+
40
+ /**
41
+ * Fill every level of the probe's prefiltered cube from its captured one.
42
+ *
43
+ * The source is bound on the unit the environment normally occupies, which is deliberate rather
44
+ * than convenient: that unit is rebound by the lit pass every frame, so borrowing it here cannot
45
+ * outlive the bake, and it keeps the pass out of the unit accounting `textureUnitBudget.test.ts`
46
+ * holds.
47
+ */
48
+ run(
49
+ gl: WebGL2RenderingContext,
50
+ source: ReflectionProbe,
51
+ array: EnvProbeArray,
52
+ layer: number,
53
+ sourceUnit: number,
54
+ samples: number,
55
+ /**
56
+ * Whether the reflection chain is the GGX convolution rather than a box filter.
57
+ *
58
+ * `RenderQuality.environmentPrefilter`, and it is consulted here rather than at bind time
59
+ * because there is one chain now instead of two textures. A profile that has not asked for the
60
+ * lobe chain bakes the box one into the same layers and gets the picture it already had.
61
+ */
62
+ prefiltered: boolean,
63
+ ): void {
64
+ const previousProgram = gl.getParameter(gl.CURRENT_PROGRAM) as WebGLProgram | null;
65
+
66
+ gl.useProgram(this.program);
67
+ gl.bindVertexArray(this.vao);
68
+ /*
69
+ * A convolution writes over a target it has no depth relationship with, so both the test and
70
+ * the write are off — and culling with it, because the fullscreen triangle's winding is
71
+ * whatever the vertex shader's corner arithmetic produced rather than something anybody chose.
72
+ */
73
+ gl.disable(gl.DEPTH_TEST);
74
+ gl.depthMask(false);
75
+ gl.disable(gl.CULL_FACE);
76
+ gl.disable(gl.BLEND);
77
+
78
+ gl.activeTexture(gl.TEXTURE0 + sourceUnit);
79
+ gl.bindTexture(gl.TEXTURE_CUBE_MAP, source.texture);
80
+ gl.uniform1i(this.uniforms['uPrefilterSource'] ?? null, sourceUnit);
81
+ gl.uniform1f(this.uniforms['uPrefilterSamples'] ?? null, samples);
82
+ gl.uniform1f(this.uniforms['uPrefilterSourceTexels'] ?? null, source.size);
83
+ gl.uniform1f(this.uniforms['uPrefilterSourceMaxLod'] ?? null, source.maxLod);
84
+
85
+ array.convolve(gl, layer, (level, roughness, kind) => {
86
+ /*
87
+ * **The level's own edge, not the array's.** A gutter is one texel at every level, so its
88
+ * share of the map doubles as the chain coarsens; insetting a coarse level by the base
89
+ * edge's fraction reads as the reflection sliding as roughness rises.
90
+ */
91
+ gl.uniform1f(this.uniforms['uPrefilterEdge'] ?? null, Math.max(1, array.edge >> level));
92
+ gl.uniform1f(this.uniforms['uPrefilterIrradiance'] ?? null, kind === 'irradiance' ? 1 : 0);
93
+ gl.uniform1f(this.uniforms['uPrefilterBox'] ?? null, prefiltered ? 0 : 1);
94
+ gl.uniform1f(this.uniforms['uPrefilterLevel'] ?? null, level);
95
+ gl.uniform1f(this.uniforms['uPrefilterRoughness'] ?? null, roughness);
96
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
97
+ });
98
+
99
+ gl.bindVertexArray(null);
100
+ gl.depthMask(true);
101
+ gl.enable(gl.DEPTH_TEST);
102
+ gl.enable(gl.CULL_FACE);
103
+ /*
104
+ * Put the caller's program back rather than leaving ours current. The bake around this reads
105
+ * and restores flat-shader uniforms on either side of itself, and it would be doing that to
106
+ * whichever program happened to be bound.
107
+ */
108
+ if (previousProgram !== null) gl.useProgram(previousProgram);
109
+ }
110
+
111
+ dispose(gl: WebGL2RenderingContext): void {
112
+ gl.deleteProgram(this.program);
113
+ gl.deleteVertexArray(this.vao);
114
+ }
115
+ }