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