@oidoid/void 0.1.0-3 → 0.1.0-6

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 (295) hide show
  1. package/dist/meta.json +1 -0
  2. package/dist/package.json +66 -0
  3. package/dist/public/favicon/favicon16.png +0 -0
  4. package/dist/public/favicon/favicon192.png +0 -0
  5. package/dist/public/favicon/favicon32.png +0 -0
  6. package/dist/public/favicon/favicon48.png +0 -0
  7. package/dist/public/favicon/favicon512.png +0 -0
  8. package/dist/public/favicon/favicon64.png +0 -0
  9. package/dist/public/index.html +23 -0
  10. package/dist/public/index.js +3844 -0
  11. package/dist/public/index.js.map +7 -0
  12. package/dist/public/manifest.json +1 -0
  13. package/dist/public/preload-atlas.png +0 -0
  14. package/dist/public/void-v0.1.0-4.html +111 -0
  15. package/dist/public/void-v0.1.0-5.html +111 -0
  16. package/dist/public/void-v0.1.0-6.html +111 -0
  17. package/dist/schema/config-file.d.ts +32 -0
  18. package/dist/schema/config-file.js +41 -0
  19. package/dist/schema/config-file.js.map +1 -0
  20. package/dist/schema/config-file.v0.json +68 -0
  21. package/dist/src/audio.d.ts +7 -0
  22. package/dist/src/audio.js +25 -0
  23. package/dist/src/audio.js.map +1 -0
  24. package/dist/src/demo/assets/manifest.json +46 -0
  25. package/dist/src/demo/assets/preload-atlas.json +193 -0
  26. package/dist/src/demo/ents/clock-ent.d.ts +10 -0
  27. package/dist/src/demo/ents/clock-ent.js +26 -0
  28. package/dist/src/demo/ents/clock-ent.js.map +1 -0
  29. package/dist/src/demo/ents/render-toggle-ent.d.ts +10 -0
  30. package/dist/src/demo/ents/render-toggle-ent.js +38 -0
  31. package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
  32. package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
  33. package/dist/src/demo/ents/work-counter-ent.js +24 -0
  34. package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
  35. package/dist/src/demo/game.d.ts +13 -0
  36. package/dist/src/demo/game.js +155 -0
  37. package/dist/src/demo/game.js.map +1 -0
  38. package/dist/src/demo/index.d.ts +1 -0
  39. package/dist/src/demo/index.js +8 -0
  40. package/dist/src/demo/index.js.map +1 -0
  41. package/dist/src/demo/tsconfig.json +15 -0
  42. package/dist/src/demo/types/tag.d.ts +2 -0
  43. package/dist/src/demo/types/tag.js +2 -0
  44. package/dist/src/demo/types/tag.js.map +1 -0
  45. package/dist/src/demo/void.json +11 -0
  46. package/dist/src/ents/button-ent.d.ts +38 -0
  47. package/dist/src/ents/button-ent.js +124 -0
  48. package/dist/src/ents/button-ent.js.map +1 -0
  49. package/dist/src/ents/cursor-ent.d.ts +18 -0
  50. package/dist/src/ents/cursor-ent.js +58 -0
  51. package/dist/src/ents/cursor-ent.js.map +1 -0
  52. package/dist/src/ents/ent.d.ts +7 -0
  53. package/dist/src/ents/ent.js +2 -0
  54. package/dist/src/ents/ent.js.map +1 -0
  55. package/dist/src/ents/follow-cam-ent.d.ts +25 -0
  56. package/dist/src/ents/follow-cam-ent.js +87 -0
  57. package/dist/src/ents/follow-cam-ent.js.map +1 -0
  58. package/dist/src/ents/nine-patch-ent.d.ts +43 -0
  59. package/dist/src/ents/nine-patch-ent.js +143 -0
  60. package/dist/src/ents/nine-patch-ent.js.map +1 -0
  61. package/dist/src/ents/text-ent.d.ts +23 -0
  62. package/dist/src/ents/text-ent.js +109 -0
  63. package/dist/src/ents/text-ent.js.map +1 -0
  64. package/dist/src/ents/zoo.d.ts +16 -0
  65. package/dist/src/ents/zoo.js +38 -0
  66. package/dist/src/ents/zoo.js.map +1 -0
  67. package/dist/src/graphics/atlas-parser.d.ts +4 -0
  68. package/dist/src/graphics/atlas-parser.js +27 -0
  69. package/dist/src/graphics/atlas-parser.js.map +1 -0
  70. package/dist/src/graphics/atlas.d.ts +49 -0
  71. package/dist/src/graphics/atlas.js +7 -0
  72. package/dist/src/graphics/atlas.js.map +1 -0
  73. package/dist/src/graphics/cam.d.ts +89 -0
  74. package/dist/src/graphics/cam.js +211 -0
  75. package/dist/src/graphics/cam.js.map +1 -0
  76. package/dist/src/graphics/gl.d.ts +24 -0
  77. package/dist/src/graphics/gl.js +70 -0
  78. package/dist/src/graphics/gl.js.map +1 -0
  79. package/dist/src/graphics/layer.d.ts +21 -0
  80. package/dist/src/graphics/layer.js +23 -0
  81. package/dist/src/graphics/layer.js.map +1 -0
  82. package/dist/src/graphics/renderer.d.ts +22 -0
  83. package/dist/src/graphics/renderer.js +168 -0
  84. package/dist/src/graphics/renderer.js.map +1 -0
  85. package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
  86. package/dist/src/graphics/sprite-frag.glsl.js +35 -0
  87. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
  88. package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
  89. package/dist/src/graphics/sprite-vert.glsl.js +68 -0
  90. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
  91. package/dist/src/graphics/sprite.d.ts +108 -0
  92. package/dist/src/graphics/sprite.js +301 -0
  93. package/dist/src/graphics/sprite.js.map +1 -0
  94. package/dist/src/index.d.ts +30 -0
  95. package/dist/src/index.js +33 -0
  96. package/dist/src/index.js.map +1 -0
  97. package/dist/src/input/context-menu.d.ts +8 -0
  98. package/dist/src/input/context-menu.js +25 -0
  99. package/dist/src/input/context-menu.js.map +1 -0
  100. package/dist/src/input/gamepad.d.ts +18 -0
  101. package/dist/src/input/gamepad.js +49 -0
  102. package/dist/src/input/gamepad.js.map +1 -0
  103. package/dist/src/input/input.d.ts +148 -0
  104. package/dist/src/input/input.js +383 -0
  105. package/dist/src/input/input.js.map +1 -0
  106. package/dist/src/input/keyboard.d.ts +17 -0
  107. package/dist/src/input/keyboard.js +46 -0
  108. package/dist/src/input/keyboard.js.map +1 -0
  109. package/dist/src/input/pointer.d.ts +53 -0
  110. package/dist/src/input/pointer.js +162 -0
  111. package/dist/src/input/pointer.js.map +1 -0
  112. package/dist/src/input/wheel.d.ts +12 -0
  113. package/dist/src/input/wheel.js +30 -0
  114. package/dist/src/input/wheel.js.map +1 -0
  115. package/dist/src/looper.d.ts +15 -0
  116. package/dist/src/looper.js +48 -0
  117. package/dist/src/looper.js.map +1 -0
  118. package/dist/src/mem/pool.d.ts +31 -0
  119. package/dist/src/mem/pool.js +98 -0
  120. package/dist/src/mem/pool.js.map +1 -0
  121. package/dist/src/pixel-ratio-observer.d.ts +10 -0
  122. package/dist/src/pixel-ratio-observer.js +26 -0
  123. package/dist/src/pixel-ratio-observer.js.map +1 -0
  124. package/dist/src/random/random.d.ts +8 -0
  125. package/dist/src/random/random.js +23 -0
  126. package/dist/src/random/random.js.map +1 -0
  127. package/dist/src/storage/local-storage.d.ts +3 -0
  128. package/dist/src/storage/local-storage.js +11 -0
  129. package/dist/src/storage/local-storage.js.map +1 -0
  130. package/dist/src/text/font.d.ts +6 -0
  131. package/dist/src/text/font.js +20 -0
  132. package/dist/src/text/font.js.map +1 -0
  133. package/dist/src/text/mem-prop-5x6.json +573 -0
  134. package/dist/src/text/text-layout.d.ts +19 -0
  135. package/dist/src/text/text-layout.js +85 -0
  136. package/dist/src/text/text-layout.js.map +1 -0
  137. package/dist/src/tsconfig.json +15 -0
  138. package/dist/src/types/geo.d.ts +38 -0
  139. package/dist/src/types/geo.js +61 -0
  140. package/dist/src/types/geo.js.map +1 -0
  141. package/dist/src/types/json.d.ts +31 -0
  142. package/dist/src/types/json.js +2 -0
  143. package/dist/src/types/json.js.map +1 -0
  144. package/dist/src/types/time.d.ts +19 -0
  145. package/dist/src/types/time.js +10 -0
  146. package/dist/src/types/time.js.map +1 -0
  147. package/dist/src/types/void-version.d.ts +9 -0
  148. package/dist/src/types/void-version.js +2 -0
  149. package/dist/src/types/void-version.js.map +1 -0
  150. package/dist/src/utils/async-util.d.ts +11 -0
  151. package/dist/src/utils/async-util.js +36 -0
  152. package/dist/src/utils/async-util.js.map +1 -0
  153. package/dist/src/utils/canvas-util.d.ts +7 -0
  154. package/dist/src/utils/canvas-util.js +128 -0
  155. package/dist/src/utils/canvas-util.js.map +1 -0
  156. package/dist/src/utils/color-util.d.ts +1 -0
  157. package/dist/src/utils/color-util.js +4 -0
  158. package/dist/src/utils/color-util.js.map +1 -0
  159. package/dist/src/utils/debug.d.ts +17 -0
  160. package/dist/src/utils/debug.js +34 -0
  161. package/dist/src/utils/debug.js.map +1 -0
  162. package/dist/src/utils/dom-util.d.ts +3 -0
  163. package/dist/src/utils/dom-util.js +29 -0
  164. package/dist/src/utils/dom-util.js.map +1 -0
  165. package/dist/src/utils/fetch-util.d.ts +3 -0
  166. package/dist/src/utils/fetch-util.js +24 -0
  167. package/dist/src/utils/fetch-util.js.map +1 -0
  168. package/dist/src/utils/math.d.ts +6 -0
  169. package/dist/src/utils/math.js +18 -0
  170. package/dist/src/utils/math.js.map +1 -0
  171. package/dist/src/utils/vibrate.d.ts +1 -0
  172. package/dist/src/utils/vibrate.js +4 -0
  173. package/dist/src/utils/vibrate.js.map +1 -0
  174. package/dist/src/void.d.ts +43 -0
  175. package/dist/src/void.js +95 -0
  176. package/dist/src/void.js.map +1 -0
  177. package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
  178. package/dist/tools/atlas-pack/aseprite.js +16 -0
  179. package/dist/tools/atlas-pack/aseprite.js.map +1 -0
  180. package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
  181. package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
  182. package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
  183. package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
  184. package/dist/tools/atlas-pack/atlas-pack.js +17 -0
  185. package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
  186. package/dist/tools/bundle/bundle.d.ts +3 -0
  187. package/dist/tools/bundle/bundle.js +48 -0
  188. package/dist/tools/bundle/bundle.js.map +1 -0
  189. package/dist/tools/bundle/html-plugin.d.ts +3 -0
  190. package/dist/tools/bundle/html-plugin.js +88 -0
  191. package/dist/tools/bundle/html-plugin.js.map +1 -0
  192. package/dist/tools/tsconfig-base.json +45 -0
  193. package/dist/tools/tsconfig.json +21 -0
  194. package/dist/tools/types/config.d.ts +20 -0
  195. package/dist/tools/types/config.js +22 -0
  196. package/dist/tools/types/config.js.map +1 -0
  197. package/dist/tools/utils/argv.d.ts +12 -0
  198. package/dist/tools/utils/argv.js +19 -0
  199. package/dist/tools/utils/argv.js.map +1 -0
  200. package/dist/tools/utils/exec.d.ts +3 -0
  201. package/dist/tools/utils/exec.js +15 -0
  202. package/dist/tools/utils/exec.js.map +1 -0
  203. package/dist/tools/utils/file-util.d.ts +1 -0
  204. package/dist/tools/utils/file-util.js +13 -0
  205. package/dist/tools/utils/file-util.js.map +1 -0
  206. package/dist/tools/utils/html-parser.d.ts +1 -0
  207. package/dist/tools/utils/html-parser.js +10 -0
  208. package/dist/tools/utils/html-parser.js.map +1 -0
  209. package/dist/tools/void.d.ts +17 -0
  210. package/dist/tools/void.js +30 -0
  211. package/dist/tools/void.js.map +1 -0
  212. package/package.json +33 -39
  213. package/readme.md +1 -1
  214. package/schema/config-file.test.ts +55 -0
  215. package/schema/config-file.ts +69 -0
  216. package/schema/config-file.v0.json +68 -0
  217. package/tools/atlas-pack/aseprite.ts +60 -0
  218. package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
  219. package/tools/atlas-pack/atlas-json-parser.ts +159 -0
  220. package/tools/atlas-pack/atlas-pack.ts +38 -0
  221. package/tools/bundle/bundle.ts +65 -0
  222. package/tools/bundle/html-plugin.ts +135 -0
  223. package/tools/types/config.ts +43 -0
  224. package/tools/utils/argv.test.ts +41 -0
  225. package/tools/utils/argv.ts +29 -0
  226. package/tools/utils/exec.ts +22 -0
  227. package/tools/utils/file-util.ts +11 -0
  228. package/tools/utils/html-parser.ts +9 -0
  229. package/tools/void.ts +54 -0
  230. package/dist/atlas/aseprite.d.ts +0 -37
  231. package/dist/atlas/aseprite.js +0 -2
  232. package/dist/atlas/aseprite.js.map +0 -1
  233. package/dist/atlas/atlas-parser.d.ts +0 -52
  234. package/dist/atlas/atlas-parser.js +0 -109
  235. package/dist/atlas/atlas-parser.js.map +0 -1
  236. package/dist/atlas/atlas.d.ts +0 -12
  237. package/dist/atlas/atlas.js +0 -2
  238. package/dist/atlas/atlas.js.map +0 -1
  239. package/dist/audio/synth.d.ts +0 -4
  240. package/dist/audio/synth.js +0 -21
  241. package/dist/audio/synth.js.map +0 -1
  242. package/dist/graphics/bitmap.d.ts +0 -14
  243. package/dist/graphics/bitmap.js +0 -14
  244. package/dist/graphics/bitmap.js.map +0 -1
  245. package/dist/graphics/cam.d.ts +0 -16
  246. package/dist/graphics/cam.js +0 -42
  247. package/dist/graphics/cam.js.map +0 -1
  248. package/dist/graphics/frag.glsl.d.ts +0 -1
  249. package/dist/graphics/frag.glsl.js +0 -15
  250. package/dist/graphics/frag.glsl.js.map +0 -1
  251. package/dist/graphics/frame-listener.d.ts +0 -16
  252. package/dist/graphics/frame-listener.js +0 -83
  253. package/dist/graphics/frame-listener.js.map +0 -1
  254. package/dist/graphics/renderer.d.ts +0 -12
  255. package/dist/graphics/renderer.js +0 -185
  256. package/dist/graphics/renderer.js.map +0 -1
  257. package/dist/graphics/vert.glsl.d.ts +0 -1
  258. package/dist/graphics/vert.glsl.js +0 -46
  259. package/dist/graphics/vert.glsl.js.map +0 -1
  260. package/dist/index.d.ts +0 -31
  261. package/dist/index.js +0 -79
  262. package/dist/index.js.map +0 -1
  263. package/dist/input/gamepad-poller.d.ts +0 -8
  264. package/dist/input/gamepad-poller.js +0 -38
  265. package/dist/input/gamepad-poller.js.map +0 -1
  266. package/dist/input/input.d.ts +0 -44
  267. package/dist/input/input.js +0 -175
  268. package/dist/input/input.js.map +0 -1
  269. package/dist/input/keyboard-poller.d.ts +0 -7
  270. package/dist/input/keyboard-poller.js +0 -30
  271. package/dist/input/keyboard-poller.js.map +0 -1
  272. package/dist/input/pointer-poller.d.ts +0 -12
  273. package/dist/input/pointer-poller.js +0 -67
  274. package/dist/input/pointer-poller.js.map +0 -1
  275. package/dist/sprite/sprite.d.ts +0 -51
  276. package/dist/sprite/sprite.js +0 -161
  277. package/dist/sprite/sprite.js.map +0 -1
  278. package/dist/storage/json-storage.d.ts +0 -4
  279. package/dist/storage/json-storage.js +0 -13
  280. package/dist/storage/json-storage.js.map +0 -1
  281. package/dist/test/tsconfig.json +0 -14
  282. package/dist/text/font.d.ts +0 -6
  283. package/dist/text/font.js +0 -18
  284. package/dist/text/font.js.map +0 -1
  285. package/dist/text/text-layout.d.ts +0 -11
  286. package/dist/text/text-layout.js +0 -73
  287. package/dist/text/text-layout.js.map +0 -1
  288. package/dist/tsconfig.json +0 -13
  289. package/dist/types/2d.d.ts +0 -9
  290. package/dist/types/2d.js +0 -2
  291. package/dist/types/2d.js.map +0 -1
  292. package/dist/void.js +0 -60
  293. package/dist/void.js.map +0 -7
  294. package/dist/void.meta.json +0 -299
  295. package/tools/void.js +0 -143
@@ -0,0 +1,383 @@
1
+ import { ContextMenu } from "./context-menu.js";
2
+ import { Gamepad } from "./gamepad.js";
3
+ import { Keyboard } from "./keyboard.js";
4
+ import { Pointer } from "./pointer.js";
5
+ import { Wheel } from "./wheel.js";
6
+ /**
7
+ * input device abstraction. aggregates devices, records history, and provides
8
+ * a convenient API.
9
+ *
10
+ * devices own as much device-specific detail and as little coordination (time
11
+ * and device) as practical. devices avoid caching state which is the
12
+ * responsibility of Input. devices strive to provide the current state and
13
+ * nothing else.
14
+ *
15
+ * if you miss reporting on a event between long updates, you just miss it.
16
+ * that's the nature of polling. there's no queue.
17
+ *
18
+ * to-do: expose analog state of gamepad. offer direction as a number instead of
19
+ * bool.
20
+ * to-do: multiplayer. possible if devices were requested instead of sought.
21
+ * to-do: expose input source device.
22
+ */
23
+ export class Input {
24
+ /** time allowed between combo inputs. */
25
+ comboMaxIntervalMillis = 300;
26
+ /**
27
+ * true if any button, key, or click was _ever_ on. doesn't consider handled.
28
+ */
29
+ gestured = false;
30
+ /** clear buttonish inputs for rest of frame. */
31
+ handled = false;
32
+ /** true if _any_ input has changed since previous update. */
33
+ invalid = false;
34
+ /**
35
+ * minimum duration for an input to be considered held. durations are
36
+ * calculated at frame boundaries, not on actual press. devices are treated
37
+ * strictly as polled aggregates.
38
+ */
39
+ minHeldMillis = 300;
40
+ #bitByButton = {};
41
+ #buttonByBit = {};
42
+ #bits = 0;
43
+ #cam;
44
+ /**
45
+ * sequence of nonzero bits ordered from oldest to latest. combos end only by
46
+ * expiration.
47
+ */
48
+ #combo = [];
49
+ #contextMenu;
50
+ #gamepad;
51
+ /** time since buttons changed. */
52
+ #heldMillis = 0;
53
+ #keyboard;
54
+ #pointer;
55
+ #pointerState;
56
+ /** bits last update. may not be equal to `#combo.at(-1)`. */
57
+ #prevBits = 0;
58
+ #wheel;
59
+ #wheelState;
60
+ constructor(cam, target) {
61
+ this.#cam = cam;
62
+ this.#contextMenu = new ContextMenu(target);
63
+ this.#gamepad = new Gamepad(globalThis);
64
+ this.#keyboard = new Keyboard(target.ownerDocument);
65
+ this.#pointer = new Pointer(target);
66
+ this.#wheel = new Wheel(target);
67
+ }
68
+ get anyOn() {
69
+ return this.#bits !== 0;
70
+ }
71
+ /** for debugging. */
72
+ get combo() {
73
+ const chords = [];
74
+ for (const bits of this.#combo) {
75
+ const chord = [];
76
+ for (let bit = 1; bit <= bits; bit <<= 1) {
77
+ if ((bit & bits) === bit && this.#buttonByBit[bit])
78
+ chord.push(this.#buttonByBit[bit]);
79
+ }
80
+ chord.sort();
81
+ chords.push(chord);
82
+ }
83
+ return chords;
84
+ }
85
+ /**
86
+ * enable when game is paused or in photo mode to allow right clicks and long
87
+ * presses to save canvas.
88
+ */
89
+ get contextMenu() {
90
+ return this.#contextMenu;
91
+ }
92
+ /** doesn't consider handled. gamepads must be polled. */
93
+ get gamepad() {
94
+ return this.#gamepad.connected ? {} : undefined;
95
+ }
96
+ /** true if bits hasn't changed for a while. */
97
+ get held() {
98
+ return !this.handled && this.#heldMillis >= this.minHeldMillis;
99
+ }
100
+ isAnyOn(...btns) {
101
+ return !this.handled && !!(this.#bits & this.#mapBits(btns));
102
+ }
103
+ isAnyOnStart(...btns) {
104
+ return this.started && this.isAnyOn(...btns);
105
+ }
106
+ /**
107
+ * buttons are exact. eg, up won't match up AND down like `isOn('U')` will.
108
+ * combo is exact too. `['A'], ['A']` will match `['A'], ['A']` but not
109
+ * `['A'], ['A'], ['A']`.
110
+ */
111
+ isCombo(...combo) {
112
+ return combo.length === this.#combo.length && this.isComboEndsWith(...combo);
113
+ }
114
+ /**
115
+ * `['A'], ['A']` will match `['A'], ['A']` and `['B'], ['A'], ['A']`. eg,
116
+ * double-clicks often don't care about any preceding buttons.
117
+ */
118
+ isComboEndsWith(...combo) {
119
+ for (const [i, btns] of combo.entries()) {
120
+ const bits = this.#mapBits(btns);
121
+ if (this.#combo.at(-combo.length + i) !== bits)
122
+ return false;
123
+ }
124
+ // #combo is a historical record of buttons. whenever buttons changes, a new
125
+ // entry is pushed. make sure the current entry is the current state.
126
+ return !this.handled && (this.#combo.at(-1) === this.#bits || !this.#bits);
127
+ }
128
+ /** like isComboEndsWith() but test if the last button is triggered. */
129
+ isComboEndsWithStart(...combo) {
130
+ // isOnStart() can handle zero-length.
131
+ return this.isOnStart(...combo.at(-1)) && this.isComboEndsWith(...combo);
132
+ }
133
+ /** like isCombo() but test if the last button is triggered. */
134
+ isComboStart(...combo) {
135
+ return this.isOnStart(...combo.at(-1)) && this.isCombo(...combo);
136
+ }
137
+ /*:
138
+ * true if any button in chord is not on. this is usually what's wanted. eg:
139
+ * ```ts
140
+ * if (isOn('A', 'B')) console.log('on')
141
+ * if (isOff('A', 'B')) console.log('not A+B; A and/or B is off')
142
+ * ```
143
+ */
144
+ isOff(...btns) {
145
+ return !this.handled && !this.isOn(...btns);
146
+ }
147
+ isOffStart(...btns) {
148
+ const bits = this.#mapBits(btns);
149
+ const wasOn = (this.#prevBits & bits) === bits;
150
+ // don't test this.#bits === 0 since it might forever miss the off event for
151
+ // the specific bits.
152
+ return wasOn && this.started && this.isOff(...btns);
153
+ }
154
+ /**
155
+ * true if all buttons are on inclusively. eg, `isOn('U')` is true when up is
156
+ * pressed or when up and down are pressed.
157
+ */
158
+ isOn(...btns) {
159
+ const bits = this.#mapBits(btns);
160
+ return !this.handled && (this.#bits & bits) === bits;
161
+ }
162
+ isOnStart(...btns) {
163
+ return this.started && this.isOn(...btns);
164
+ }
165
+ get key() {
166
+ return { invalid: this.#keyboard.invalid };
167
+ }
168
+ mapDefault() {
169
+ const input = this;
170
+ input.mapKeyboardCode('L', 'ArrowLeft');
171
+ input.mapKeyboardCode('R', 'ArrowRight');
172
+ input.mapKeyboardCode('U', 'ArrowUp');
173
+ input.mapKeyboardCode('D', 'ArrowDown');
174
+ input.mapKeyboardCode('C', 'KeyC');
175
+ input.mapKeyboardCode('A', 'KeyX');
176
+ input.mapKeyboardCode('B', 'KeyZ');
177
+ input.mapKeyboardCode('Menu', 'Enter');
178
+ input.mapKeyboardCode('Back', 'Escape');
179
+ // https://w3c.github.io/gamepad/#remapping
180
+ input.mapGamepadAxis('L', 'R', 0, 2);
181
+ input.mapGamepadAxis('U', 'D', 1, 3);
182
+ input.mapGamepadButton('L', 14);
183
+ input.mapGamepadButton('R', 15);
184
+ input.mapGamepadButton('U', 12);
185
+ input.mapGamepadButton('D', 13);
186
+ input.mapGamepadButton('C', 2);
187
+ input.mapGamepadButton('B', 0); // to-do: not good from PS perspective.
188
+ input.mapGamepadButton('A', 1); // to-do: not good from PS perspective.
189
+ input.mapGamepadButton('Menu', 9);
190
+ input.mapGamepadButton('Back', 8);
191
+ input.mapPointerClick('Click', 1);
192
+ input.mapPointerClick('Click2', 2);
193
+ input.mapPointerClick('ClickMiddle', 4);
194
+ return input;
195
+ }
196
+ // to-do: support analog values.
197
+ mapGamepadAxis(less, more, ...axes) {
198
+ for (const axis of axes) {
199
+ this.#gamepad.bitByAxis[axis] = [
200
+ this.#mapButton(less),
201
+ this.#mapButton(more)
202
+ ];
203
+ }
204
+ }
205
+ mapGamepadButton(btn, ...indices) {
206
+ for (const index of indices)
207
+ this.#gamepad.bitByButton[index] = this.#mapButton(btn);
208
+ }
209
+ /** @arg codes union of KeyboardEvent.code. */
210
+ mapKeyboardCode(btn, ...codes) {
211
+ for (const code of codes)
212
+ this.#keyboard.bitByCode[code] = this.#mapButton(btn);
213
+ }
214
+ mapPointerClick(btn, ...clicks) {
215
+ for (const click of clicks)
216
+ this.#pointer.bitByButton[click] = this.#mapButton(btn);
217
+ }
218
+ get on() {
219
+ const on = [];
220
+ for (const btn in this.#bitByButton)
221
+ if (this.isOn(btn))
222
+ on.push(btn);
223
+ return on.sort();
224
+ }
225
+ set onEvent(cb) {
226
+ this.#gamepad.onEvent = cb;
227
+ this.#keyboard.onEvent = cb;
228
+ this.#pointer.onEvent = cb;
229
+ this.#wheel.onEvent = cb;
230
+ }
231
+ /** doesn't consider handled. */
232
+ get point() {
233
+ return this.#pointerState;
234
+ }
235
+ get pointer() {
236
+ return this.#pointer;
237
+ }
238
+ register(op) {
239
+ globalThis[`${op}EventListener`]('blur', this.reset); // keyup is lost if window loses focus.
240
+ this.#contextMenu.register(op);
241
+ this.#gamepad.register(op);
242
+ this.#keyboard.register(op);
243
+ this.#pointer.register(op);
244
+ this.#wheel.register(op);
245
+ return this;
246
+ }
247
+ reset = () => {
248
+ this.#bits = 0;
249
+ this.#prevBits = 0;
250
+ this.handled = false;
251
+ this.#heldMillis = 0;
252
+ this.#combo.length = 0;
253
+ this.#gamepad.reset();
254
+ this.#keyboard.reset();
255
+ this.#pointer.reset();
256
+ this.#pointerState = undefined;
257
+ this.#wheel.reset();
258
+ this.#wheelState = undefined;
259
+ };
260
+ /** true if bits has changed. */
261
+ get started() {
262
+ return !this.handled && this.#bits !== this.#prevBits;
263
+ }
264
+ /**
265
+ * call on new frame before altering cam. dispatches always occur before an
266
+ * update.
267
+ * @arg millis duration since last update.
268
+ */
269
+ update(millis) {
270
+ this.handled = false;
271
+ this.#gamepad.update();
272
+ this.#pointer.update();
273
+ this.#prevBits = this.#bits;
274
+ this.#bits =
275
+ this.#gamepad.bits |
276
+ this.#keyboard.bits |
277
+ (this.#pointer.primary?.bits ?? 0);
278
+ this.invalid =
279
+ this.#bits !== this.#prevBits ||
280
+ this.#pointer.invalid ||
281
+ !!this.#wheel.deltaClient;
282
+ this.gestured ||= !!this.#bits;
283
+ if ((millis > this.comboMaxIntervalMillis && this.#bits !== this.#prevBits) ||
284
+ (this.#heldMillis + millis > this.comboMaxIntervalMillis && !this.#bits))
285
+ this.#combo.length = 0;
286
+ if (this.#bits === this.#prevBits)
287
+ this.#heldMillis = (this.#heldMillis + millis);
288
+ else
289
+ this.#heldMillis = millis;
290
+ if (this.#bits && this.#bits !== this.#prevBits) {
291
+ if (this.#prevBits)
292
+ this.#combo.length = 0; // new button without release.
293
+ this.#combo.push(this.#bits);
294
+ }
295
+ if (this.#pointer.primary) {
296
+ const pinchClient = this.#pointer.pinchClient;
297
+ const dragOn = this.#pointer.primary.drag &&
298
+ !Object.values(this.#pointer.secondary).length;
299
+ const secondary = [];
300
+ for (const pt of Object.values(this.#pointer.secondary)) {
301
+ secondary.push({
302
+ type: pt.type,
303
+ click: pt.clickClient
304
+ ? {
305
+ client: pt.clickClient,
306
+ local: this.#cam.clientToXYLocal(pt.clickClient),
307
+ ...this.#cam.clientToXY(pt.clickClient)
308
+ }
309
+ : undefined,
310
+ ...this.#cam.clientToXY(pt.xyClient),
311
+ client: pt.xyClient,
312
+ local: this.#cam.clientToXYLocal(pt.xyClient)
313
+ });
314
+ }
315
+ const centerClient = this.#pointer.centerClient;
316
+ const center = {
317
+ client: centerClient,
318
+ local: this.#cam.clientToXYLocal(centerClient),
319
+ ...this.#cam.clientToXY(centerClient)
320
+ };
321
+ this.#pointerState = {
322
+ center,
323
+ click: this.#pointer.primary.clickClient
324
+ ? {
325
+ client: this.#pointer.primary.clickClient,
326
+ local: this.#cam.clientToXYLocal(this.#pointer.primary.clickClient),
327
+ ...this.#cam.clientToXY(this.#pointer.primary.clickClient)
328
+ }
329
+ : undefined,
330
+ drag: {
331
+ on: dragOn,
332
+ start: !this.#pointerState?.drag.on && dragOn,
333
+ end: !!this.#pointerState?.drag.on && !dragOn
334
+ },
335
+ invalid: this.#pointer.invalid,
336
+ pinch: pinchClient
337
+ ? { client: pinchClient, xy: this.#cam.clientToXY(pinchClient) }
338
+ : undefined,
339
+ secondary,
340
+ type: this.#pointer.primary.type,
341
+ ...this.#cam.clientToXY(this.#pointer.primary.xyClient),
342
+ client: this.#pointer.primary.xyClient,
343
+ local: this.#cam.clientToXYLocal(this.#pointer.primary.xyClient)
344
+ };
345
+ }
346
+ // secondary should never be set when primary isn't.
347
+ else
348
+ this.#pointerState = undefined;
349
+ this.#wheelState = this.#wheel.deltaClient
350
+ ? {
351
+ delta: {
352
+ client: this.#wheel.deltaClient,
353
+ xy: this.#cam.clientToXY(this.#wheel.deltaClient)
354
+ }
355
+ }
356
+ : undefined;
357
+ this.#keyboard.postupdate();
358
+ this.#pointer.postupdate();
359
+ this.#wheel.postupdate();
360
+ }
361
+ [Symbol.dispose]() {
362
+ this.register('remove');
363
+ }
364
+ /** doesn't consider handled. */
365
+ get wheel() {
366
+ return this.#wheelState;
367
+ }
368
+ /** get bits for buttons. */
369
+ #mapBits(btns) {
370
+ let bits = 0;
371
+ for (const btn of btns)
372
+ bits |= this.#bitByButton[btn] ?? 0;
373
+ return bits;
374
+ }
375
+ /** assign button to bit. */
376
+ #mapButton(btn) {
377
+ const bit = (this.#bitByButton[btn] ??=
378
+ 1 << Object.keys(this.#bitByButton).length);
379
+ this.#buttonByBit[bit] = btn;
380
+ return bit;
381
+ }
382
+ }
383
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/input/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** @internal */
2
+ export declare class Keyboard {
3
+ #private;
4
+ /** KeyboardEvent.code to bit. */
5
+ readonly bitByCode: {
6
+ [code: string]: number;
7
+ };
8
+ invalid: boolean;
9
+ /** KeyboardEvent.code to state. Multiple keys may map to the same bit. */
10
+ onEvent: () => void;
11
+ constructor(target: EventTarget);
12
+ get bits(): number;
13
+ postupdate(): void;
14
+ register(op: 'add' | 'remove'): this;
15
+ reset(): void;
16
+ [Symbol.dispose](): void;
17
+ }
@@ -0,0 +1,46 @@
1
+ /** @internal */
2
+ export class Keyboard {
3
+ /** KeyboardEvent.code to bit. */
4
+ bitByCode = {};
5
+ invalid = false;
6
+ /** KeyboardEvent.code to state. Multiple keys may map to the same bit. */
7
+ onEvent = () => { };
8
+ #on = {};
9
+ #target;
10
+ constructor(target) {
11
+ this.#target = target;
12
+ }
13
+ get bits() {
14
+ let bits = 0;
15
+ for (const k in this.bitByCode)
16
+ bits |= this.#on[k] ? this.bitByCode[k] : 0;
17
+ return bits;
18
+ }
19
+ postupdate() {
20
+ this.invalid = false;
21
+ }
22
+ register(op) {
23
+ const fn = this.#target[`${op}EventListener`].bind(this.#target);
24
+ for (const ev of ['keydown', 'keyup'])
25
+ fn(ev, this.#onKey);
26
+ return this;
27
+ }
28
+ reset() {
29
+ this.invalid = false;
30
+ this.#on = {};
31
+ }
32
+ [Symbol.dispose]() {
33
+ this.register('remove');
34
+ }
35
+ #onKey = (ev) => {
36
+ if (!ev.isTrusted || this.bitByCode[ev.code] == null)
37
+ return;
38
+ if (ev.type === 'keydown' && (ev.metaKey || ev.altKey || ev.ctrlKey))
39
+ return;
40
+ this.invalid = true;
41
+ this.#on[ev.code] = ev.type === 'keydown';
42
+ ev.preventDefault();
43
+ this.onEvent();
44
+ };
45
+ }
46
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../../src/input/keyboard.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,OAAO,QAAQ;IACnB,iCAAiC;IACxB,SAAS,GAA6B,EAAE,CAAA;IACjD,OAAO,GAAY,KAAK,CAAA;IACxB,0EAA0E;IAC1E,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAA;IAC9B,GAAG,GAA8B,EAAE,CAAA;IAC1B,OAAO,CAAa;IAE7B,YAAY,MAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,QAAQ,CAAC,EAAoB;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChE,KAAK,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;YAAE,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,MAAuB,CAAC,CAAA;QAC3E,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;IACf,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,GAAG,CAAC,EAAiB,EAAQ,EAAE;QACnC,IAAI,CAAC,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI;YAAE,OAAM;QAC5D,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC;YAAE,OAAM;QAC5E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,SAAS,CAAA;QACzC,EAAE,CAAC,cAAc,EAAE,CAAA;QACnB,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC,CAAA;CACF"}
@@ -0,0 +1,53 @@
1
+ import { type Box, type XY } from '../types/geo.ts';
2
+ export type PointType = (typeof pointTypeByPointerType)[keyof typeof pointTypeByPointerType];
3
+ export type PointEvent = {
4
+ bits: number;
5
+ /** most recent click. */
6
+ clickClient: XY | undefined;
7
+ drag: boolean;
8
+ ev: (typeof pointEvents)[number];
9
+ id: number;
10
+ /**
11
+ * cursors should only use the primary inputs to avoid flickering between
12
+ * distant points. inputs may be only secondaries.
13
+ */
14
+ primary: boolean;
15
+ type: PointType | undefined;
16
+ xyClient: XY;
17
+ };
18
+ declare const pointTypeByPointerType: {
19
+ readonly mouse: "Mouse";
20
+ readonly pen: "Pen";
21
+ readonly touch: "Touch";
22
+ };
23
+ declare const pointEvents: readonly ["pointercancel", "pointerdown", "pointermove", "pointerup"];
24
+ /** @internal */
25
+ export declare class Pointer {
26
+ #private;
27
+ readonly bitByButton: {
28
+ [btn: number]: number;
29
+ };
30
+ dragMinClient: number;
31
+ invalid: boolean;
32
+ onEvent: () => void;
33
+ /** primary may be on or off. */
34
+ primary: Readonly<PointEvent> | undefined;
35
+ /**
36
+ * secondaries are deleted when buttons are off. secondaries are only present
37
+ * when primary is defined.
38
+ */
39
+ readonly secondary: {
40
+ [id: number]: Readonly<PointEvent>;
41
+ };
42
+ constructor(target: Element);
43
+ get boundsClient(): Box | undefined;
44
+ get centerClient(): XY | undefined;
45
+ get locked(): boolean;
46
+ get pinchClient(): XY | undefined;
47
+ postupdate(): void;
48
+ register(op: 'add' | 'remove'): this;
49
+ reset(): void;
50
+ update(): void;
51
+ [Symbol.dispose](): void;
52
+ }
53
+ export {};