@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,470 @@
1
+ import { mat3, mat4, vec3 } from 'gl-matrix';
2
+
3
+ /**
4
+ * What a point light's shadow cubemap *is*, with no device in it.
5
+ *
6
+ * **Everything here is a decision, and the six that matter are already paid for.** A cubemap
7
+ * that is stale by a millimetre re-bakes six passes over the world; one that is not stale
8
+ * enough strobes; one that publishes its parameters before its last face pairs new numbers with
9
+ * old pixels; one that keeps `baked` across a pool handover reports another lamp's picture as
10
+ * its own. Each of those was a shipped bug on the WebGL2 path and each is fixed *here*, so a
11
+ * second backend inherits the fixes instead of re-earning them. That is the 2026-08-13 rule
12
+ * applied to the largest piece of state in the renderer.
13
+ *
14
+ * The device half — the cube texture and the six passes that fill it — is per backend and is
15
+ * all that is left outside this file.
16
+ */
17
+
18
+ /** A cubemap is six faces, and a bake may be spread across frames a few at a time. */
19
+ export const FACE_COUNT = 6;
20
+
21
+ /** Which way each face looks, and which way is up for it. The order is the cubemap's own. */
22
+ const FACE_TARGETS: readonly (readonly [vec3, vec3])[] = [
23
+ [
24
+ [1, 0, 0],
25
+ [0, -1, 0],
26
+ ],
27
+ [
28
+ [-1, 0, 0],
29
+ [0, -1, 0],
30
+ ],
31
+ [
32
+ [0, 1, 0],
33
+ [0, 0, 1],
34
+ ],
35
+ [
36
+ [0, -1, 0],
37
+ [0, 0, -1],
38
+ ],
39
+ [
40
+ [0, 0, 1],
41
+ [0, -1, 0],
42
+ ],
43
+ [
44
+ [0, 0, -1],
45
+ [0, -1, 0],
46
+ ],
47
+ ];
48
+
49
+ /**
50
+ * Default distance from the source at which shadow casting begins.
51
+ *
52
+ * Raising it per light is how a fixture avoids shadowing its own lamp: a brazier sits directly
53
+ * under its flame, so with a near plane of a few centimetres it occludes an enormous solid
54
+ * angle and throws a big square across the ground. Anything nearer the source than this is
55
+ * simply not rendered into the map, which is what real fixtures do — the light comes from
56
+ * *inside* them.
57
+ */
58
+ export const POINT_SHADOW_NEAR = 0.25;
59
+
60
+ /**
61
+ * How long a freshly baked image takes to reach full strength, in seconds.
62
+ *
63
+ * Long enough to read as a shadow settling rather than a shadow appearing, short enough that
64
+ * nobody standing still waits for it. A quarter second is about thirty frames at 120 Hz, which
65
+ * is also comfortably longer than the six-face bake it follows, so the ramp starts from a
66
+ * picture that is already complete.
67
+ */
68
+ const ARRIVAL_SECONDS = 0.25;
69
+
70
+ /**
71
+ * The emitter radius assumed for a light that names none.
72
+ *
73
+ * One constant because it is read in three places — the field, the bake and `matchesSource` —
74
+ * and the whole of the bug it replaces was two of those disagreeing. The bake filled in 0.05
75
+ * and `matchesSource` compared against `undefined`, so a map baked by a caller that said
76
+ * nothing was stale on every frame it was ever checked.
77
+ */
78
+ export const DEFAULT_SOURCE_RADIUS = 0.05;
79
+
80
+ const scratchView = mat4.create();
81
+ const scratchLook = mat4.create();
82
+ const scratchProj = mat4.create();
83
+ const scratchEye = vec3.create();
84
+ const scratchCenter = vec3.create();
85
+
86
+ /**
87
+ * One face's view-projection, into a matrix the caller owns.
88
+ *
89
+ * A ninety-degree square frustum per face is what makes six of them a cube, so the projection
90
+ * takes no aspect and no field of view: both are fixed by the shape. Module-scope scratch,
91
+ * because this runs once per face of every bake and `AGENTS.md` allows no allocation there.
92
+ */
93
+ export function pointShadowFaceViewProj(
94
+ face: number,
95
+ x: number,
96
+ y: number,
97
+ z: number,
98
+ near: number,
99
+ range: number,
100
+ out: mat4,
101
+ ): mat4 {
102
+ const target = FACE_TARGETS[face];
103
+ if (target === undefined) return out;
104
+ const dir = target[0];
105
+ vec3.set(scratchEye, x, y, z);
106
+ vec3.set(scratchCenter, x + dir[0], y + dir[1], z + dir[2]);
107
+ mat4.perspective(scratchProj, Math.PI / 2, 1, near, range);
108
+ mat4.lookAt(scratchView, scratchEye, scratchCenter, target[1]);
109
+ return mat4.multiply(out, scratchProj, scratchView);
110
+ }
111
+
112
+ /**
113
+ * A face's world-to-face rotation, from the same targets its frustum is built from.
114
+ *
115
+ * **The resolve needs one and the bake needs the other, and two tables would eventually
116
+ * disagree.** A face's octahedral region is written by projecting each texel's direction into that
117
+ * face's own frame and reading the depth the bake stored there; if the two differ by an up vector,
118
+ * every texel of that face is read from the wrong place. That reads as a lighting bug and is a
119
+ * transcription error, so both come off `FACE_TARGETS` and a test puts one point through each and
120
+ * requires the same image coordinates.
121
+ *
122
+ * `lookAt` builds a right-handed view looking down `-z`, so a direction inside this face comes
123
+ * back with a **negative** `z`. The resolve divides by `-v.z` for that reason and not by
124
+ * preference.
125
+ *
126
+ * Module-scope scratch, because this runs once per resolved face inside the bake budget and
127
+ * `AGENTS.md` allows no allocation there.
128
+ */
129
+ export function pointShadowFaceRotation(face: number, out: mat3): mat3 {
130
+ const target = FACE_TARGETS[face];
131
+ if (target === undefined) return out;
132
+ const dir = target[0];
133
+ vec3.set(scratchEye, 0, 0, 0);
134
+ vec3.set(scratchCenter, dir[0], dir[1], dir[2]);
135
+ mat4.lookAt(scratchLook, scratchEye, scratchCenter, target[1]);
136
+ return mat3.fromMat4(out, scratchLook);
137
+ }
138
+
139
+ /**
140
+ * The window of faces a resumed bake should render this frame, and what to render them for.
141
+ * Empty when there is none.
142
+ *
143
+ * **The parameters travel with the window, and that is the point rather than a convenience.**
144
+ * A bake is spread over frames against `pointShadowBudget.ts`, and a caller that used its own
145
+ * live light position for the second half would build an image around two different places —
146
+ * which is the failure `planBake` says it exists to prevent and, before these fields, did not.
147
+ * See `planBake`.
148
+ */
149
+ export interface FaceRange {
150
+ first: number;
151
+ last: number;
152
+ /** Where the light was when this bake started. */
153
+ x: number;
154
+ y: number;
155
+ z: number;
156
+ /** The far plane, the near plane and the emitter radius the same bake started with. */
157
+ range: number;
158
+ near: number;
159
+ sourceRadius: number;
160
+ }
161
+
162
+ /** A `FaceRange` a map can own for the life of the session, since a bake allocates nothing. */
163
+ export function createFaceRange(): FaceRange {
164
+ return {
165
+ first: 0,
166
+ last: 0,
167
+ x: 0,
168
+ y: 0,
169
+ z: 0,
170
+ range: 1,
171
+ near: POINT_SHADOW_NEAR,
172
+ sourceRadius: DEFAULT_SOURCE_RADIUS,
173
+ };
174
+ }
175
+
176
+ /**
177
+ * The state of one cubemap: what it was baked for, how present it is, and how far through.
178
+ *
179
+ * Held by a backend's map rather than inherited from, so the device resource stays a device
180
+ * resource and this stays testable without one.
181
+ */
182
+ export class PointShadowImage {
183
+ /** Far plane, needed by the shader to linearise the comparison. */
184
+ far = 1;
185
+ /** Near plane; the shader needs the same value to linearise. */
186
+ near = POINT_SHADOW_NEAR;
187
+ /** Emitter radius of the light this map was baked for. */
188
+ sourceRadius = DEFAULT_SOURCE_RADIUS;
189
+
190
+ private baked = false;
191
+ private arrival = 0;
192
+ private x = 0;
193
+ private y = 0;
194
+ private z = 0;
195
+ /** Next face a resumed bake will render; 0 when none is in flight. */
196
+ private pendingFace = 0;
197
+ /** What the in-flight bake was started for, so a changed light restarts it. */
198
+ private pendingX = 0;
199
+ private pendingY = 0;
200
+ private pendingZ = 0;
201
+ private pendingRange = 0;
202
+ private pendingNear = 0;
203
+ private pendingSourceRadius = 0;
204
+
205
+ /** Whether this map holds an image worth sampling. False until a bake completes. */
206
+ get hasBaked(): boolean {
207
+ return this.baked;
208
+ }
209
+
210
+ /** How present the image is, 0 to 1. The shader mixes the occlusion in by it. */
211
+ get presence(): number {
212
+ return this.arrival;
213
+ }
214
+
215
+ /**
216
+ * Whether this map still represents the source projection well enough to sample.
217
+ *
218
+ * `tolerance` is how far the source may drift from where it was baked before the map is
219
+ * stale. It exists because an exact comparison made a *flame* the most expensive object in
220
+ * the scene: a brazier wanders a few centimetres every frame to look alive, every frame that
221
+ * moved the light, and every move re-baked six cubemap faces of the entire static world. Up
222
+ * to eight sampled lights doing that is where a frame's 174 surplus draw calls came from,
223
+ * against an `AGENTS.md` budget of a hundred in total.
224
+ *
225
+ * A drift tolerance is the honest fix rather than a cheat. The shadow of static geometry
226
+ * metres away barely moves when the emitter shifts by centimetres, and a fire's shadow that
227
+ * re-solves every frame reads as strobing rather than as flicker. Callers that genuinely move
228
+ * a light pass 0 and get the old behaviour, because drift is measured against the *baked*
229
+ * origin and so accumulates rather than being forgiven each frame.
230
+ *
231
+ * `sourceRadius` defaults to exactly what a bake defaults it to, and the two defaults being
232
+ * one constant is the point rather than a convenience: they disagreed once, `0.05 !== undefined`
233
+ * was true every frame, every map was stale forever, and with a couple of faces of budget the
234
+ * only thing on screen was whichever face had most recently finished — a hard square of shadow
235
+ * that moved as you did. Any default would do as long as it is the same one. Two is the bug.
236
+ */
237
+ matchesSource(
238
+ x: number,
239
+ y: number,
240
+ z: number,
241
+ range: number,
242
+ near: number,
243
+ sourceRadius = DEFAULT_SOURCE_RADIUS,
244
+ tolerance = 0,
245
+ ): boolean {
246
+ if (
247
+ !this.baked ||
248
+ this.far !== range ||
249
+ this.near !== near ||
250
+ this.sourceRadius !== sourceRadius
251
+ ) {
252
+ return false;
253
+ }
254
+ const dx = this.x - x;
255
+ const dy = this.y - y;
256
+ const dz = this.z - z;
257
+ return dx * dx + dy * dy + dz * dz <= tolerance * tolerance;
258
+ }
259
+
260
+ /**
261
+ * Ramp the image in over `ARRIVAL_SECONDS`.
262
+ *
263
+ * The drastic case, and the one the light's own fade cannot reach. A light leaving takes its
264
+ * shadow with it, because by the time membership changes the light is already at nothing —
265
+ * but a light *keeping* its place can still lose its picture, when a pool slot changes hands
266
+ * and `forget` throws the image away. The re-bake then lands whole between two frames, under
267
+ * a lamp that has not moved, and a shadow switching on is exactly as wrong as one switching
268
+ * off.
269
+ *
270
+ * Only a first image after a `forget` ramps. A map that merely drifted past the rebake
271
+ * tolerance keeps `baked` true throughout and stays fully present, which is right: it is
272
+ * correcting a picture, not arriving with one.
273
+ */
274
+ advance(dt: number): void {
275
+ if (!this.baked) {
276
+ this.arrival = 0;
277
+ return;
278
+ }
279
+ this.arrival = Math.min(1, this.arrival + dt / ARRIVAL_SECONDS);
280
+ }
281
+
282
+ /**
283
+ * Throw away the image, because this map is about to belong to another light.
284
+ *
285
+ * A pool slot keeps its cubemap when it changes hands. Without this, `baked` stayed true from
286
+ * the previous borrower, so the new light reported an image it had never rendered — the *old*
287
+ * lamp's, taken from somewhere else — and the shader sampled it for the three frames a
288
+ * re-bake takes at two faces each. That is the flicker: shadows and glare appearing and
289
+ * disappearing as the camera moves and the chosen eight reorder.
290
+ *
291
+ * The partial-bake cursor goes too: a resumed bake must not stitch new faces onto the
292
+ * previous light's old ones. Presence goes with the image — whatever arrives next is a new
293
+ * light's, and it arrives as one.
294
+ */
295
+ forget(): void {
296
+ this.baked = false;
297
+ this.pendingFace = 0;
298
+ this.arrival = 0;
299
+ }
300
+
301
+ /**
302
+ * Which faces to render now, and what to render them for.
303
+ *
304
+ * **A bake in flight owns its parameters until it finishes**, and the returned range carries
305
+ * them so the caller renders the remaining faces at the place the first ones were rendered
306
+ * for. Half a cubemap around one point and half around another is not a cubemap around
307
+ * anything, and this is what stops it being built.
308
+ *
309
+ * **It used to abandon a partial image whenever any argument moved, and that is the defect
310
+ * this replaces.** The comparison was exact — position, range, near plane and emitter radius,
311
+ * all of them — so a light that changes by any amount between two frames could never satisfy
312
+ * it. Two kinds are ordinary rather than exotic: a flame wanders a few centimetres every
313
+ * frame to look alive, and a light whose brightness is expressed as a radius rescales that
314
+ * radius every frame while it pulses. For either, `pendingFace` was reset to zero on every
315
+ * frame, so with a budget of two faces the bake rendered faces 0 and 1 for ever and **faces 2
316
+ * to 5 were never written again**.
317
+ *
318
+ * That is not a bake that is merely slow. `resolveFace` writes each face into the light's
319
+ * octahedral layer as it is rendered, and `hasBaked` stays true from the last bake that did
320
+ * complete — so the shader keeps sampling a layer holding two faces from where the light is
321
+ * now and four from wherever it used to be, permanently, at full presence. A cube face is a
322
+ * 90 degree frustum, so what that draws is a hard-edged quadrilateral of shadow standing on
323
+ * the ground under the lamp with nothing above it to cast one. Reported as exactly that.
324
+ *
325
+ * A light that moves during a bake is not lost: the image completes at the origin it started
326
+ * from, `matchesSource` finds it stale on the next frame, and a fresh bake starts. What it
327
+ * costs is a shadow up to `FACE_COUNT / facesPerFrame` frames behind a moving lamp, which is
328
+ * the trade `pointShadowRebakeDistance` already makes in a coarser form.
329
+ */
330
+ planBake(
331
+ x: number,
332
+ y: number,
333
+ z: number,
334
+ range: number,
335
+ near: number,
336
+ sourceRadius: number,
337
+ maxFaces: number,
338
+ out: FaceRange,
339
+ ): FaceRange {
340
+ if (this.pendingFace <= 0) {
341
+ this.pendingX = x;
342
+ this.pendingY = y;
343
+ this.pendingZ = z;
344
+ this.pendingRange = range;
345
+ this.pendingNear = near;
346
+ this.pendingSourceRadius = sourceRadius;
347
+ }
348
+ out.first = this.pendingFace;
349
+ out.last = Math.min(FACE_COUNT, out.first + Math.max(0, Math.trunc(maxFaces)));
350
+ out.x = this.pendingX;
351
+ out.y = this.pendingY;
352
+ out.z = this.pendingZ;
353
+ out.range = this.pendingRange;
354
+ out.near = this.pendingNear;
355
+ out.sourceRadius = this.pendingSourceRadius;
356
+ return out;
357
+ }
358
+
359
+ /**
360
+ * Record that faces up to `last` have been rendered.
361
+ *
362
+ * **`far`, `near` and `sourceRadius` move only when the last face lands**, and that is the
363
+ * one subtle part. They describe the image the shader is sampling, so publishing them early
364
+ * would pair new parameters with faces that are still mostly old. A first bake is not sampled
365
+ * at all until it completes, so this only matters for a re-bake, where holding the old values
366
+ * keeps them matched to the old faces.
367
+ */
368
+ completeBake(
369
+ last: number,
370
+ x: number,
371
+ y: number,
372
+ z: number,
373
+ range: number,
374
+ near: number,
375
+ sourceRadius: number,
376
+ ): void {
377
+ this.pendingFace = last;
378
+ if (last < FACE_COUNT) return;
379
+ this.pendingFace = 0;
380
+ this.x = x;
381
+ this.y = y;
382
+ this.z = z;
383
+ this.far = range;
384
+ this.near = near;
385
+ this.sourceRadius = sourceRadius;
386
+ this.baked = true;
387
+ }
388
+ }
389
+
390
+ /**
391
+ * What a pool needs of a cubemap, whichever device holds it.
392
+ *
393
+ * Nine members, seven of which are `PointShadowImage`'s already — so a backend's map is this
394
+ * interface plus a texture and a way to fill it. Declared here rather than in either backend
395
+ * because `PointShadowSystem` and `LivePointShadowSet` are written against it, and a pool that
396
+ * knew which device it was pooling would be two pools.
397
+ */
398
+ export interface PointShadowSource {
399
+ /** Which layer of the shared array holds this map's image. */
400
+ readonly layer: number;
401
+ readonly far: number;
402
+ readonly near: number;
403
+ readonly sourceRadius: number;
404
+ /** Whether this map holds an image worth sampling. */
405
+ readonly hasBaked: boolean;
406
+ /** How present the image is, 0 to 1. */
407
+ readonly presence: number;
408
+ advance(dt: number): void;
409
+ forget(): void;
410
+ }
411
+
412
+ /**
413
+ * Everything the shader needs about the point-shadow set, chosen once and bound twice.
414
+ *
415
+ * **The arrays are the decision and the textures are the binding**, which is the split the
416
+ * 2026-08-13 rule asks for. Which light owns which slot, whether its image has landed, and how
417
+ * present it is are answers a pool computes; turning them into `uniform1fv` or into bytes of a
418
+ * uniform block is all that differs between the backends.
419
+ *
420
+ * A caller owns one of these and hands it in, because this is filled every frame.
421
+ */
422
+ export interface ResolvedPointShadows {
423
+ /**
424
+ * Per shaded light: which array layer holds its static shadow, or −1 for none.
425
+ *
426
+ * **Indexed by the shading pass's light, and it used to be the other way round.** When each
427
+ * map was its own `samplerCube` the shader could not index one, so it ran ten `else if` arms
428
+ * comparing a light against a slot's owner; every array here was addressed by the slot and the
429
+ * light was the value. One array texture makes the map a number, so the light can be the index
430
+ * and the whole chain becomes a lookup. Every array below moved with it.
431
+ */
432
+ readonly layers: Int32Array;
433
+ readonly far: Float32Array;
434
+ readonly near: Float32Array;
435
+ readonly sourceRadius: Float32Array;
436
+ /** How present each bound map is, so a re-baked one arrives rather than appears. */
437
+ readonly presence: Float32Array;
438
+ /** The live pair, by the same light index: a light owns at most one of the two. */
439
+ readonly liveLayers: Int32Array;
440
+ readonly liveFar: Float32Array;
441
+ readonly liveNear: Float32Array;
442
+ readonly liveSourceRadius: Float32Array;
443
+ readonly liveWeights: Float32Array;
444
+ }
445
+
446
+ export function createResolvedPointShadows(lights: number): ResolvedPointShadows {
447
+ /*
448
+ * **−1 from the moment it exists, because zero is a layer.**
449
+ *
450
+ * `flat.ts` reads `uPointShadowLayer[i]` and samples when it is not negative, so a zero-filled
451
+ * array does not mean "no point shadows" — it means every light in every scene samples layer
452
+ * zero, which belongs to a live transition map. `resolve` fills these every frame, but a pass
453
+ * bound before the pool has ever been updated would otherwise upload the zeroes, and a scene
454
+ * is free to draw before it updates its shadows. Caught by a unit test that failed with
455
+ * `expected +0 to be -1`; the same trap survives the move from slots to layers, with a worse
456
+ * failure than before, because layer zero always exists where slot zero often did not.
457
+ */
458
+ return {
459
+ layers: new Int32Array(lights).fill(-1),
460
+ far: new Float32Array(lights),
461
+ near: new Float32Array(lights),
462
+ sourceRadius: new Float32Array(lights),
463
+ presence: new Float32Array(lights),
464
+ liveLayers: new Int32Array(lights).fill(-1),
465
+ liveFar: new Float32Array(lights),
466
+ liveNear: new Float32Array(lights),
467
+ liveSourceRadius: new Float32Array(lights),
468
+ liveWeights: new Float32Array(lights),
469
+ };
470
+ }
@@ -0,0 +1,228 @@
1
+ import { mat4 } from 'gl-matrix';
2
+ import type { PointShadowTarget } from './pointShadowArray.ts';
3
+ import { DEFAULT_RENDER_QUALITY } from './renderQuality.ts';
4
+ import {
5
+ createFaceRange,
6
+ DEFAULT_SOURCE_RADIUS,
7
+ FACE_COUNT,
8
+ POINT_SHADOW_NEAR,
9
+ PointShadowImage,
10
+ pointShadowFaceViewProj,
11
+ type FaceRange,
12
+ } from './pointShadowImage.ts';
13
+
14
+ /**
15
+ * Omnidirectional shadows for a point light: one octahedral layer, rendered a face at a time.
16
+ *
17
+ * Six depth passes per light is normally what makes point-light shadows unaffordable. Static
18
+ * scenes can bake once; a caller may also rebuild a map for a moving source or nearby moving
19
+ * casters.
20
+ *
21
+ * Game-agnostic: it takes a position, a range, and a callback that draws whatever should cast.
22
+ *
23
+ * **All of the state is `PointShadowImage`'s and all of the arithmetic is too**, and now every
24
+ * GPU object is `PointShadowArray`'s — so what is left here is a layer index and a loop. That
25
+ * split is what lets a second backend inherit six paid-for decisions rather than re-derive them;
26
+ * see that file.
27
+ *
28
+ * **The six faces are still rasterised under six 90 degree frusta**, unchanged, because that is
29
+ * the only projection a triangle survives. What changed is where they land: each one goes to the
30
+ * array's shared scratch and is resolved from there into this map's layer, in the octahedral
31
+ * projection the shader reads. Nothing about the bake's cost, order or resumption moved.
32
+ */
33
+
34
+ /* Re-exported so callers that reach for these through this module keep working. */
35
+ export { FACE_COUNT, POINT_SHADOW_NEAR };
36
+
37
+ const scratchViewProj = mat4.create();
38
+
39
+ export class PointShadowMap {
40
+ readonly size: number;
41
+ /**
42
+ * Which layer of the shared array this map's image lives in.
43
+ *
44
+ * Fixed for the life of the map. The pool hands slots out and takes them back, and a slot's
45
+ * layer never moves — `forget` throws the *image* away, not the storage — so the shader can be
46
+ * told a layer index and nothing has to re-upload a texture binding when a light changes hands.
47
+ */
48
+ readonly layer: number;
49
+
50
+ /** Everything this map knows about itself that is not a GPU object. */
51
+ private readonly image = new PointShadowImage();
52
+ private readonly range: FaceRange = createFaceRange();
53
+
54
+ /**
55
+ * The array this map writes into, read late rather than held.
56
+ *
57
+ * The pool builds its live maps when the renderer is constructed, and the array cannot exist
58
+ * until a world says how many lights it has — and it is rebuilt if a later world says more. A
59
+ * getter rather than a reference means a map outlives both events without knowing about either.
60
+ * Called once per resolved face, which is nowhere near a per-fragment path.
61
+ */
62
+ private readonly array: () => PointShadowTarget | null;
63
+
64
+ get far(): number {
65
+ return this.image.far;
66
+ }
67
+
68
+ get near(): number {
69
+ return this.image.near;
70
+ }
71
+
72
+ get sourceRadius(): number {
73
+ return this.image.sourceRadius;
74
+ }
75
+
76
+ /** Whether this map holds an image worth sampling. False until a bake completes. */
77
+ get hasBaked(): boolean {
78
+ return this.image.hasBaked;
79
+ }
80
+
81
+ /** How present the image is, 0 to 1. The shader mixes the occlusion in by it. */
82
+ get presence(): number {
83
+ return this.image.presence;
84
+ }
85
+
86
+ /** Whether this map still represents the source well enough to sample. See the image. */
87
+ matchesSource(
88
+ x: number,
89
+ y: number,
90
+ z: number,
91
+ range: number,
92
+ near: number,
93
+ sourceRadius = DEFAULT_SOURCE_RADIUS,
94
+ tolerance = 0,
95
+ ): boolean {
96
+ return this.image.matchesSource(x, y, z, range, near, sourceRadius, tolerance);
97
+ }
98
+
99
+ /** Ramp the image in. See the image. */
100
+ advance(dt: number): void {
101
+ this.image.advance(dt);
102
+ }
103
+
104
+ /** Throw the image away, because this map is about to belong to another light. */
105
+ forget(): void {
106
+ this.image.forget();
107
+ }
108
+
109
+ constructor(
110
+ array: () => PointShadowTarget | null,
111
+ layer: number,
112
+ size = DEFAULT_RENDER_QUALITY.pointShadowFaceSize,
113
+ ) {
114
+ this.array = array;
115
+ this.layer = layer;
116
+ this.size = size;
117
+ }
118
+
119
+ /**
120
+ * Render up to `maxFaces` of the six, resuming a bake already under way.
121
+ * Returns how many faces were rendered.
122
+ *
123
+ * `drawCasters` receives each face's view-projection and issues its draw calls, so a
124
+ * face is a full pass over the caster set and six of them is the whole cost. Doing
125
+ * all six unconditionally is what made this the most expensive thing in the frame the
126
+ * moment several lights went stale together: eight lights is 48 passes, measured at
127
+ * 89 ms and 99 ms in two consecutive frames against an 8.3 ms budget. The caller
128
+ * spends a per-frame face budget across the lights that need one; see
129
+ * `pointShadowBudget.ts`.
130
+ *
131
+ * A resumed bake keeps the origin it started with, **whatever this call is passed**:
132
+ * half a cubemap around one point and half around another is not a cubemap around
133
+ * anything, and a light that moves every frame used to produce exactly that, for ever.
134
+ * See `planBake`. Different arguments are honoured by the *next* bake, which the
135
+ * staleness test starts as soon as this one lands.
136
+ *
137
+ * **`far`, `near` and `sourceRadius` move only when the last face lands**, and that is
138
+ * the one subtle part. They describe the image the shader is sampling, so publishing
139
+ * them early would pair new parameters with faces that are still mostly old. A first
140
+ * bake is not sampled at all until it completes, so this only matters for a re-bake,
141
+ * where holding the old values keeps them matched to the old faces.
142
+ */
143
+ bake(
144
+ gl: WebGL2RenderingContext,
145
+ x: number,
146
+ y: number,
147
+ z: number,
148
+ range: number,
149
+ drawCasters: (viewProj: mat4) => void,
150
+ near = POINT_SHADOW_NEAR,
151
+ sourceRadius = DEFAULT_SOURCE_RADIUS,
152
+ maxFaces = FACE_COUNT,
153
+ ): number {
154
+ /*
155
+ * What to render now, **and what to render it for**. A bake in flight owns the parameters
156
+ * it started with, so the arguments here are only a proposal for a bake that is not already
157
+ * under way; see `planBake` for the permanent artefact that reading them unconditionally
158
+ * left in a moving light's map.
159
+ */
160
+ const plan = this.image.planBake(x, y, z, range, near, sourceRadius, maxFaces, this.range);
161
+ const { first, last } = plan;
162
+ if (last <= first) return 0;
163
+
164
+ const array = this.array();
165
+ if (array === null) return 0;
166
+
167
+ /*
168
+ * Cull nothing.
169
+ *
170
+ * Rendering back faces only is the usual acne cure, but it stores the *far*
171
+ * side of every caster — and for a character's limbs the near and far sides
172
+ * are centimetres apart, so the caster effectively vanishes from the map.
173
+ * Acne is handled properly by the slope-scaled bias in the flat shader,
174
+ * which is where it belongs: it is a function of the receiving angle, not
175
+ * of which faces were rasterised.
176
+ */
177
+ gl.disable(gl.CULL_FACE);
178
+
179
+ /*
180
+ * Render, resolve, repeat — and the *repeat* is what makes one scratch serve every light.
181
+ *
182
+ * A face's octahedral region is disjoint from the other five, so the scratch is consumed the
183
+ * moment `resolveFace` reads it and is free again before the next face touches it. That holds
184
+ * across lights too, which matters: `pointShadowBudget.ts` spends one frame's face budget
185
+ * across several stale maps, so a scratch that had to survive a whole six-face bake would be
186
+ * clobbered by whichever light baked next.
187
+ *
188
+ * Completeness is checked once, in the array's constructor. See the note there: asking here
189
+ * is a pipeline flush in the middle of the frame loop.
190
+ */
191
+ for (let face = first; face < last; face++) {
192
+ array.beginFace(gl);
193
+ drawCasters(
194
+ pointShadowFaceViewProj(
195
+ face,
196
+ plan.x,
197
+ plan.y,
198
+ plan.z,
199
+ plan.near,
200
+ plan.range,
201
+ scratchViewProj,
202
+ ),
203
+ );
204
+ /*
205
+ * The casters left culling off and the resolve is a fullscreen triangle, so it does not
206
+ * care; `resolveFace` restores the depth function it borrows, which is the one thing the
207
+ * next face's pass does care about.
208
+ */
209
+ array.resolveFace(gl, this.layer, face, plan.range, plan.near);
210
+ }
211
+
212
+ gl.enable(gl.CULL_FACE);
213
+ gl.cullFace(gl.BACK);
214
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
215
+
216
+ this.image.completeBake(last, plan.x, plan.y, plan.z, plan.range, plan.near, plan.sourceRadius);
217
+ return last - first;
218
+ }
219
+
220
+ /**
221
+ * Nothing to free: every GPU object this map used to own belongs to `PointShadowArray` now.
222
+ *
223
+ * Kept because the pool's `releaseMap` calls it, and because a map that silently stopped
224
+ * needing disposal is exactly the shape of a leak nobody notices. The array is disposed by the
225
+ * renderer that built it.
226
+ */
227
+ dispose(_gl: WebGL2RenderingContext): void {}
228
+ }