@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,524 @@
1
+ import { POINT_LIGHT_COS_INNER, POINT_LIGHT_COS_OUTER } from './clusteredLights.js';
2
+ /**
3
+ * How many point lights the shading pass shades against at once.
4
+ *
5
+ * It was eight, and eight is what an ordinary lamp-lit courtyard broke over: six lamps
6
+ * and a brazier inside 8.7 m take seven of them, so a gate's two lights —
7
+ * equidistant by construction, both 12.52 m out — contended for the one remaining
8
+ * slot and only ever one of them was rendered. More slots do not make the budget
9
+ * unbounded, and they are not what fixes contention; `CONTENTION_BAND_M` in
10
+ * `pointLightSelection.ts` is, by making the trade continuous. They buy the room
11
+ * that stops a scene this ordinary from having to make the trade at all.
12
+ *
13
+ * **It was ten, and ten was a texture-unit limit that no longer exists.** The comment
14
+ * here used to say that raising it "costs a texture unit and a pool slot each" and that
15
+ * eleven "would spend the last guaranteed unit, so this is the end of the road". That was
16
+ * true while each light's shadow was its own `samplerCube`. Every point shadow is now one
17
+ * layer of one `TEXTURE_2D_ARRAY` — see `pointShadowArray.ts` — so a light costs a layer
18
+ * and a pool slot, and no bindings at all.
19
+ *
20
+ * **Sixteen because that is what costs nothing.** A cube at face 512 was 6.29 MB and the
21
+ * pool plus the two live maps was sixteen of them, 100.7 MB. An octahedral layer at 1024 is
22
+ * 4.19 MB, so sixteen lights is a pool of twenty plus two live, twenty-two layers, 92.3 MB —
23
+ * less than the storage it replaces, with six more shadowed lights. **Eighteen is where the
24
+ * memory exactly equals what the cubes cost**, which is the number to reach for if a scene
25
+ * ever wants more, and the arithmetic is written down here so nobody has to re-derive it.
26
+ *
27
+ * What limits it now is the shader rather than the bindings: every one of these is a slot in
28
+ * five uniform arrays and an iteration of the light loop in the widest permutation of the
29
+ * largest shader in the engine.
30
+ */
31
+ export const MAX_POINT_LIGHTS = 16;
32
+ /** Two live maps make changing the caster's owning light a crossfade, not a pop. */
33
+ export const LIVE_POINT_SHADOW_MAPS = 2;
34
+ /**
35
+ * Texture units the directional cascade binds: static, its depth peel, and dynamic.
36
+ *
37
+ * Named because the shading pass's total unit count has to be compared against what a
38
+ * device offers, and a budget assembled from three literals scattered across two files
39
+ * is a budget nobody can check. See the guard in `Renderer`'s constructor.
40
+ */
41
+ export const DIRECTIONAL_SHADOW_UNITS = 3;
42
+ /**
43
+ * Texture units every point light's shadow binds: one, for all of them.
44
+ *
45
+ * **It was twelve** — ten pooled cubemaps and two live transition maps, each its own
46
+ * `samplerCube`, because GLSL ES cannot index a sampler array with a non-constant expression.
47
+ * One `TEXTURE_2D_ARRAY` of octahedral maps makes the choice a layer index instead, so the
48
+ * count stops depending on `MAX_POINT_LIGHTS` at all.
49
+ */
50
+ export const POINT_SHADOW_UNITS = 1;
51
+ /**
52
+ * Where surface colour binds, directly above the shadow units.
53
+ *
54
+ * Units 0–2 are the sun's static, peeled and mover depth layers; unit 3 is the point-shadow
55
+ * array, every light in one binding. This is the fifth, the normal map is the sixth, and **ten of
56
+ * WebGL2's guaranteed sixteen are free** — where the lit pass used to fill all sixteen exactly.
57
+ *
58
+ * It lives here rather than in the renderer because this is where the unit accounting is
59
+ * written down. Raising `MAX_POINT_LIGHTS` no longer moves it: lights cost layers now, not
60
+ * units, which is the whole of what the octahedral change bought.
61
+ */
62
+ export const SURFACE_TEXTURE_UNIT = DIRECTIONAL_SHADOW_UNITS + POINT_SHADOW_UNITS;
63
+ /**
64
+ * Where a normal map binds, directly above surface colour.
65
+ *
66
+ * **The first of the eleven units Phase 1.4 freed to be spent**, and it is worth saying what it
67
+ * cost to have one at all. `uTextureRelief`'s comment records the constraint in as many words: a
68
+ * second image sampler "is not the free addition it would be in a smaller shader", because the
69
+ * widest permutation already declared one more sampler than this project's adapter offered.
70
+ * Twelve point-shadow cubemaps became one array binding, and this is what that was for.
71
+ *
72
+ * The ORM map is the next one, and takes the unit above this.
73
+ */
74
+ export const NORMAL_TEXTURE_UNIT = SURFACE_TEXTURE_UNIT + 1;
75
+ /**
76
+ * Occlusion, roughness and metallic in one image, on the unit above the normal map.
77
+ *
78
+ * Derived rather than written down, for the reason `SURFACE_TEXTURE_UNIT` is: a gap wastes a unit
79
+ * on a device that has none to waste, and an overlap binds two textures to one unit, which is
80
+ * undefined at best and reads as a surface losing one of its maps depending on the driver.
81
+ *
82
+ * **One unit for three channels rather than three units for three maps.** glTF packs them this way
83
+ * and so does every authoring tool that emits them; a file that separates its occlusion into its
84
+ * own image loses it, with the reason stated in the importer rather than a second sampler spent.
85
+ *
86
+ * The emissive map is the next one, and takes the unit above this.
87
+ */
88
+ export const ORM_TEXTURE_UNIT = NORMAL_TEXTURE_UNIT + 1;
89
+ /**
90
+ * Where a consumer's emissive map binds.
91
+ *
92
+ * **The unit `textureUnitBudget.test.ts` has named for it since the sampler unlock**, which is the
93
+ * point of naming units rather than counting them: the change that spends one has to read what it
94
+ * is spending, and this one was written down before it was taken.
95
+ *
96
+ * Directly above the ORM map so the four material maps are contiguous — surface, normal, ORM,
97
+ * emissive. They are the set a device's guaranteed sixteen has to hold together, and anything else
98
+ * sitting between two of them makes that budget harder to read than it is.
99
+ */
100
+ export const EMISSIVE_TEXTURE_UNIT = ORM_TEXTURE_UNIT + 1;
101
+ /**
102
+ * Where a baked reflection probe binds, when there is a unit spare for one.
103
+ *
104
+ * **It used to be one past the guarantee, and it is not any more.** WebGL2 promises sixteen
105
+ * units; the lit pass used to fill 0 through 15, so the probe sat at the seventeenth and every
106
+ * Apple GPU — all of which report exactly sixteen — had no unit for it and stood down. The
107
+ * point-shadow cubes became one array binding, so this is the eighth of sixteen and the probe
108
+ * fits everywhere.
109
+ *
110
+ * The rule it carried is kept anyway rather than deleted, because the reasoning is still the
111
+ * right one if the budget ever fills again: the probe is the thing given up, not the shadows.
112
+ * Dropping shadows to make room would trade a feature every scene uses for one a single
113
+ * material asks for, and a surface that cannot mirror the room still reflects the
114
+ * sky-and-ground approximation it always did.
115
+ */
116
+ export const ENVIRONMENT_TEXTURE_UNIT = EMISSIVE_TEXTURE_UNIT + 1;
117
+ /**
118
+ * Where the froxel table binds.
119
+ *
120
+ * **Spent unconditionally, and that is what a runtime branch costs.** The clustered arm is
121
+ * compiled into every profile rather than permuted in, because a fifth permutation flag doubled
122
+ * the generated WGSL and cost 49% of the bundle on every consumer — the measurement is at the
123
+ * declaration in `shaders/flat/preamble.ts`. A declared sampler needs a valid texture bound to it
124
+ * whether or not the branch reads it, so this unit is taken even with `clusteredLights` off, and a
125
+ * one-texel placeholder stands in it.
126
+ *
127
+ * The eighth of sixteen. The sampler unlock left nine free and this is the first of them.
128
+ */
129
+ export const CLUSTER_TABLE_TEXTURE_UNIT = ENVIRONMENT_TEXTURE_UNIT + 1;
130
+ /**
131
+ * Where the photometric atlas binds: one row per IES profile, any number of them.
132
+ *
133
+ * **One unit for every profile a world holds, which is the whole reason it is an atlas.** A
134
+ * fixture's distribution is a curve rather than an image, so a row of 128 floats holds one and a
135
+ * texture holds as many as a consumer loads. Per-profile textures would have spent the remaining
136
+ * units on the third fixture.
137
+ *
138
+ * **Spent unconditionally, for the same reason the froxel table is**, and the argument is at that
139
+ * declaration: the lookup is a branch on a value rather than a permutation, so the sampler is
140
+ * declared in every profile and a declared sampler needs a complete texture bound whether or not
141
+ * the branch reads it. With no profile loaded that texture is a single row of ones, which is the
142
+ * multiplicative identity — a row of zeros would switch off every light that reached it.
143
+ *
144
+ * The tenth of sixteen. `CAPABILITIES.md` §3 keeps the running count.
145
+ */
146
+ export const IES_ATLAS_TEXTURE_UNIT = CLUSTER_TABLE_TEXTURE_UNIT + 1;
147
+ /**
148
+ * The joint palette, read by the **vertex** stage.
149
+ *
150
+ * **It comes out of the same sixteen as everything above it, and that is the correction.** The
151
+ * palette was first given unit 0 on the reasoning that `MAX_VERTEX_TEXTURE_IMAGE_UNITS` is a
152
+ * separate guarantee of sixteen from `MAX_TEXTURE_IMAGE_UNITS`. Those two do bound the stages
153
+ * separately — but they bound how many units each stage may *reference*, not how the units are
154
+ * numbered: `activeTexture` selects from one shared pool, so unit 0 is the directional shadow map
155
+ * whoever binds it. The result is `GL_INVALID_OPERATION: two textures of different types use the
156
+ * same sampler location`, on a frame that otherwise draws.
157
+ *
158
+ * Found on hardware rather than in review, which is the whole reason a capture is part of the
159
+ * work. WebGPU never had it: its bindings are per bind group and carry no shared namespace.
160
+ *
161
+ * What it costs is one of the five units left after the IES atlas. What would make it wrong is
162
+ * the lit pass growing past sixteen, which `textureUnitBudget.test.ts` asserts against.
163
+ */
164
+ export const SKIN_PALETTE_TEXTURE_UNIT = IES_ATLAS_TEXTURE_UNIT + 1;
165
+ /**
166
+ * A mesh's morph deltas, also read by the vertex stage, and also out of this same sixteen.
167
+ *
168
+ * The second vertex-stage sampler this engine has, and it takes a unit for the reason the palette
169
+ * does: `activeTexture` selects from one pool whichever stage the sampler is declared in. Thirteen
170
+ * of sixteen spoken for, three free.
171
+ */
172
+ export const MORPH_DELTA_TEXTURE_UNIT = SKIN_PALETTE_TEXTURE_UNIT + 1;
173
+ /**
174
+ * Where the spot-light cookie atlas binds: one row of square tiles, one tile a cookie.
175
+ *
176
+ * **The fourteenth of sixteen, and two are left.** `CAPABILITIES.md` §3 keeps the running count —
177
+ * and had been three units stale for as long as the IES atlas, the skin palette and the morph
178
+ * deltas have existed, which is why the number is derived in `textureUnitBudget.test.ts` and only
179
+ * quoted in prose.
180
+ *
181
+ * **Spent unconditionally, for the reason the froxel table and the IES atlas are**: a declared
182
+ * sampler needs a complete texture bound whether or not the branch reads it, so a one-texel white
183
+ * placeholder stands in it when no consumer has loaded a cookie. White rather than black, because
184
+ * it multiplies a light's colour and a black stand-in would switch off every light that reached
185
+ * it — the identity `packIesAtlas` chooses for the same reason.
186
+ */
187
+ export const COOKIE_ATLAS_TEXTURE_UNIT = MORPH_DELTA_TEXTURE_UNIT + 1;
188
+ /**
189
+ * The colour the frame had already drawn, for a refracting surface to sample.
190
+ *
191
+ * **The second-to-last unit WebGL2 guarantees, and derived rather than a literal** for the reason
192
+ * every unit above it is: a gap wastes a unit on a device that has none to waste, and an overlap
193
+ * binds two textures of different types to one unit, which is undefined and reads as a scene
194
+ * losing one of them depending on the driver.
195
+ *
196
+ * **One unit is left after this.** What that costs is that the next sampler added has to find room
197
+ * rather than take it — by folding into an existing binding the way the twelve point-shadow
198
+ * cubemaps became one array, which is what freed the units this one is spending.
199
+ * `textureUnitBudget.test.ts` carries the phone that budget was written for.
200
+ */
201
+ export const REFRACT_SCENE_TEXTURE_UNIT = COOKIE_ATLAS_TEXTURE_UNIT + 1;
202
+ /**
203
+ * A cookie's tile, in texels a side.
204
+ *
205
+ * **128, which is what a gobo is.** A cookie is a soft mask — a window frame, a leaf canopy, a
206
+ * grille — and its edges are blurred by the source's own size before anything sees them, so the
207
+ * resolution that matters is the shape rather than the detail. Sixteen tiles at 128 is a
208
+ * 2048x128 atlas at 1 MB, against 16 MB for the same count at 512.
209
+ *
210
+ * Interpolated into the shader rather than repeated there, so the half-texel inset that stops one
211
+ * tile bleeding into the next is derived from one definition.
212
+ */
213
+ export const COOKIE_TILE = 128;
214
+ /**
215
+ * Where the SDF text atlas binds.
216
+ *
217
+ * **Not a new number past `SURFACE_TEXTURE_UNIT`.** The next untaken one by that reading is
218
+ * `ENVIRONMENT_TEXTURE_UNIT`, the seventeenth unit — and on the Apple GPUs this file already
219
+ * accounts for, which report exactly the guaranteed sixteen, a seventeenth unit does not
220
+ * exist. The reflection probe can decline gracefully when that happens and still leave a
221
+ * correct picture behind. SDF text has no such fallback: it is opt-in, but a consumer who
222
+ * opts in wants their labels on every device that promises WebGL2, not on every device except
223
+ * one vendor's phones.
224
+ *
225
+ * So the atlas reuses `SURFACE_TEXTURE_UNIT` itself, which needs no capability check because
226
+ * it is already the last unit WebGL2 guarantees. That is safe rather than a compromise: text
227
+ * draws through its own program, in its own pass, with exactly one sampler, so it never
228
+ * needs to coexist with whatever the shading pass bound a moment earlier — the two are never
229
+ * bound at once. Named separately anyway, so the SDF renderer's call site reads as "the
230
+ * atlas's unit" rather than as a reference to a surface colour it has nothing to do with.
231
+ */
232
+ export const SDF_TEXT_TEXTURE_UNIT = SURFACE_TEXTURE_UNIT;
233
+ /**
234
+ * Cubemaps kept for world lights, independent of how many lights a world has.
235
+ *
236
+ * This used to be one map per light, forever, and it is the single most expensive
237
+ * mistake the renderer has made. A `DEPTH_COMPONENT24` cube at face size 512 is
238
+ * six faces at four bytes a texel, about 6.3 MB; a measured world carries 50
239
+ * lights, so the renderer allocated roughly 327 MB of shadow storage — of which
240
+ * `MAX_POINT_LIGHTS` worth, eight maps, could be sampled in any given frame.
241
+ * Forty-two of them, some 265 MB, were unreadable by construction.
242
+ *
243
+ * Nothing about that is visible on a GPU with its own memory. On an integrated
244
+ * part it is fatal: system RAM *is* the VRAM, over a bus shared with the CPU, so
245
+ * past the budget the driver evicts and re-uploads every frame and the frame rate
246
+ * falls off a cliff rather than degrading. It reproduced as a game that ran at
247
+ * 3 fps maximised and *perfectly* in a small window, because shrinking the window
248
+ * shrank the other targets back under the budget.
249
+ *
250
+ * So the pool is sized to what the shader can actually read, plus headroom. The
251
+ * headroom is not optional: selection reorders as the camera moves, and a pool of
252
+ * exactly eight would evict a map that is about to be wanted again and re-bake it
253
+ * on the next frame, forever. Four spare slots absorb that churn.
254
+ *
255
+ * The maps are no longer permanent, which is the cost of this: a light entering
256
+ * the sampled set for the first time in a while pays six face passes once. They
257
+ * bake from static geometry, so the result is identical whenever it is taken.
258
+ */
259
+ export const POINT_SHADOW_POOL = MAX_POINT_LIGHTS + 4;
260
+ /** Weights are optional per consumer; a short array means every light is fully present. */
261
+ const FULLY_PRESENT = new Float32Array(MAX_POINT_LIGHTS).fill(1);
262
+ /** No size at all, which is the behaviour every scene had before a light could have one. */
263
+ const POINT_SOURCES = new Float32Array(MAX_POINT_LIGHTS);
264
+ /**
265
+ * Every light pointing nowhere, which is what a light with no cone needs.
266
+ *
267
+ * The direction is never read when the cone admits everything — `smoothstep` is already at its
268
+ * upper bound — so zeroes are correct rather than merely harmless.
269
+ */
270
+ const NO_DIRECTIONS = new Float32Array(MAX_POINT_LIGHTS * 3);
271
+ /**
272
+ * Every light carrying no photometric profile.
273
+ *
274
+ * Filled with −1 rather than left at zero, because zero is a valid row index: a world with one
275
+ * profile loaded and a light that never asked for it would otherwise take row 0 and be shaped by
276
+ * a fixture it has nothing to do with.
277
+ */
278
+ const NO_PROFILES = new Float32Array(MAX_POINT_LIGHTS).fill(-1);
279
+ /**
280
+ * Every light carrying no azimuth reference.
281
+ *
282
+ * Zero rather than an axis, and the shader reads a zero-length reference as "no usable one" and
283
+ * stays on the first plane — which is what every symmetric profile does anyway, so a scene that
284
+ * never heard of this shades exactly as it did.
285
+ */
286
+ const NO_IES_AXES = new Float32Array(MAX_POINT_LIGHTS * 3);
287
+ /** Every light carrying no cookie. −1 rather than 0, because tile 0 is a real cookie. */
288
+ const NO_COOKIES = new Float32Array(MAX_POINT_LIGHTS).fill(-1);
289
+ /**
290
+ * A cone that admits every direction, for every light.
291
+ *
292
+ * Inner −1 and outer −2 in each pair, which is the collapse `POINT_LIGHT_COS_OUTER` describes: the
293
+ * dot product never falls below −1, so the term is exactly 1 and a scene with no spot light shades
294
+ * exactly as it did before spot lights existed.
295
+ */
296
+ /**
297
+ * A fresh cone array where every light admits every direction.
298
+ *
299
+ * Exported because `createEnvironment` needs one it owns: the module-scope `OPEN_CONES` is shared
300
+ * by every fallback in this file, and handing it to an environment would let one scene's edit
301
+ * reach another's — the aliasing `createEnvironment` already warns about for `lightPositions`.
302
+ */
303
+ export function openCones(lights = MAX_POINT_LIGHTS) {
304
+ const cones = new Float32Array(lights * 2);
305
+ for (let light = 0; light < lights; light++) {
306
+ cones[light * 2] = POINT_LIGHT_COS_INNER;
307
+ cones[light * 2 + 1] = POINT_LIGHT_COS_OUTER;
308
+ }
309
+ return cones;
310
+ }
311
+ const OPEN_CONES = (() => {
312
+ const cones = new Float32Array(MAX_POINT_LIGHTS * 2);
313
+ for (let light = 0; light < MAX_POINT_LIGHTS; light++) {
314
+ cones[light * 2] = POINT_LIGHT_COS_INNER;
315
+ cones[light * 2 + 1] = POINT_LIGHT_COS_OUTER;
316
+ }
317
+ return cones;
318
+ })();
319
+ /** A light nobody positioned, at the origin with no colour: shaded, and contributing nothing. */
320
+ const NO_POSITIONS = new Float32Array(MAX_POINT_LIGHTS * 3);
321
+ const NO_COLORS = new Float32Array(MAX_POINT_LIGHTS * 3);
322
+ /** Said once per process, not once per frame. See the guard that sets it. */
323
+ let warnedShortArrays = false;
324
+ /**
325
+ * Bind a light set to whichever program declares the shared slot names.
326
+ *
327
+ * Three passes now shade against these — surfaces, smoke and water — and each had its
328
+ * own copy of the same four uploads. A fourth would have made it four, and one of the
329
+ * four would eventually have been the one to forget `uLightWeight` and have lights pop
330
+ * in and out instead of fading.
331
+ *
332
+ * `falloff` travels with them because the shape a lamp fades with is a property of the
333
+ * *world*, not of the material it lands on: a lamp that behaves one way on stone and
334
+ * another on the water beside it is the same light in two places.
335
+ */
336
+ export function bindPointLights(gl, uniforms, lights, falloff) {
337
+ const r = resolvePointLights(lights, falloff, glLights);
338
+ gl.uniform1i(uniforms['uLightCount'] ?? null, r.count);
339
+ gl.uniform1i(uniforms['uLightFalloff'] ?? null, r.falloff);
340
+ if (r.count === 0)
341
+ return;
342
+ gl.uniform3fv(uniforms['uLightPos[0]'] ?? null, r.positions);
343
+ gl.uniform3fv(uniforms['uLightColor[0]'] ?? null, r.colors);
344
+ gl.uniform1fv(uniforms['uLightRadius[0]'] ?? null, r.radii);
345
+ gl.uniform1fv(uniforms['uLightSourceRadius[0]'] ?? null, r.sourceRadii);
346
+ gl.uniform1fv(uniforms['uLightWeight[0]'] ?? null, r.weights);
347
+ /*
348
+ * The cone, uploaded for every light rather than only for spots. The shader reads these slots
349
+ * unconditionally — a point light's pair is what makes its term collapse to 1 — so leaving them
350
+ * unwritten is a uniform holding zeros, which is a cone that admits nothing and a world with
351
+ * every lamp switched off.
352
+ */
353
+ gl.uniform3fv(uniforms['uLightDir[0]'] ?? null, r.directions);
354
+ gl.uniform2fv(uniforms['uLightCone[0]'] ?? null, r.coneCos);
355
+ gl.uniform1fv(uniforms['uLightIesProfile[0]'] ?? null, r.iesProfiles);
356
+ gl.uniform3fv(uniforms['uLightIesAxis[0]'] ?? null, r.iesAxes);
357
+ gl.uniform1fv(uniforms['uLightCookie[0]'] ?? null, r.cookies);
358
+ }
359
+ /**
360
+ * Bind the rectangular emitters, on the same reasoning `bindPointLights` gives.
361
+ *
362
+ * Separate from the point lights because they are a separate loop with separate arrays, and in the
363
+ * same file because a fourth pass forgetting one of these is the failure that helper exists to
364
+ * prevent — and there is no reason a second one would be immune to it.
365
+ */
366
+ export function bindAreaLights(gl, uniforms, lights) {
367
+ const count = lights?.count ?? 0;
368
+ gl.uniform1i(uniforms['uAreaLightCount'] ?? null, count);
369
+ /*
370
+ * Nothing else uploaded at zero, which is what makes an area light free to a scene that has
371
+ * none: the shader's loop breaks on the count before it reads an array, so the arrays may hold
372
+ * whatever they held.
373
+ */
374
+ if (count === 0 || lights === null)
375
+ return;
376
+ gl.uniform3fv(uniforms['uAreaLightPos[0]'] ?? null, lights.positions);
377
+ gl.uniform3fv(uniforms['uAreaLightColor[0]'] ?? null, lights.colors);
378
+ gl.uniform3fv(uniforms['uAreaLightRight[0]'] ?? null, lights.right);
379
+ gl.uniform3fv(uniforms['uAreaLightUp[0]'] ?? null, lights.up);
380
+ gl.uniform2fv(uniforms['uAreaLightSize[0]'] ?? null, lights.sizes);
381
+ gl.uniform1fv(uniforms['uAreaLightTwoSided[0]'] ?? null, lights.twoSided);
382
+ }
383
+ /**
384
+ * Put a rectangle's occlusion on the program: eight arrays, no texture of its own.
385
+ *
386
+ * **No sampler here, and that is the whole reason this is a separate function rather than part of
387
+ * `bindPointShadows`.** An area light's layers live in the array that call already bound, so the
388
+ * unit and the sampler name are its business and these are only indices into it — which is also
389
+ * what makes an area shadow ride `RenderQuality.pointShadows`: with the flag off the program
390
+ * declares no array at all, none of these eight names exists, and every lookup below answers
391
+ * `null`.
392
+ *
393
+ * Addressed as `name[0]`, because GLSL ES exposes an array uniform under the name of its first
394
+ * element and `name[1]` returns nothing from the cached table — the mistake that left point-light
395
+ * slots 1 to 7 at zero and made their shadows vanish.
396
+ */
397
+ export function bindAreaShadows(gl, uniforms, shadows) {
398
+ gl.uniform1iv(uniforms['uAreaShadowLayer[0]'] ?? null, shadows.layer);
399
+ gl.uniform1fv(uniforms['uAreaShadowFar[0]'] ?? null, shadows.far);
400
+ gl.uniform1fv(uniforms['uAreaShadowNear[0]'] ?? null, shadows.near);
401
+ gl.uniform1fv(uniforms['uAreaShadowWeight[0]'] ?? null, shadows.weight);
402
+ gl.uniform1iv(uniforms['uLiveAreaShadowLayer[0]'] ?? null, shadows.liveLayer);
403
+ gl.uniform1fv(uniforms['uLiveAreaShadowFar[0]'] ?? null, shadows.liveFar);
404
+ gl.uniform1fv(uniforms['uLiveAreaShadowNear[0]'] ?? null, shadows.liveNear);
405
+ gl.uniform1fv(uniforms['uLiveAreaShadowWeight[0]'] ?? null, shadows.liveWeight);
406
+ }
407
+ /** One per GL binder, refilled per call: holds references, allocates nothing. */
408
+ const glLights = {
409
+ count: 0,
410
+ falloff: 0,
411
+ positions: NO_POSITIONS,
412
+ colors: NO_COLORS,
413
+ radii: POINT_SOURCES,
414
+ sourceRadii: POINT_SOURCES,
415
+ weights: FULLY_PRESENT,
416
+ directions: NO_DIRECTIONS,
417
+ coneCos: OPEN_CONES,
418
+ iesProfiles: NO_PROFILES,
419
+ iesAxes: NO_IES_AXES,
420
+ cookies: NO_COOKIES,
421
+ };
422
+ /**
423
+ * Choose which array each slot actually gets, with every fallback applied.
424
+ *
425
+ * **Separated from the upload so a second backend reaches the same five arrays.** The whole
426
+ * argument for `bindPointLights` is that a fourth pass would eventually be the one to forget
427
+ * `uLightWeight`; a second *backend* that cannot call it, having no `WebGL2RenderingContext`,
428
+ * is that same fourth pass wearing a different hat. WebGPU scatters these into a uniform block
429
+ * at the generated stride, WebGL2 hands them to `uniform3fv`.
430
+ *
431
+ * Fills a target the caller owns, because both callers are per-frame paths.
432
+ */
433
+ export function resolvePointLights(lights, falloff, out) {
434
+ const count = lights?.lightCount ?? 0;
435
+ out.count = count;
436
+ out.falloff = falloff === 'inverseSquare' ? 1 : 0;
437
+ if (count === 0 || lights === null) {
438
+ out.positions = NO_POSITIONS;
439
+ out.colors = NO_COLORS;
440
+ out.radii = POINT_SOURCES;
441
+ out.sourceRadii = POINT_SOURCES;
442
+ out.weights = FULLY_PRESENT;
443
+ out.directions = NO_DIRECTIONS;
444
+ out.coneCos = OPEN_CONES;
445
+ out.iesProfiles = NO_PROFILES;
446
+ out.iesAxes = NO_IES_AXES;
447
+ out.cookies = NO_COOKIES;
448
+ return out;
449
+ }
450
+ /*
451
+ * **Every array is guarded on its length, and they used to disagree about what absent means.**
452
+ *
453
+ * `uLightWeight` checked a length and `uLightSourceRadius` checked for `undefined`, and
454
+ * `createEnvironment` initialises the whole family to `new Float32Array(0)`, which is not
455
+ * undefined. So the emitter-size fallback never fired: a zero-length array reached a uniform
456
+ * declared as `MAX_POINT_LIGHTS` floats, `uniform1fv` refused it with `INVALID_VALUE` on every
457
+ * frame that had a light in it, and the uniform kept the zeros it started with. Every light in
458
+ * the scene was then shaded as a mathematical point, which is a highlight narrower than a
459
+ * fragment: exactly the speckle on dark glossy paint that `sourceRadius` was added to remove.
460
+ * **The feature was silently off in the app that asked for it.** Reported from outside; the
461
+ * comment here previously claimed the fallback covered "an environment built before this
462
+ * existed", which is true of a hand-written literal and false of anything the factory made.
463
+ *
464
+ * The other three had no guard at all, so the same mistake on them was the same error with a
465
+ * different name. A short array now means a light that is unlit rather than a frame that is
466
+ * invalid, which is the difference between a picture somebody can debug and a console flood.
467
+ */
468
+ const positions = lights.lightPositions.length >= MAX_POINT_LIGHTS * 3 ? lights.lightPositions : NO_POSITIONS;
469
+ const colors = lights.lightColors.length >= MAX_POINT_LIGHTS * 3 ? lights.lightColors : NO_COLORS;
470
+ const radii = lights.lightRadii.length >= MAX_POINT_LIGHTS ? lights.lightRadii : POINT_SOURCES;
471
+ const sourceRadii = (lights.lightSourceRadii?.length ?? 0) >= MAX_POINT_LIGHTS
472
+ ? lights.lightSourceRadii
473
+ : POINT_SOURCES;
474
+ const weights = lights.lightWeights.length >= MAX_POINT_LIGHTS ? lights.lightWeights : FULLY_PRESENT;
475
+ /*
476
+ * Guarded on length exactly as the five above are, and for the reason that comment gives: a short
477
+ * array reaching a uniform declared `MAX_POINT_LIGHTS` wide is an `INVALID_VALUE` every frame and
478
+ * a uniform that keeps whatever it started with. For the cone that would be zeros, which is a
479
+ * cone admitting nothing — every light in the scene switched off, silently.
480
+ */
481
+ const directions = (lights.lightDirections?.length ?? 0) >= MAX_POINT_LIGHTS * 3
482
+ ? lights.lightDirections
483
+ : NO_DIRECTIONS;
484
+ const coneCos = (lights.lightConeCos?.length ?? 0) >= MAX_POINT_LIGHTS * 2
485
+ ? lights.lightConeCos
486
+ : OPEN_CONES;
487
+ const iesProfiles = (lights.lightIesProfiles?.length ?? 0) >= MAX_POINT_LIGHTS
488
+ ? lights.lightIesProfiles
489
+ : NO_PROFILES;
490
+ /* Guarded on length like the five above, and for that comment's reason: a short array reaching a
491
+ uniform declared `MAX_POINT_LIGHTS` wide is an `INVALID_VALUE` every frame and a uniform that
492
+ keeps whatever it started with — which here would be a stale reference axis, and a fixture
493
+ whose pattern points somewhere nobody asked for. */
494
+ const iesAxes = (lights.lightIesAxes?.length ?? 0) >= MAX_POINT_LIGHTS * 3
495
+ ? lights.lightIesAxes
496
+ : NO_IES_AXES;
497
+ const cookies = (lights.lightCookies?.length ?? 0) >= MAX_POINT_LIGHTS
498
+ ? lights.lightCookies
499
+ : NO_COOKIES;
500
+ /*
501
+ * Said once, because a consumer who has done this wants to know and does not want it every
502
+ * frame. It is the diagnostic that was missing: the symptom is "the highlights look wrong",
503
+ * which leads nowhere, and the cause is one array the caller forgot to bind.
504
+ */
505
+ if (!warnedShortArrays &&
506
+ (positions === NO_POSITIONS || radii === POINT_SOURCES || sourceRadii === POINT_SOURCES)) {
507
+ warnedShortArrays = true;
508
+ console.warn(`bindPointLights: lightCount is ${count} but at least one light array is shorter than ` +
509
+ `MAX_POINT_LIGHTS (${MAX_POINT_LIGHTS}). Those lights are being drawn unlit or as ` +
510
+ 'points. Bind every array from the same PointLightBuffer: positions, colors, radii, ' +
511
+ 'sourceRadii and weights.');
512
+ }
513
+ out.positions = positions;
514
+ out.colors = colors;
515
+ out.radii = radii;
516
+ out.sourceRadii = sourceRadii;
517
+ out.weights = weights;
518
+ out.directions = directions;
519
+ out.coneCos = coneCos;
520
+ out.iesProfiles = iesProfiles;
521
+ out.iesAxes = iesAxes;
522
+ out.cookies = cookies;
523
+ return out;
524
+ }
@@ -0,0 +1,3 @@
1
+ import { mat4 } from 'gl-matrix';
2
+ import type { Vec3 } from '../math/color.ts';
3
+ export declare function computeLightMatrix(lightDir: Vec3, focusX: number, focusY: number, focusZ: number, radius: number, shadowMapSize: number, out: mat4): number;
@@ -0,0 +1,45 @@
1
+ import { mat4, vec3 } from 'gl-matrix';
2
+ /**
3
+ * Orthographic view-projection for a directional light, covering a sphere of
4
+ * `radius` around a focus point — normally the viewer or the player character.
5
+ *
6
+ * Focusing on the viewer rather than the whole world is what buys shadow
7
+ * resolution: fitting the entire scene spends most of the depth map on geometry
8
+ * nobody is looking at, which is what makes edges read as pixelated.
9
+ *
10
+ * The cost of a moving frustum is swimming edges, so the projection is snapped
11
+ * to whole texel increments. That only works if the light's *view basis* is
12
+ * fixed — it depends on the light direction alone, with every bit of focus
13
+ * movement expressed through the snapped ortho bounds. Anchoring the eye to the
14
+ * focus instead would shift light space underneath the snap and cancel it.
15
+ */
16
+ const ORIGIN = [0, 0, 0];
17
+ const scratchTarget = vec3.create();
18
+ const scratchFocus = vec3.create();
19
+ const scratchView = mat4.create();
20
+ const scratchProj = mat4.create();
21
+ const UP = [0, 1, 0];
22
+ /** Used when the light is near-vertical and `UP` would be degenerate. */
23
+ const UP_FALLBACK = [0, 0, 1];
24
+ export function computeLightMatrix(lightDir, focusX, focusY, focusZ, radius, shadowMapSize, out) {
25
+ const up = Math.abs(lightDir[1]) > 0.999 ? UP_FALLBACK : UP;
26
+ // View basis only — eye pinned at the origin, looking along -lightDir.
27
+ vec3.set(scratchTarget, -lightDir[0], -lightDir[1], -lightDir[2]);
28
+ mat4.lookAt(scratchView, ORIGIN, scratchTarget, up);
29
+ // Where the focus lands in that fixed light space.
30
+ vec3.set(scratchFocus, focusX, focusY, focusZ);
31
+ vec3.transformMat4(scratchFocus, scratchFocus, scratchView);
32
+ // Snap the frustum centre to the texel grid so edges stay put frame to frame.
33
+ const texelWorldSize = (radius * 2) / shadowMapSize;
34
+ const cx = Math.round(scratchFocus[0] / texelWorldSize) * texelWorldSize;
35
+ const cy = Math.round(scratchFocus[1] / texelWorldSize) * texelWorldSize;
36
+ // View space looks down -Z, so distance in front of the eye is -z. Snapped
37
+ // like x and y: an unsnapped depth range leaves the matrix drifting every
38
+ // frame, which defeats the point even though depth alone does not swim.
39
+ const cz = Math.round(-scratchFocus[2] / texelWorldSize) * texelWorldSize;
40
+ mat4.ortho(scratchProj, cx - radius, cx + radius, cy - radius, cy + radius, cz - radius * 3, cz + radius * 3);
41
+ mat4.multiply(out, scratchProj, scratchView);
42
+ // Orthographic depth is linear. The receiving shader uses this exact span
43
+ // to express its residual depth tolerance in stable world-space metres.
44
+ return radius * 6;
45
+ }