@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,111 @@
1
+ /** Whether this renderer string names a part known to struggle with the good profile. */
2
+ export declare function isWeakGpuFamily(rendererName: string): boolean;
3
+ /**
4
+ * What a WebGPU adapter calls the part, in the shape the table above matches.
5
+ *
6
+ * **Here rather than inline in `selectBackend`, because two callers need the identical string.**
7
+ * The backend selection builds it to hand the renderer a part number for the clamp, and
8
+ * `describeGpu` builds it to answer a consumer choosing a profile *before* a renderer exists. Two
9
+ * spellings of this join is the 2026-08-13 rule's first clause exactly: one decision, two
10
+ * implementations, and the drift shows up as a clamp that fires in one path and not the other.
11
+ *
12
+ * Every field is optional and browsers withhold them to differing degrees, so they are joined
13
+ * rather than formatted: a string with a vendor and nothing else is still something the table can
14
+ * recognise. An empty result falls back to the literal `WebGPU`, so nothing that prints it gets a
15
+ * blank — which is also why `isWeakGpuFamily('WebGPU')` is false and must stay false.
16
+ */
17
+ export declare function adapterRendererName(info: GPUAdapterInfo | undefined): string;
18
+ /**
19
+ * What a WebGL2 context calls the part.
20
+ *
21
+ * `WEBGL_debug_renderer_info` is an extension and a browser may withhold it, so the empty string
22
+ * is an ordinary answer and not a failure — `isWeakGpuFamily('')` is false, which is the same
23
+ * "unknown is not weak" rule the table above is built on.
24
+ */
25
+ export declare function webgl2RendererName(gl: WebGL2RenderingContext): string;
26
+ /** What part this machine has, as far as the browser will say. See `describeGpu`. */
27
+ export interface GpuIdentity {
28
+ /**
29
+ * The part's own string, or `''` where the browser declined to name it.
30
+ *
31
+ * The same string `RendererApi.rendererName` carries once a renderer exists, from the same two
32
+ * derivations — this is that answer, moved earlier.
33
+ */
34
+ readonly rendererName: string;
35
+ /** `isWeakGpuFamily(rendererName)`, so a caller does not have to remember to ask. */
36
+ readonly weak: boolean;
37
+ /**
38
+ * Which API answered, and **never a prediction of the backend `createRenderer` will build on.**
39
+ *
40
+ * Naming the part and choosing a backend are different questions with different costs: this
41
+ * asks an adapter for its name, and the selection asks for a *device*, compiles what it was
42
+ * given and reads back a pixel. A machine can name a WebGPU adapter and still end up on WebGL2.
43
+ * The field is here so a bug report can say where the string came from, not so a caller can
44
+ * branch on it.
45
+ */
46
+ readonly source: 'webgpu' | 'webgl2' | 'none';
47
+ }
48
+ /** The seams a test needs. A caller in a browser passes none of them. */
49
+ export interface DescribeGpuOptions {
50
+ /** Whether to ask WebGPU first. Defaults to true, matching `createRenderer`. */
51
+ readonly preferWebGpu?: boolean;
52
+ /** Defaults to `navigator.gpu`. */
53
+ readonly gpu?: GPU | null;
54
+ /**
55
+ * Where the WebGL2 fallback reads its string from. Defaults to a **detached** canvas.
56
+ *
57
+ * **Detached, and that is the whole reason this is not read off the caller's canvas.** A second
58
+ * `getContext('webgl2')` on one canvas returns the *existing* context and silently ignores the
59
+ * attributes, so whoever calls first decides `alpha`, `antialias` and `powerPreference` for
60
+ * everybody — and `Renderer` chooses `antialias` from the very profile a caller is here to
61
+ * decide. Reading the name off the real canvas would settle a rendering attribute as a side
62
+ * effect of asking a question. `webgl2/renderer.ts` records the same trap from the other side,
63
+ * where a consumer doing this by hand was the bug.
64
+ */
65
+ readonly createCanvas?: () => HTMLCanvasElement | null;
66
+ }
67
+ /**
68
+ * Ask what part this machine has, **before** building a renderer.
69
+ *
70
+ * **The gap this closes:** `isWeakGpuFamily` is exported for a consumer to classify the part it is
71
+ * running on, and until now the only string to hand it arrived on a renderer that had already been
72
+ * constructed — by which time the profile has been consumed and, as `applyResolutionScale` puts
73
+ * it, everything except the pixel density is memory allocated at construction. So the one function
74
+ * the engine offers for this decision took an argument the engine would not give you in time.
75
+ * Reported from outside 2026-08-28, by a consumer that had fallen back to `(pointer: coarse)`
76
+ * instead: a good proxy, right about a phone and wrong about a weak desktop, which is exactly the
77
+ * case `isWeakGpuFamily` exists for.
78
+ *
79
+ * **WebGL2 is asked first, and that order is a measurement rather than a preference.** The first
80
+ * version of this asked WebGPU first, and on this machine it answered `amd rdna-4` where the built
81
+ * WebGL2 renderer answered `ANGLE (AMD, Vulkan 1.4.354 (AMD Radeon RX 9070 XT (RADV GFX1201)
82
+ * (0x00007550)), radv)` — the same part, two spellings, and only one of them carries a model
83
+ * number. That is not cosmetic: `GPUAdapterInfo` reports an *architecture bucket* to limit
84
+ * fingerprinting, so `adreno-7xx` is one string for both the 710 measured at 112 ms a frame and
85
+ * the 740 in a flagship, and the table above deliberately refuses to clamp it. The unmasked
86
+ * WebGL2 string says `Adreno (TM) 710` and the table does clamp that. Asking the API that names
87
+ * the part first therefore gives a **more accurate verdict on the devices this table exists for**,
88
+ * and it costs an adapter request less on every machine that answers.
89
+ *
90
+ * **So this can be more precise than the renderer's own `rendererName`, and a caller comparing
91
+ * the two should expect that** rather than read it as a fault: a WebGPU renderer on that phone
92
+ * knows only `adreno-7xx` and its internal clamp cannot fire, while a consumer that called this
93
+ * has the part number and can choose a profile the clamp could not reach.
94
+ *
95
+ * **What it costs** is one detached WebGL2 context, created and immediately handed back, and — only
96
+ * where that declines to name the part — one adapter request. An adapter request, not a device
97
+ * request, which is the cheap half of what `selectBackend` does. Only a consumer that asks pays it.
98
+ *
99
+ * **Why this rather than a callback inside `createRenderer`.** Handing the profile in as a function
100
+ * of the part was the alternative and was not taken: the WebGL2 name cannot be read off the real
101
+ * canvas before the profile is chosen anyway, since that canvas's `antialias` comes *from* the
102
+ * profile; and a fallback from WebGPU to WebGL2 mid-creation would have to call that function a
103
+ * second time with a different identity, which is a re-entrancy trap inside the one function every
104
+ * consumer calls. This keeps the decision in the consumer's hands and the signature unchanged.
105
+ *
106
+ * **Nothing here throws.** A machine that will name itself through neither API is an ordinary
107
+ * outcome and answers `source: 'none'` with an empty name — which `isWeakGpuFamily` reads as *not
108
+ * weak*, the same "unknown is not weak" rule the table is built on. A caller gets the good profile
109
+ * and `ResolutionGovernor` corrects it from measurement, which is the design.
110
+ */
111
+ export declare function describeGpu(options?: DescribeGpuOptions): Promise<GpuIdentity>;
@@ -0,0 +1,194 @@
1
+ /**
2
+ * A hint, from the renderer string, about whether this part can hold the good profile.
3
+ *
4
+ * **It is a hint and never the authority.** A device database is a thing to maintain and
5
+ * it is wrong about every GPU nobody has tested, so the unknown case is deliberately *not*
6
+ * weak: guessing weak on the unknown would ship a soft picture to every device released
7
+ * after this line was written. `ResolutionGovernor` is what corrects a wrong guess, in both
8
+ * directions, from measurement rather than from a table.
9
+ *
10
+ * The families listed are the ones this project has evidence for, and each is a
11
+ * measurement rather than a reputation:
12
+ *
13
+ * - **Adreno 5xx/6xx and 70x/71x** — `NFD6QQ`, an Adreno 619 at 156.66 ms a frame that
14
+ * then lost its context outright, and `JBL3XG`, an Adreno 710 at 112 ms. Both were
15
+ * opened at the desktop profile because the default quality is a constant.
16
+ * - **Intel HD/UHD** — a UHD 630 that was unplayable fullscreen and *"perfetto"* in a
17
+ * small window, which is the signature of a part using system RAM as VRAM.
18
+ * - **Mali-G3x/G5x and PowerVR** — the same class as those Adrenos by every public number.
19
+ * No report from either yet; listed because the cost of being wrong is a picture one
20
+ * step softer than it needed to be, and the cost of omitting them is another `NFD6QQ`.
21
+ *
22
+ * Adreno 72x-8xx and the Immortalis Malis are excluded on purpose. `JBL3XG`'s 710 is the
23
+ * one 7xx data point and it belongs to the mid-range; the flagships hold the budget. If a
24
+ * second 7xx report lands, move that whole family here rather than special-casing a number.
25
+ */
26
+ /**
27
+ * **WebGPU does not hand out part numbers, and that changes what this table can match.**
28
+ *
29
+ * `UNMASKED_RENDERER_WEBGL` gives a string like `ANGLE (Qualcomm, Adreno (TM) 619, OpenGL ES
30
+ * 3.2)`. `GPUAdapterInfo` deliberately does not: it reports a vendor and an *architecture
31
+ * bucket*, to reduce fingerprinting entropy. Measured on this machine, an RX 9070 XT reports
32
+ * `vendor: "amd", architecture: "rdna-4"` and nothing else — no model, no description.
33
+ *
34
+ * So the patterns below have to recognise both shapes, and the bucketed one costs precision:
35
+ * `adreno-7xx` cannot distinguish the 710 that was measured at 112 ms a frame from the 740 in
36
+ * a current flagship. **It is therefore deliberately absent**, on the same reasoning that keeps
37
+ * the unknown part unclamped — guessing weak is a soft picture for somebody who did not need
38
+ * one, and `ResolutionGovernor` corrects a wrong guess from measurement in either direction.
39
+ *
40
+ * The bucket spellings are inferred from the specification's vocabulary rather than read off a
41
+ * device this project owns, so a phone that ought to clamp and does not is a bug in these two
42
+ * lines rather than in the mechanism. `Renderer.rendererName` is reported in the game's boot
43
+ * log for exactly that reason: the string a real device gives settles it in one message.
44
+ */
45
+ const WEAK_ARCHITECTURES = [/adreno-[56]xx/, /mali-g[35]x/];
46
+ const WEAK_FAMILIES = [
47
+ ...WEAK_ARCHITECTURES,
48
+ // Adreno 5xx and 6xx entirely, plus the 700 and 710 mid-range.
49
+ /adreno\s*(?:\(tm\))?\s*[56]\d\d/,
50
+ /adreno\s*(?:\(tm\))?\s*7[01]\d/,
51
+ // `Intel(R) HD Graphics 520`, `Intel(R) UHD Graphics 630`, and the same without the (R).
52
+ /intel(?:\(r\))?\s+u?hd\s+graphics/,
53
+ // Mali-G31 through G57. The Immortalis and G6xx/G7xx parts are not here.
54
+ /mali-g[35]\d/,
55
+ /powervr/,
56
+ ];
57
+ /** Whether this renderer string names a part known to struggle with the good profile. */
58
+ export function isWeakGpuFamily(rendererName) {
59
+ const name = rendererName.toLowerCase();
60
+ return WEAK_FAMILIES.some((pattern) => pattern.test(name));
61
+ }
62
+ /**
63
+ * What a WebGPU adapter calls the part, in the shape the table above matches.
64
+ *
65
+ * **Here rather than inline in `selectBackend`, because two callers need the identical string.**
66
+ * The backend selection builds it to hand the renderer a part number for the clamp, and
67
+ * `describeGpu` builds it to answer a consumer choosing a profile *before* a renderer exists. Two
68
+ * spellings of this join is the 2026-08-13 rule's first clause exactly: one decision, two
69
+ * implementations, and the drift shows up as a clamp that fires in one path and not the other.
70
+ *
71
+ * Every field is optional and browsers withhold them to differing degrees, so they are joined
72
+ * rather than formatted: a string with a vendor and nothing else is still something the table can
73
+ * recognise. An empty result falls back to the literal `WebGPU`, so nothing that prints it gets a
74
+ * blank — which is also why `isWeakGpuFamily('WebGPU')` is false and must stay false.
75
+ */
76
+ export function adapterRendererName(info) {
77
+ return ([info?.description, info?.vendor, info?.architecture, info?.device]
78
+ .filter((part) => typeof part === 'string' && part.length > 0)
79
+ .join(' ')
80
+ .trim() || 'WebGPU');
81
+ }
82
+ /**
83
+ * What a WebGL2 context calls the part.
84
+ *
85
+ * `WEBGL_debug_renderer_info` is an extension and a browser may withhold it, so the empty string
86
+ * is an ordinary answer and not a failure — `isWeakGpuFamily('')` is false, which is the same
87
+ * "unknown is not weak" rule the table above is built on.
88
+ */
89
+ export function webgl2RendererName(gl) {
90
+ const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
91
+ if (debugInfo === null)
92
+ return '';
93
+ return String(gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) ?? '');
94
+ }
95
+ const UNKNOWN = { rendererName: '', weak: false, source: 'none' };
96
+ /**
97
+ * Ask what part this machine has, **before** building a renderer.
98
+ *
99
+ * **The gap this closes:** `isWeakGpuFamily` is exported for a consumer to classify the part it is
100
+ * running on, and until now the only string to hand it arrived on a renderer that had already been
101
+ * constructed — by which time the profile has been consumed and, as `applyResolutionScale` puts
102
+ * it, everything except the pixel density is memory allocated at construction. So the one function
103
+ * the engine offers for this decision took an argument the engine would not give you in time.
104
+ * Reported from outside 2026-08-28, by a consumer that had fallen back to `(pointer: coarse)`
105
+ * instead: a good proxy, right about a phone and wrong about a weak desktop, which is exactly the
106
+ * case `isWeakGpuFamily` exists for.
107
+ *
108
+ * **WebGL2 is asked first, and that order is a measurement rather than a preference.** The first
109
+ * version of this asked WebGPU first, and on this machine it answered `amd rdna-4` where the built
110
+ * WebGL2 renderer answered `ANGLE (AMD, Vulkan 1.4.354 (AMD Radeon RX 9070 XT (RADV GFX1201)
111
+ * (0x00007550)), radv)` — the same part, two spellings, and only one of them carries a model
112
+ * number. That is not cosmetic: `GPUAdapterInfo` reports an *architecture bucket* to limit
113
+ * fingerprinting, so `adreno-7xx` is one string for both the 710 measured at 112 ms a frame and
114
+ * the 740 in a flagship, and the table above deliberately refuses to clamp it. The unmasked
115
+ * WebGL2 string says `Adreno (TM) 710` and the table does clamp that. Asking the API that names
116
+ * the part first therefore gives a **more accurate verdict on the devices this table exists for**,
117
+ * and it costs an adapter request less on every machine that answers.
118
+ *
119
+ * **So this can be more precise than the renderer's own `rendererName`, and a caller comparing
120
+ * the two should expect that** rather than read it as a fault: a WebGPU renderer on that phone
121
+ * knows only `adreno-7xx` and its internal clamp cannot fire, while a consumer that called this
122
+ * has the part number and can choose a profile the clamp could not reach.
123
+ *
124
+ * **What it costs** is one detached WebGL2 context, created and immediately handed back, and — only
125
+ * where that declines to name the part — one adapter request. An adapter request, not a device
126
+ * request, which is the cheap half of what `selectBackend` does. Only a consumer that asks pays it.
127
+ *
128
+ * **Why this rather than a callback inside `createRenderer`.** Handing the profile in as a function
129
+ * of the part was the alternative and was not taken: the WebGL2 name cannot be read off the real
130
+ * canvas before the profile is chosen anyway, since that canvas's `antialias` comes *from* the
131
+ * profile; and a fallback from WebGPU to WebGL2 mid-creation would have to call that function a
132
+ * second time with a different identity, which is a re-entrancy trap inside the one function every
133
+ * consumer calls. This keeps the decision in the consumer's hands and the signature unchanged.
134
+ *
135
+ * **Nothing here throws.** A machine that will name itself through neither API is an ordinary
136
+ * outcome and answers `source: 'none'` with an empty name — which `isWeakGpuFamily` reads as *not
137
+ * weak*, the same "unknown is not weak" rule the table is built on. A caller gets the good profile
138
+ * and `ResolutionGovernor` corrects it from measurement, which is the design.
139
+ */
140
+ export async function describeGpu(options = {}) {
141
+ const named = (rendererName, source) => ({
142
+ rendererName,
143
+ weak: isWeakGpuFamily(rendererName),
144
+ source,
145
+ });
146
+ /* WebGL2 first: it is the API that gives a model number. See the header for the measurement. */
147
+ const canvas = options.createCanvas === undefined
148
+ ? (globalThis.document?.createElement('canvas') ?? null)
149
+ : options.createCanvas();
150
+ if (canvas !== null) {
151
+ let gl = null;
152
+ try {
153
+ gl = canvas.getContext('webgl2');
154
+ }
155
+ catch {
156
+ gl = null;
157
+ }
158
+ if (gl !== null) {
159
+ const name = webgl2RendererName(gl);
160
+ /*
161
+ * Handed back promptly rather than left to the collector. A detached canvas holding a live
162
+ * context is a GPU allocation nothing will use again, and a boot that leaks one on every
163
+ * consumer is the kind of cost this function has no business adding.
164
+ */
165
+ gl.getExtension('WEBGL_lose_context')?.loseContext();
166
+ if (name !== '')
167
+ return named(name, 'webgl2');
168
+ }
169
+ }
170
+ /*
171
+ * Only where WebGL2 declined to name the part — a browser withholding
172
+ * `WEBGL_debug_renderer_info`, or one with no WebGL2 at all. The bucketed adapter string is
173
+ * less precise and is better than nothing.
174
+ */
175
+ if (options.preferWebGpu ?? true) {
176
+ const gpu = options.gpu === undefined ? globalThis.navigator?.gpu : options.gpu;
177
+ if (gpu != null) {
178
+ try {
179
+ const adapter = await gpu.requestAdapter();
180
+ /*
181
+ * A browser that offers no adapter has told us nothing about the part, so this answers
182
+ * unknown rather than `WebGPU` — the literal the join defaults to would be a name nobody
183
+ * can act on standing where the absence of one is the honest answer.
184
+ */
185
+ if (adapter !== null)
186
+ return named(adapterRendererName(adapter.info), 'webgpu');
187
+ }
188
+ catch {
189
+ /* An adapter request that throws is a machine without usable WebGPU. */
190
+ }
191
+ }
192
+ }
193
+ return UNKNOWN;
194
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * How long the GPU actually spent, in three parts.
3
+ *
4
+ * Wall clock cannot answer this. It is vsync-capped long before a GPU is saturated, so
5
+ * every configuration from Low to 4K High reads the same on a clock while the GPU times
6
+ * behind them span 13.5x. That gap is the difference between a machine with headroom and
7
+ * one running the game at 3 fps.
8
+ *
9
+ * **The frame is partitioned, not nested.** `TIME_ELAPSED_EXT` cannot nest, so there is
10
+ * no whole-frame query wrapped around two inner ones — three sequential brackets sum to
11
+ * the frame instead, and `rest` earns its slot by being the number that says *this one
12
+ * is not shadows*.
13
+ *
14
+ * Sampled one frame in eight. Seven samples a second is ample for a distribution, and it
15
+ * removes any argument about query overhead on drivers nobody here owns.
16
+ */
17
+ import type { FrameTimer } from './backend/timer.ts';
18
+ export declare const GPU_SLOTS: readonly ['shadows', 'reflection', 'rest'];
19
+ export type GpuSlot = (typeof GPU_SLOTS)[number];
20
+ /** Milliseconds per bracket. */
21
+ export interface GpuSample {
22
+ readonly shadows: number;
23
+ readonly reflection: number;
24
+ readonly rest: number;
25
+ }
26
+ export declare class GpuTimer implements FrameTimer {
27
+ private readonly gl;
28
+ /** False where the extension is missing or disabled, which is a normal state. */
29
+ readonly available: boolean;
30
+ /** Samples the driver said were untrustworthy. Reported, never silently dropped. */
31
+ disjointDrops: number;
32
+ /**
33
+ * The last sample `poll` resolved, held so `lastFrameMs` can answer without re-reading.
34
+ *
35
+ * Null until one resolves, and null is the honest answer for a device with no extension:
36
+ * unmeasured is not zero.
37
+ */
38
+ private lastSample;
39
+ private readonly ext;
40
+ private readonly sampleEvery;
41
+ /** Completed triples waiting to be read, oldest first. */
42
+ private readonly inFlight;
43
+ private current;
44
+ private open;
45
+ private frame;
46
+ private measuring;
47
+ /** Whether `beginFrame` said yes for the frame being drawn. */
48
+ get sampling(): boolean;
49
+ constructor(gl: WebGL2RenderingContext, sampleEvery?: number);
50
+ /**
51
+ * Whether this frame is measured. Call once per frame, before any `begin`.
52
+ *
53
+ * `begin` and `end` do nothing on an unmeasured frame, so the skipped frames really
54
+ * are free rather than merely cheap.
55
+ */
56
+ beginFrame(): boolean;
57
+ /**
58
+ * Close the frame and queue it for reading.
59
+ *
60
+ * Explicit rather than counting to three, because the shadow pass runs **several
61
+ * times a frame** — static, the depth peel, then dynamic — and the reflection pass
62
+ * may not run at all when water is off. A frame is over when the caller says so,
63
+ * and `poll` sums the brackets per slot, so three shadow passes are one shadow
64
+ * number rather than three partial ones.
65
+ */
66
+ endFrame(): void;
67
+ /**
68
+ * Open a bracket. Never two at once — `TIME_ELAPSED_EXT` cannot nest, and the
69
+ * partition is what guarantees `end` runs before the next `begin`.
70
+ */
71
+ begin(slot: GpuSlot): void;
72
+ end(): void;
73
+ /**
74
+ * The oldest finished sample, or null. Never blocks and never waits for a result:
75
+ * a diagnostic that stalls the pipeline to measure it is measuring itself.
76
+ */
77
+ poll(): GpuSample | null;
78
+ /**
79
+ * The whole of the last resolved frame, in milliseconds, or null where nothing measured.
80
+ *
81
+ * The three brackets are summed because they partition the frame rather than overlapping:
82
+ * `shadows` and `reflection` are the passes drawn before the scene, `rest` is everything
83
+ * after. A caller wanting the breakdown reads `poll`, which is what the frame meter does.
84
+ */
85
+ lastFrameMs(): number | null;
86
+ dispose(): void;
87
+ }
@@ -0,0 +1,145 @@
1
+ export const GPU_SLOTS = ['shadows', 'reflection', 'rest'];
2
+ /** In flight at once. Past this a frame is skipped rather than allocating. */
3
+ const POOL_DEPTH = 4;
4
+ const NS_PER_MS = 1e6;
5
+ export class GpuTimer {
6
+ gl;
7
+ /** False where the extension is missing or disabled, which is a normal state. */
8
+ available;
9
+ /** Samples the driver said were untrustworthy. Reported, never silently dropped. */
10
+ disjointDrops = 0;
11
+ /**
12
+ * The last sample `poll` resolved, held so `lastFrameMs` can answer without re-reading.
13
+ *
14
+ * Null until one resolves, and null is the honest answer for a device with no extension:
15
+ * unmeasured is not zero.
16
+ */
17
+ lastSample = null;
18
+ ext;
19
+ sampleEvery;
20
+ /** Completed triples waiting to be read, oldest first. */
21
+ inFlight = [];
22
+ current = null;
23
+ open = false;
24
+ frame = 0;
25
+ measuring = false;
26
+ /** Whether `beginFrame` said yes for the frame being drawn. */
27
+ get sampling() {
28
+ return this.measuring;
29
+ }
30
+ constructor(gl, sampleEvery = 8) {
31
+ this.gl = gl;
32
+ this.ext = gl.getExtension('EXT_disjoint_timer_query_webgl2');
33
+ this.available = this.ext !== null;
34
+ this.sampleEvery = Math.max(1, Math.floor(sampleEvery));
35
+ }
36
+ /**
37
+ * Whether this frame is measured. Call once per frame, before any `begin`.
38
+ *
39
+ * `begin` and `end` do nothing on an unmeasured frame, so the skipped frames really
40
+ * are free rather than merely cheap.
41
+ */
42
+ beginFrame() {
43
+ if (this.ext === null)
44
+ return false;
45
+ const measured = this.frame % this.sampleEvery === 0;
46
+ this.frame++;
47
+ this.measuring = measured && this.inFlight.length < POOL_DEPTH;
48
+ if (this.measuring)
49
+ this.current = { queries: [], slots: [] };
50
+ return this.measuring;
51
+ }
52
+ /**
53
+ * Close the frame and queue it for reading.
54
+ *
55
+ * Explicit rather than counting to three, because the shadow pass runs **several
56
+ * times a frame** — static, the depth peel, then dynamic — and the reflection pass
57
+ * may not run at all when water is off. A frame is over when the caller says so,
58
+ * and `poll` sums the brackets per slot, so three shadow passes are one shadow
59
+ * number rather than three partial ones.
60
+ */
61
+ endFrame() {
62
+ if (!this.measuring || this.current === null)
63
+ return;
64
+ if (this.current.queries.length > 0)
65
+ this.inFlight.push(this.current);
66
+ this.current = null;
67
+ this.measuring = false;
68
+ }
69
+ /**
70
+ * Open a bracket. Never two at once — `TIME_ELAPSED_EXT` cannot nest, and the
71
+ * partition is what guarantees `end` runs before the next `begin`.
72
+ */
73
+ begin(slot) {
74
+ if (!this.measuring || this.ext === null || this.open)
75
+ return;
76
+ const query = this.gl.createQuery();
77
+ if (query === null)
78
+ return;
79
+ this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT, query);
80
+ this.current?.queries.push(query);
81
+ this.current?.slots.push(slot);
82
+ this.open = true;
83
+ }
84
+ end() {
85
+ if (!this.measuring || this.ext === null || !this.open)
86
+ return;
87
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
88
+ this.open = false;
89
+ }
90
+ /**
91
+ * The oldest finished sample, or null. Never blocks and never waits for a result:
92
+ * a diagnostic that stalls the pipeline to measure it is measuring itself.
93
+ */
94
+ poll() {
95
+ if (this.ext === null)
96
+ return null;
97
+ const oldest = this.inFlight[0];
98
+ if (oldest === undefined)
99
+ return null;
100
+ for (const query of oldest.queries) {
101
+ const ready = this.gl.getQueryParameter(query, this.gl.QUERY_RESULT_AVAILABLE);
102
+ if (!ready)
103
+ return null;
104
+ }
105
+ this.inFlight.shift();
106
+ const disjoint = this.gl.getParameter(this.ext.GPU_DISJOINT_EXT);
107
+ if (disjoint) {
108
+ this.disjointDrops++;
109
+ for (const query of oldest.queries)
110
+ this.gl.deleteQuery(query);
111
+ return null;
112
+ }
113
+ // Summed per slot, not assigned: the shadow pass runs once per layer, so a frame
114
+ // holds several `shadows` brackets and the answer is their total.
115
+ const parts = { shadows: 0, reflection: 0, rest: 0 };
116
+ for (let i = 0; i < oldest.queries.length; i++) {
117
+ const query = oldest.queries[i];
118
+ const slot = oldest.slots[i];
119
+ parts[slot] += this.gl.getQueryParameter(query, this.gl.QUERY_RESULT) / NS_PER_MS;
120
+ this.gl.deleteQuery(query);
121
+ }
122
+ this.lastSample = parts;
123
+ return parts;
124
+ }
125
+ /**
126
+ * The whole of the last resolved frame, in milliseconds, or null where nothing measured.
127
+ *
128
+ * The three brackets are summed because they partition the frame rather than overlapping:
129
+ * `shadows` and `reflection` are the passes drawn before the scene, `rest` is everything
130
+ * after. A caller wanting the breakdown reads `poll`, which is what the frame meter does.
131
+ */
132
+ lastFrameMs() {
133
+ if (this.lastSample === null)
134
+ return null;
135
+ return this.lastSample.shadows + this.lastSample.reflection + this.lastSample.rest;
136
+ }
137
+ dispose() {
138
+ for (const pending of this.inFlight) {
139
+ for (const query of pending.queries)
140
+ this.gl.deleteQuery(query);
141
+ }
142
+ this.inFlight.length = 0;
143
+ this.current = null;
144
+ }
145
+ }
@@ -0,0 +1,4 @@
1
+ /** IEEE 754 binary16 conversion, shared by everything that has to hand a device half floats. */
2
+ export declare function halfBits(value: number): number;
3
+ /** A whole array of floats as binary16, which is what a `r16float` or `rgba16float` upload wants. */
4
+ export declare function toHalfFloats(values: Float32Array): Uint16Array;
@@ -0,0 +1,38 @@
1
+ /** IEEE 754 binary16 conversion, shared by everything that has to hand a device half floats. */
2
+ /** IEEE 754 binary16, via a float32 view, which is the only exact way to read the bits. */
3
+ const conversion = new ArrayBuffer(4);
4
+ const asFloat = new Float32Array(conversion);
5
+ const asUint = new Uint32Array(conversion);
6
+ export function halfBits(value) {
7
+ asFloat[0] = value;
8
+ const bits = asUint[0] ?? 0;
9
+ const sign = (bits >>> 16) & 0x8000;
10
+ let exponent = (bits >>> 23) & 0xff;
11
+ let mantissa = bits & 0x7fffff;
12
+ /* Infinity and NaN carry straight across; a NaN must stay a NaN rather than becoming infinity. */
13
+ if (exponent === 0xff)
14
+ return sign | 0x7c00 | (mantissa === 0 ? 0 : 0x200);
15
+ /* Rebias 127 to 15. Above half's range saturates to infinity rather than wrapping to zero. */
16
+ exponent = exponent - 127 + 15;
17
+ if (exponent >= 0x1f)
18
+ return sign | 0x7c00;
19
+ if (exponent <= 0) {
20
+ /*
21
+ * Subnormal. An environment's darkest texels live here, and flushing them to zero is what
22
+ * makes a night sky's gradient band — so they are shifted rather than discarded.
23
+ */
24
+ if (exponent < -10)
25
+ return sign;
26
+ mantissa |= 0x800000;
27
+ const shift = 14 - exponent;
28
+ return sign | (mantissa >>> shift);
29
+ }
30
+ return sign | (exponent << 10) | (mantissa >>> 13);
31
+ }
32
+ /** A whole array of floats as binary16, which is what a `r16float` or `rgba16float` upload wants. */
33
+ export function toHalfFloats(values) {
34
+ const out = new Uint16Array(values.length);
35
+ for (let i = 0; i < values.length; i++)
36
+ out[i] = halfBits(values[i] ?? 0);
37
+ return out;
38
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * A slot table addressed by generational handles.
3
+ *
4
+ * **The handle arithmetic, and nothing about what a handle names.** It came out of `pass.ts`
5
+ * when a second registry wanted exactly this: two copies of a generation rule are two chances to
6
+ * get the invalidation wrong, and the failure mode is a handle answering to whoever took its slot
7
+ * next — a use-after-free that reads as a leak.
8
+ *
9
+ * The definition type is a parameter rather than a union of the two kinds it holds. A union would
10
+ * oblige every caller to narrow a value it already knows the type of, and would make adding a
11
+ * third kind an edit to this file rather than to the caller that wanted it.
12
+ */
13
+ export interface HandleRegistry<T> {
14
+ definitions: (T | undefined)[];
15
+ /** Bumped whenever a slot is released, which is what invalidates the handles that named it. */
16
+ generations: number[];
17
+ /** Slots released and not yet reused, so registration does not grow the array forever. */
18
+ free: number[];
19
+ }
20
+ export declare function createHandleRegistry<T>(): HandleRegistry<T>;
21
+ /**
22
+ * Take a slot and return the handle that names it.
23
+ *
24
+ * Handles start at 1: zero is a generation-0 slot-0 handle and would be indistinguishable from
25
+ * the number a caller gets from an uninitialised field, so generations start at 1 instead.
26
+ */
27
+ export declare function registerIn<T>(registry: HandleRegistry<T>, definition: T): number;
28
+ /** The definition a handle names, or `undefined` if it names one that has been released. */
29
+ export declare function definitionAt<T>(registry: HandleRegistry<T>, handle: number): T | undefined;
30
+ /**
31
+ * Release a slot.
32
+ *
33
+ * Guarded on the handle still being live, so calling it twice frees the slot once — a slot
34
+ * pushed onto `free` twice is a slot handed to two different definitions.
35
+ */
36
+ export declare function unregisterIn<T>(registry: HandleRegistry<T>, handle: number): T | undefined;
37
+ /**
38
+ * Release every slot still held, handing each definition to the caller on the way out.
39
+ *
40
+ * **Teardown's half of `unregisterIn`, and it was missing.** Both renderers hold registries like
41
+ * this one and neither emptied one when it was disposed, so a definition kept whatever `init`
42
+ * built — a pipeline, a bind group, its buffers — for as long as the process lived. A private
43
+ * field going out of scope is not a GPU object being destroyed. Written here rather than once per
44
+ * backend for the reason this module exists at all: two copies of a lifetime rule are two chances
45
+ * to get it wrong, and the one that is wrong is the one nobody reads.
46
+ *
47
+ * `release` is the caller's, because the device object a definition must be handed is the only
48
+ * part of this that is per-backend — and on one of them there is a condition on handing it over
49
+ * at all.
50
+ *
51
+ * Each slot is released *before* its definition is told, so a `release` that reaches back into
52
+ * this registry finds a slot already gone rather than one it can free twice.
53
+ */
54
+ export declare function drainRegistry<T>(registry: HandleRegistry<T>, release: (definition: T) => void): void;