@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,377 @@
1
+ import type { KeyValueStore } from '../core/storage.ts';
2
+ import type { InputSource } from './input.ts';
3
+ import type { GamepadButton } from './gamepadMapping.ts';
4
+
5
+ /**
6
+ * Actions a game asks about, and the bindings that satisfy them.
7
+ *
8
+ * **This is what makes the gamepad worth having.** Without it every site that reads input carries
9
+ * the device branch by hand — `isDown('Space') || pad?.down('faceDown')` — every new device widens
10
+ * it, and a player cannot change either half. A game asks whether *jump* happened and does not ask
11
+ * which device said so.
12
+ *
13
+ * **The action name is the consumer's own string.** A game's verbs are a game's business, and an
14
+ * engine-side enumeration of them would be exactly the "needs to know what something *is*" boundary
15
+ * error `AGENTS.md` forbids.
16
+ */
17
+
18
+ /** One thing that can satisfy an action. */
19
+ export type Binding =
20
+ | { readonly device: 'keyboard'; readonly code: string }
21
+ | { readonly device: 'gamepad'; readonly button: GamepadButton };
22
+
23
+ /** Jump, fire, pause: a state, bound to keys and buttons. */
24
+ export interface DigitalAction {
25
+ readonly keys?: readonly string[];
26
+ readonly buttons?: readonly GamepadButton[];
27
+ }
28
+
29
+ /**
30
+ * Move, look: a direction rather than a state.
31
+ *
32
+ * **The reason this cannot be a button-only design.** A stick is not a key, and a game that treated
33
+ * one as four keys would throw away the magnitude the player is actually controlling.
34
+ *
35
+ * Key directions follow the stick's convention, which is the specification's: **up is negative**.
36
+ * The alternative was to flip one of them, and an engine that silently disagrees with the API it
37
+ * wraps is one a consumer cannot reason about.
38
+ */
39
+ export interface AnalogAction {
40
+ readonly stick: 'left' | 'right';
41
+ /**
42
+ * One code or several, per direction.
43
+ *
44
+ * **Several, because `DigitalAction` above takes several and a player does not care which kind
45
+ * of action they are rebinding.** A game binding both `KeyW` and `ArrowUp` to forward — which is
46
+ * the ordinary thing to do — could express that for jump and not for movement, and the asymmetry
47
+ * was the whole of the gap: the alternative was two analog actions merged by hand at the call
48
+ * site, which is the engine handing back a job it already does.
49
+ */
50
+ readonly up?: string | readonly string[];
51
+ readonly down?: string | readonly string[];
52
+ readonly left?: string | readonly string[];
53
+ readonly right?: string | readonly string[];
54
+ }
55
+
56
+ export type ActionDefinition = DigitalAction | AnalogAction;
57
+
58
+ function isAnalog(definition: ActionDefinition): definition is AnalogAction {
59
+ return 'stick' in definition;
60
+ }
61
+
62
+ /** Scratch, at module scope because `vector` is a per-frame read. */
63
+ const stickVector = { x: 0, y: 0 };
64
+ const keyVector = { x: 0, y: 0 };
65
+
66
+ /** What a stored record holds: only what differs from the defaults. See `save`. */
67
+ interface StoredBindings {
68
+ readonly [action: string]: readonly Binding[];
69
+ }
70
+
71
+ export class ActionMap {
72
+ private readonly input: InputSource;
73
+ private readonly definitions: Readonly<Record<string, ActionDefinition>>;
74
+ /** The current bindings per digital action, which rebinding and loading replace. */
75
+ private readonly bindings = new Map<string, Binding[]>();
76
+ private readonly defaults = new Map<string, readonly Binding[]>();
77
+ private warnedAboutRecord = false;
78
+
79
+ constructor(input: InputSource, definitions: Readonly<Record<string, ActionDefinition>>) {
80
+ this.input = input;
81
+ this.definitions = definitions;
82
+ for (const [name, definition] of Object.entries(definitions)) {
83
+ if (isAnalog(definition)) continue;
84
+ const initial = bindingsOf(definition);
85
+ this.defaults.set(name, initial);
86
+ this.bindings.set(name, [...initial]);
87
+ }
88
+ }
89
+
90
+ /** Whether anything bound to this action is held. */
91
+ down(action: string): boolean {
92
+ return this.any(action, (binding) =>
93
+ binding.device === 'keyboard'
94
+ ? this.input.isDown(binding.code)
95
+ : (this.input.pad(0)?.down(binding.button) ?? false),
96
+ );
97
+ }
98
+
99
+ /** Whether anything bound to it went down since the last poll. Readable by anything. */
100
+ pressed(action: string): boolean {
101
+ return this.any(action, (binding) =>
102
+ binding.device === 'keyboard'
103
+ ? this.input.keyPressed(binding.code)
104
+ : (this.input.pad(0)?.pressed(binding.button) ?? false),
105
+ );
106
+ }
107
+
108
+ /**
109
+ * The same edge, claimed: true for exactly one caller.
110
+ *
111
+ * **Claims through the device rather than keeping its own set**, so a claim made here is also
112
+ * gone from `input.keyPressed` and from the pad's own `pressed`. Two claim registers over one
113
+ * physical press is how a press gets acted on twice.
114
+ */
115
+ consumePress(action: string): boolean {
116
+ const bindings = this.bindings.get(action);
117
+ if (bindings === undefined) return false;
118
+ for (const binding of bindings) {
119
+ if (binding.device === 'keyboard') {
120
+ if (this.input.consumeKeyPress(binding.code)) return true;
121
+ } else if (this.input.pad(0)?.consumePress(binding.button) === true) {
122
+ return true;
123
+ }
124
+ }
125
+ return false;
126
+ }
127
+
128
+ /**
129
+ * Fill `out` with an analog action's direction.
130
+ *
131
+ * **The larger of stick and keys, never the sum.** A player holding a key while pushing the
132
+ * stick the same way is asking to go that way, once; adding the contributions would send them at
133
+ * twice the speed, which is the bug a naive merge ships with. What it costs: the two cannot be
134
+ * combined to exceed the rim, which is the intent. What would make it wrong: an action where two
135
+ * devices genuinely should add, and nothing has asked for one.
136
+ *
137
+ * **This is the reader for a direction.** If the two axes are two separate controls — throttle
138
+ * and steering, pitch and roll — read them one at a time with `axis`, which does not normalise
139
+ * them against each other. See its note for what the joint normalisation cost one consumer.
140
+ */
141
+ vector(action: string, out: { x: number; y: number }): void {
142
+ out.x = 0;
143
+ out.y = 0;
144
+ if (!this.sample(action)) return;
145
+ /* Normalised, so a diagonal on the keyboard is not faster than a straight line. This is the
146
+ one line `axis` does not run, and the whole difference between the two readers. */
147
+ const keyLength = Math.hypot(keyVector.x, keyVector.y);
148
+ if (keyLength > 1) {
149
+ keyVector.x /= keyLength;
150
+ keyVector.y /= keyLength;
151
+ }
152
+ const useStick = Math.hypot(stickVector.x, stickVector.y) >= Math.min(keyLength, 1);
153
+ out.x = useStick ? stickVector.x : keyVector.x;
154
+ out.y = useStick ? stickVector.y : keyVector.y;
155
+ }
156
+
157
+ /**
158
+ * One axis of an analog action, on its own, **not normalised against the other**.
159
+ *
160
+ * **`vector` is right for a direction and wrong for two controls**, and the difference is not
161
+ * cosmetic. On foot the two axes are one direction, so a keyboard diagonal must be shortened to
162
+ * the rim or the player walks faster askew than straight ahead — that is what `vector` is for and
163
+ * it should stay the default. At a wheel the same two axes are throttle and steering, which are
164
+ * two separate controls that happen to share an action: normalising them together means a driver
165
+ * holding forward and left gets 0.707 of each and **can never reach full lock while accelerating**.
166
+ *
167
+ * A consumer lost two weeks to this. The report was "the car does not turn and it is slow", the
168
+ * whole vehicle model was rewritten looking for it, and it was not in the vehicle model — it was
169
+ * `Math.hypot` three call frames away, doing exactly what it was written to do. They shipped four
170
+ * duplicate digital actions bound to the same keys to get around it.
171
+ *
172
+ * The pad is unchanged either way: a stick already gives its two axes independently, so a caller
173
+ * driving with one reads the same numbers from both methods. The keyboard is where they part.
174
+ */
175
+ axis(action: string, axis: 'x' | 'y'): number {
176
+ if (!this.sample(action)) return 0;
177
+ const useStick =
178
+ Math.hypot(stickVector.x, stickVector.y) >= Math.min(Math.hypot(keyVector.x, keyVector.y), 1);
179
+ const from = useStick ? stickVector : keyVector;
180
+ return axis === 'x' ? from.x : from.y;
181
+ }
182
+
183
+ /**
184
+ * Fill the two scratch vectors for an analog action, and say whether there was one.
185
+ *
186
+ * Shared so that `vector` and `axis` cannot disagree about which device is being read or how a
187
+ * key becomes a number — the device choice in particular is subtle enough that two copies of it
188
+ * would drift.
189
+ */
190
+ private sample(action: string): boolean {
191
+ const definition = this.definitions[action];
192
+ if (definition === undefined || !isAnalog(definition)) return false;
193
+
194
+ const pad = this.input.pad(0);
195
+ stickVector.x = pad === null ? 0 : pad.axis(definition.stick === 'left' ? 'leftX' : 'rightX');
196
+ stickVector.y = pad === null ? 0 : pad.axis(definition.stick === 'left' ? 'leftY' : 'rightY');
197
+
198
+ keyVector.x = 0;
199
+ keyVector.y = 0;
200
+ if (this.anyDown(definition.left)) keyVector.x -= 1;
201
+ if (this.anyDown(definition.right)) keyVector.x += 1;
202
+ if (this.anyDown(definition.up)) keyVector.y -= 1;
203
+ if (this.anyDown(definition.down)) keyVector.y += 1;
204
+ return true;
205
+ }
206
+
207
+ /**
208
+ * Whether the pad these actions read has motors this browser can drive.
209
+ *
210
+ * **Pad 0, which is the pad every other member of this class already reads.** An action map is
211
+ * one player's controls, so "the pad the actions come from" is the device a rumble belongs on;
212
+ * a consumer running local multiplayer reaches `InputSource.pad(n).rumble` directly.
213
+ *
214
+ * Grey the control out when this is false. It is re-read rather than cached, because a pad
215
+ * unplugged and plugged back in is a different device behind the same slot.
216
+ */
217
+ get canRumble(): boolean {
218
+ return this.input.pad(0)?.canRumble ?? false;
219
+ }
220
+
221
+ /**
222
+ * Rumble that pad for `durationMs`, at two magnitudes in [0, 1]. Answers whether it was taken.
223
+ *
224
+ * `false` where there is no pad, no actuator, or nothing to play. Never throws.
225
+ */
226
+ rumble(durationMs: number, strong: number, weak: number): boolean {
227
+ return this.input.pad(0)?.rumble(durationMs, strong, weak) ?? false;
228
+ }
229
+
230
+ /** Stop whatever that pad is playing. Answers whether the platform took it. */
231
+ stopRumble(): boolean {
232
+ return this.input.pad(0)?.stopRumble() ?? false;
233
+ }
234
+
235
+ /**
236
+ * Whether any of a direction's codes is held.
237
+ *
238
+ * Allocation-free for both shapes: a single code is compared without wrapping it in an array,
239
+ * and an array is walked by index. `vector` runs once a tick.
240
+ */
241
+ private anyDown(codes: string | readonly string[] | undefined): boolean {
242
+ if (codes === undefined) return false;
243
+ if (typeof codes === 'string') return this.input.isDown(codes);
244
+ for (let i = 0; i < codes.length; i++) {
245
+ const code = codes[i];
246
+ if (code !== undefined && this.input.isDown(code)) return true;
247
+ }
248
+ return false;
249
+ }
250
+
251
+ /** What currently satisfies an action. */
252
+ bindingsFor(action: string): readonly Binding[] {
253
+ return this.bindings.get(action) ?? [];
254
+ }
255
+
256
+ /**
257
+ * Give an action a binding, and say which actions lost it.
258
+ *
259
+ * **Reports rather than decides.** A binding already serving another action is the interesting
260
+ * case in every rebinding screen there has ever been, and what to do about it is a product
261
+ * decision: steal it silently, warn, or refuse. A consumer that wants uniqueness enforced reads
262
+ * the return and rebinds back.
263
+ */
264
+ rebind(action: string, binding: Binding): readonly string[] {
265
+ const displaced: string[] = [];
266
+ for (const [name, list] of this.bindings) {
267
+ if (name === action) continue;
268
+ const at = list.findIndex((held) => sameBinding(held, binding));
269
+ if (at < 0) continue;
270
+ list.splice(at, 1);
271
+ displaced.push(name);
272
+ }
273
+ const own = this.bindings.get(action);
274
+ if (own === undefined) return displaced;
275
+ if (!own.some((held) => sameBinding(held, binding))) own.push(binding);
276
+ return displaced;
277
+ }
278
+
279
+ /** Put one action, or every action, back to what the game shipped with. */
280
+ resetToDefaults(action?: string): void {
281
+ for (const [name, initial] of this.defaults) {
282
+ if (action !== undefined && name !== action) continue;
283
+ this.bindings.set(name, [...initial]);
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Write the bindings a player has actually changed, and nothing else.
289
+ *
290
+ * **A diff rather than a snapshot, and this is the load-bearing decision.** A snapshot freezes
291
+ * the map at the version that saved it: a game that later adds an action, or changes a default
292
+ * nobody had rebound, finds every returning player still on the old set with no way to tell a
293
+ * deliberate choice from a stale record. A diff means an untouched action always follows the
294
+ * current default and only real choices survive an update.
295
+ *
296
+ * Through `KeyValueStore` because the engine calls no platform API a consumer might want to
297
+ * supply differently — the rule that put saves behind this seam.
298
+ */
299
+ save(store: KeyValueStore, key: string): void {
300
+ const changed: Record<string, readonly Binding[]> = {};
301
+ for (const [name, list] of this.bindings) {
302
+ const initial = this.defaults.get(name) ?? [];
303
+ if (sameList(list, initial)) continue;
304
+ changed[name] = list;
305
+ }
306
+ store.write(key, JSON.stringify(changed));
307
+ }
308
+
309
+ /**
310
+ * Apply a stored record over the defaults.
311
+ *
312
+ * **An unreadable record is the defaults, reported once.** A player whose stored bindings cannot
313
+ * be parsed should get a working game rather than a broken one, and should not have that decided
314
+ * silently — the same shape as every other refusal in this engine.
315
+ */
316
+ load(store: KeyValueStore, key: string): void {
317
+ const raw = store.read(key);
318
+ if (raw === null) return;
319
+ let parsed: StoredBindings | null = null;
320
+ try {
321
+ parsed = JSON.parse(raw) as StoredBindings;
322
+ } catch {
323
+ parsed = null;
324
+ }
325
+ if (parsed === null || typeof parsed !== 'object') {
326
+ if (!this.warnedAboutRecord) {
327
+ this.warnedAboutRecord = true;
328
+ console.warn(
329
+ `[driftengine] the stored input bindings at ${JSON.stringify(key)} could not be read; ` +
330
+ 'the defaults are in force. Save again to replace the record.',
331
+ );
332
+ }
333
+ return;
334
+ }
335
+ for (const [name, list] of Object.entries(parsed)) {
336
+ /* An action the record knows and this build does not is dropped rather than kept: it is a
337
+ binding for a verb that no longer exists, and holding it would resurrect it on a
338
+ downgrade. An action this build has and the record does not keeps its default, which is
339
+ the whole reason this is a diff. */
340
+ if (!this.bindings.has(name) || !Array.isArray(list)) continue;
341
+ this.bindings.set(name, list.filter(isBinding));
342
+ }
343
+ }
344
+
345
+ private any(action: string, holds: (binding: Binding) => boolean): boolean {
346
+ const bindings = this.bindings.get(action);
347
+ if (bindings === undefined) return false;
348
+ for (const binding of bindings) if (holds(binding)) return true;
349
+ return false;
350
+ }
351
+ }
352
+
353
+ function bindingsOf(definition: DigitalAction): Binding[] {
354
+ const list: Binding[] = [];
355
+ for (const code of definition.keys ?? []) list.push({ device: 'keyboard', code });
356
+ for (const button of definition.buttons ?? []) list.push({ device: 'gamepad', button });
357
+ return list;
358
+ }
359
+
360
+ function sameBinding(a: Binding, b: Binding): boolean {
361
+ if (a.device !== b.device) return false;
362
+ return a.device === 'keyboard' && b.device === 'keyboard'
363
+ ? a.code === b.code
364
+ : a.device === 'gamepad' && b.device === 'gamepad' && a.button === b.button;
365
+ }
366
+
367
+ function sameList(a: readonly Binding[], b: readonly Binding[]): boolean {
368
+ return a.length === b.length && a.every((entry, at) => sameBinding(entry, b[at] as Binding));
369
+ }
370
+
371
+ /** A stored entry is data from disk, so it is checked rather than trusted. */
372
+ function isBinding(value: unknown): value is Binding {
373
+ if (typeof value !== 'object' || value === null) return false;
374
+ const candidate = value as { device?: unknown; code?: unknown; button?: unknown };
375
+ if (candidate.device === 'keyboard') return typeof candidate.code === 'string';
376
+ return candidate.device === 'gamepad' && typeof candidate.button === 'string';
377
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Which device the player is actually using, so a consumer can redraw its prompts.
3
+ *
4
+ * **The rule is use, never presence**, and that single word is most of the design. A controller
5
+ * plugged in for something else, or left on a desk, must not change every prompt on screen while
6
+ * the player is still on the keyboard — which is the bug this kind of feature usually ships with.
7
+ * The browser helps: it does not report a gamepad at all until a button has been pressed on it.
8
+ * This closes the rest.
9
+ */
10
+
11
+ export type InputDevice = 'keyboard' | 'mouse' | 'touch' | 'gamepad';
12
+
13
+ /**
14
+ * How far a cursor must travel, in pixels, before it counts as the player choosing the mouse.
15
+ *
16
+ * A tuning constant, so its value is not asserted anywhere — `AGENTS.md` forbids that, because a
17
+ * decision that will change every feel pass produces a test that fails on intent.
18
+ */
19
+ export const MOUSE_MOVE_THRESHOLD_PX = 32;
20
+
21
+ export class ActiveDevice {
22
+ /**
23
+ * The keyboard to begin with.
24
+ *
25
+ * Something has to be answered before anything has been touched, and a prompt is more often
26
+ * wanted on a desktop than not. It is corrected by the first real input either way, and no
27
+ * device is *reported* as connected by this — only as used.
28
+ */
29
+ private device: InputDevice = 'keyboard';
30
+
31
+ /**
32
+ * Travel accumulated since a device other than the mouse was last used.
33
+ *
34
+ * **A threshold rather than a flip on the first event, and the mouse alone needs one.** A
35
+ * keydown and a touchstart are intentional; a mousemove is not necessarily anything at all — an
36
+ * unlocked cursor drifts, a desk gets bumped, and a window manager can deliver motion nobody
37
+ * caused. Accumulating rather than testing one delta means a slow deliberate movement counts
38
+ * while a single stray pixel does not.
39
+ *
40
+ * **What it costs:** a drift of a pixel at a time does eventually cross it, in about thirty
41
+ * moves. **What would make it wrong:** a pointing device whose ordinary use produces less travel
42
+ * than this — a trackpoint or an eye tracker — where the answer is a smaller threshold rather
43
+ * than none.
44
+ */
45
+ private travel = 0;
46
+
47
+ private readonly listeners: ((device: InputDevice) => void)[] = [];
48
+
49
+ get last(): InputDevice {
50
+ return this.device;
51
+ }
52
+
53
+ /** Record that a device was used. Notifies only on a change. */
54
+ use(device: InputDevice): void {
55
+ if (device !== 'mouse') this.travel = 0;
56
+ if (device === this.device) return;
57
+ this.device = device;
58
+ /* Indexed rather than iterated: this can fire from a frame callback, and the house rule about
59
+ allocation in a per-frame path binds it. */
60
+ for (let i = 0; i < this.listeners.length; i += 1) this.listeners[i]?.(device);
61
+ }
62
+
63
+ /** Offer pointer movement. Becomes a use of the mouse once it adds up to a decision. */
64
+ moved(dx: number, dy: number): void {
65
+ if (this.device === 'mouse') return;
66
+ this.travel += Math.hypot(dx, dy);
67
+ if (this.travel >= MOUSE_MOVE_THRESHOLD_PX) this.use('mouse');
68
+ }
69
+
70
+ /**
71
+ * Hear about changes. Returns the unsubscribe, which is the shape `InputSource.subscribe` uses.
72
+ *
73
+ * Fires only on a change, so a consumer that redraws its prompts here redraws them once rather
74
+ * than every frame a button is held.
75
+ */
76
+ subscribe(listener: (device: InputDevice) => void): () => void {
77
+ this.listeners.push(listener);
78
+ let subscribed = true;
79
+ return () => {
80
+ if (!subscribed) return;
81
+ subscribed = false;
82
+ const index = this.listeners.indexOf(listener);
83
+ if (index >= 0) this.listeners.splice(index, 1);
84
+ };
85
+ }
86
+ }
@@ -0,0 +1,131 @@
1
+ import { type GamepadButton } from './gamepadMapping.ts';
2
+
3
+ /**
4
+ * What the pad in the player's hands calls a position, so a consumer can draw the right prompt.
5
+ *
6
+ * **The engine ships no art and never will.** A glyph key is an identifier a consumer maps to its
7
+ * own icon set or font. It exists so that several consumers do not each write the same table, and
8
+ * so the mapping from *hardware* to *name* lives beside the hardware knowledge rather than inside
9
+ * somebody's heads-up display.
10
+ *
11
+ * **Four families, and no device database.** A table of individual controllers is a maintenance
12
+ * obligation that grows with the hardware market and rots silently — and a rotted entry shows a
13
+ * wrong glyph to a player while no test can see it. Four families cover the pads a browser will
14
+ * vouch for; everything else is `generic` and correct rather than guessed.
15
+ *
16
+ * **What would make this wrong:** a family whose members disagree about their own lettering, which
17
+ * would make the family the wrong unit to key on. None of these four do.
18
+ */
19
+
20
+ export type GamepadFamily = 'xbox' | 'playstation' | 'nintendo' | 'generic';
21
+
22
+ /** Vendor identifiers, which are the same four hex digits in every browser that reports them. */
23
+ const VENDORS: Readonly<Record<string, GamepadFamily>> = {
24
+ '045e': 'xbox',
25
+ '054c': 'playstation',
26
+ '057e': 'nintendo',
27
+ };
28
+
29
+ /** For a pad that names itself but carries no vendor pair, which is most of what XInput reports. */
30
+ const NAMED: readonly (readonly [string, GamepadFamily])[] = [
31
+ ['xbox', 'xbox'],
32
+ ['xinput', 'xbox'],
33
+ ['dualsense', 'playstation'],
34
+ ['dualshock', 'playstation'],
35
+ ['playstation', 'playstation'],
36
+ ['nintendo', 'nintendo'],
37
+ ['switch pro', 'nintendo'],
38
+ ];
39
+
40
+ /**
41
+ * Read the family out of the `id` string, in either shape a browser writes it.
42
+ *
43
+ * Chromium writes `Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 09cc)`; Firefox
44
+ * writes `054c-09cc-Wireless Controller`. Both are matched, because a parser that knew only one
45
+ * would answer `generic` for every pad in the other browser — which is a wrong prompt on screen
46
+ * with nothing anywhere reporting it, the failure this repository's rules about silent plausible
47
+ * answers exist for.
48
+ */
49
+ export function identifyGamepad(id: string): GamepadFamily {
50
+ const lower = id.toLowerCase();
51
+ const vendor = /(?:^|vendor:\s*)([0-9a-f]{4})\b/.exec(lower);
52
+ const known = vendor === null ? undefined : VENDORS[vendor[1] ?? ''];
53
+ if (known !== undefined) return known;
54
+ for (const [needle, family] of NAMED) if (lower.includes(needle)) return family;
55
+ return 'generic';
56
+ }
57
+
58
+ /**
59
+ * The vendor's own token for a position, which is also the tail of its glyph key.
60
+ *
61
+ * Only the positions vendors actually name differently are listed. A shoulder is `L1` on every pad
62
+ * that has one printed, so it falls through to the positional label rather than being repeated
63
+ * three times.
64
+ */
65
+ const TOKENS: Readonly<Record<GamepadFamily, Partial<Record<GamepadButton, string>>>> = {
66
+ xbox: {
67
+ faceDown: 'a',
68
+ faceRight: 'b',
69
+ faceLeft: 'x',
70
+ faceUp: 'y',
71
+ select: 'view',
72
+ start: 'menu',
73
+ },
74
+ playstation: {
75
+ faceDown: 'cross',
76
+ faceRight: 'circle',
77
+ faceLeft: 'square',
78
+ faceUp: 'triangle',
79
+ select: 'create',
80
+ start: 'options',
81
+ l1: 'l1',
82
+ r1: 'r1',
83
+ l2: 'l2',
84
+ r2: 'r2',
85
+ },
86
+ /* The swap: Nintendo's bottom button is B and its right button is A, the other way round from
87
+ every other pad here. This is the entire reason the engine names positions. */
88
+ nintendo: {
89
+ faceDown: 'b',
90
+ faceRight: 'a',
91
+ faceLeft: 'y',
92
+ faceUp: 'x',
93
+ select: 'minus',
94
+ start: 'plus',
95
+ },
96
+ generic: {},
97
+ };
98
+
99
+ /** `faceDown` to `Face Down`, `l1` to `L1` — true of any pad, and readable rather than cryptic. */
100
+ function positionalLabel(button: GamepadButton): string {
101
+ if (/^[lr][123]$/.test(button)) return button.toUpperCase();
102
+ const spaced = button.replace(/([A-Z])/g, ' $1');
103
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
104
+ }
105
+
106
+ /** A vendor token to the label a player reads on the plastic: `cross` to `Cross`, `a` to `A`. */
107
+ function titled(token: string): string {
108
+ return token.length <= 2 ? token.toUpperCase() : token.charAt(0).toUpperCase() + token.slice(1);
109
+ }
110
+
111
+ /**
112
+ * What this pad calls that position.
113
+ *
114
+ * A generic pad answers its position — `Face Down` is a poor prompt and it is not a *wrong* one,
115
+ * which is the trade this design takes over inventing a lettering for hardware it cannot identify.
116
+ */
117
+ export function labelFor(family: GamepadFamily, button: GamepadButton): string {
118
+ const token = TOKENS[family][button];
119
+ return token === undefined ? positionalLabel(button) : titled(token);
120
+ }
121
+
122
+ /**
123
+ * A stable key for a consumer's own icon set: `xbox.a`, `playstation.cross`, `nintendo.b`.
124
+ *
125
+ * Stable is the load-bearing word. A consumer builds a lookup from these to its own art, so
126
+ * changing one silently breaks an icon in somebody else's repository — they are an interface, not
127
+ * a formatting choice.
128
+ */
129
+ export function glyphFor(family: GamepadFamily, button: GamepadButton): string {
130
+ return `${family}.${TOKENS[family][button] ?? button}`;
131
+ }