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