@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,113 @@
1
+ /**
2
+ * Filling the screen on a handheld, from a gesture that is already happening.
3
+ *
4
+ * A browser tab on a phone keeps its URL bar, and the game keeps whatever is left.
5
+ * There is no declaration that changes that — no manifest key, no meta tag, and
6
+ * nothing anywhere on the web platform that marks a page as a game and is granted
7
+ * anything for it. A page fills a phone's screen in exactly two ways: it is an
8
+ * *installed* app whose manifest asks for `display: fullscreen`, or it calls
9
+ * `requestFullscreen` from a user gesture. This is the second one. The manifest is
10
+ * the consumer's to ship and covers the installed case; between them every Android
11
+ * entry point is covered, and iPhone Safari is covered by neither because it has no
12
+ * element fullscreen at all — only the installed route.
13
+ *
14
+ * Game-agnostic (AGENTS.md): an element and a gesture. It knows nothing about what
15
+ * is being drawn into the element.
16
+ *
17
+ * **Handheld only, and once.** Two restraints, both of them about not taking a
18
+ * decision away from somebody who has already made it:
19
+ *
20
+ * A desktop player has a window they chose the size of, and a key that toggles
21
+ * fullscreen whenever they want it. Seizing the whole display because they clicked
22
+ * a menu button is the behaviour every embedded video player has been hated for.
23
+ * So the request is made where the screen is small and there is no other way to
24
+ * reclaim the space, and nowhere else.
25
+ *
26
+ * And a player who leaves fullscreen — the back gesture, the notification shade,
27
+ * the system button — has said something. Asking again on their next tap would be
28
+ * an argument they cannot win, since every tap is another gesture and every gesture
29
+ * is another chance to ask. One attempt per page load, whether it is granted,
30
+ * refused or undone.
31
+ */
32
+
33
+ /** What the decision needs to know. Every field is observed, none of it inferred. */
34
+ export interface FullscreenConditions {
35
+ /**
36
+ * A handheld, decided by the pointer rather than by the user agent string.
37
+ *
38
+ * `(pointer: coarse)` is the property that actually matters — a finger, no
39
+ * hover, no window to speak of — and unlike a UA sniff it is right about a
40
+ * tablet, right about a phone in desktop-site mode, and right about a laptop
41
+ * with a touchscreen that is being driven by its trackpad.
42
+ */
43
+ readonly coarsePointer: boolean;
44
+ /** Whether the API exists here at all. False on iPhone Safari. */
45
+ readonly supported: boolean;
46
+ /** Already filling the screen: asking again is a no-op that can still reject. */
47
+ readonly alreadyFullscreen: boolean;
48
+ /** Asked once already this page load, granted or not. See the header. */
49
+ readonly askedBefore: boolean;
50
+ }
51
+
52
+ /**
53
+ * Whether to ask for fullscreen on the gesture currently being handled.
54
+ *
55
+ * Pure, so all four restraints are checkable without a browser — which is the whole
56
+ * of this module's logic. The call itself is one line and is verified by hand, per
57
+ * AGENTS.md's rule that DOM is not unit-tested.
58
+ */
59
+ export function fullscreenWanted(conditions: FullscreenConditions): boolean {
60
+ const { coarsePointer, supported, alreadyFullscreen, askedBefore } = conditions;
61
+ return coarsePointer && supported && !alreadyFullscreen && !askedBefore;
62
+ }
63
+
64
+ /**
65
+ * Ask for fullscreen on the next gesture of any kind, once, on a handheld.
66
+ *
67
+ * Returns the way to stop listening. The listeners are passive and in the capture
68
+ * phase, matching the audio unlock that shares this moment: a page whose first
69
+ * gesture has to both start the audio graph and claim the screen should do both from
70
+ * that one gesture, not ask for a second one.
71
+ *
72
+ * Failure is silence by design. `requestFullscreen` rejects when the browser is not
73
+ * satisfied that a gesture is in progress, when an ancestor iframe has no
74
+ * `allowfullscreen`, and on platforms that expose the method and refuse it anyway.
75
+ * None of those is worth a message to somebody who did not ask for fullscreen in the
76
+ * first place and whose game is running either way.
77
+ */
78
+ export function requestFullscreenOnGesture(element: HTMLElement): () => void {
79
+ const events = ['pointerdown', 'keydown', 'touchstart'] as const;
80
+ let asked = false;
81
+
82
+ function stop(): void {
83
+ for (const event of events) window.removeEventListener(event, fire, true);
84
+ }
85
+
86
+ function fire(): void {
87
+ const wanted = fullscreenWanted({
88
+ coarsePointer: matchesCoarsePointer(),
89
+ supported: typeof element.requestFullscreen === 'function',
90
+ alreadyFullscreen: document.fullscreenElement !== null,
91
+ askedBefore: asked,
92
+ });
93
+ // Detached either way: on a desktop the answer will never change, and on a
94
+ // handheld the one attempt has now been made.
95
+ asked = true;
96
+ stop();
97
+ if (!wanted) return;
98
+ // Floating deliberately. There is nothing to do with the rejection but ignore
99
+ // it, and awaiting it would hold up the gesture that is unlocking the audio.
100
+ void element.requestFullscreen().catch(() => {
101
+ /* Refused. The game is running regardless. */
102
+ });
103
+ }
104
+
105
+ for (const event of events) window.addEventListener(event, fire, true);
106
+ return stop;
107
+ }
108
+
109
+ /** `(pointer: coarse)`, defensively — an engine without `matchMedia` is a test one. */
110
+ function matchesCoarsePointer(): boolean {
111
+ if (typeof window.matchMedia !== 'function') return false;
112
+ return window.matchMedia('(pointer: coarse)').matches;
113
+ }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Pixel art from a string grid, as a CSS cursor value.
3
+ *
4
+ * Generated rather than shipped as a PNG. Two reasons, and the second is the
5
+ * one that matters: a generated cursor costs no asset and no request, and it
6
+ * can be recoloured at runtime — so it belongs to whatever palette the game is
7
+ * currently wearing instead of being a fixed image that clashes with half of
8
+ * them.
9
+ *
10
+ * Rendered at the device pixel ratio and declared through `image-set`, so it is
11
+ * crisp on a retina display. A bitmap authored at 1x is upscaled smoothly by
12
+ * the browser, which is precisely the wrong thing to do to pixel art.
13
+ */
14
+ export interface PixelCursorOptions {
15
+ /** Device-independent pixels per art pixel. */
16
+ readonly scale?: number;
17
+ /** The art pixel that sits under the pointer. Defaults to the centre. */
18
+ readonly hotspotX?: number;
19
+ readonly hotspotY?: number;
20
+ /** Keyword used when the image cannot be built. */
21
+ readonly fallback?: string;
22
+ }
23
+
24
+ /**
25
+ * @param rows one string per row; each character indexes `palette`.
26
+ * @param palette character → CSS colour. A character absent from it is
27
+ * transparent, which is what makes `' '` the natural empty cell.
28
+ */
29
+ export function pixelCursor(
30
+ rows: readonly string[],
31
+ palette: Readonly<Record<string, string>>,
32
+ options: PixelCursorOptions = {},
33
+ ): string {
34
+ const fallback = options.fallback ?? 'auto';
35
+ const height = rows.length;
36
+ const width = rows[0]?.length ?? 0;
37
+ if (width === 0 || height === 0) return fallback;
38
+
39
+ const scale = Math.max(1, Math.round(options.scale ?? 3));
40
+ const dpr = Math.max(1, Math.round(globalThis.devicePixelRatio ?? 1));
41
+
42
+ const cssWidth = width * scale;
43
+ const cssHeight = height * scale;
44
+ const hotspotX = Math.round((options.hotspotX ?? (width - 1) / 2) * scale);
45
+ const hotspotY = Math.round((options.hotspotY ?? (height - 1) / 2) * scale);
46
+
47
+ const url = render(rows, palette, cssWidth * dpr, cssHeight * dpr, scale * dpr);
48
+ if (url === null) return fallback;
49
+
50
+ /*
51
+ * `image-set` carries the pixel ratio the image was drawn at, so the browser
52
+ * displays it at the right physical size instead of treating device pixels as
53
+ * CSS pixels and rendering a cursor a third of the intended size.
54
+ *
55
+ * The bare `url()` in front is the fallback for engines without image-set in
56
+ * `cursor`; there the image is oversized on retina rather than absent, which
57
+ * is the better of the two failures.
58
+ */
59
+ const hotspot = `${hotspotX} ${hotspotY}`;
60
+ if (dpr === 1) return `url(${url}) ${hotspot}, ${fallback}`;
61
+ return `image-set(url(${url}) ${dpr}x) ${hotspot}, url(${url}) ${hotspot}, ${fallback}`;
62
+ }
63
+
64
+ function render(
65
+ rows: readonly string[],
66
+ palette: Readonly<Record<string, string>>,
67
+ pixelWidth: number,
68
+ pixelHeight: number,
69
+ cellSize: number,
70
+ ): string | null {
71
+ let canvas: HTMLCanvasElement;
72
+ try {
73
+ canvas = document.createElement('canvas');
74
+ } catch {
75
+ return null;
76
+ }
77
+ canvas.width = pixelWidth;
78
+ canvas.height = pixelHeight;
79
+ const ctx = canvas.getContext('2d');
80
+ if (ctx === null) return null;
81
+
82
+ for (let y = 0; y < rows.length; y++) {
83
+ const row = rows[y] ?? '';
84
+ for (let x = 0; x < row.length; x++) {
85
+ const colour = palette[row[x] ?? ''];
86
+ if (colour === undefined) continue;
87
+ ctx.fillStyle = colour;
88
+ // Filled as whole cells rather than drawn small and scaled up: this is
89
+ // what keeps the edges hard at any ratio.
90
+ ctx.fillRect(x * cellSize, y * cellSize, cellSize, cellSize);
91
+ }
92
+ }
93
+
94
+ try {
95
+ return canvas.toDataURL('image/png');
96
+ } catch {
97
+ return null;
98
+ }
99
+ }
@@ -0,0 +1,347 @@
1
+ /**
2
+ * The engine badge a web-delivered game shows while it builds its first frame.
3
+ *
4
+ * **The packaged shell already does this, and a browser has nowhere to put it.** `drift-package`
5
+ * opens a small frameless window with `assets/splash.html` in it and holds the game's own window
6
+ * hidden until it paints. A game served from a URL has one document and no shell, so the same
7
+ * badge has to be drawn *inside* the page, over whatever is already there, and taken down again
8
+ * without leaving a trace in a DOM the engine does not own.
9
+ *
10
+ * **On by default, which is the only reason it exists.** A splash a consumer has to remember to
11
+ * mount is one that every consumer mounts a different way and one forgets. `createRenderer` mounts
12
+ * this one before it probes for a device, so a game inherits it by calling the function it was
13
+ * already calling. `{ splash: false }` turns it off, and `?splash=0` turns it off without a code
14
+ * change — the two-way form of the same flag `forcedBackend` reads.
15
+ *
16
+ * **It covers a real wait rather than manufacturing one.** Between `createRenderer` and the first
17
+ * `endFrame` a browser probes for a GPU, compiles shaders and uploads whatever the game builds at
18
+ * startup, and the alternative to a badge is a white page followed by an empty canvas. What it
19
+ * cannot cover is the wait before this module exists at all: the bundle still has to arrive and
20
+ * parse, and nothing inside the bundle can paint sooner than that.
21
+ *
22
+ * The mark is inlined rather than fetched. A badge that can fail to load is worse than none, and
23
+ * the file it would fetch lives in `@driftengine/package`, which a web consumer never installs.
24
+ *
25
+ * **What it cannot do, stated because it looks like a bug.** A consumer's own loading screen that
26
+ * is markup in `index.html` is on screen before this module exists — measured on a real game at
27
+ * about a second in development — and no code inside the bundle can paint sooner than the bundle
28
+ * parses. From the moment it mounts the plate is uncoverable, because it is in the top layer; the
29
+ * window before that belongs to the page, and only markup in the page can close it.
30
+ */
31
+ import { holdFrames } from '../core/bootGate.ts';
32
+
33
+ /**
34
+ * What decides whether a badge is shown at all. Taken as data so the rule is testable in Node,
35
+ * which is where the engine's tests run — the mount below is verified by looking at it.
36
+ */
37
+ export interface SplashConditions {
38
+ /** What the consumer asked for. `true` unless it opted out. */
39
+ readonly enabled: boolean;
40
+ /** Running inside `drift-package`, whose shell shows the same badge in its own window. */
41
+ readonly packagedShell: boolean;
42
+ /** The query string, so the flag can be flipped on a deployed build. */
43
+ readonly search: string;
44
+ /** Whether there is a document to mount on at all. False in a test, a bake or a worker. */
45
+ readonly document: boolean;
46
+ }
47
+
48
+ /**
49
+ * `?splash=1` or `?splash=0`, or null for anything else.
50
+ *
51
+ * Only the two values count, exactly as `forcedBackend` reads `?backend`. A flag that treats
52
+ * every unrecognised string as one of its states is a typo that silently changes behaviour.
53
+ */
54
+ export function forcedSplash(search: string): boolean | null {
55
+ const value = new URLSearchParams(search).get('splash');
56
+ if (value === '1') return true;
57
+ if (value === '0') return false;
58
+ return null;
59
+ }
60
+
61
+ export function splashWanted(conditions: SplashConditions): boolean {
62
+ /* Not a preference and not overridable: there is nothing to mount on. */
63
+ if (!conditions.document) return false;
64
+
65
+ const forced = forcedSplash(conditions.search);
66
+ if (forced !== null) return forced;
67
+
68
+ return conditions.enabled && !conditions.packagedShell;
69
+ }
70
+
71
+ export type SplashDecision = 'hold' | 'swap';
72
+
73
+ /**
74
+ * The ceiling on the whole badge, whatever the caller asked for.
75
+ *
76
+ * Twenty seconds is long enough for a large world to stream in over a slow connection — which is
77
+ * exactly the boot a badge should cover — and short enough that a failure is seen in the same
78
+ * sitting. The same number `@driftengine/package` uses, for the same reason.
79
+ */
80
+ export const SPLASH_HARD_CAP_MS = 20_000;
81
+
82
+ /**
83
+ * How long the badge stays even on a machine that paints instantly.
84
+ *
85
+ * **Three seconds, which is a deliberate hold rather than a covered wait.** The mark's entrance
86
+ * takes 640ms and the hairline sweeps on a 1500ms cycle, so anything under about two seconds
87
+ * shows a logo arriving and then leaving before it has finished arriving — which reads as a
88
+ * rendering fault rather than as a brand. A game boots once and this is the only place its engine
89
+ * is named, so the seconds are spent on purpose.
90
+ *
91
+ * **What would make it wrong** is a consumer that is not a game booting: a page whose canvas is
92
+ * one section among several, or a tool that opens into an interface. Three seconds of black is an
93
+ * interruption there, which is why `enabled: false` exists and why the sites and the editing tool
94
+ * in this repository pass it.
95
+ */
96
+ export const SPLASH_MIN_MS = 3_000;
97
+
98
+ /** How long the plate takes to leave. Short: this is a handoff, not a transition. */
99
+ export const SPLASH_FADE_MS = 420;
100
+
101
+ /**
102
+ * When the badge gives the screen to the game. Two conditions and a cap, each for a named failure.
103
+ *
104
+ * - **The game has painted.** Swapping before that shows the empty canvas the badge exists to
105
+ * cover.
106
+ * - **The minimum has passed.** A badge that vanishes the instant a fast machine paints is a
107
+ * flicker, and the machines that boot fastest are the ones a developer tests on.
108
+ * - **The cap overrides both**, and is checked first so that a minimum longer than the cap
109
+ * cannot pin the screen. Past it the game is shown in whatever state it is in, because a
110
+ * broken game that can be seen is better than a brand that cannot be dismissed.
111
+ *
112
+ * Pure, so all three are testable without a browser: the caller owns the clock. This is the
113
+ * second copy of the rule — `@driftengine/package`'s runs in Electron's main process, which
114
+ * cannot import this engine — and `splash.test.ts` says why that duplication is deliberate.
115
+ */
116
+ export function splashDecision(
117
+ elapsedMs: number,
118
+ minMs: number,
119
+ contentReady: boolean,
120
+ capMs: number = SPLASH_HARD_CAP_MS,
121
+ ): SplashDecision {
122
+ if (elapsedMs >= capMs) return 'swap';
123
+ if (!contentReady) return 'hold';
124
+ return elapsedMs >= minMs ? 'swap' : 'hold';
125
+ }
126
+
127
+ export interface SplashOptions {
128
+ /** Off with `false`. Default on, which is the point of the module. */
129
+ readonly enabled?: boolean;
130
+ /** How long the badge stays even on a machine that paints immediately. */
131
+ readonly minMs?: number;
132
+ /** The query string to read `?splash` from. Defaults to the page's own. */
133
+ readonly search?: string;
134
+ }
135
+
136
+ export interface MountedSplash {
137
+ /** Tell the badge a frame reached the screen. Cheap, and ignored after the first one. */
138
+ present(): void;
139
+ /** Take it down now, whatever the clock says. Idempotent. */
140
+ release(): void;
141
+ }
142
+
143
+ /**
144
+ * The badge markup. One constant string, interpolated into nothing.
145
+ *
146
+ * **Everything is scoped under the host element**, including the keyframes, because this is
147
+ * mounted into a document the engine does not own and a bare `@keyframes fade` would be a name
148
+ * collision with whatever the consumer already defined.
149
+ *
150
+ * **The lockup's own `:root` rule is dropped on the way in.** In its own file that rule sets the
151
+ * colour of the SVG document; inlined into a page, `:root` is the *page's* html element, so the
152
+ * file would recolour the game it is covering and flip to near-black on a machine that prefers a
153
+ * light scheme — an invisible mark on a black plate. The colour is set on the element instead.
154
+ */
155
+ const SPLASH_MARK = `<svg viewBox="0 0 233.30 207.08" style="color:#ececf0" aria-hidden="true" focusable="false">
156
+ <g transform="translate(27.96,0)">
157
+ <polygon points="38.04,54.65 4.00,71.67 4.00,82.07 38.04,65.05" fill="#2ac79c"/>
158
+ <polygon points="38.04,83.02 4.00,100.04 4.00,110.44 38.04,93.42" fill="#116352"/>
159
+ <polygon points="49.39,43.31 88.69,66.00 88.69,111.39 49.39,88.69" fill="#0f5b49"/>
160
+ <polygon points="88.69,66.00 128.00,43.31 128.00,88.69 88.69,111.39" fill="#1c9b7c"/>
161
+ <polygon points="88.69,20.61 128.00,43.31 88.69,66.00 49.39,43.31" fill="#35e0b0"/>
162
+ </g>
163
+ <g transform="translate(0.00,196.96)">
164
+ <path transform="translate(0.00,0.00) scale(0.04600,-0.04600)" d="M247 685H111V0H258C399 0 566 64 566 348C566 630 406 685 247 685ZM255 635C375 635 503 599 503 348C503 102 380 50 262 50H171V635Z" fill="currentColor"/>
165
+ <path transform="translate(29.37,0.00) scale(0.04600,-0.04600)" d="M309 534C236 534 189 492 161 406L156 523H106V0H164V320C192 427 231 479 304 479C322 479 335 477 350 473L361 528C347 532 329 534 309 534Z" fill="currentColor"/>
166
+ <path transform="translate(46.83,0.00) scale(0.04600,-0.04600)" d="M134 753C108 753 91 734 91 711C91 688 108 669 134 669C161 669 178 688 178 711C178 734 161 753 134 753ZM164 523H106V0H164Z" fill="currentColor"/>
167
+ <path transform="translate(59.55,0.00) scale(0.04600,-0.04600)" d="M260 695C293 695 325 687 359 672L379 715C340 733 302 743 257 743C166 743 112 691 112 609V523H21V476H112V0H170V476H300L308 523H170V607C170 669 201 695 260 695Z" fill="currentColor"/>
168
+ <path transform="translate(74.62,0.00) scale(0.04600,-0.04600)" d="M321 62C295 47 270 39 241 39C188 39 164 69 164 130V476H292L299 523H164V655L106 648V523H18V476H106V127C106 36 155 -11 234 -11C276 -11 312 1 344 22Z" fill="currentColor"/>
169
+ <path transform="translate(90.60,0.00) scale(0.04600,-0.04600)" d="M486 692H73V0H488V108H220V299H438V405H220V585H470Z" fill="#35e0b0"/>
170
+ <path transform="translate(115.19,0.00) scale(0.04600,-0.04600)" d="M366 546C298 546 247 516 204 463L193 530H70V0H212V366C241 413 273 440 314 440C350 440 372 423 372 362V0H514V386C514 486 459 546 366 546Z" fill="#35e0b0"/>
171
+ <path transform="translate(142.12,0.00) scale(0.04600,-0.04600)" d="M509 610C445 574 383 543 261 546C128 546 35 471 35 354C35 286 63 239 129 203C91 179 67 142 67 104C67 48 113 0 224 0H302C358 0 385 -22 385 -58C385 -96 359 -123 261 -123C160 -123 138 -101 138 -51H11C11 -157 64 -220 258 -220C435 -220 528 -155 528 -48C528 40 451 104 331 104H250C198 104 189 121 189 139C189 153 197 166 209 174C228 169 248 167 271 167C406 167 489 242 489 345C489 412 456 452 391 481C455 481 505 486 544 501ZM264 451C323 451 352 421 352 358C352 293 322 259 265 259C211 259 177 295 177 356C177 414 210 451 264 451Z" fill="#35e0b0"/>
172
+ <path transform="translate(167.45,0.00) scale(0.04600,-0.04600)" d="M140 803C89 803 54 767 54 720C54 673 89 637 140 637C191 637 227 673 227 720C227 767 191 803 140 803ZM212 530H70V0H212Z" fill="#35e0b0"/>
173
+ <path transform="translate(180.72,0.00) scale(0.04600,-0.04600)" d="M366 546C298 546 247 516 204 463L193 530H70V0H212V366C241 413 273 440 314 440C350 440 372 423 372 362V0H514V386C514 486 459 546 366 546Z" fill="#35e0b0"/>
174
+ <path transform="translate(207.65,0.00) scale(0.04600,-0.04600)" d="M518 277C518 446 429 546 279 546C124 546 38 422 38 262C38 96 127 -16 297 -16C380 -16 446 14 498 56L439 136C393 104 355 90 310 90C242 90 194 120 184 222H515C516 237 518 259 518 277ZM377 311H184C191 411 226 449 282 449C350 449 377 397 377 317Z" fill="#35e0b0"/>
175
+ </g>
176
+ </svg>`;
177
+
178
+ /**
179
+ * The plate, as the packaged badge with its window taken away.
180
+ *
181
+ * Same flat near-black with one very soft lift behind the mark, which is what stops a full screen
182
+ * of `#0b0b0d` reading as a page that failed to paint. Sized in `vmin` rather than the packaged
183
+ * page's fixed pixels: that page knew its window was 420x300, and this one is asked to look
184
+ * deliberate on a phone held upright and on an ultrawide.
185
+ */
186
+ function splashStyle(fadeMs: number): string {
187
+ /*
188
+ * **The reset before the layout is the popover's, not decoration.** A `[popover]` element
189
+ * carries a UA border, padding, a background and `width:fit-content`, and it is `display:none`
190
+ * until shown — so the four resets below are what turn the browser's dialog-shaped default back
191
+ * into a full-bleed plate. `max-width`/`max-height` are the ones that are easy to miss: the UA
192
+ * caps a popover at the viewport minus its margin, which crops the plate by a hair on some
193
+ * platforms and looks like a rounding fault.
194
+ */
195
+ return `[data-drift-splash]{position:fixed;inset:0;width:auto;height:auto;max-width:none;max-height:none;border:0;padding:0;z-index:2147483647;margin:0;display:grid;place-items:center;background:#0b0b0d;background-image:radial-gradient(60% 55% at 50% 42%,#12161a 0%,#0b0b0d 70%);color-scheme:dark;overflow:hidden;opacity:1;transition:opacity ${fadeMs}ms linear}
196
+ [data-drift-splash]::backdrop{background:#0b0b0d}
197
+ [data-drift-splash][data-drift-splash-leaving]{opacity:0}
198
+ [data-drift-splash] .drift-splash-stack{display:grid;justify-items:center;gap:clamp(18px,3vmin,26px)}
199
+ [data-drift-splash] svg{width:min(232px,30vmin);height:auto;animation:drift-splash-arrive 640ms cubic-bezier(0.16,0.84,0.44,1) both}
200
+ @keyframes drift-splash-arrive{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:translateX(0)}}
201
+ [data-drift-splash] .drift-splash-line{width:min(168px,24vmin);height:2px;border-radius:2px;background:#1a2320;overflow:hidden;animation:drift-splash-fade 700ms 260ms both}
202
+ [data-drift-splash] .drift-splash-line::after{content:'';display:block;width:42%;height:100%;border-radius:2px;background:linear-gradient(90deg,rgba(53,224,176,0),#35e0b0,rgba(53,224,176,0));animation:drift-splash-sweep 1500ms cubic-bezier(0.45,0,0.55,1) infinite}
203
+ @keyframes drift-splash-fade{from{opacity:0}to{opacity:1}}
204
+ @keyframes drift-splash-sweep{from{transform:translateX(-100%)}to{transform:translateX(340%)}}
205
+ @media (prefers-reduced-motion:reduce){[data-drift-splash] svg{animation:drift-splash-fade 300ms both}[data-drift-splash] .drift-splash-line::after{animation:none;width:100%;opacity:0.5}}`;
206
+ }
207
+
208
+ /** True when `drift-package`'s preload bridge is on the page. One name, feature-detected. */
209
+ function inPackagedShell(): boolean {
210
+ return (globalThis as Record<string, unknown>)['__driftHost'] !== undefined;
211
+ }
212
+
213
+ /**
214
+ * Put the badge up, and hand back the two verbs that take it down.
215
+ *
216
+ * Returns null when the conditions say no, so a caller can `?.present()` without asking twice.
217
+ * Nothing here runs per frame: `present` is called once by the renderer's first `endFrame` and
218
+ * the clock is a single `setTimeout`, not a `requestAnimationFrame` watch.
219
+ */
220
+ export function mountSplash(options: SplashOptions = {}): MountedSplash | null {
221
+ const hasDocument = typeof document !== 'undefined' && document !== null;
222
+ const wanted = splashWanted({
223
+ enabled: options.enabled ?? true,
224
+ packagedShell: inPackagedShell(),
225
+ search: options.search ?? globalThis.location?.search ?? '',
226
+ document: hasDocument,
227
+ });
228
+ if (!wanted) return null;
229
+
230
+ const minMs = Math.min(SPLASH_HARD_CAP_MS, Math.max(0, options.minMs ?? SPLASH_MIN_MS));
231
+ const started = performance.now();
232
+
233
+ const host = document.createElement('div');
234
+ host.setAttribute('data-drift-splash', '');
235
+ /*
236
+ * **Manual popover, so the plate is in the top layer and cannot be covered.**
237
+ *
238
+ * `z-index` alone is not enough and the reason is not hypothetical: a consumer's own loading
239
+ * screen is frequently already in the document before the engine's bundle has even parsed, and
240
+ * whatever it sets, a later sibling with an equal z-index wins on document order. The top layer
241
+ * is outside that argument entirely — nothing painted by ordinary content reaches it, including
242
+ * an element that asks for the same maximum.
243
+ *
244
+ * `manual` rather than `auto`: an auto popover is light-dismissed by a click or the escape key,
245
+ * and a badge somebody can dismiss by pressing a key while a game boots is a badge that
246
+ * sometimes is not there. The z-index above stays as the fallback for a browser with no popover
247
+ * support, where the plate is an ordinary fixed layer and the old argument applies again.
248
+ */
249
+ host.setAttribute('popover', 'manual');
250
+ const style = document.createElement('style');
251
+ style.textContent = splashStyle(SPLASH_FADE_MS);
252
+ host.append(style);
253
+ const stack = document.createElement('div');
254
+ stack.className = 'drift-splash-stack';
255
+ /* A constant with nothing interpolated into it. The alternative is forty `createElementNS`
256
+ calls for a picture that never changes. */
257
+ stack.innerHTML = SPLASH_MARK;
258
+ const line = document.createElement('div');
259
+ line.className = 'drift-splash-line';
260
+ stack.append(line);
261
+ host.append(stack);
262
+
263
+ /* `body` is missing for a script in `<head>` without `defer`, and a badge that throws during
264
+ boot is the failure this whole module is trying to prevent. */
265
+ (document.body ?? document.documentElement).append(host);
266
+
267
+ /* Guarded rather than assumed: `showPopover` is absent on older Safari and on any engine
268
+ without the top layer, where the element stays an ordinary fixed layer and still draws. */
269
+ if (typeof host.showPopover === 'function') {
270
+ try {
271
+ host.showPopover();
272
+ } catch {
273
+ /* An implementation that has the method and refuses the element. The plate is already in
274
+ the document and already styled; nothing here needs to be undone. */
275
+ }
276
+ }
277
+
278
+ let painted = false;
279
+ let leaving = false;
280
+ let timer: ReturnType<typeof setTimeout> | null = null;
281
+
282
+ /*
283
+ * **Freeze the game the moment it has proved it can draw.**
284
+ *
285
+ * `painted` is the first `endFrame`, and everything after it until the plate leaves is time the
286
+ * game would otherwise spend running behind an opaque screen. `bootGate` is read by `startLoop`
287
+ * and named by neither of them; see its own comment for why the state is shared that way.
288
+ */
289
+ const openGate = holdFrames(() => painted && !leaving);
290
+
291
+ const remove = (): void => {
292
+ /* Leaving the top layer is what `hidePopover` is for. `remove()` alone takes the element out
293
+ of the document, and an element removed while shown is not a state worth relying on. */
294
+ if (host.isConnected && typeof host.hidePopover === 'function') {
295
+ try {
296
+ host.hidePopover();
297
+ } catch {
298
+ /* Not shown, or shown by nobody. The removal below is the part that matters. */
299
+ }
300
+ }
301
+ host.remove();
302
+ };
303
+
304
+ const release = (): void => {
305
+ if (leaving) return;
306
+ leaving = true;
307
+ /* Before the fade, not after it: the game resumes as the plate becomes transparent, so what
308
+ shows through is a running frame rather than the still one it was frozen on. */
309
+ openGate();
310
+ if (timer !== null) clearTimeout(timer);
311
+ timer = null;
312
+ host.setAttribute('data-drift-splash-leaving', '');
313
+ /* A timeout rather than `transitionend`, which never fires for an element in a background
314
+ tab — where a boot is exactly as likely to finish. */
315
+ setTimeout(remove, SPLASH_FADE_MS);
316
+ };
317
+
318
+ /**
319
+ * Ask the rule, and either go or come back when it could have changed.
320
+ *
321
+ * Two things move `splashDecision`: a frame arriving and the clock passing a threshold. The
322
+ * first calls this directly; for the second it schedules itself for whichever threshold is
323
+ * next, so an idle badge costs one pending timer rather than a frame callback.
324
+ */
325
+ const settle = (): void => {
326
+ if (leaving) return;
327
+ const elapsed = performance.now() - started;
328
+ if (splashDecision(elapsed, minMs, painted) === 'swap') {
329
+ release();
330
+ return;
331
+ }
332
+ if (timer !== null) clearTimeout(timer);
333
+ const next = painted ? minMs - elapsed : SPLASH_HARD_CAP_MS - elapsed;
334
+ timer = setTimeout(settle, Math.max(0, next));
335
+ };
336
+
337
+ settle();
338
+
339
+ return {
340
+ present(): void {
341
+ if (painted || leaving) return;
342
+ painted = true;
343
+ settle();
344
+ },
345
+ release,
346
+ };
347
+ }
@@ -0,0 +1,44 @@
1
+ import { bakeOverlay } from './frameOverlay.ts';
2
+ import type { FrameOverlay } from './frameOverlay.ts';
3
+
4
+ /**
5
+ * One frame, composited with the same mark a clip would carry.
6
+ *
7
+ * A free function rather than a static on `FrameRecorder`, and it was that static
8
+ * until 2026-08-07. The reason for the move is the same reason it was static in the
9
+ * first place, taken one step further: a still needs no `MediaRecorder`, so a browser
10
+ * that cannot record video must still be able to save a screenshot. As a static it
11
+ * could be *called* without a recorder but not *reached* without one — a bundler sees
12
+ * the class, and the class drags the recorder, the export target and the frame pacer
13
+ * in behind it. A consumer taking a screenshot was paying for the whole clip pipeline
14
+ * to do it. Here it costs the overlay compositor and nothing else.
15
+ *
16
+ * Composited at the source's own size, because a still is a picture of what is on
17
+ * screen rather than a clip that needs a platform's shape.
18
+ *
19
+ * **Call this inside the render pass**, before the page composites: a WebGL drawing
20
+ * buffer is not guaranteed readable afterwards, and this copies black when it is not.
21
+ * The same rule governs `Renderer.copyRegionTo`, and it has now cost a session twice —
22
+ * once as a black still with a watermark on it, once as an empty preview box.
23
+ */
24
+ export function stillFrame(
25
+ source: HTMLCanvasElement,
26
+ overlay?: FrameOverlay,
27
+ drawFrame?: (ctx: CanvasRenderingContext2D, width: number, height: number) => void,
28
+ ): HTMLCanvasElement | null {
29
+ const still = document.createElement('canvas');
30
+ still.width = source.width;
31
+ still.height = source.height;
32
+ const ctx = still.getContext('2d', { alpha: false });
33
+ if (ctx === null) return null;
34
+ ctx.drawImage(source, 0, 0);
35
+ const mark = overlay === undefined ? null : bakeOverlay(overlay, still.width, still.height);
36
+ if (mark !== null) ctx.drawImage(mark, 0, 0);
37
+ // Same live layer a clip gets, so a still is not a different picture.
38
+ if (drawFrame !== undefined) {
39
+ ctx.save();
40
+ drawFrame(ctx, still.width, still.height);
41
+ ctx.restore();
42
+ }
43
+ return still;
44
+ }