@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,139 @@
1
+ /**
2
+ * What a frame asked of a backend, against what that backend allows.
3
+ *
4
+ * **This exists because a ceiling firing was unobservable.** The WebGPU backend holds ten per-frame
5
+ * ceilings — draws, material changes, overlays, water bodies, light volumes, plumes, three kinds of
6
+ * effect batch and the scatter shadow round — and past any of them it skips the work and writes one
7
+ * `console.warn` for the lifetime of the renderer. WebGL2 holds none of them and draws everything.
8
+ * So a scene over a ceiling renders differently on the two backends, silently, and a consumer
9
+ * developing against WebGL2 has no way to see it coming.
10
+ *
11
+ * **The cost of that was measured from outside.** A consumer spent weeks on ground that
12
+ * vanished and reappeared as the camera moved; its own report still lists, as the decisive
13
+ * experiment nobody has run, *"ask the reporter for the console"*. It wrote a draw counter and a
14
+ * per-material `reach` field of its own to guess at a worst case this renderer already knew
15
+ * exactly.
16
+ *
17
+ * **A count, not a log.** A warning cannot be asserted on, cannot be read from a headless check,
18
+ * and is gone by the time anybody looks. A number can be all three, and the whole point of the
19
+ * shape below is that `dropped` is one boolean a consumer's own suite can fail on.
20
+ */
21
+
22
+ /** One ceiling's frame. Updated in place, so holding a reference to it is the intended use. */
23
+ export interface BudgetLine {
24
+ /** What a consumer would call the thing, not what the ring holding it is called. */
25
+ readonly name: string;
26
+ /**
27
+ * How many were **asked for**, including any that were refused.
28
+ *
29
+ * The distinction is the whole value of this field. A ring naturally knows how many slots it
30
+ * handed out, which tops out at the ceiling and says a frame is exactly full; what a consumer
31
+ * needs is how far past it the scene went, because that is the number that says how much to cut.
32
+ */
33
+ readonly used: number;
34
+ /** The ceiling, or `null` where this backend imposes none. */
35
+ readonly ceiling: number | null;
36
+ /** How many were asked for and not drawn. */
37
+ readonly dropped: number;
38
+ }
39
+
40
+ /**
41
+ * The half a backend writes: a line it can count against.
42
+ *
43
+ * Separate from `BudgetLine` so that what a consumer is handed is read-only — a caller able to
44
+ * call `drop()` on the renderer's own budget could clear a check that was about to fail.
45
+ */
46
+ export interface BudgetCounter extends BudgetLine {
47
+ /** One more of this thing was asked for, whether or not it will fit. */
48
+ ask(): void;
49
+ /** One of them was refused, and the frame is marked. */
50
+ drop(): void;
51
+ }
52
+
53
+ class Line implements BudgetCounter {
54
+ used = 0;
55
+ dropped = 0;
56
+
57
+ constructor(
58
+ readonly name: string,
59
+ readonly ceiling: number | null,
60
+ private readonly budget: FrameBudget,
61
+ ) {}
62
+
63
+ /** One more of this thing was asked for, whether or not it will fit. */
64
+ ask(): void {
65
+ this.used += 1;
66
+ }
67
+
68
+ /** One of them was refused. Marks the frame, which is what a consumer asserts on. */
69
+ drop(): void {
70
+ this.dropped += 1;
71
+ this.budget.markDropped();
72
+ }
73
+
74
+ reset(): void {
75
+ this.used = 0;
76
+ this.dropped = 0;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Every ceiling a backend imposes, counted for the frame just drawn.
82
+ *
83
+ * **The lines and the array holding them are allocated once and updated in place**, so a consumer
84
+ * reading this every frame allocates nothing — which is what `AGENTS.md` requires of anything on a
85
+ * per-frame path, and a budget nobody can afford to read every frame is a budget nobody reads.
86
+ */
87
+ export class FrameBudget {
88
+ private readonly all: Line[] = [];
89
+ private anyDropped = false;
90
+
91
+ /**
92
+ * Declare a line. Called at construction, never in a frame.
93
+ *
94
+ * `ceiling` is `null` for a backend that imposes none — reported rather than omitted, because a
95
+ * line that disappears on one backend is a line a cross-backend check cannot compare.
96
+ */
97
+ line(name: string, ceiling: number | null): BudgetCounter {
98
+ for (const existing of this.all) {
99
+ if (existing.name === name) {
100
+ throw new Error(
101
+ `frame budget: a line named ${name} is already declared. Two subsystems sharing one ` +
102
+ 'ceiling constant still need a line each, or a consumer told which number ran out ' +
103
+ 'cannot tell which of them to cut.',
104
+ );
105
+ }
106
+ }
107
+ const line = new Line(name, ceiling, this);
108
+ this.all.push(line);
109
+ return line;
110
+ }
111
+
112
+ /** Every line, in the order declared. The same array every frame. */
113
+ get lines(): readonly BudgetLine[] {
114
+ return this.all;
115
+ }
116
+
117
+ /**
118
+ * Whether anything at all was refused this frame.
119
+ *
120
+ * **The one thing worth asserting on**, and the reason it is a field rather than a walk over
121
+ * `lines`: a consumer's headless check wants `expect(renderer.frameBudget.dropped).toBe(false)`
122
+ * on every scene it renders, and a check that has to know which lines exist is a check that
123
+ * misses the line added after it was written.
124
+ */
125
+ get dropped(): boolean {
126
+ return this.anyDropped;
127
+ }
128
+
129
+ /** @internal Marked by a line, not by a caller. */
130
+ markDropped(): void {
131
+ this.anyDropped = true;
132
+ }
133
+
134
+ /** Start a frame. Keeps every line object; clears what they hold. */
135
+ reset(): void {
136
+ for (const line of this.all) line.reset();
137
+ this.anyDropped = false;
138
+ }
139
+ }
@@ -0,0 +1,343 @@
1
+ import { Renderer } from './webgl2/renderer.ts';
2
+ import { resolveRenderQuality, type RenderQualityOptions } from '../renderQuality.ts';
3
+ import type { RenderBackend, RendererApi } from './api.ts';
4
+ import { BACKEND_TIMEOUT_MS, forcedBackend, selectBackend } from './select.ts';
5
+ import { TIMED_OUT, withDeadline } from './deadline.ts';
6
+ import { mountSplash, type MountedSplash, type SplashOptions } from '../../ui/splash.ts';
7
+
8
+ /** Everything about selection a caller may want to decide instead of inherit. */
9
+ export interface CreateRendererOptions {
10
+ /**
11
+ * Whether to try WebGPU at all. **Defaults to true**: WebGPU is the backend this engine is
12
+ * built on now, and WebGL2 is the fallback beneath it rather than the path of record.
13
+ *
14
+ * It defaulted to false for as long as the second backend was under construction, and the
15
+ * comment holding it there pointed at a numbered task in a plan. That is how a default
16
+ * outlives its reason: by the time it was wrong, every consumer in the workspace was already
17
+ * passing `true`, so the conservative default was overridden everywhere and true nowhere.
18
+ *
19
+ * **What this costs** is an `await` on `requestAdapter` in a boot that previously had none,
20
+ * on every consumer that never mentioned a backend. Pass `false` to decline it and get the
21
+ * old boot exactly. **What would make it wrong** is an adapter request slow enough to be felt
22
+ * at startup on a device that was never going to yield a device anyway; nothing measured here
23
+ * shows that, and the fallback is silent when it happens.
24
+ */
25
+ readonly preferWebGpu?: boolean;
26
+ /**
27
+ * The query string to read `?backend=` from. Defaults to the document's own.
28
+ *
29
+ * Injectable because a test has no `location`, and because an application that routes
30
+ * without touching the address bar should be able to say what it means.
31
+ */
32
+ readonly search?: string;
33
+ /**
34
+ * Shader sources the acceptance probe compiles before a device is accepted. Empty by default.
35
+ *
36
+ * **Empty because it was measured, not assumed.** On an AMD Radeon RX 9070 XT (RADV, ANGLE over
37
+ * Vulkan) the draw-and-read check alone costs **4.2–5.4 ms** and catches a device that validates
38
+ * everything and rasterises nothing; adding all **46** generated WGSL modules costs a further
39
+ * **58–62 ms** on every boot and catches the class that
40
+ * `packages/core/src/render/shaders/uniformStride.test.ts` already catches at test time, by
41
+ * reading the committed files. Sixty milliseconds of every player's startup is a poor price for
42
+ * a second copy of a test.
43
+ *
44
+ * **What would make an empty default wrong** is a device-specific compile failure in a shader
45
+ * that test cannot model — which is precisely what the iOS black screen was before that test
46
+ * existed. A consumer shipping to a platform nobody has certified should pass the real set and
47
+ * take the cost: a slower boot is worth more than a black screen. `scripts/probe-check.mjs`
48
+ * re-measures both figures on any machine.
49
+ */
50
+ readonly probeShaders?: readonly string[];
51
+ /**
52
+ * How long the WebGPU path may take before WebGL2 is answered instead. `Infinity` waits forever.
53
+ *
54
+ * **A preference that cannot fall back is not a preference.** Every other refusal arrives as an
55
+ * answer — a null adapter, a throw, a device that cannot draw — and each lands on WebGL2 with a
56
+ * reason. A request that never settles is none of those and has nothing under it: the boot stops
57
+ * at an `await`, nothing throws, and the player is left looking at the window the game was going
58
+ * to be drawn in. See `BACKEND_TIMEOUT_MS` for the default and what it was measured against.
59
+ */
60
+ readonly backendTimeoutMs?: number;
61
+ /**
62
+ * The engine badge shown over the page until the first frame reaches the screen.
63
+ *
64
+ * **On by default, and that default is the feature.** A web-delivered game has no shell to
65
+ * show one for it — `drift-package` opens a window for exactly this and a browser tab has
66
+ * nowhere to put it — so the engine mounts it here, before the device probe, and a game
67
+ * inherits it by calling the function it was already calling. See `ui/splash.ts`.
68
+ *
69
+ * `false` declines it. Pass that for anything that is not a game booting: a site whose canvas
70
+ * is one section of a page, a tool that opens into its own interface, a demo harness. Those
71
+ * are the cases where a full-screen badge is an interruption rather than a cover, and they
72
+ * are the reason this is a decision rather than a behaviour.
73
+ *
74
+ * `?splash=0` and `?splash=1` override it either way without a code change, which is how the
75
+ * badge is looked at on a deployed build.
76
+ */
77
+ readonly splash?: boolean | SplashOptions;
78
+ }
79
+
80
+ /** What was built, and which path built it. */
81
+ export interface CreatedRenderer {
82
+ /** The renderer, behind the surface both backends satisfy. */
83
+ readonly renderer: RendererApi;
84
+ /** Which backend is actually drawing. Report this; never infer it. */
85
+ readonly backend: RenderBackend;
86
+ /** Why that backend, in words, for the frame meter and for bug reports. */
87
+ readonly reason: string;
88
+ /**
89
+ * What the part calls itself, from whichever backend was actually built.
90
+ *
91
+ * **The third of the same kind of fact as `backend` and `reason`, and it was the one missing.**
92
+ * `select.ts` already carried it to hand the WebGPU renderer a part number for the capability
93
+ * clamp, and then dropped it here — so `gpuCapability.ts`'s own claim that the string "is
94
+ * reported in the game's boot log, because the string a real device gives settles it in one
95
+ * message" was true of this repository's harness and not of a consumer, whose boot log could not
96
+ * print what it was never handed. Reported from outside 2026-08-28 as exactly that: a bug report
97
+ * that cannot say which GPU it came from.
98
+ *
99
+ * `''` where the browser declined to name the part, which is an ordinary answer rather than a
100
+ * failure — see `webgl2RendererName`.
101
+ *
102
+ * **For a log and a bug report, not for choosing a profile.** By the time this exists the
103
+ * renderer is built and every setting except the pixel density is memory allocated at
104
+ * construction. `describeGpu()` is the same question asked early enough to act on.
105
+ */
106
+ readonly rendererName: string;
107
+
108
+ /**
109
+ * Which way this renderer's depth buffer actually runs.
110
+ *
111
+ * **The answer a consumer has to key their near plane on, and it is the *runtime* one.** The
112
+ * engine's own wish is the `REVERSED_DEPTH` constant; this is what the context granted. On
113
+ * WebGPU they always agree, because its clip space is already `[0, 1]`. On WebGL2 they can
114
+ * differ: reversing needs `EXT_clip_control`, and a context without it keeps the conventional
115
+ * sense — so a game that read the constant would pick a near plane the machine in front of it
116
+ * cannot honour.
117
+ *
118
+ * **Why it is reported at all.** A conventional buffer resolves about `z² / (near · 2^bits)`,
119
+ * which makes the near plane the only control there is, and a consumer that cannot ask has to
120
+ * choose for the worse case and gains nothing from the better one. Reported the way
121
+ * `rendererName` is, and for the same reason: it is a fact about the machine that only the
122
+ * renderer knows.
123
+ */
124
+ readonly reversedDepth: boolean;
125
+ }
126
+
127
+ /**
128
+ * Hand the badge the one fact it is waiting for: a frame reached the screen.
129
+ *
130
+ * **Patched onto the instance and deleted by its own first call**, so what a game runs from the
131
+ * second frame on is the prototype method it would have run anyway. The alternative — a flag the
132
+ * backends check inside `endFrame` — puts a branch in the hot path of both renderers forever to
133
+ * learn something that is true exactly once, and puts the splash's name in `render/`, which is the
134
+ * boundary this whole module sits outside of.
135
+ */
136
+ function presentOnFirstFrame(renderer: RendererApi, splash: MountedSplash): void {
137
+ const target = renderer as RendererApi & { endFrame(): void };
138
+ const inherited = target.endFrame.bind(target);
139
+ Object.defineProperty(target, 'endFrame', {
140
+ configurable: true,
141
+ writable: true,
142
+ value(): void {
143
+ inherited();
144
+ /* Before `present`, not after: the badge's removal must not be able to leave the patch
145
+ behind if it throws. Deleting an own property uncovers the prototype's. */
146
+ delete (target as Partial<Record<'endFrame', unknown>>).endFrame;
147
+ splash.present();
148
+ },
149
+ });
150
+ }
151
+
152
+ /**
153
+ * Build a renderer on the best backend this browser will actually give us.
154
+ *
155
+ * **Asynchronous because it has to be.** `navigator.gpu.requestAdapter()` returns a promise
156
+ * and there is no synchronous way to learn whether a usable device exists. That is the one
157
+ * change this reaches into a consumer's boot sequence, and it is exactly why
158
+ * `new Renderer(canvas, quality)` keeps working untouched: three applications construct one
159
+ * today and none of them should be made to move on this plan's schedule.
160
+ *
161
+ * **Both backends are behind it now**, and which one a caller gets is this function's whole
162
+ * job: WebGPU where the browser offers a usable device, WebGL2 everywhere else. The returned
163
+ * `backend` and `reason` say which and why, and they are meant to be read — `reason` was
164
+ * returned and ignored by every caller for long enough that a silent fallback could be
165
+ * mistaken for a comparison.
166
+ */
167
+ export async function createRenderer(
168
+ canvas: HTMLCanvasElement,
169
+ quality: RenderQualityOptions = {},
170
+ options: CreateRendererOptions = {},
171
+ ): Promise<CreatedRenderer> {
172
+ const search = options.search ?? globalThis.location?.search ?? '';
173
+
174
+ /*
175
+ * **Mounted before the probe, because the probe is part of the wait.** `selectBackend` asks for
176
+ * an adapter, compiles what it was given and reads back a pixel; on a slow machine that is the
177
+ * first visible fraction of a second, and it happens over an empty canvas.
178
+ */
179
+ const splashOptions: SplashOptions =
180
+ options.splash === undefined
181
+ ? {}
182
+ : typeof options.splash === 'boolean'
183
+ ? { enabled: options.splash }
184
+ : options.splash;
185
+ const splash = mountSplash({ search, ...splashOptions });
186
+
187
+ /**
188
+ * Attach the badge to whichever renderer was built. Every return goes through here, including
189
+ * the two failure paths — a fallback still paints, and a badge that outlived a fallback would
190
+ * sit on the screen until the cap for a game that was running perfectly well underneath it.
191
+ */
192
+ const built = (
193
+ result: Omit<CreatedRenderer, 'rendererName' | 'reversedDepth'>,
194
+ ): CreatedRenderer => {
195
+ if (splash !== null) presentOnFirstFrame(result.renderer, splash);
196
+ /*
197
+ * **Read off the renderer here rather than carried down from the choice**, and the difference
198
+ * is the fallback. `choice.rendererName` is the *adapter's* name and is null on every WebGL2
199
+ * branch; more than that, a WebGPU surface that fails after a device was granted returns a
200
+ * WebGL2 renderer through this same wrapper, so the choice's name would then describe a
201
+ * backend that is not drawing. Every return goes through here and every renderer carries its
202
+ * own name, so there is one place and it cannot disagree with the object beside it.
203
+ */
204
+ /*
205
+ * `reversedDepth` is read off the renderer for the same reason and with more force: on WebGL2
206
+ * it depends on an extension the context may not offer, so it is a property of the object
207
+ * that got built and of nothing upstream of it.
208
+ */
209
+ return {
210
+ ...result,
211
+ rendererName: result.renderer.rendererName,
212
+ reversedDepth: result.renderer.reversedDepth,
213
+ };
214
+ };
215
+
216
+ /*
217
+ * **One budget for the whole WebGPU branch, spent in two halves.**
218
+ *
219
+ * Acquisition is the first half and `selectBackend` bounds it. Construction is the second — a
220
+ * dynamically imported backend, a surface and a renderer — and it used to be bounded by nothing,
221
+ * which meant a boot could stall with a deadline visibly present and never firing. Reported from
222
+ * outside exactly that way: every GPU call in the hung page completed by hand in milliseconds
223
+ * while the engine's own boot never returned, because whatever it was waiting on was not inside
224
+ * the promise the deadline was racing.
225
+ */
226
+ const budgetMs = options.backendTimeoutMs ?? BACKEND_TIMEOUT_MS;
227
+ const startedAt = Date.now();
228
+ const choice = await selectBackend(
229
+ search,
230
+ options.preferWebGpu ?? true,
231
+ quality.gpuTiming ?? false,
232
+ options.probeShaders ?? [],
233
+ budgetMs,
234
+ );
235
+
236
+ if (choice.backend === 'webgpu' && choice.device !== null) {
237
+ /*
238
+ * **A failure here falls back rather than propagating.** Everything up to this point
239
+ * proved a device exists; a canvas that will not give a `webgpu` context after that is
240
+ * a different fault, and one a consumer can do nothing about. Falling back draws the
241
+ * frame on WebGL2 and says why, which beats a black canvas and a stack trace.
242
+ *
243
+ * The device is destroyed on the way past, because the surface that would have owned it
244
+ * was never built and nothing else will free it.
245
+ */
246
+ /*
247
+ * **What it was doing when it stopped, kept as a word.** A consumer cannot read a stack out of
248
+ * a packaged build with no developer tools, and the question a stalled boot raises is which of
249
+ * these three steps it is sitting in. The reason string carries the answer rather than a
250
+ * request to reproduce it under a debugger.
251
+ */
252
+ let stage = 'importing the backend';
253
+ const device = choice.device;
254
+ try {
255
+ const construction = (async () => {
256
+ /*
257
+ * Imported dynamically so a bundler can split them out. A consumer that ends up on
258
+ * WebGL2 — every consumer today, and every browser without WebGPU afterwards — should
259
+ * not be made to download a backend it will never construct.
260
+ *
261
+ * **And it is an await over a network, which is why it is inside the race.** In a packaged
262
+ * artifact these chunks come back through the application's own protocol handler; a request
263
+ * that never answers is a boot that never finishes, and nothing about it is a GPU fault.
264
+ */
265
+ const { createGpuSurface } = await import('./webgpu/device.ts');
266
+ const { WebGPURenderer } = await import('./webgpu/renderer.ts');
267
+ stage = 'creating the surface';
268
+ const surface = createGpuSurface(canvas, device);
269
+ stage = 'constructing the renderer';
270
+ return { surface, WebGPURenderer };
271
+ })();
272
+
273
+ const spent = Date.now() - startedAt;
274
+ const settled = await withDeadline(construction, budgetMs - spent);
275
+ if (settled === TIMED_OUT) {
276
+ device.destroy();
277
+ return built({
278
+ renderer: new Renderer(canvas, quality),
279
+ backend: 'webgl2',
280
+ reason: `WebGPU stalled while ${stage}, fell back after ${budgetMs} ms`,
281
+ });
282
+ }
283
+ const { surface, WebGPURenderer } = settled;
284
+ return built({
285
+ /*
286
+ * **No cast: `WebGPURenderer` satisfies `RendererApi` outright.** It implemented
287
+ * `Partial<RendererApi>` while its passes were being written and the cast here was what
288
+ * let an incomplete backend be returned behind the complete surface. That hole is
289
+ * closed, and closing it is what makes the derived type do the job it exists for —
290
+ * adding a method to `Renderer` now stops this backend compiling until it has one too.
291
+ *
292
+ * It takes the *resolved* profile rather than the options, because it reads its shadow
293
+ * terms off it and a bare options object leaves every unset field undefined. `Renderer`
294
+ * resolves internally, so the two backends get the same numbers by construction rather
295
+ * than from a copied set of defaults somebody has to keep in step.
296
+ */
297
+ renderer: new WebGPURenderer(
298
+ surface,
299
+ resolveRenderQuality(quality),
300
+ /* The adapter's own words, so the capability clamp has a part number to
301
+ recognise rather than the literal string `WebGPU`. */
302
+ choice.rendererName ?? undefined,
303
+ ),
304
+ backend: 'webgpu',
305
+ reason: choice.reason,
306
+ });
307
+ } catch (error) {
308
+ choice.device.destroy();
309
+ const detail = error instanceof Error ? error.message : String(error);
310
+ return built({
311
+ renderer: new Renderer(canvas, quality),
312
+ backend: 'webgl2',
313
+ reason: `WebGPU surface failed, fell back: ${detail}`,
314
+ });
315
+ }
316
+ }
317
+
318
+ choice.device?.destroy();
319
+ /*
320
+ * **Asked for WebGPU and did not get it: say so, once, out loud.**
321
+ *
322
+ * `reason` has always been returned and a caller is free to ignore it, which every caller
323
+ * did — so a browser without WebGPU, a driver that refused a device and a misspelt query all
324
+ * produced the same thing: a perfectly ordinary WebGL2 frame and no indication that the
325
+ * request had been dropped. Somebody comparing the two backends then compares one of them
326
+ * with itself, which is the exact failure `shots.mjs --backend` exists to prevent, arrived at
327
+ * from the other direction.
328
+ *
329
+ * Only when it was asked for **explicitly** — a `?backend=webgpu` or a literal
330
+ * `preferWebGpu: true`. Since the default became true this is a narrower test than it reads,
331
+ * and deliberately so: every consumer now asks, so warning on the default would put a console
332
+ * line in front of every player whose browser simply has no WebGPU, which is most of the
333
+ * reason the fallback exists. Someone comparing the two backends states it, and gets told.
334
+ */
335
+ if (forcedBackend(search) === 'webgpu' || options.preferWebGpu === true) {
336
+ console.warn(`[driftengine] WebGPU was asked for and is not being used: ${choice.reason}`);
337
+ }
338
+ return built({
339
+ renderer: new Renderer(canvas, quality),
340
+ backend: 'webgl2',
341
+ reason: choice.reason,
342
+ });
343
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A bound on a promise, and the sentinel that says it was reached.
3
+ *
4
+ * **Its own module because two callers share it and one of them learned the hard way that a bound
5
+ * on part of a path is not a bound on the path.** The WebGPU branch is an acquisition *and* a
6
+ * construction: an adapter, a device and a probe, then a dynamically imported backend, a surface
7
+ * and a renderer. Bounding only the first half leaves the second half unbounded, and a boot that
8
+ * stalls there stalls exactly as completely — with the added confusion that a deadline exists,
9
+ * visibly, and never fires. Reported from outside precisely that way.
10
+ */
11
+
12
+ /** Returned in place of a value that did not arrive in time. */
13
+ export const TIMED_OUT = Symbol('timed out');
14
+
15
+ /**
16
+ * `work`, or `TIMED_OUT` if it has not settled within `ms`.
17
+ *
18
+ * `Infinity` and anything non-positive wait without bound, which is how a caller asks for the
19
+ * behaviour that existed before deadlines did. The timer is always cleared: a pending one keeps a
20
+ * process alive after the answer is known, which turns a passing suite into one that hangs at the
21
+ * end.
22
+ *
23
+ * **A synchronous stall is not covered and cannot be.** Nothing in JavaScript races a call that
24
+ * does not yield, so this bounds the awaits and says so rather than implying more.
25
+ */
26
+ export async function withDeadline<T>(work: Promise<T>, ms: number): Promise<T | typeof TIMED_OUT> {
27
+ if (!Number.isFinite(ms) || ms <= 0) return work;
28
+ let timer: ReturnType<typeof setTimeout> | undefined;
29
+ const deadline = new Promise<typeof TIMED_OUT>((resolve) => {
30
+ timer = setTimeout(() => resolve(TIMED_OUT), ms);
31
+ });
32
+ try {
33
+ return await Promise.race([work, deadline]);
34
+ } finally {
35
+ if (timer !== undefined) clearTimeout(timer);
36
+ }
37
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Whether a WebGPU device can do what it is about to be asked to do.
3
+ *
4
+ * **Feature detection is not this.** `navigator.gpu` was present, an adapter was offered and a
5
+ * device was returned throughout the total iOS failure recorded in
6
+ * The iOS black-screen investigation: WebKit enforces a sixteen-byte stride
7
+ * for arrays in the uniform address space where Dawn does not, so the shaders that draw everything
8
+ * compiled on every desktop browser and on no iPhone. Nothing in the boot sequence asked, and the
9
+ * player got a black screen.
10
+ *
11
+ * Two checks, because neither finds the other's failures:
12
+ *
13
+ * 1. **Compile what will be compiled.** Catches a device that rejects real source.
14
+ * 2. **Draw a known colour and read it back.** Catches a device that validates everything and
15
+ * rasterises nothing — which is a black screen with a clean log.
16
+ *
17
+ * **What this costs** is one pipeline and one 1x1 readback at boot, plus the compile of whatever
18
+ * `shaders` is given. **What would make it wrong** is a driver where the probe passes and real
19
+ * content fails anyway; this narrows that window and does not close it, and nothing short of
20
+ * running the game can.
21
+ *
22
+ * Not a hot path: called once, before the first frame.
23
+ */
24
+
25
+ /** What the probe decided, and why. */
26
+ export interface ProbeVerdict {
27
+ readonly ok: boolean;
28
+ /** Why it was refused, in words a bug report can carry. Empty when `ok`. */
29
+ readonly reason: string;
30
+ }
31
+
32
+ /** Magenta, because an empty frame has no red and no blue in either colour space. */
33
+ const EXPECTED = [255, 0, 255, 255] as const;
34
+
35
+ /*
36
+ * Usage flags numerically rather than off `GPUTextureUsage` and friends, matching
37
+ * `render/webgpu/buffers.ts` and for its reason: those globals do not exist under vitest, and a
38
+ * probe that can only run on a device is a probe whose own logic nobody checks. The values are
39
+ * normative in the WebGPU specification, so nothing here is guessed.
40
+ */
41
+ const TEXTURE_COPY_SRC = 0x0001;
42
+ const TEXTURE_RENDER_ATTACHMENT = 0x0010;
43
+ const BUFFER_MAP_READ = 0x0001;
44
+ const BUFFER_COPY_DST = 0x0008;
45
+ const MAP_MODE_READ = 0x0001;
46
+
47
+ /** 256 is the smallest bytes-per-row a texture-to-buffer copy accepts. */
48
+ const READBACK_BYTES = 256;
49
+
50
+ const DRAW_WGSL = `
51
+ @vertex fn vs(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {
52
+ var p = array(vec2f(-1.0, -3.0), vec2f(3.0, 1.0), vec2f(-1.0, 1.0));
53
+ return vec4f(p[i], 0.0, 1.0);
54
+ }
55
+ @fragment fn fs() -> @location(0) vec4f { return vec4f(1.0, 0.0, 1.0, 1.0); }
56
+ `;
57
+
58
+ export async function probeDevice(
59
+ device: GPUDevice,
60
+ shaders: readonly string[],
61
+ ): Promise<ProbeVerdict> {
62
+ /* Inside the try, with everything else: this function's contract is that it *answers* rather
63
+ than throws, and a device broken enough to reject an error scope must reach the same
64
+ fallback as one that draws black rather than an exception the caller has to catch. */
65
+ try {
66
+ device.pushErrorScope('validation');
67
+ for (const code of shaders) {
68
+ const info = await device.createShaderModule({ code }).getCompilationInfo();
69
+ const failure = info.messages.find((message) => message.type === 'error');
70
+ if (failure !== undefined) {
71
+ await device.popErrorScope();
72
+ return { ok: false, reason: `a shader did not compile: ${failure.message}` };
73
+ }
74
+ }
75
+
76
+ const pixel = await drawOnePixel(device);
77
+ const error = await device.popErrorScope();
78
+ if (error !== null) {
79
+ return { ok: false, reason: `the device refused something: ${error.message}` };
80
+ }
81
+ if (pixel === null) {
82
+ return { ok: false, reason: 'the device drew nothing that could be read back' };
83
+ }
84
+
85
+ const matches = EXPECTED.every((value, i) => Math.abs(value - (pixel[i] ?? 0)) <= 1);
86
+ if (!matches) {
87
+ return { ok: false, reason: `the device drew nothing: read ${[...pixel].join(',')}` };
88
+ }
89
+ return { ok: true, reason: '' };
90
+ } catch (cause) {
91
+ /* The scope has to be popped whatever happened, and a device that throws here may well
92
+ throw on the pop as well — which must not replace the interesting error with a dull one. */
93
+ try {
94
+ await device.popErrorScope();
95
+ } catch {
96
+ /* nothing to add: the throw below is the one worth reporting */
97
+ }
98
+ return { ok: false, reason: `the device threw during the probe: ${String(cause)}` };
99
+ }
100
+ }
101
+
102
+ /** One triangle of known colour into a 1x1 target, read back. */
103
+ async function drawOnePixel(device: GPUDevice): Promise<Uint8Array | null> {
104
+ const module = device.createShaderModule({ code: DRAW_WGSL });
105
+ const pipeline = device.createRenderPipeline({
106
+ layout: 'auto',
107
+ vertex: { module, entryPoint: 'vs' },
108
+ fragment: { module, entryPoint: 'fs', targets: [{ format: 'rgba8unorm' }] },
109
+ primitive: { topology: 'triangle-list' },
110
+ });
111
+
112
+ const target = device.createTexture({
113
+ size: { width: 1, height: 1 },
114
+ format: 'rgba8unorm',
115
+ usage: TEXTURE_RENDER_ATTACHMENT | TEXTURE_COPY_SRC,
116
+ label: 'probe.target',
117
+ });
118
+ const readback = device.createBuffer({
119
+ size: READBACK_BYTES,
120
+ usage: BUFFER_COPY_DST | BUFFER_MAP_READ,
121
+ label: 'probe.readback',
122
+ });
123
+
124
+ const encoder = device.createCommandEncoder();
125
+ const pass = encoder.beginRenderPass({
126
+ colorAttachments: [
127
+ {
128
+ view: target.createView(),
129
+ loadOp: 'clear',
130
+ storeOp: 'store',
131
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
132
+ },
133
+ ],
134
+ });
135
+ pass.setPipeline(pipeline);
136
+ pass.draw(3);
137
+ pass.end();
138
+ encoder.copyTextureToBuffer(
139
+ { texture: target },
140
+ { buffer: readback, bytesPerRow: READBACK_BYTES },
141
+ { width: 1, height: 1 },
142
+ );
143
+ device.queue.submit([encoder.finish()]);
144
+ await device.queue.onSubmittedWorkDone();
145
+
146
+ await readback.mapAsync(MAP_MODE_READ);
147
+ const pixel = new Uint8Array(readback.getMappedRange().slice(0, 4));
148
+ readback.unmap();
149
+ readback.destroy();
150
+ target.destroy();
151
+ return pixel;
152
+ }