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