@nodetool-ai/game-renderer 0.8.1 → 0.8.2

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 (273) hide show
  1. package/README.md +46 -0
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/audio/mixer.d.ts +75 -0
  4. package/dist/audio/mixer.d.ts.map +1 -0
  5. package/dist/audio/mixer.js +345 -0
  6. package/dist/audio/mixer.js.map +1 -0
  7. package/dist/audio/player.d.ts +67 -0
  8. package/dist/audio/player.d.ts.map +1 -0
  9. package/dist/audio/player.js +337 -0
  10. package/dist/audio/player.js.map +1 -0
  11. package/dist/audio/spatial.d.ts +50 -0
  12. package/dist/audio/spatial.d.ts.map +1 -0
  13. package/dist/audio/spatial.js +166 -0
  14. package/dist/audio/spatial.js.map +1 -0
  15. package/dist/audio/voices.d.ts +11 -0
  16. package/dist/audio/voices.d.ts.map +1 -0
  17. package/dist/audio/voices.js +22 -0
  18. package/dist/audio/voices.js.map +1 -0
  19. package/dist/audio.d.ts +6 -38
  20. package/dist/audio.d.ts.map +1 -1
  21. package/dist/audio.js +3 -226
  22. package/dist/audio.js.map +1 -1
  23. package/dist/browser.d.ts +2 -1
  24. package/dist/browser.d.ts.map +1 -1
  25. package/dist/browser.js +5 -5
  26. package/dist/browser.js.map +1 -1
  27. package/dist/browser3d.d.ts +2 -0
  28. package/dist/browser3d.d.ts.map +1 -0
  29. package/dist/browser3d.js +2 -0
  30. package/dist/browser3d.js.map +1 -0
  31. package/dist/build.d.ts.map +1 -1
  32. package/dist/build.js +29 -19
  33. package/dist/build.js.map +1 -1
  34. package/dist/build3d.d.ts +11 -0
  35. package/dist/build3d.d.ts.map +1 -0
  36. package/dist/build3d.js +126 -0
  37. package/dist/build3d.js.map +1 -0
  38. package/dist/canvas2d.d.ts +12 -3
  39. package/dist/canvas2d.d.ts.map +1 -1
  40. package/dist/canvas2d.js +59 -12
  41. package/dist/canvas2d.js.map +1 -1
  42. package/dist/fixed-tick-host.d.ts +10 -0
  43. package/dist/fixed-tick-host.d.ts.map +1 -0
  44. package/dist/fixed-tick-host.js +29 -0
  45. package/dist/fixed-tick-host.js.map +1 -0
  46. package/dist/frame-budget.d.ts +34 -0
  47. package/dist/frame-budget.d.ts.map +1 -0
  48. package/dist/frame-budget.js +52 -0
  49. package/dist/frame-budget.js.map +1 -0
  50. package/dist/frame.d.ts +20 -1
  51. package/dist/frame.d.ts.map +1 -1
  52. package/dist/frame.js +69 -1
  53. package/dist/frame.js.map +1 -1
  54. package/dist/game3d-capture-page.js +5834 -0
  55. package/dist/game3d-player.js +6001 -0
  56. package/dist/imageDiff.d.ts +9 -0
  57. package/dist/imageDiff.d.ts.map +1 -0
  58. package/dist/imageDiff.js +30 -0
  59. package/dist/imageDiff.js.map +1 -0
  60. package/dist/index.d.ts +12 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +9 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/input-bindings.d.ts +76 -0
  65. package/dist/input-bindings.d.ts.map +1 -0
  66. package/dist/input-bindings.js +377 -0
  67. package/dist/input-bindings.js.map +1 -0
  68. package/dist/input.d.ts +1 -1
  69. package/dist/input.d.ts.map +1 -1
  70. package/dist/input.js +1 -14
  71. package/dist/input.js.map +1 -1
  72. package/dist/input3d.d.ts +3 -0
  73. package/dist/input3d.d.ts.map +1 -0
  74. package/dist/input3d.js +3 -0
  75. package/dist/input3d.js.map +1 -0
  76. package/dist/node.d.ts +5 -0
  77. package/dist/node.d.ts.map +1 -1
  78. package/dist/node.js +28 -11
  79. package/dist/node.js.map +1 -1
  80. package/dist/node3d.d.ts +29 -0
  81. package/dist/node3d.d.ts.map +1 -0
  82. package/dist/node3d.js +160 -0
  83. package/dist/node3d.js.map +1 -0
  84. package/dist/particles/curves.d.ts +16 -0
  85. package/dist/particles/curves.d.ts.map +1 -0
  86. package/dist/particles/curves.js +49 -0
  87. package/dist/particles/curves.js.map +1 -0
  88. package/dist/particles/index.d.ts +6 -0
  89. package/dist/particles/index.d.ts.map +1 -0
  90. package/dist/particles/index.js +6 -0
  91. package/dist/particles/index.js.map +1 -0
  92. package/dist/particles/random.d.ts +10 -0
  93. package/dist/particles/random.d.ts.map +1 -0
  94. package/dist/particles/random.js +26 -0
  95. package/dist/particles/random.js.map +1 -0
  96. package/dist/particles/render2d.d.ts +40 -0
  97. package/dist/particles/render2d.d.ts.map +1 -0
  98. package/dist/particles/render2d.js +70 -0
  99. package/dist/particles/render2d.js.map +1 -0
  100. package/dist/particles/shapes.d.ts +18 -0
  101. package/dist/particles/shapes.d.ts.map +1 -0
  102. package/dist/particles/shapes.js +92 -0
  103. package/dist/particles/shapes.js.map +1 -0
  104. package/dist/particles/simulator.d.ts +88 -0
  105. package/dist/particles/simulator.d.ts.map +1 -0
  106. package/dist/particles/simulator.js +371 -0
  107. package/dist/particles/simulator.js.map +1 -0
  108. package/dist/player-v1.js +2502 -0
  109. package/dist/preparation3d.d.ts +3 -0
  110. package/dist/preparation3d.d.ts.map +1 -0
  111. package/dist/preparation3d.js +3 -0
  112. package/dist/preparation3d.js.map +1 -0
  113. package/dist/renderPipeline.d.ts +12 -0
  114. package/dist/renderPipeline.d.ts.map +1 -0
  115. package/dist/renderPipeline.js +17 -0
  116. package/dist/renderPipeline.js.map +1 -0
  117. package/dist/renderer3d/animation/index.d.ts +11 -0
  118. package/dist/renderer3d/animation/index.d.ts.map +1 -0
  119. package/dist/renderer3d/animation/index.js +212 -0
  120. package/dist/renderer3d/animation/index.js.map +1 -0
  121. package/dist/renderer3d/assets/cache.d.ts +14 -0
  122. package/dist/renderer3d/assets/cache.d.ts.map +1 -0
  123. package/dist/renderer3d/assets/cache.js +74 -0
  124. package/dist/renderer3d/assets/cache.js.map +1 -0
  125. package/dist/renderer3d/assets/dispose.d.ts +4 -0
  126. package/dist/renderer3d/assets/dispose.d.ts.map +1 -0
  127. package/dist/renderer3d/assets/dispose.js +41 -0
  128. package/dist/renderer3d/assets/dispose.js.map +1 -0
  129. package/dist/renderer3d/assets/hdri-contract.d.ts +23 -0
  130. package/dist/renderer3d/assets/hdri-contract.d.ts.map +1 -0
  131. package/dist/renderer3d/assets/hdri-contract.js +2 -0
  132. package/dist/renderer3d/assets/hdri-contract.js.map +1 -0
  133. package/dist/renderer3d/assets/instances.d.ts +5 -0
  134. package/dist/renderer3d/assets/instances.d.ts.map +1 -0
  135. package/dist/renderer3d/assets/instances.js +86 -0
  136. package/dist/renderer3d/assets/instances.js.map +1 -0
  137. package/dist/renderer3d/capture-driver-types.d.ts +42 -0
  138. package/dist/renderer3d/capture-driver-types.d.ts.map +1 -0
  139. package/dist/renderer3d/capture-driver-types.js +2 -0
  140. package/dist/renderer3d/capture-driver-types.js.map +1 -0
  141. package/dist/renderer3d/capture-page.d.ts +36 -0
  142. package/dist/renderer3d/capture-page.d.ts.map +1 -0
  143. package/dist/renderer3d/capture-page.js +68 -0
  144. package/dist/renderer3d/capture-page.js.map +1 -0
  145. package/dist/renderer3d/culling.d.ts +10 -0
  146. package/dist/renderer3d/culling.d.ts.map +1 -0
  147. package/dist/renderer3d/culling.js +27 -0
  148. package/dist/renderer3d/culling.js.map +1 -0
  149. package/dist/renderer3d/environment/index.d.ts +4 -0
  150. package/dist/renderer3d/environment/index.d.ts.map +1 -0
  151. package/dist/renderer3d/environment/index.js +9 -0
  152. package/dist/renderer3d/environment/index.js.map +1 -0
  153. package/dist/renderer3d/environment/sky.d.ts +45 -0
  154. package/dist/renderer3d/environment/sky.d.ts.map +1 -0
  155. package/dist/renderer3d/environment/sky.js +221 -0
  156. package/dist/renderer3d/environment/sky.js.map +1 -0
  157. package/dist/renderer3d/hud/fonts.d.ts +13 -0
  158. package/dist/renderer3d/hud/fonts.d.ts.map +1 -0
  159. package/dist/renderer3d/hud/fonts.js +69 -0
  160. package/dist/renderer3d/hud/fonts.js.map +1 -0
  161. package/dist/renderer3d/hud/paint.d.ts +4 -0
  162. package/dist/renderer3d/hud/paint.d.ts.map +1 -0
  163. package/dist/renderer3d/hud/paint.js +22 -0
  164. package/dist/renderer3d/hud/paint.js.map +1 -0
  165. package/dist/renderer3d/import.d.ts +34 -0
  166. package/dist/renderer3d/import.d.ts.map +1 -0
  167. package/dist/renderer3d/import.js +408 -0
  168. package/dist/renderer3d/import.js.map +1 -0
  169. package/dist/renderer3d/index.d.ts +74 -0
  170. package/dist/renderer3d/index.d.ts.map +1 -0
  171. package/dist/renderer3d/index.js +338 -0
  172. package/dist/renderer3d/index.js.map +1 -0
  173. package/dist/renderer3d/lights/index.d.ts +7 -0
  174. package/dist/renderer3d/lights/index.d.ts.map +1 -0
  175. package/dist/renderer3d/lights/index.js +67 -0
  176. package/dist/renderer3d/lights/index.js.map +1 -0
  177. package/dist/renderer3d/materials/index.d.ts +4 -0
  178. package/dist/renderer3d/materials/index.d.ts.map +1 -0
  179. package/dist/renderer3d/materials/index.js +8 -0
  180. package/dist/renderer3d/materials/index.js.map +1 -0
  181. package/dist/renderer3d/passes/post-processing.d.ts +44 -0
  182. package/dist/renderer3d/passes/post-processing.d.ts.map +1 -0
  183. package/dist/renderer3d/passes/post-processing.js +213 -0
  184. package/dist/renderer3d/passes/post-processing.js.map +1 -0
  185. package/dist/renderer3d/pipeline.d.ts +15 -0
  186. package/dist/renderer3d/pipeline.d.ts.map +1 -0
  187. package/dist/renderer3d/pipeline.js +10 -0
  188. package/dist/renderer3d/pipeline.js.map +1 -0
  189. package/dist/renderer3d/playwright-contract.d.ts +3 -0
  190. package/dist/renderer3d/playwright-contract.d.ts.map +1 -0
  191. package/dist/renderer3d/playwright-contract.js +4 -0
  192. package/dist/renderer3d/playwright-contract.js.map +1 -0
  193. package/dist/renderer3d/preparation.d.ts +79 -0
  194. package/dist/renderer3d/preparation.d.ts.map +1 -0
  195. package/dist/renderer3d/preparation.js +458 -0
  196. package/dist/renderer3d/preparation.js.map +1 -0
  197. package/dist/renderer3d/scene-sync.d.ts +8 -0
  198. package/dist/renderer3d/scene-sync.d.ts.map +1 -0
  199. package/dist/renderer3d/scene-sync.js +96 -0
  200. package/dist/renderer3d/scene-sync.js.map +1 -0
  201. package/dist/renderer3d/shadows/cascades.d.ts +40 -0
  202. package/dist/renderer3d/shadows/cascades.d.ts.map +1 -0
  203. package/dist/renderer3d/shadows/cascades.js +244 -0
  204. package/dist/renderer3d/shadows/cascades.js.map +1 -0
  205. package/dist/renderer3d/shadows/index.d.ts +44 -0
  206. package/dist/renderer3d/shadows/index.d.ts.map +1 -0
  207. package/dist/renderer3d/shadows/index.js +129 -0
  208. package/dist/renderer3d/shadows/index.js.map +1 -0
  209. package/dist/renderer3d/types.d.ts +18 -0
  210. package/dist/renderer3d/types.d.ts.map +1 -0
  211. package/dist/renderer3d/types.js +2 -0
  212. package/dist/renderer3d/types.js.map +1 -0
  213. package/dist/smoke.d.ts +15 -0
  214. package/dist/smoke.d.ts.map +1 -0
  215. package/dist/smoke.js +138 -0
  216. package/dist/smoke.js.map +1 -0
  217. package/dist/standalone-player.d.ts +11 -1
  218. package/dist/standalone-player.d.ts.map +1 -1
  219. package/dist/standalone-player.js +67 -41
  220. package/dist/standalone-player.js.map +1 -1
  221. package/dist/standalone-player3d.d.ts +14 -0
  222. package/dist/standalone-player3d.d.ts.map +1 -0
  223. package/dist/standalone-player3d.js +255 -0
  224. package/dist/standalone-player3d.js.map +1 -0
  225. package/dist/touch-controls.d.ts +22 -8
  226. package/dist/touch-controls.d.ts.map +1 -1
  227. package/dist/touch-controls.js +88 -21
  228. package/dist/touch-controls.js.map +1 -1
  229. package/dist/ui/controller.d.ts +59 -0
  230. package/dist/ui/controller.d.ts.map +1 -0
  231. package/dist/ui/controller.js +201 -0
  232. package/dist/ui/controller.js.map +1 -0
  233. package/dist/ui/hud2d.d.ts +11 -0
  234. package/dist/ui/hud2d.d.ts.map +1 -0
  235. package/dist/ui/hud2d.js +25 -0
  236. package/dist/ui/hud2d.js.map +1 -0
  237. package/dist/ui/layout.d.ts +42 -0
  238. package/dist/ui/layout.d.ts.map +1 -0
  239. package/dist/ui/layout.js +182 -0
  240. package/dist/ui/layout.js.map +1 -0
  241. package/dist/ui/paint.d.ts +45 -0
  242. package/dist/ui/paint.d.ts.map +1 -0
  243. package/dist/ui/paint.js +121 -0
  244. package/dist/ui/paint.js.map +1 -0
  245. package/dist/webgpu/effects.d.ts +22 -0
  246. package/dist/webgpu/effects.d.ts.map +1 -0
  247. package/dist/webgpu/effects.js +69 -0
  248. package/dist/webgpu/effects.js.map +1 -0
  249. package/dist/webgpu/hud.d.ts +4 -0
  250. package/dist/webgpu/hud.d.ts.map +1 -0
  251. package/dist/webgpu/hud.js +27 -0
  252. package/dist/webgpu/hud.js.map +1 -0
  253. package/dist/webgpu/lighting.d.ts +4 -0
  254. package/dist/webgpu/lighting.d.ts.map +1 -0
  255. package/dist/webgpu/lighting.js +47 -0
  256. package/dist/webgpu/lighting.js.map +1 -0
  257. package/dist/webgpu/pipeline.d.ts +11 -0
  258. package/dist/webgpu/pipeline.d.ts.map +1 -0
  259. package/dist/webgpu/pipeline.js +11 -0
  260. package/dist/webgpu/pipeline.js.map +1 -0
  261. package/dist/webgpu/sprites.d.ts +6 -0
  262. package/dist/webgpu/sprites.d.ts.map +1 -0
  263. package/dist/webgpu/sprites.js +74 -0
  264. package/dist/webgpu/sprites.js.map +1 -0
  265. package/dist/webgpu/types.d.ts +14 -0
  266. package/dist/webgpu/types.d.ts.map +1 -0
  267. package/dist/webgpu/types.js +2 -0
  268. package/dist/webgpu/types.js.map +1 -0
  269. package/dist/webgpu.d.ts +4 -3
  270. package/dist/webgpu.d.ts.map +1 -1
  271. package/dist/webgpu.js +119 -279
  272. package/dist/webgpu.js.map +1 -1
  273. package/package.json +47 -10
@@ -0,0 +1,9 @@
1
+ export interface GameCaptureDifference {
2
+ readonly width: number;
3
+ readonly height: number;
4
+ readonly changedPixels: number;
5
+ readonly changedFraction: number;
6
+ }
7
+ /** Measures pixels whose channel differences exceed the allowed capture tolerance. */
8
+ export declare function compareGameCaptures(expected: Uint8Array, actual: Uint8Array, channelTolerance: number): Promise<GameCaptureDifference>;
9
+ //# sourceMappingURL=imageDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageDiff.d.ts","sourceRoot":"","sources":["../src/imageDiff.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,sFAAsF;AACtF,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAwB5I"}
@@ -0,0 +1,30 @@
1
+ import { createCanvas, loadImage } from "@napi-rs/canvas";
2
+ /** Measures pixels whose channel differences exceed the allowed capture tolerance. */
3
+ export async function compareGameCaptures(expected, actual, channelTolerance) {
4
+ if (!Number.isInteger(channelTolerance) || channelTolerance < 0 || channelTolerance > 255) {
5
+ throw new Error("Capture channel tolerance must be an integer from 0 to 255");
6
+ }
7
+ const first = await loadImage(Buffer.from(expected));
8
+ const second = await loadImage(Buffer.from(actual));
9
+ if (first.width !== second.width || first.height !== second.height) {
10
+ throw new Error("Capture dimensions changed");
11
+ }
12
+ const canvas = createCanvas(first.width, first.height);
13
+ const context = canvas.getContext("2d");
14
+ context.drawImage(first, 0, 0);
15
+ const reference = context.getImageData(0, 0, first.width, first.height).data;
16
+ context.clearRect(0, 0, first.width, first.height);
17
+ context.drawImage(second, 0, 0);
18
+ const pixels = context.getImageData(0, 0, first.width, first.height).data;
19
+ let changedPixels = 0;
20
+ for (let offset = 0; offset < pixels.length; offset += 4) {
21
+ for (let channel = 0; channel < 4; channel++) {
22
+ if (Math.abs(pixels[offset + channel] - reference[offset + channel]) > channelTolerance) {
23
+ changedPixels++;
24
+ break;
25
+ }
26
+ }
27
+ }
28
+ return { width: first.width, height: first.height, changedPixels, changedFraction: changedPixels / (first.width * first.height) };
29
+ }
30
+ //# sourceMappingURL=imageDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageDiff.js","sourceRoot":"","sources":["../src/imageDiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAS1D,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAoB,EAAE,MAAkB,EAAE,gBAAwB;IAC1G,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,GAAG,CAAC,IAAI,gBAAgB,GAAG,GAAG,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAAC,CAAC;IACtH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC7E,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IAC1E,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACzD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAAC;gBACxF,aAAa,EAAE,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AACpI,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import type { GameRenderEffect, GameRenderFrame } from "@nodetool-ai/protocol";
2
+ import type { GameParticleField } from "./particles/render2d.js";
2
3
  export { gameKeyAction } from "./input.js";
3
4
  export { projectedCamera } from "./frame.js";
5
+ export * from "./particles/index.js";
6
+ export * from "./frame-budget.js";
4
7
  export type GameRendererBackend = "webgpu" | "canvas2d";
5
8
  export type GameRendererEffect = GameRenderEffect;
6
9
  export type GameHudEffectOrder = "beforeEffects" | "afterEffects";
@@ -34,10 +37,18 @@ export interface GameRenderer {
34
37
  readonly backend: GameRendererBackend;
35
38
  readonly canvas: HTMLCanvasElement;
36
39
  readonly capabilities: GameRendererCapabilities;
37
- render(frame: GameRenderFrame, interpolation: number): Promise<GameRendererStats>;
40
+ /** Draws the frame, with `particles` interleaved into the sprite layers when given. */
41
+ render(frame: GameRenderFrame, interpolation: number, particles?: GameParticleField): Promise<GameRendererStats>;
38
42
  setEffects(effects: readonly GameRendererEffect[], hudOrder?: GameHudEffectOrder): void;
39
43
  resize(width: number, height: number): void;
40
44
  invalidateAsset(assetId: string): void;
41
45
  dispose(): void;
42
46
  }
47
+ export { FixedTickClock } from "./fixed-tick-host.js";
48
+ export { GameInput3D } from "./input3d.js";
49
+ export { browserGamepads, GameInput, type GamepadLike, type TouchInputState } from "./input-bindings.js";
50
+ export * from "./ui/layout.js";
51
+ export * from "./ui/paint.js";
52
+ export * from "./ui/hud2d.js";
53
+ export * from "./ui/controller.js";
43
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExD,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAClD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnG,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,wBAAwB,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClF,UAAU,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC;CACjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,3 +1,12 @@
1
1
  export { gameKeyAction } from "./input.js";
2
2
  export { projectedCamera } from "./frame.js";
3
+ export * from "./particles/index.js";
4
+ export * from "./frame-budget.js";
5
+ export { FixedTickClock } from "./fixed-tick-host.js";
6
+ export { GameInput3D } from "./input3d.js";
7
+ export { browserGamepads, GameInput } from "./input-bindings.js";
8
+ export * from "./ui/layout.js";
9
+ export * from "./ui/paint.js";
10
+ export * from "./ui/hud2d.js";
11
+ export * from "./ui/controller.js";
3
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AA4ClC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,SAAS,EAA0C,MAAM,qBAAqB,CAAC;AACzG,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { type GameDocument, type GameDocument3D, type GameInputFrame, type GameInputFrame3D } from "@nodetool-ai/protocol";
2
+ /** The parts of the browser `Gamepad` the sampler reads. */
3
+ export interface GamepadLike {
4
+ readonly connected?: boolean;
5
+ readonly buttons: readonly {
6
+ readonly pressed: boolean;
7
+ readonly value?: number;
8
+ }[];
9
+ readonly axes: readonly number[];
10
+ }
11
+ /** What touch controls hold: a stick offset normalised to the stick radius (y grows downward) and held button actions. */
12
+ export interface TouchInputState {
13
+ readonly stick?: {
14
+ readonly x: number;
15
+ readonly y: number;
16
+ };
17
+ readonly buttons: ReadonlySet<string>;
18
+ }
19
+ /** The connected gamepads, or none where the Gamepad API is missing or blocked by permissions policy. */
20
+ export declare function browserGamepads(): readonly (GamepadLike | null)[];
21
+ /**
22
+ * Turns physical keyboard, mouse, gamepad and touch input into input frames through a document's
23
+ * input bindings. Physical input is sampled once per simulation tick, and edges and look deltas are
24
+ * consumed by the sample. While disabled (paused play), input is dropped instead of queued.
25
+ */
26
+ export declare class GameInput {
27
+ private readonly keys;
28
+ private readonly newSources;
29
+ private readonly newKeyValues;
30
+ private readonly previousPressed;
31
+ private readonly gamepadButtons;
32
+ private readonly touchSince;
33
+ private readonly uiHeld;
34
+ private gamepadAxes;
35
+ private touch;
36
+ private stickSince;
37
+ private mouseX;
38
+ private mouseY;
39
+ private touchX;
40
+ private touchY;
41
+ private enabled;
42
+ private clock;
43
+ /** Disabling releases everything held and ignores input until enabled again. */
44
+ setEnabled(enabled: boolean): void;
45
+ /** `code` is a `KeyboardEvent.code` and `key` its `KeyboardEvent.key`. `Mouse<n>` is accepted for mouse button n. */
46
+ keyDown(code: string, key?: string): void;
47
+ keyUp(code: string): void;
48
+ mouseDown(button: number): void;
49
+ mouseUp(button: number): void;
50
+ /** Mouse movement in pixels, accumulated until the next sample. */
51
+ look(x: number, y: number): void;
52
+ /** Touch drag movement in pixels, accumulated until the next sample. */
53
+ touchLook(x: number, y: number): void;
54
+ setTouch(state: TouchInputState): void;
55
+ /** A HUD button press. The action stays held until as many `releaseUiAction` calls as presses. */
56
+ pressUiAction(action: string): void;
57
+ releaseUiAction(action: string): void;
58
+ /** Reads every connected gamepad. Call once per tick with `navigator.getGamepads()`. */
59
+ pollGamepads(pads: readonly (GamepadLike | null)[] | null | undefined): void;
60
+ release(): void;
61
+ /** Whether a key is bound in this document, so the host can stop the browser's default action. */
62
+ handlesKey(document: GameDocument | GameDocument3D, code: string, key?: string): boolean;
63
+ sample(document: GameDocument3D): GameInputFrame3D;
64
+ /** 2D frames list actions in press order, as the fixed 2D key mapping did. */
65
+ sample2D(document: GameDocument): GameInputFrame;
66
+ private consume;
67
+ private sampleActions;
68
+ /** The press stamp of a held digital control, "analog" for a held analog control, or undefined when it is not held. */
69
+ private heldSince;
70
+ /** The first press stamp of a digital control pressed since the last sample. */
71
+ private pressedSince;
72
+ private axisValue;
73
+ private axisBindingValue;
74
+ private sampleLook;
75
+ }
76
+ //# sourceMappingURL=input-bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-bindings.d.ts","sourceRoot":"","sources":["../src/input-bindings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,377 @@
1
+ import { resolveGameInputBindings } from "@nodetool-ai/protocol";
2
+ import { stickActions } from "./touch-controls.js";
3
+ /** The connected gamepads, or none where the Gamepad API is missing or blocked by permissions policy. */
4
+ export function browserGamepads() {
5
+ try {
6
+ return typeof navigator !== "undefined" && typeof navigator.getGamepads === "function" ? navigator.getGamepads() : [];
7
+ }
8
+ catch {
9
+ // A permissions policy that blocks "gamepad" makes getGamepads throw; play continues without gamepads.
10
+ return [];
11
+ }
12
+ }
13
+ // The stick turns on past a quarter of its radius, as the 2D touch stick always has.
14
+ const TOUCH_STICK_DEAD_ZONE = 0.25;
15
+ const EMPTY_TOUCH = { buttons: new Set() };
16
+ function deadZoned(value, deadZone) {
17
+ if (!Number.isFinite(value)) {
18
+ return 0;
19
+ }
20
+ const magnitude = Math.abs(value);
21
+ if (magnitude <= deadZone) {
22
+ return 0;
23
+ }
24
+ return Math.sign(value) * Math.min(1, (magnitude - deadZone) / (1 - deadZone));
25
+ }
26
+ /** Negates without producing -0, so an idle frame reads exactly zero. */
27
+ function flip(value, invert) {
28
+ return invert && value !== 0 ? -value : value;
29
+ }
30
+ /** Keys that a `key` binding names by code. Such a key never also matches a `keyValue` binding. */
31
+ function boundCodes(bindings) {
32
+ const codes = new Set();
33
+ for (const { bindings: list } of bindings.actions) {
34
+ for (const binding of list) {
35
+ if (binding.kind === "key") {
36
+ codes.add(binding.code);
37
+ }
38
+ }
39
+ }
40
+ return codes;
41
+ }
42
+ /**
43
+ * Turns physical keyboard, mouse, gamepad and touch input into input frames through a document's
44
+ * input bindings. Physical input is sampled once per simulation tick, and edges and look deltas are
45
+ * consumed by the sample. While disabled (paused play), input is dropped instead of queued.
46
+ */
47
+ export class GameInput {
48
+ // Held keys by `KeyboardEvent.code`, with the lowercase key value at keydown and the press stamp.
49
+ keys = new Map();
50
+ // Digital sources pressed since the last sample, with the stamp of their first press.
51
+ newSources = new Map();
52
+ // Key values of keys pressed since the last sample, so a quick tap still produces an edge.
53
+ newKeyValues = new Map();
54
+ previousPressed = new Map();
55
+ gamepadButtons = new Map();
56
+ touchSince = new Map();
57
+ // Actions held by HUD buttons, with the press stamp and how many pointers or focus presses hold each.
58
+ uiHeld = new Map();
59
+ gamepadAxes = [];
60
+ touch = EMPTY_TOUCH;
61
+ stickSince;
62
+ mouseX = 0;
63
+ mouseY = 0;
64
+ touchX = 0;
65
+ touchY = 0;
66
+ enabled = true;
67
+ // Orders presses, so 2D frames list actions in the order they were pressed.
68
+ clock = 0;
69
+ /** Disabling releases everything held and ignores input until enabled again. */
70
+ setEnabled(enabled) {
71
+ if (!enabled) {
72
+ this.release();
73
+ }
74
+ this.enabled = enabled;
75
+ }
76
+ /** `code` is a `KeyboardEvent.code` and `key` its `KeyboardEvent.key`. `Mouse<n>` is accepted for mouse button n. */
77
+ keyDown(code, key) {
78
+ if (!this.enabled || this.keys.has(code)) {
79
+ return;
80
+ }
81
+ const since = ++this.clock;
82
+ const value = key?.toLowerCase();
83
+ this.keys.set(code, { value, since });
84
+ if (!this.newSources.has(`key:${code}`)) {
85
+ this.newSources.set(`key:${code}`, since);
86
+ }
87
+ if (value !== undefined) {
88
+ this.newKeyValues.set(code, value);
89
+ }
90
+ }
91
+ keyUp(code) { this.keys.delete(code); }
92
+ mouseDown(button) { this.keyDown(`Mouse${button}`); }
93
+ mouseUp(button) { this.keyUp(`Mouse${button}`); }
94
+ /** Mouse movement in pixels, accumulated until the next sample. */
95
+ look(x, y) {
96
+ if (!this.enabled) {
97
+ return;
98
+ }
99
+ this.mouseX += x;
100
+ this.mouseY += y;
101
+ }
102
+ /** Touch drag movement in pixels, accumulated until the next sample. */
103
+ touchLook(x, y) {
104
+ if (!this.enabled) {
105
+ return;
106
+ }
107
+ this.touchX += x;
108
+ this.touchY += y;
109
+ }
110
+ setTouch(state) {
111
+ if (!this.enabled) {
112
+ return;
113
+ }
114
+ // The stick counts as pressed when the thumb lands, before buttons the same touch update holds.
115
+ if (!state.stick) {
116
+ this.stickSince = undefined;
117
+ }
118
+ else if (this.stickSince === undefined) {
119
+ this.stickSince = ++this.clock;
120
+ }
121
+ for (const action of state.buttons) {
122
+ if (this.touchSince.has(action)) {
123
+ continue;
124
+ }
125
+ const since = ++this.clock;
126
+ this.touchSince.set(action, since);
127
+ if (!this.newSources.has(`touch:${action}`)) {
128
+ this.newSources.set(`touch:${action}`, since);
129
+ }
130
+ }
131
+ for (const action of [...this.touchSince.keys()]) {
132
+ if (!state.buttons.has(action)) {
133
+ this.touchSince.delete(action);
134
+ }
135
+ }
136
+ this.touch = state;
137
+ }
138
+ /** A HUD button press. The action stays held until as many `releaseUiAction` calls as presses. */
139
+ pressUiAction(action) {
140
+ if (!this.enabled) {
141
+ return;
142
+ }
143
+ const held = this.uiHeld.get(action);
144
+ if (held) {
145
+ held.holders += 1;
146
+ return;
147
+ }
148
+ const since = ++this.clock;
149
+ this.uiHeld.set(action, { since, holders: 1 });
150
+ if (!this.newSources.has(`ui:${action}`)) {
151
+ this.newSources.set(`ui:${action}`, since);
152
+ }
153
+ }
154
+ releaseUiAction(action) {
155
+ const held = this.uiHeld.get(action);
156
+ if (!held) {
157
+ return;
158
+ }
159
+ held.holders -= 1;
160
+ if (held.holders <= 0) {
161
+ this.uiHeld.delete(action);
162
+ }
163
+ }
164
+ /** Reads every connected gamepad. Call once per tick with `navigator.getGamepads()`. */
165
+ pollGamepads(pads) {
166
+ const buttons = new Set();
167
+ const axes = [];
168
+ if (this.enabled) {
169
+ for (const pad of pads ?? []) {
170
+ if (!pad || pad.connected === false) {
171
+ continue;
172
+ }
173
+ pad.buttons.forEach((button, index) => { if (button.pressed) {
174
+ buttons.add(index);
175
+ } });
176
+ pad.axes.forEach((value, index) => {
177
+ if (Number.isFinite(value) && Math.abs(value) > Math.abs(axes[index] ?? 0)) {
178
+ axes[index] = value;
179
+ }
180
+ });
181
+ }
182
+ }
183
+ for (const button of [...this.gamepadButtons.keys()]) {
184
+ if (!buttons.has(button)) {
185
+ this.gamepadButtons.delete(button);
186
+ }
187
+ }
188
+ for (const button of buttons) {
189
+ if (this.gamepadButtons.has(button)) {
190
+ continue;
191
+ }
192
+ const since = ++this.clock;
193
+ this.gamepadButtons.set(button, since);
194
+ if (!this.newSources.has(`gamepad:${button}`)) {
195
+ this.newSources.set(`gamepad:${button}`, since);
196
+ }
197
+ }
198
+ this.gamepadAxes = axes;
199
+ }
200
+ release() {
201
+ this.keys.clear();
202
+ this.newSources.clear();
203
+ this.newKeyValues.clear();
204
+ this.previousPressed.clear();
205
+ this.gamepadButtons.clear();
206
+ this.touchSince.clear();
207
+ this.uiHeld.clear();
208
+ this.gamepadAxes = [];
209
+ this.touch = EMPTY_TOUCH;
210
+ this.stickSince = undefined;
211
+ this.mouseX = 0;
212
+ this.mouseY = 0;
213
+ this.touchX = 0;
214
+ this.touchY = 0;
215
+ }
216
+ /** Whether a key is bound in this document, so the host can stop the browser's default action. */
217
+ handlesKey(document, code, key) {
218
+ const bindings = resolveGameInputBindings(document);
219
+ const value = key?.toLowerCase();
220
+ const matchesValue = value !== undefined && !boundCodes(bindings).has(code);
221
+ return bindings.actions.some(({ bindings: list }) => list.some((binding) => (binding.kind === "key" && binding.code === code) || (matchesValue && binding.kind === "keyValue" && binding.key.toLowerCase() === value))) ||
222
+ bindings.axes.some(({ bindings: list }) => list.some((binding) => binding.kind === "keys" && (binding.negative.includes(code) || binding.positive.includes(code))));
223
+ }
224
+ sample(document) {
225
+ const bindings = resolveGameInputBindings(document);
226
+ const { pressed, justPressed } = this.sampleActions(bindings, false);
227
+ const axes = Object.fromEntries(bindings.axes.map(({ axis, bindings: list }) => [axis, this.axisValue(list)]));
228
+ const look = this.sampleLook(bindings);
229
+ this.consume();
230
+ return { pressed, justPressed, axes, look };
231
+ }
232
+ /** 2D frames list actions in press order, as the fixed 2D key mapping did. */
233
+ sample2D(document) {
234
+ const frame = this.sampleActions(resolveGameInputBindings(document), true);
235
+ this.consume();
236
+ return frame;
237
+ }
238
+ consume() {
239
+ this.newSources.clear();
240
+ this.newKeyValues.clear();
241
+ this.mouseX = 0;
242
+ this.mouseY = 0;
243
+ this.touchX = 0;
244
+ this.touchY = 0;
245
+ }
246
+ sampleActions(bindings, pressOrder) {
247
+ const codes = boundCodes(bindings);
248
+ const sampledAt = ++this.clock;
249
+ const previous = new Map(this.previousPressed);
250
+ this.previousPressed.clear();
251
+ const pressed = [];
252
+ const justPressed = [];
253
+ for (const { action, bindings: list } of bindings.actions) {
254
+ let held = Infinity;
255
+ let fresh = Infinity;
256
+ for (const binding of list) {
257
+ const since = this.heldSince(binding, action, codes);
258
+ // An action held by analog input is ordered from the first sample that saw it on.
259
+ held = Math.min(held, since === "analog" ? previous.get(action) ?? sampledAt : since ?? Infinity);
260
+ fresh = Math.min(fresh, this.pressedSince(binding, action, codes) ?? Infinity);
261
+ }
262
+ // A HUD button holds its action whatever the bindings are.
263
+ held = Math.min(held, this.uiHeld.get(action)?.since ?? Infinity);
264
+ fresh = Math.min(fresh, this.newSources.get(`ui:${action}`) ?? Infinity);
265
+ if (held !== Infinity) {
266
+ pressed.push({ action, since: held });
267
+ this.previousPressed.set(action, held);
268
+ }
269
+ // A digital control pressed since the last sample is an edge even if it was released again.
270
+ // Analog and touch-stick controls produce an edge when the action turns on.
271
+ if (fresh !== Infinity || (held !== Infinity && !previous.has(action))) {
272
+ justPressed.push({ action, since: fresh !== Infinity ? fresh : held });
273
+ }
274
+ }
275
+ const order = (entries) => (pressOrder ? [...entries].sort((left, right) => left.since - right.since) : entries).map((entry) => entry.action);
276
+ return { pressed: order(pressed), justPressed: order(justPressed) };
277
+ }
278
+ /** The press stamp of a held digital control, "analog" for a held analog control, or undefined when it is not held. */
279
+ heldSince(binding, action, codes) {
280
+ switch (binding.kind) {
281
+ case "key": return this.keys.get(binding.code)?.since;
282
+ case "keyValue": {
283
+ const value = binding.key.toLowerCase();
284
+ let since;
285
+ for (const [code, held] of this.keys) {
286
+ if (held.value === value && !codes.has(code)) {
287
+ since = Math.min(since ?? Infinity, held.since);
288
+ }
289
+ }
290
+ return since;
291
+ }
292
+ case "mouseButton": return this.keys.get(`Mouse${binding.button}`)?.since;
293
+ case "gamepadButton": return this.gamepadButtons.get(binding.button);
294
+ case "gamepadAxis": {
295
+ const value = this.gamepadAxes[binding.axis] ?? 0;
296
+ return (binding.direction === "positive" ? value >= binding.threshold : value <= -binding.threshold) ? "analog" : undefined;
297
+ }
298
+ case "touchButton": return this.touchSince.get(action);
299
+ case "touchStick": {
300
+ const stick = this.touch.stick;
301
+ return stick !== undefined && stickActions(stick.x, stick.y, TOUCH_STICK_DEAD_ZONE).includes(binding.direction) ? this.stickSince : undefined;
302
+ }
303
+ }
304
+ }
305
+ /** The first press stamp of a digital control pressed since the last sample. */
306
+ pressedSince(binding, action, codes) {
307
+ switch (binding.kind) {
308
+ case "key": return this.newSources.get(`key:${binding.code}`);
309
+ case "keyValue": {
310
+ const value = binding.key.toLowerCase();
311
+ let since;
312
+ for (const [code, pressedValue] of this.newKeyValues) {
313
+ const stamp = this.newSources.get(`key:${code}`);
314
+ if (pressedValue === value && !codes.has(code) && stamp !== undefined) {
315
+ since = Math.min(since ?? Infinity, stamp);
316
+ }
317
+ }
318
+ return since;
319
+ }
320
+ case "mouseButton": return this.newSources.get(`key:Mouse${binding.button}`);
321
+ case "gamepadButton": return this.newSources.get(`gamepad:${binding.button}`);
322
+ case "touchButton": return this.newSources.get(`touch:${action}`);
323
+ default: return undefined;
324
+ }
325
+ }
326
+ axisValue(bindings) {
327
+ let result = 0;
328
+ for (const binding of bindings) {
329
+ const value = this.axisBindingValue(binding);
330
+ if (Math.abs(value) > Math.abs(result)) {
331
+ result = value;
332
+ }
333
+ }
334
+ return Math.max(-1, Math.min(1, result));
335
+ }
336
+ axisBindingValue(binding) {
337
+ switch (binding.kind) {
338
+ case "keys":
339
+ return Number(binding.positive.some((code) => this.keys.has(code))) - Number(binding.negative.some((code) => this.keys.has(code)));
340
+ case "gamepadAxis": return flip(deadZoned(this.gamepadAxes[binding.axis] ?? 0, binding.deadZone), binding.invert);
341
+ case "gamepadButtons": return Number(this.gamepadButtons.has(binding.positive)) - Number(this.gamepadButtons.has(binding.negative));
342
+ case "touchStick": {
343
+ const stick = this.touch.stick;
344
+ if (!stick || !(Math.hypot(stick.x, stick.y) > TOUCH_STICK_DEAD_ZONE)) {
345
+ return 0;
346
+ }
347
+ return flip(Math.max(-1, Math.min(1, binding.axis === "x" ? stick.x : stick.y)), binding.invert);
348
+ }
349
+ }
350
+ }
351
+ sampleLook(bindings) {
352
+ let x = 0;
353
+ let y = 0;
354
+ // Each term is added only when it is non-zero, so an idle source never turns a pixel delta into a rounded sum.
355
+ const add = (dx, dy) => {
356
+ if (dx !== 0) {
357
+ x = x === 0 ? dx : x + dx;
358
+ }
359
+ if (dy !== 0) {
360
+ y = y === 0 ? dy : y + dy;
361
+ }
362
+ };
363
+ for (const binding of bindings.look) {
364
+ if (binding.kind === "mouse") {
365
+ add(this.mouseX * binding.sensitivity, flip(this.mouseY * binding.sensitivity, binding.invertY));
366
+ }
367
+ else if (binding.kind === "touchDrag") {
368
+ add(this.touchX * binding.sensitivity, flip(this.touchY * binding.sensitivity, binding.invertY));
369
+ }
370
+ else {
371
+ add(deadZoned(this.gamepadAxes[binding.xAxis] ?? 0, binding.deadZone) * binding.speed, flip(deadZoned(this.gamepadAxes[binding.yAxis] ?? 0, binding.deadZone) * binding.speed, binding.invertY));
372
+ }
373
+ }
374
+ return { x, y };
375
+ }
376
+ }
377
+ //# sourceMappingURL=input-bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-bindings.js","sourceRoot":"","sources":["../src/input-bindings.ts"],"names":[],"mappings":"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"}
package/dist/input.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Map a physical key to the action name used by native game documents. */
2
- export declare function gameKeyAction(code: string, key: string): string;
2
+ export { gameKeyAction } from "@nodetool-ai/protocol";
3
3
  //# sourceMappingURL=input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAS/D"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/input.js CHANGED
@@ -1,16 +1,3 @@
1
1
  /** Map a physical key to the action name used by native game documents. */
2
- export function gameKeyAction(code, key) {
3
- switch (code) {
4
- case "ArrowLeft":
5
- case "KeyA": return "left";
6
- case "ArrowRight":
7
- case "KeyD": return "right";
8
- case "ArrowUp":
9
- case "KeyW": return "up";
10
- case "ArrowDown":
11
- case "KeyS": return "down";
12
- case "Space": return "space";
13
- default: return key.toLowerCase();
14
- }
15
- }
2
+ export { gameKeyAction } from "@nodetool-ai/protocol";
16
3
  //# sourceMappingURL=input.js.map
package/dist/input.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW;IACrD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC;QAAC,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC;QAC7C,KAAK,YAAY,CAAC;QAAC,KAAK,MAAM,EAAE,OAAO,OAAO,CAAC;QAC/C,KAAK,SAAS,CAAC;QAAC,KAAK,MAAM,EAAE,OAAO,IAAI,CAAC;QACzC,KAAK,WAAW,CAAC;QAAC,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC;QAC7C,KAAK,OAAO,EAAE,OAAO,OAAO,CAAC;QAC7B,SAAS,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The 3D hosts use the shared binding sampler. `GameInput3D` stays as the name existing callers import. */
2
+ export { GameInput as GameInput3D } from "./input-bindings.js";
3
+ //# sourceMappingURL=input3d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input3d.d.ts","sourceRoot":"","sources":["../src/input3d.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC"}