@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,301 @@
1
+ /** Allocation-free selection and packing of point lights for a fixed shader budget. */
2
+ import { POINT_LIGHT_COS_INNER, POINT_LIGHT_COS_OUTER } from './clusteredLights.js';
3
+ import { MAX_POINT_LIGHTS, POINT_SHADOW_POOL } from './lightBudget.js';
4
+ export const DEFAULT_POINT_LIGHT_VIEW_RANGE = 180;
5
+ /**
6
+ * How far out a light fades to nothing, in metres before its cull distance.
7
+ *
8
+ * One of the two boundaries a light can cross. The range is deliberately vast, so that
9
+ * a light never surprises the player by switching on in front of them — and a vaster
10
+ * range only helps if arriving at it is a ramp.
11
+ */
12
+ const FADE_BAND_M = 40;
13
+ /**
14
+ * How near the first excluded light has to be before the last chosen ones dim.
15
+ *
16
+ * The other boundary, and the one that actually flickers. A world carries more lights
17
+ * than `MAX_POINT_LIGHTS`, so somebody is always last, and membership used to be a
18
+ * step: the light holding the final slot contributed everything and the one behind it
19
+ * nothing. Ordinary camera drift traded them, and both the light and its shadow
20
+ * switched — reported, plainly, as lights that behave like on/off switches.
21
+ *
22
+ * Measured in a lamp-lit courtyard: six lamps and a brazier sit inside 8.7 m
23
+ * against a budget of eight, and a gate's two lights are 12.52 m away *each*,
24
+ * equidistant by construction. They straddle the cut, so exactly one of them was ever
25
+ * rendered and which one flipped as the camera orbited: one post shadowed, the
26
+ * identical one beside it bare.
27
+ *
28
+ * Hysteresis was tried here first and cannot fix this. A slower swap is still a swap
29
+ * and the loser is still hard off, and worse, an incumbent's advantage puts the
30
+ * newcomer's arrival *inside* the band rather than at its edge, so the crossfade it
31
+ * was paired with reintroduced the pop it exists to remove. Fading against the
32
+ * boundary subsumes it: at the tie both contenders are at nothing, so the trade is
33
+ * free, and nothing is sticky because nothing visible is at stake.
34
+ *
35
+ * Three metres dims only what is genuinely contested. A row of lamps every twelve
36
+ * metres never notices; two lights the same distance away always do. It is also long
37
+ * enough at running pace to cover a six-face bake, so a light finishes its shadow map
38
+ * while it is still too dim to show one.
39
+ */
40
+ const CONTENTION_BAND_M = 3;
41
+ /** Sort keys for the shadow list, which is ordered independently of the shaded one. */
42
+ const shadowRank = new Float32Array(POINT_SHADOW_POOL);
43
+ /**
44
+ * A buffer for the selection to fill, sized to what the caller can actually bind.
45
+ *
46
+ * **`capacity` exists because clustered lighting can carry far more than the shader's uniform
47
+ * arrays.** The froxel table takes up to `MAX_CLUSTERED_LIGHTS`, and this helper used to hand it
48
+ * sixteen whatever a world offered — so the capability was real and unreachable through the one
49
+ * path every consumer uses. A consumer with `RenderQuality.clusteredLights` on asks for a wider
50
+ * buffer; everything else takes the default and is unchanged.
51
+ *
52
+ * **`scratchDistance` grows with it**, and that is not incidental: the shaded list is kept sorted
53
+ * in it, so a buffer wider than the array holding its distances writes past the end. It was sized
54
+ * from `POINT_SHADOW_POOL` because the pool happened to be the larger of the two.
55
+ */
56
+ export function createPointLightBuffer(capacity = MAX_POINT_LIGHTS) {
57
+ const shaded = Math.max(1, Math.floor(capacity));
58
+ return {
59
+ positions: new Float32Array(shaded * 3),
60
+ colors: new Float32Array(shaded * 3),
61
+ radii: new Float32Array(shaded),
62
+ sourceRadii: new Float32Array(shaded),
63
+ considered: 0,
64
+ count: 0,
65
+ sourceIndex: new Int32Array(shaded),
66
+ weights: new Float32Array(shaded),
67
+ directions: new Float32Array(shaded * 3),
68
+ coneCos: new Float32Array(shaded * 2),
69
+ /* −1 rather than 0, because row 0 is a real fixture and a light that asked for none must not
70
+ be shaped by whichever profile happened to load first. */
71
+ iesProfiles: new Float32Array(shaded).fill(-1),
72
+ scratchDistance: new Float32Array(Math.max(shaded, POINT_SHADOW_POOL)),
73
+ shadowIndex: new Int32Array(POINT_SHADOW_POOL),
74
+ shadowCount: 0,
75
+ };
76
+ }
77
+ /**
78
+ * Select nearest lights whose influence may still be visible and pack them in
79
+ * shader order. The caller owns `out`; no sort arrays or temporary objects are
80
+ * created in this per-frame path.
81
+ *
82
+ * **Two points, because the two lists answer two questions.** `x, y, z` is where the frame is
83
+ * being *shaded* from — the camera — and it orders and culls the shaded list. `castX, castY,
84
+ * castZ` is where whatever might *cast* is standing, and it orders and culls the shadow pool.
85
+ * `AGENTS.md` had already decided which point the pool belongs to: *"a character's shadow only
86
+ * has to exist near the light they are standing at"* — they, not the viewer.
87
+ *
88
+ * They were one argument until 2026-08-25, and a third-person camera is exactly where that
89
+ * hurts: it sits behind its subject, so a fire the subject is standing next to got **no map at
90
+ * all** whenever the camera was further from it than the fire's radius. The scene stayed
91
+ * perfectly lit, which is why nobody could tell it from a bake that never ran.
92
+ *
93
+ * What it gives up: three more numbers on an already-long parameter list, spelled as numbers
94
+ * rather than a vector to match the point above it. What would make it wrong: a consumer with
95
+ * several casters far apart, which one point cannot describe — the pool would then want a set of
96
+ * reference points and a rank over the nearest of them, which is a bigger change than this one
97
+ * and is not what any consumer here has.
98
+ *
99
+ * The default is the shading point, so an existing caller selects bit-identically: `castX = x`
100
+ * makes the distance the *same arithmetic on the same operands*, not merely a close number.
101
+ */
102
+ export function selectPointLights(sources, x, y, z, out, timeSeconds = 0, viewRange = DEFAULT_POINT_LIGHT_VIEW_RANGE, castX = x, castY = y, castZ = z) {
103
+ out.count = 0;
104
+ out.shadowCount = 0;
105
+ /*
106
+ * How many the shaded list holds, read off the buffer rather than from the shader's budget.
107
+ * A caller that asked for a wider one gets it; the default is `MAX_POINT_LIGHTS` exactly.
108
+ */
109
+ const shadedCapacity = out.radii.length;
110
+ /* Everything offered, whether or not it wins a slot or is even in range. See `considered`. */
111
+ out.considered = sources.length;
112
+ /*
113
+ * The nearest light that did not make the set: the boundary the last chosen ones
114
+ * fade against. `Infinity` while the world has fewer lights in range than the
115
+ * shader binds, which is the case where nothing is contested and nothing dims.
116
+ */
117
+ let cutSq = Infinity;
118
+ for (let sourceIndex = 0; sourceIndex < sources.length; sourceIndex++) {
119
+ const light = sources[sourceIndex];
120
+ if (light === undefined)
121
+ continue;
122
+ /*
123
+ * A light with no radius illuminates nothing, and it must not take a slot from
124
+ * one that does. Consumers switch sources on and off by their radius — an oil
125
+ * slick is dark until it catches, a floor marker until it is stood on — so a world
126
+ * carries far more sources than it ever lights at once, and without this a
127
+ * character standing among forty dark markers would have the braziers around them
128
+ * pushed out of the buffer by markers emitting nothing.
129
+ */
130
+ if (light.radius <= 0)
131
+ continue;
132
+ const dx = light.x - x;
133
+ const dy = light.y - y;
134
+ const dz = light.z - z;
135
+ const distanceSq = dx * dx + dy * dy + dz * dz;
136
+ const cullDistance = viewRange + light.radius;
137
+ if (distanceSq > cullDistance * cullDistance)
138
+ continue;
139
+ /*
140
+ * Two lists, kept apart on purpose.
141
+ *
142
+ * The **shaded** list is the shader's nearest `MAX_POINT_LIGHTS`, culled at
143
+ * `viewRange + radius` so a light fades out rather than cutting at its own edge.
144
+ *
145
+ * The **shadow** list is who gets a cubemap, and it uses a different, stricter
146
+ * test: a light only qualifies inside its own radius, where the falloff
147
+ * `1 - dist / radius` means it is actually lighting anything. That is `decb3a2`'s
148
+ * rule — *"Acquisition now uses the same range test as release"* — which the pool
149
+ * rewrite lost by driving slots from the shaded list instead. A lamp a hundred
150
+ * metres away then takes a pool slot, thrashes it, and starves the lamp overhead
151
+ * of the map it needs: flashing squares when that bug first shipped, shadows that
152
+ * exist only near an emitter now.
153
+ *
154
+ * Sharing one sorted list is what made them drift apart, so they do not share one.
155
+ */
156
+ let slot = out.count;
157
+ while (slot > 0 && (out.scratchDistance[slot - 1] ?? 0) > distanceSq)
158
+ slot--;
159
+ if (slot >= shadedCapacity) {
160
+ // Rejected outright, so it is a candidate for the boundary the set fades against.
161
+ if (distanceSq < cutSq)
162
+ cutSq = distanceSq;
163
+ }
164
+ else {
165
+ // Full, so making room drops whoever was last off the end — and that is the
166
+ // nearest light not in the set unless something nearer is rejected later.
167
+ if (out.count >= shadedCapacity) {
168
+ const displaced = out.scratchDistance[shadedCapacity - 1] ?? Infinity;
169
+ if (displaced < cutSq)
170
+ cutSq = displaced;
171
+ }
172
+ const last = Math.min(out.count, shadedCapacity - 1);
173
+ for (let index = last; index > slot; index--) {
174
+ out.scratchDistance[index] = out.scratchDistance[index - 1] ?? 0;
175
+ out.radii[index] = out.radii[index - 1] ?? 0;
176
+ out.sourceRadii[index] = out.sourceRadii[index - 1] ?? 0;
177
+ out.sourceIndex[index] = out.sourceIndex[index - 1] ?? -1;
178
+ for (let component = 0; component < 3; component++) {
179
+ out.positions[index * 3 + component] = out.positions[(index - 1) * 3 + component] ?? 0;
180
+ out.colors[index * 3 + component] = out.colors[(index - 1) * 3 + component] ?? 0;
181
+ out.directions[index * 3 + component] = out.directions[(index - 1) * 3 + component] ?? 0;
182
+ }
183
+ out.coneCos[index * 2] = out.coneCos[(index - 1) * 2] ?? 0;
184
+ out.coneCos[index * 2 + 1] = out.coneCos[(index - 1) * 2 + 1] ?? 0;
185
+ out.iesProfiles[index] = out.iesProfiles[index - 1] ?? -1;
186
+ }
187
+ out.scratchDistance[slot] = distanceSq;
188
+ out.sourceIndex[slot] = sourceIndex;
189
+ out.radii[slot] = light.radius;
190
+ out.sourceRadii[slot] = Math.max(light.sourceRadius, 0);
191
+ out.positions[slot * 3] = light.x;
192
+ out.positions[slot * 3 + 1] = light.y;
193
+ out.positions[slot * 3 + 2] = light.z;
194
+ const scale = flickerScale(light, timeSeconds);
195
+ out.colors[slot * 3] = light.r * scale;
196
+ out.colors[slot * 3 + 1] = light.g * scale;
197
+ out.colors[slot * 3 + 2] = light.b * scale;
198
+ /*
199
+ * **Normalised here rather than trusted**, because the cone is a comparison against a cosine
200
+ * and an un-normalised direction scales that cosine — so a vector of length 2 gives a cone of
201
+ * the wrong width, which reads as the angle having been set wrong rather than the vector.
202
+ * A zero-length direction is a light that declared no cone, and it takes the open pair.
203
+ */
204
+ const dx = light.dirX ?? 0;
205
+ const dy = light.dirY ?? 0;
206
+ const dz = light.dirZ ?? 0;
207
+ const length = Math.sqrt(dx * dx + dy * dy + dz * dz);
208
+ const aimed = length > 1e-6 && light.coneOuterDeg !== undefined;
209
+ const inverse = aimed ? 1 / length : 0;
210
+ out.directions[slot * 3] = dx * inverse;
211
+ out.directions[slot * 3 + 1] = dy * inverse;
212
+ out.directions[slot * 3 + 2] = dz * inverse;
213
+ if (aimed) {
214
+ /*
215
+ * Clamped so the inner edge never passes the outer. A caller that swaps them would
216
+ * otherwise get `smoothstep` with its edges inverted, which is a cone that is dark in the
217
+ * middle and bright at the rim — a picture nobody would attribute to two numbers being the
218
+ * wrong way round.
219
+ */
220
+ const outerDeg = Math.min(89.9, Math.max(0, light.coneOuterDeg ?? 45));
221
+ const innerDeg = Math.min(outerDeg, Math.max(0, light.coneInnerDeg ?? outerDeg * 0.75));
222
+ out.coneCos[slot * 2] = Math.cos((innerDeg * Math.PI) / 180);
223
+ out.coneCos[slot * 2 + 1] = Math.cos((outerDeg * Math.PI) / 180);
224
+ }
225
+ else {
226
+ out.coneCos[slot * 2] = POINT_LIGHT_COS_INNER;
227
+ out.coneCos[slot * 2 + 1] = POINT_LIGHT_COS_OUTER;
228
+ }
229
+ /*
230
+ * The profile applies to a point light as readily as to a spot: a bare bulb has a measured
231
+ * distribution too, and the arithmetic does not care whether a cone is also being applied.
232
+ * Restricting it to spots would be a smaller feature for no saving.
233
+ */
234
+ out.iesProfiles[slot] = light.iesProfile ?? -1;
235
+ if (out.count < shadedCapacity)
236
+ out.count++;
237
+ }
238
+ /*
239
+ * Inside its own radius, so it is lighting something and therefore has something
240
+ * to cast. Nearest first, capped at the pool, and independent of whether the
241
+ * shader had a slot left for it.
242
+ *
243
+ * **Measured from the caster and not from the camera**, and the guard and the rank read the
244
+ * same point on purpose: reading two would fill the pool nearest-to-camera and then evict
245
+ * the very lamp the subject is standing under, which is the shape of every pool bug this
246
+ * file already carries a paragraph about.
247
+ *
248
+ * Computed unconditionally rather than behind `castX === x`. At the default the operands are
249
+ * identical, so this is the same product of the same subtractions and the result is bit
250
+ * identical — a branch would buy a few flops per light and cost the guarantee that a caller
251
+ * who says nothing gets exactly what it got before.
252
+ */
253
+ // A light that animates its radius, or is simply not meant to cast, never takes
254
+ // a slot: it would be stale every frame and starve the lamps that do cast.
255
+ if (light.castsShadow === false)
256
+ continue;
257
+ const cx = light.x - castX;
258
+ const cy = light.y - castY;
259
+ const cz = light.z - castZ;
260
+ const castDistanceSq = cx * cx + cy * cy + cz * cz;
261
+ if (castDistanceSq >= light.radius * light.radius)
262
+ continue;
263
+ let shadowSlot = out.shadowCount;
264
+ while (shadowSlot > 0 && (shadowRank[shadowSlot - 1] ?? 0) > castDistanceSq)
265
+ shadowSlot--;
266
+ if (shadowSlot >= POINT_SHADOW_POOL)
267
+ continue;
268
+ const lastShadow = Math.min(out.shadowCount, POINT_SHADOW_POOL - 1);
269
+ for (let index = lastShadow; index > shadowSlot; index--) {
270
+ shadowRank[index] = shadowRank[index - 1] ?? 0;
271
+ out.shadowIndex[index] = out.shadowIndex[index - 1] ?? -1;
272
+ }
273
+ shadowRank[shadowSlot] = castDistanceSq;
274
+ out.shadowIndex[shadowSlot] = sourceIndex;
275
+ if (out.shadowCount < POINT_SHADOW_POOL)
276
+ out.shadowCount++;
277
+ }
278
+ /*
279
+ * How present each of them is, now that the set — and with it the boundary — is
280
+ * known. A second pass over at most eight entries, which is why the cut can be a
281
+ * fact about the whole frame rather than a guess made light by light.
282
+ *
283
+ * The two boundaries are independent and a light can be near both, so it takes
284
+ * whichever says it is fainter.
285
+ */
286
+ const cut = Math.sqrt(cutSq);
287
+ for (let index = 0; index < out.count; index++) {
288
+ const distance = Math.sqrt(out.scratchDistance[index] ?? 0);
289
+ const cullDistance = viewRange + (out.radii[index] ?? 0);
290
+ const arriving = (cullDistance - distance) / FADE_BAND_M;
291
+ const contested = (cut - distance) / CONTENTION_BAND_M;
292
+ out.weights[index] = Math.max(0, Math.min(1, arriving, contested));
293
+ }
294
+ }
295
+ function flickerScale(light, timeSeconds) {
296
+ if (light.flicker <= 0)
297
+ return 1;
298
+ const phase = light.x * 0.7 + light.z * 1.3;
299
+ const wobble = Math.sin(timeSeconds * 11.3 + phase) * 0.55 + Math.sin(timeSeconds * 27.7 + phase * 2.1) * 0.45;
300
+ return 1 + light.flicker * wobble;
301
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * The edge of one light's octahedral map.
3
+ *
4
+ * Matching a 512 cube face's angular density would need `512 * sqrt(6)`, about 1254, because a
5
+ * cube face covers a sixth of the sphere inside its own square. This is 1024, so texels are about
6
+ * 1.2x coarser in the worst direction — chosen because the wider filter this whole change unlocks
7
+ * is blurring the result anyway, and because 1024 costs 4.19 MB a layer against a cube's 6.29 MB.
8
+ */
9
+ export declare const OCTAHEDRAL_EDGE = 1024;
10
+ /**
11
+ * What a `PointShadowMap` needs of the array: somewhere to render a face, and somewhere to put it.
12
+ *
13
+ * An interface rather than the class, so a map can be built without a device at all — the pooling
14
+ * rules are worth testing on their own and none of them is about a texture.
15
+ */
16
+ export interface PointShadowTarget {
17
+ beginFace(gl: WebGL2RenderingContext): void;
18
+ resolveFace(gl: WebGL2RenderingContext, layer: number, face: number, far: number, near: number): void;
19
+ }
20
+ /**
21
+ * Every point light's shadow as one array texture, and the scratch that fills it.
22
+ *
23
+ * **One scratch for the whole engine rather than one cube per pool slot**, which is the economy
24
+ * the whole design turns on. Each octahedral texel has exactly one dominant axis, so a cube face's
25
+ * region of the map is disjoint from the other five and is written in full the moment that face is
26
+ * resolved. A face is therefore consumed immediately, and a bake spread across frames — which is
27
+ * how bakes work here, a couple of faces at a time against `pointShadowBudget.ts` — never needs a
28
+ * second face to still be around.
29
+ *
30
+ * **The scratch is a separate texture and that is not tidiness.** WebGL2's rendering-feedback-loop
31
+ * check is per texture object rather than per image: a draw that samples the array while any layer
32
+ * of it is attached is `INVALID_OPERATION`, on a layer it does not even write. Measured on a probe
33
+ * before this file existed. So the resolve reads the scratch and writes the array, and the two are
34
+ * never the same object.
35
+ */
36
+ export declare class PointShadowArray implements PointShadowTarget {
37
+ readonly texture: WebGLTexture;
38
+ /**
39
+ * How many layers this array holds: the point pool, the two live transition maps, and two more
40
+ * for each rectangle a world said would cast. See the constructor's `extraLayers`.
41
+ */
42
+ readonly layers: number;
43
+ private readonly framebuffer;
44
+ private readonly scratchTexture;
45
+ private readonly scratchFramebuffer;
46
+ /** Parked on the resolve's unit while the scratch is a render target. See `beginFace`. */
47
+ private readonly parked;
48
+ private readonly faceSize;
49
+ private readonly program;
50
+ private readonly uniforms;
51
+ private readonly vao;
52
+ constructor(gl: WebGL2RenderingContext, faceSize: number, lightCount: number,
53
+ /**
54
+ * Layers above the point pool, for the rectangles a world says will cast.
55
+ *
56
+ * **Sized from the declaration for the same reason the point half is**, and it is the whole of
57
+ * what an area light costs in storage: `areaShadowLayerCount` counts two per casting rectangle
58
+ * and zero for a world whose rectangles do not cast, so a consumer that has not asked for this
59
+ * allocates exactly what it allocated before. Where they land is `firstAreaShadowLayer`, which
60
+ * is the same expression as the line below — one function, because the array sizing itself and
61
+ * the set handing out indices disagreeing by one would have every rectangle sampling a lamp's
62
+ * map.
63
+ */
64
+ extraLayers?: number);
65
+ /**
66
+ * Bind the scratch as the render target for one face of one bake, and clear it.
67
+ *
68
+ * **The previous face's resolve left the scratch bound for sampling, and it is about to be the
69
+ * target.** That is a rendering feedback loop, and WebGL2 answers a draw in one with
70
+ * `INVALID_OPERATION` and no pixels — which is not the resolve's own draw but the *casters*,
71
+ * because `depth.ts` declares `uPreviousShadowMap` on that unit and an active sampler is
72
+ * enough whether the shader branch reads it or not. Found by capturing `night-court` and
73
+ * `day-clock`, which bake while the shot is taken; `gilded-chamber` was silent, because it had
74
+ * nothing stale to bake.
75
+ *
76
+ * `beginShadowPass` carries the identical fix for the directional maps, and this is the same
77
+ * rule one level down. A complete 1x1 texture rather than `null`, because an unbound sampler
78
+ * is *incomplete* and a driver may fetch its descriptor before evaluating the branch that
79
+ * would have skipped it — see `emptyTexture.ts` for the card that page-faulted over it.
80
+ */
81
+ beginFace(gl: WebGL2RenderingContext): void;
82
+ /**
83
+ * Write the scratch's contents into `layer`'s region for `face`.
84
+ *
85
+ * `depthFunc(ALWAYS)` because this is a copy and not a render. The layer already holds whatever
86
+ * the previous bake of this light left in it, so a fragment that lost a comparison would leave
87
+ * half of one image and half of another — a shadow baked around two different places at once,
88
+ * which is the failure `PointShadowImage.planBake` exists to prevent one level up.
89
+ *
90
+ * Allocates nothing: the rotation is a module-scope scratch, and the pass draws three vertices
91
+ * from an empty vertex array.
92
+ */
93
+ resolveFace(gl: WebGL2RenderingContext, layer: number, face: number, far: number, near: number): void;
94
+ dispose(gl: WebGL2RenderingContext): void;
95
+ }
@@ -0,0 +1,219 @@
1
+ import { mat3 } from 'gl-matrix';
2
+ import { createEmptyTexture2D } from './emptyTexture.js';
3
+ import { LIVE_POINT_SHADOW_MAPS, POINT_SHADOW_POOL } from './lightBudget.js';
4
+ import { pointShadowFaceRotation } from './pointShadowImage.js';
5
+ import { compileProgram, uniformLocations } from './shader.js';
6
+ import { OCTAHEDRAL_RESOLVE_FRAG, OCTAHEDRAL_RESOLVE_VERT } from './shaders/octahedralResolve.js';
7
+ /**
8
+ * The edge of one light's octahedral map.
9
+ *
10
+ * Matching a 512 cube face's angular density would need `512 * sqrt(6)`, about 1254, because a
11
+ * cube face covers a sixth of the sphere inside its own square. This is 1024, so texels are about
12
+ * 1.2x coarser in the worst direction — chosen because the wider filter this whole change unlocks
13
+ * is blurring the result anyway, and because 1024 costs 4.19 MB a layer against a cube's 6.29 MB.
14
+ */
15
+ export const OCTAHEDRAL_EDGE = 1024;
16
+ /** Filled per resolved face, at module scope, because a bake runs inside the frame's budget. */
17
+ const faceRotation = mat3.create();
18
+ /**
19
+ * Every point light's shadow as one array texture, and the scratch that fills it.
20
+ *
21
+ * **One scratch for the whole engine rather than one cube per pool slot**, which is the economy
22
+ * the whole design turns on. Each octahedral texel has exactly one dominant axis, so a cube face's
23
+ * region of the map is disjoint from the other five and is written in full the moment that face is
24
+ * resolved. A face is therefore consumed immediately, and a bake spread across frames — which is
25
+ * how bakes work here, a couple of faces at a time against `pointShadowBudget.ts` — never needs a
26
+ * second face to still be around.
27
+ *
28
+ * **The scratch is a separate texture and that is not tidiness.** WebGL2's rendering-feedback-loop
29
+ * check is per texture object rather than per image: a draw that samples the array while any layer
30
+ * of it is attached is `INVALID_OPERATION`, on a layer it does not even write. Measured on a probe
31
+ * before this file existed. So the resolve reads the scratch and writes the array, and the two are
32
+ * never the same object.
33
+ */
34
+ export class PointShadowArray {
35
+ texture;
36
+ /**
37
+ * How many layers this array holds: the point pool, the two live transition maps, and two more
38
+ * for each rectangle a world said would cast. See the constructor's `extraLayers`.
39
+ */
40
+ layers;
41
+ framebuffer;
42
+ scratchTexture;
43
+ scratchFramebuffer;
44
+ /** Parked on the resolve's unit while the scratch is a render target. See `beginFace`. */
45
+ parked;
46
+ faceSize;
47
+ program;
48
+ uniforms;
49
+ vao;
50
+ constructor(gl, faceSize, lightCount,
51
+ /**
52
+ * Layers above the point pool, for the rectangles a world says will cast.
53
+ *
54
+ * **Sized from the declaration for the same reason the point half is**, and it is the whole of
55
+ * what an area light costs in storage: `areaShadowLayerCount` counts two per casting rectangle
56
+ * and zero for a world whose rectangles do not cast, so a consumer that has not asked for this
57
+ * allocates exactly what it allocated before. Where they land is `firstAreaShadowLayer`, which
58
+ * is the same expression as the line below — one function, because the array sizing itself and
59
+ * the set handing out indices disagreeing by one would have every rectangle sampling a lamp's
60
+ * map.
61
+ */
62
+ extraLayers = 0) {
63
+ this.faceSize = faceSize;
64
+ /*
65
+ * Sized from the world rather than from the maximum. `texStorage3D` is immutable, so the
66
+ * alternative is handing a three-light world the storage for twenty-two — which is the mistake
67
+ * `lightBudget.ts` calls the most expensive the renderer has made, wearing a new shape.
68
+ */
69
+ this.layers =
70
+ Math.min(lightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS + Math.max(0, extraLayers);
71
+ const texture = gl.createTexture();
72
+ if (texture === null)
73
+ throw new Error('PointShadowArray: createTexture failed');
74
+ this.texture = texture;
75
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
76
+ gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.DEPTH_COMPONENT24, OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE, this.layers);
77
+ /* One storage level and no filtering, so textureLod(..., 0.0) is the only fetch there is. */
78
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
79
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
80
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
81
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
82
+ const scratchTexture = gl.createTexture();
83
+ if (scratchTexture === null)
84
+ throw new Error('PointShadowArray: createTexture failed');
85
+ this.scratchTexture = scratchTexture;
86
+ gl.bindTexture(gl.TEXTURE_2D, scratchTexture);
87
+ gl.texStorage2D(gl.TEXTURE_2D, 1, gl.DEPTH_COMPONENT24, faceSize, faceSize);
88
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
89
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
90
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
91
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
92
+ this.parked = createEmptyTexture2D(gl);
93
+ const scratchFramebuffer = gl.createFramebuffer();
94
+ if (scratchFramebuffer === null)
95
+ throw new Error('PointShadowArray: createFramebuffer failed');
96
+ this.scratchFramebuffer = scratchFramebuffer;
97
+ gl.bindFramebuffer(gl.FRAMEBUFFER, scratchFramebuffer);
98
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, scratchTexture, 0);
99
+ /* Depth-only: without this WebGL expects a colour attachment. */
100
+ gl.drawBuffers([gl.NONE]);
101
+ gl.readBuffer(gl.NONE);
102
+ /*
103
+ * The resolve program, built **before** the completeness check below, because that check may
104
+ * return early on a lost context and every field has to be assigned by then. `PointShadowMap`
105
+ * and `ShadowMap` both hold that shape; here it is load-bearing rather than incidental, since
106
+ * `program`, `uniforms` and `vao` are all `readonly`.
107
+ */
108
+ this.program = compileProgram(gl, OCTAHEDRAL_RESOLVE_VERT, OCTAHEDRAL_RESOLVE_FRAG, 'octahedralResolve');
109
+ this.uniforms = uniformLocations(gl, this.program, 'octahedralResolve');
110
+ const vao = gl.createVertexArray();
111
+ if (vao === null)
112
+ throw new Error('PointShadowArray: createVertexArray failed');
113
+ this.vao = vao;
114
+ const framebuffer = gl.createFramebuffer();
115
+ if (framebuffer === null)
116
+ throw new Error('PointShadowArray: createFramebuffer failed');
117
+ this.framebuffer = framebuffer;
118
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
119
+ gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, texture, 0, 0);
120
+ gl.drawBuffers([gl.NONE]);
121
+ gl.readBuffer(gl.NONE);
122
+ /*
123
+ * Asked once, here, for the reason `pointShadowMap.ts` records at length: it is a synchronous
124
+ * query, so the driver must drain what it has queued before it can answer, and asking it per
125
+ * face put a pipeline flush inside the render loop for the life of the session — 95.6% of a
126
+ * 69 ms frame. Every layer shares one texture, one size and one format, so a configuration
127
+ * complete for layer 0 is complete for all of them, and nothing about that can change later.
128
+ */
129
+ const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
130
+ if (status !== gl.FRAMEBUFFER_COMPLETE) {
131
+ /*
132
+ * A lost context reports every attachment unusable, and that is not a misconfiguration the
133
+ * caller can fix — see `planarReflection.ts`. Init still throws, because the context cannot
134
+ * be lost before it exists.
135
+ */
136
+ if (gl.isContextLost())
137
+ return;
138
+ throw new Error(`PointShadowArray: framebuffer incomplete (0x${status.toString(16)})`);
139
+ }
140
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
141
+ gl.bindTexture(gl.TEXTURE_2D, null);
142
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
143
+ }
144
+ /**
145
+ * Bind the scratch as the render target for one face of one bake, and clear it.
146
+ *
147
+ * **The previous face's resolve left the scratch bound for sampling, and it is about to be the
148
+ * target.** That is a rendering feedback loop, and WebGL2 answers a draw in one with
149
+ * `INVALID_OPERATION` and no pixels — which is not the resolve's own draw but the *casters*,
150
+ * because `depth.ts` declares `uPreviousShadowMap` on that unit and an active sampler is
151
+ * enough whether the shader branch reads it or not. Found by capturing `night-court` and
152
+ * `day-clock`, which bake while the shot is taken; `gilded-chamber` was silent, because it had
153
+ * nothing stale to bake.
154
+ *
155
+ * `beginShadowPass` carries the identical fix for the directional maps, and this is the same
156
+ * rule one level down. A complete 1x1 texture rather than `null`, because an unbound sampler
157
+ * is *incomplete* and a driver may fetch its descriptor before evaluating the branch that
158
+ * would have skipped it — see `emptyTexture.ts` for the card that page-faulted over it.
159
+ */
160
+ beginFace(gl) {
161
+ gl.activeTexture(gl.TEXTURE0);
162
+ gl.bindTexture(gl.TEXTURE_2D, this.parked);
163
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.scratchFramebuffer);
164
+ gl.viewport(0, 0, this.faceSize, this.faceSize);
165
+ gl.clear(gl.DEPTH_BUFFER_BIT);
166
+ }
167
+ /**
168
+ * Write the scratch's contents into `layer`'s region for `face`.
169
+ *
170
+ * `depthFunc(ALWAYS)` because this is a copy and not a render. The layer already holds whatever
171
+ * the previous bake of this light left in it, so a fragment that lost a comparison would leave
172
+ * half of one image and half of another — a shadow baked around two different places at once,
173
+ * which is the failure `PointShadowImage.planBake` exists to prevent one level up.
174
+ *
175
+ * Allocates nothing: the rotation is a module-scope scratch, and the pass draws three vertices
176
+ * from an empty vertex array.
177
+ */
178
+ resolveFace(gl, layer, face, far, near) {
179
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
180
+ gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, this.texture, 0, layer);
181
+ gl.viewport(0, 0, OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE);
182
+ gl.useProgram(this.program);
183
+ gl.bindVertexArray(this.vao);
184
+ gl.activeTexture(gl.TEXTURE0);
185
+ gl.bindTexture(gl.TEXTURE_2D, this.scratchTexture);
186
+ gl.uniform1i(this.uniforms['uFace'] ?? null, 0);
187
+ gl.uniform1i(this.uniforms['uFaceIndex'] ?? null, face);
188
+ gl.uniformMatrix3fv(this.uniforms['uFaceRotation'] ?? null, false, pointShadowFaceRotation(face, faceRotation));
189
+ gl.uniform1f(this.uniforms['uFar'] ?? null, far);
190
+ gl.uniform1f(this.uniforms['uNear'] ?? null, near);
191
+ gl.uniform1f(this.uniforms['uEdge'] ?? null, OCTAHEDRAL_EDGE);
192
+ gl.disable(gl.CULL_FACE);
193
+ gl.enable(gl.DEPTH_TEST);
194
+ gl.depthMask(true);
195
+ /*
196
+ * **Saved and restored rather than put back to a named compare.** This used to end with
197
+ * `depthFunc(LESS)`, which was the frame's compare when it was written and stopped being it
198
+ * the moment the engine could draw reversed: after one point-shadow copy the whole rest of the
199
+ * frame tested the wrong way, and a scene with point shadows lost most of its pixels. Reading
200
+ * the state back costs one `getParameter` on a path that already binds a framebuffer, and it
201
+ * cannot go stale the way a constant can.
202
+ */
203
+ const wasDepthFunc = gl.getParameter(gl.DEPTH_FUNC);
204
+ gl.depthFunc(gl.ALWAYS);
205
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
206
+ gl.depthFunc(wasDepthFunc);
207
+ gl.bindVertexArray(null);
208
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
209
+ }
210
+ dispose(gl) {
211
+ gl.deleteFramebuffer(this.framebuffer);
212
+ gl.deleteFramebuffer(this.scratchFramebuffer);
213
+ gl.deleteTexture(this.texture);
214
+ gl.deleteTexture(this.scratchTexture);
215
+ gl.deleteTexture(this.parked);
216
+ gl.deleteProgram(this.program);
217
+ gl.deleteVertexArray(this.vao);
218
+ }
219
+ }