@oidoid/void 0.1.0-4 → 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 (300) 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 +31 -41
  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/anim.d.ts +0 -30
  231. package/dist/atlas/anim.js +0 -16
  232. package/dist/atlas/anim.js.map +0 -1
  233. package/dist/atlas/aseprite.d.ts +0 -37
  234. package/dist/atlas/aseprite.js +0 -2
  235. package/dist/atlas/aseprite.js.map +0 -1
  236. package/dist/atlas/atlas-parser.d.ts +0 -52
  237. package/dist/atlas/atlas-parser.js +0 -109
  238. package/dist/atlas/atlas-parser.js.map +0 -1
  239. package/dist/atlas/atlas.d.ts +0 -4
  240. package/dist/atlas/atlas.js +0 -2
  241. package/dist/atlas/atlas.js.map +0 -1
  242. package/dist/audio/synth.d.ts +0 -4
  243. package/dist/audio/synth.js +0 -21
  244. package/dist/audio/synth.js.map +0 -1
  245. package/dist/graphics/bitmap.d.ts +0 -14
  246. package/dist/graphics/bitmap.js +0 -14
  247. package/dist/graphics/bitmap.js.map +0 -1
  248. package/dist/graphics/cam.d.ts +0 -16
  249. package/dist/graphics/cam.js +0 -42
  250. package/dist/graphics/cam.js.map +0 -1
  251. package/dist/graphics/frag.glsl.d.ts +0 -1
  252. package/dist/graphics/frag.glsl.js +0 -15
  253. package/dist/graphics/frag.glsl.js.map +0 -1
  254. package/dist/graphics/frame-listener.d.ts +0 -16
  255. package/dist/graphics/frame-listener.js +0 -83
  256. package/dist/graphics/frame-listener.js.map +0 -1
  257. package/dist/graphics/renderer.d.ts +0 -12
  258. package/dist/graphics/renderer.js +0 -184
  259. package/dist/graphics/renderer.js.map +0 -1
  260. package/dist/graphics/vert.glsl.d.ts +0 -1
  261. package/dist/graphics/vert.glsl.js +0 -46
  262. package/dist/graphics/vert.glsl.js.map +0 -1
  263. package/dist/index.d.ts +0 -31
  264. package/dist/index.js +0 -79
  265. package/dist/index.js.map +0 -1
  266. package/dist/input/gamepad-poller.d.ts +0 -8
  267. package/dist/input/gamepad-poller.js +0 -38
  268. package/dist/input/gamepad-poller.js.map +0 -1
  269. package/dist/input/input.d.ts +0 -44
  270. package/dist/input/input.js +0 -175
  271. package/dist/input/input.js.map +0 -1
  272. package/dist/input/keyboard-poller.d.ts +0 -7
  273. package/dist/input/keyboard-poller.js +0 -30
  274. package/dist/input/keyboard-poller.js.map +0 -1
  275. package/dist/input/pointer-poller.d.ts +0 -12
  276. package/dist/input/pointer-poller.js +0 -67
  277. package/dist/input/pointer-poller.js.map +0 -1
  278. package/dist/sprite/sprite.d.ts +0 -51
  279. package/dist/sprite/sprite.js +0 -161
  280. package/dist/sprite/sprite.js.map +0 -1
  281. package/dist/storage/json-storage.d.ts +0 -4
  282. package/dist/storage/json-storage.js +0 -13
  283. package/dist/storage/json-storage.js.map +0 -1
  284. package/dist/test/tsconfig.json +0 -14
  285. package/dist/text/font.d.ts +0 -6
  286. package/dist/text/font.js +0 -18
  287. package/dist/text/font.js.map +0 -1
  288. package/dist/text/text-layout.d.ts +0 -11
  289. package/dist/text/text-layout.js +0 -73
  290. package/dist/text/text-layout.js.map +0 -1
  291. package/dist/tsconfig.json +0 -13
  292. package/dist/types/2d.d.ts +0 -9
  293. package/dist/types/2d.js +0 -2
  294. package/dist/types/2d.js.map +0 -1
  295. package/dist/void.js +0 -60
  296. package/dist/void.js.map +0 -7
  297. package/dist/void.meta.json +0 -289
  298. package/src/atlas/anim.js +0 -17
  299. package/tools/atlas-parser.js +0 -120
  300. package/tools/void.js +0 -143
@@ -1,184 +0,0 @@
1
- import { maxAnimCels } from '../atlas/anim.js';
2
- import { BitmapBuffer } from './bitmap.js';
3
- import { Cam } from './cam.js';
4
- import { fragGLSL } from './frag.glsl.js';
5
- import { vertGLSL } from './vert.glsl.js';
6
- const uv = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0]);
7
- export class Renderer {
8
- #bmpBuffer = null;
9
- #canvas;
10
- #cels;
11
- #gl;
12
- #loseContext = null;
13
- #spritesheet;
14
- #uniforms = {};
15
- #vertArray = null;
16
- constructor(atlas, canvas, spritesheet) {
17
- this.#canvas = canvas;
18
- this.#spritesheet = spritesheet;
19
- this.#cels = new Uint16Array(newCels(atlas));
20
- }
21
- clearColor(rgba) {
22
- this.#gl.clearColor(((rgba >>> 24) & 0xff) / 0xff, ((rgba >>> 16) & 0xff) / 0xff, ((rgba >>> 8) & 0xff) / 0xff, ((rgba >>> 0) & 0xff) / 0xff);
23
- }
24
- initGL() {
25
- const gl = this.#canvas.getContext('webgl2', {
26
- antialias: false,
27
- desynchronized: true, // breaks render stats
28
- powerPreference: 'high-performance'
29
- });
30
- if (!gl)
31
- throw Error('WebGL v2 unsupported');
32
- this.#gl = gl;
33
- // Allow transparent textures to be layered.
34
- gl.enable(gl.BLEND);
35
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
36
- // Enable z-buffer for [0, 1] ([foreground, background]).
37
- gl.enable(gl.DEPTH_TEST);
38
- gl.depthRange(0, 1);
39
- gl.clearDepth(1);
40
- gl.depthFunc(gl.LESS);
41
- // Disable image colorspace conversions. The default is browser dependent.
42
- gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false);
43
- const pgm = loadProgram(gl, vertGLSL, fragGLSL);
44
- this.#uniforms = getUniformLocations(gl, pgm);
45
- gl.uniform2ui(this.#uniforms.uSpritesheetSize, this.#spritesheet.naturalWidth, this.#spritesheet.naturalHeight);
46
- this.#vertArray = gl.createVertexArray();
47
- gl.bindVertexArray(this.#vertArray);
48
- const uvBuffer = gl.createBuffer();
49
- gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);
50
- gl.enableVertexAttribArray(0);
51
- gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0);
52
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
53
- this.#bmpBuffer = gl.createBuffer();
54
- gl.bindBuffer(gl.ARRAY_BUFFER, this.#bmpBuffer);
55
- gl.enableVertexAttribArray(1);
56
- gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 12, 0);
57
- gl.vertexAttribDivisor(1, 1);
58
- gl.enableVertexAttribArray(2);
59
- gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, 12, 4);
60
- gl.vertexAttribDivisor(2, 1);
61
- gl.enableVertexAttribArray(3);
62
- gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, 12, 8);
63
- gl.vertexAttribDivisor(3, 1);
64
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
65
- gl.bindVertexArray(null);
66
- gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);
67
- gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);
68
- gl.bindBuffer(this.#gl.ARRAY_BUFFER, null);
69
- gl.uniform1i(this.#uniforms.uCels, 0);
70
- gl.activeTexture(gl.TEXTURE0);
71
- const dataTex = gl.createTexture();
72
- gl.bindTexture(gl.TEXTURE_2D, dataTex);
73
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
74
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
75
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16UI, 1, this.#cels.length / 4, // 4 u8s per row
76
- 0, gl.RGBA_INTEGER, gl.UNSIGNED_SHORT, this.#cels);
77
- gl.uniform1i(this.#uniforms.uSpritesheet, 1);
78
- gl.activeTexture(gl.TEXTURE1);
79
- const spritesheetTex = gl.createTexture();
80
- gl.bindTexture(gl.TEXTURE_2D, spritesheetTex);
81
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
82
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
83
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.#spritesheet);
84
- this.#loseContext = gl.getExtension('WEBGL_lose_context');
85
- }
86
- get loseContext() {
87
- return this.#loseContext;
88
- }
89
- hasContext() {
90
- return !this.#gl.isContextLost();
91
- }
92
- render(cam, frame, bmps) {
93
- this.#resize(cam);
94
- this.#gl.clear(this.#gl.COLOR_BUFFER_BIT | this.#gl.DEPTH_BUFFER_BIT);
95
- this.#gl.uniform4i(this.#uniforms.uCam, cam.x, cam.y, cam.w, cam.h);
96
- this.#gl.uniform1ui(this.#uniforms.uFrame, frame);
97
- this.#gl.bindVertexArray(this.#vertArray);
98
- this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#bmpBuffer);
99
- this.#gl.bufferData(this.#gl.ARRAY_BUFFER, bmps.buffer, this.#gl.STREAM_DRAW);
100
- this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, null);
101
- this.#gl.drawArraysInstanced(this.#gl.TRIANGLE_STRIP, 0, uv.length / 2, // d
102
- bmps.size);
103
- this.#gl.bindVertexArray(null);
104
- }
105
- #resize(cam) {
106
- const canvas = this.#canvas;
107
- const nativeWH = { w: cam.w * cam.scale, h: cam.h * cam.scale };
108
- if (canvas.width !== nativeWH.w || canvas.height !== nativeWH.h) {
109
- canvas.width = nativeWH.w;
110
- canvas.height = nativeWH.h;
111
- this.#gl.viewport(0, 0, nativeWH.w, nativeWH.h);
112
- }
113
- // These pixels may be greater than, less than, or equal to native.
114
- const clientW = nativeWH.w / devicePixelRatio;
115
- const clientH = nativeWH.h / devicePixelRatio;
116
- const diffW = Number.parseFloat(canvas.style.width.slice(0, -2)) - clientW;
117
- const diffH = Number.parseFloat(canvas.style.height.slice(0, -2)) - clientH;
118
- if (!Number.isFinite(diffW) ||
119
- Math.abs(diffW) >= 0.5 ||
120
- !Number.isFinite(diffH) ||
121
- Math.abs(diffH) >= 0.5) {
122
- canvas.style.width = `${clientW}px`;
123
- canvas.style.height = `${clientH}px`;
124
- }
125
- }
126
- }
127
- function compileShader(gl, type, src) {
128
- const shader = gl.createShader(type);
129
- if (!shader)
130
- throw Error('shader creation failed');
131
- gl.shaderSource(shader, src.trim());
132
- gl.compileShader(shader);
133
- const log = gl.getShaderInfoLog(shader)?.slice(0, -1);
134
- if (log)
135
- console.warn(log);
136
- return shader;
137
- }
138
- function getUniformLocations(gl, pgm) {
139
- if (!pgm)
140
- return {};
141
- const len = gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS);
142
- const locations = {};
143
- for (let i = 0; i < len; ++i) {
144
- const uniform = gl.getActiveUniform(pgm, i);
145
- if (uniform == null)
146
- throw Error(`missing shader uniform at index ${i}`);
147
- locations[uniform.name] = gl.getUniformLocation(pgm, uniform.name);
148
- }
149
- return locations;
150
- }
151
- function loadProgram(gl, vertGLSL, fragGLSL) {
152
- const pgm = gl.createProgram();
153
- if (!pgm)
154
- return null;
155
- const vert = compileShader(gl, gl.VERTEX_SHADER, vertGLSL);
156
- const frag = compileShader(gl, gl.FRAGMENT_SHADER, fragGLSL);
157
- gl.attachShader(pgm, vert);
158
- gl.attachShader(pgm, frag);
159
- gl.linkProgram(pgm);
160
- gl.useProgram(pgm);
161
- const log = gl.getProgramInfoLog(pgm)?.slice(0, -1);
162
- if (log)
163
- console.warn(log);
164
- gl.detachShader(pgm, frag);
165
- gl.detachShader(pgm, vert);
166
- gl.deleteShader(frag);
167
- gl.deleteShader(vert);
168
- return pgm;
169
- }
170
- /** XYWH ordered by ID and padded to 16-cel blocks. */
171
- function newCels(atlas) {
172
- const cels = [];
173
- for (const anim of Object.values(atlas)) {
174
- // Animations are inserted in ID order.
175
- for (const cel of anim.cels)
176
- cels.push(cel.x, cel.y, anim.w, anim.h);
177
- for (let i = anim.cels.length; i < maxAnimCels; i++) {
178
- const cel = anim.cels[i % anim.cels.length];
179
- cels.push(cel.x, cel.y, anim.w, anim.h);
180
- }
181
- }
182
- return cels;
183
- }
184
- //# sourceMappingURL=renderer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/graphics/renderer.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare const vertGLSL = "#version 300 es\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2\nuniform lowp usampler2D uCels;\nuniform mediump ivec4 uCam;\nuniform highp uint uFrame;\n\nlayout (location=0) in lowp ivec2 iUV;\nlayout (location=1) in highp uint iXY;\nlayout (location=2) in highp uint iWH;\nlayout (location=3) in highp uint iIFFZZ;\n\nflat out highp ivec4 vTexXYWH;\nout highp vec2 vDstWH;\n\nconst mediump int maxY = 0x1000;\nconst lowp int maxZ = 8;\nconst mediump int maxDepth = maxY * maxZ;\n\nvoid main() {\n mediump int x = int(iXY) >> 19;\n mediump int y = int(iXY << 16) >> 19;\n lowp int z = int(iIFFZZ & 0x7u);\n bool zend = bool(iIFFZZ & 0x8u);\n bool flipX = bool(iIFFZZ & 0x20u);\n bool flipY = bool(iIFFZZ & 0x10u);\n mediump int id = int((iIFFZZ >> 6) & 0x7ff0u);\n lowp int cel = int((iIFFZZ >> 6) & 0xfu);\n mediump int w = int((iWH >> 12) & 0xfffu);\n mediump int h = int(iWH & 0xfffu);\n\n lowp int frame = ((int(uFrame) - cel) / 4) & 0xf;\n mediump uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);\n\n // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel\n highp float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);\n\n highp ivec2 targetWH = ivec2(iUV) * ivec2(w, h);\n highp ivec2 origWH = ivec2(iUV) * ivec2(texXYWH.zw);\n\n highp vec2 end = vec2(x + targetWH.x, y + targetWH.y);\n highp vec2 clip = ((-2. * vec2(uCam.xy) + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);\n gl_Position = vec4(clip, depth, 1);\n vTexXYWH = ivec4(texXYWH);\n vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));\n}";
@@ -1,46 +0,0 @@
1
- export const vertGLSL = `#version 300 es
2
- // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2
3
- uniform lowp usampler2D uCels;
4
- uniform mediump ivec4 uCam;
5
- uniform highp uint uFrame;
6
-
7
- layout (location=0) in lowp ivec2 iUV;
8
- layout (location=1) in highp uint iXY;
9
- layout (location=2) in highp uint iWH;
10
- layout (location=3) in highp uint iIFFZZ;
11
-
12
- flat out highp ivec4 vTexXYWH;
13
- out highp vec2 vDstWH;
14
-
15
- const mediump int maxY = 0x1000;
16
- const lowp int maxZ = 8;
17
- const mediump int maxDepth = maxY * maxZ;
18
-
19
- void main() {
20
- mediump int x = int(iXY) >> 19;
21
- mediump int y = int(iXY << 16) >> 19;
22
- lowp int z = int(iIFFZZ & 0x7u);
23
- bool zend = bool(iIFFZZ & 0x8u);
24
- bool flipX = bool(iIFFZZ & 0x20u);
25
- bool flipY = bool(iIFFZZ & 0x10u);
26
- mediump int id = int((iIFFZZ >> 6) & 0x7ff0u);
27
- lowp int cel = int((iIFFZZ >> 6) & 0xfu);
28
- mediump int w = int((iWH >> 12) & 0xfffu);
29
- mediump int h = int(iWH & 0xfffu);
30
-
31
- lowp int frame = ((int(uFrame) - cel) / 4) & 0xf;
32
- mediump uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);
33
-
34
- // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel
35
- highp float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);
36
-
37
- highp ivec2 targetWH = ivec2(iUV) * ivec2(w, h);
38
- highp ivec2 origWH = ivec2(iUV) * ivec2(texXYWH.zw);
39
-
40
- highp vec2 end = vec2(x + targetWH.x, y + targetWH.y);
41
- highp vec2 clip = ((-2. * vec2(uCam.xy) + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);
42
- gl_Position = vec4(clip, depth, 1);
43
- vTexXYWH = ivec4(texXYWH);
44
- vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));
45
- }`;
46
- //# sourceMappingURL=vert.glsl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vert.glsl.js","sourceRoot":"","sources":["../../src/graphics/vert.glsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CtB,CAAA"}
package/dist/index.d.ts DELETED
@@ -1,31 +0,0 @@
1
- import type { Anim, AnimTag } from './atlas/anim.js';
2
- import type { Atlas } from './atlas/atlas.js';
3
- import { Synth } from './audio/synth.js';
4
- import { type Bitmap } from './graphics/bitmap.js';
5
- import { Cam } from './graphics/cam.js';
6
- import { Input, type StandardButton } from './input/input.js';
7
- import { Sprite } from './sprite/sprite.js';
8
- import { JSONStorage } from './storage/json-storage.js';
9
- export type { Font } from 'mem-font';
10
- export type { SpriteJSON } from './sprite/sprite.js';
11
- export { fontCharToTag } from './text/font.js';
12
- export { layoutText, type TextLayout } from './text/text-layout.js';
13
- export type { Box, WH, XY } from './types/2d.js';
14
- export { Sprite };
15
- export type { Anim, AnimTag, Atlas };
16
- export declare class Void<Tag extends AnimTag = AnimTag, Button extends string = StandardButton> {
17
- #private;
18
- static new<Tag extends AnimTag = AnimTag, Button extends string = StandardButton>(): Promise<Void<Tag, Button>>;
19
- readonly atlas: Atlas<Tag>;
20
- readonly cam: Cam;
21
- readonly ctrl: Input<Button>;
22
- readonly kv: JSONStorage;
23
- readonly synth: Synth;
24
- constructor(spritesheet: HTMLImageElement);
25
- set background(rgba: number);
26
- blit(bmp: Readonly<Bitmap>): void;
27
- get frame(): number;
28
- render(loop?: () => void): void;
29
- sprite(tag: Tag): Sprite<Tag>;
30
- stop(): void;
31
- }
package/dist/index.js DELETED
@@ -1,79 +0,0 @@
1
- import { Synth } from './audio/synth.js';
2
- import { BitmapBuffer } from './graphics/bitmap.js';
3
- import { Cam } from './graphics/cam.js';
4
- import { FrameListener } from './graphics/frame-listener.js';
5
- import { Renderer } from './graphics/renderer.js';
6
- import { Input } from './input/input.js';
7
- import { Sprite } from './sprite/sprite.js';
8
- import { JSONStorage } from './storage/json-storage.js';
9
- export { fontCharToTag } from './text/font.js';
10
- export { layoutText } from './text/text-layout.js';
11
- export { Sprite };
12
- export class Void {
13
- static async new() {
14
- return new Void(await loadImage(atlasURI));
15
- }
16
- atlas = atlas;
17
- cam = new Cam();
18
- ctrl;
19
- kv = new JSONStorage();
20
- synth = new Synth();
21
- #bitmaps = new BitmapBuffer(1_000_000);
22
- #framer;
23
- #renderer;
24
- constructor(spritesheet) {
25
- const meta = document.createElement('meta');
26
- meta.name = 'viewport';
27
- // Don't wait for double-tap scaling on mobile.
28
- meta.content = 'maximum-scale=1, minimum-scale=1, user-scalable=no';
29
- document.head.appendChild(meta);
30
- document.body.style.margin = '0';
31
- document.body.style.width = '100vw';
32
- document.body.style.height = '100vh';
33
- document.body.style.overflow = 'hidden';
34
- const canvas = document.createElement('canvas');
35
- canvas.style.cursor = 'none';
36
- canvas.style.display = 'block'; // No line height spacing.
37
- canvas.style.imageRendering = 'pixelated';
38
- // Update on each pointermove *touch* Event like *mouse* Events.
39
- canvas.style.touchAction = 'none';
40
- document.body.append(canvas);
41
- this.ctrl = new Input(this.cam, canvas);
42
- this.#renderer = new Renderer(atlas, canvas, spritesheet);
43
- this.#framer = new FrameListener(canvas, this.ctrl, this.#renderer);
44
- this.#framer.register('add');
45
- this.background = 0x000000ff;
46
- }
47
- set background(rgba) {
48
- document.body.style.background = `#${rgba.toString(16).padStart(8, '0')}`;
49
- this.#renderer.clearColor(rgba);
50
- }
51
- blit(bmp) {
52
- this.#bitmaps.push(bmp);
53
- }
54
- get frame() {
55
- return this.#framer.frame;
56
- }
57
- render(loop) {
58
- this.cam.resize();
59
- this.#framer.render(this.cam, this.#bitmaps, loop);
60
- this.#bitmaps.size = 0;
61
- }
62
- sprite(tag) {
63
- return new Sprite(this.atlas, tag);
64
- }
65
- stop() {
66
- this.#framer.cancel();
67
- this.#framer.register('remove');
68
- this.ctrl.register('remove');
69
- }
70
- }
71
- function loadImage(src) {
72
- return new Promise((resolve, reject) => {
73
- const img = new Image();
74
- img.onload = () => resolve(img);
75
- img.onerror = () => reject(img);
76
- img.src = src;
77
- });
78
- }
79
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export declare class GamepadPoller {
2
- #private;
3
- get bits(): number;
4
- mapAxis(axis: number, lessBit: number, moreBit: number): void;
5
- mapButton(button: number, bit: number): void;
6
- poll(): void;
7
- reset(): void;
8
- }
@@ -1,38 +0,0 @@
1
- export class GamepadPoller {
2
- #bits = 0;
3
- #bitByAxis = {};
4
- #bitByButton = {};
5
- get bits() {
6
- return this.#bits;
7
- }
8
- mapAxis(axis, lessBit, moreBit) {
9
- this.#bitByAxis[axis] = [lessBit, moreBit];
10
- }
11
- mapButton(button, bit) {
12
- this.#bitByButton[button] = bit;
13
- }
14
- poll() {
15
- if (!isSecureContext)
16
- return;
17
- this.#bits = 0;
18
- for (const pad of navigator.getGamepads()) {
19
- for (const [index, axis] of pad?.axes.entries() ?? []) {
20
- const bits = this.#bitByAxis[index];
21
- if (bits == null)
22
- continue;
23
- const bit = axis < 0 ? bits[0] : axis === 0 ? 0 : bits[1];
24
- this.#bits |= Math.abs(axis) >= 0.5 ? bit : 0;
25
- }
26
- for (const [index, button] of pad?.buttons.entries() ?? []) {
27
- const bit = this.#bitByButton[index];
28
- if (bit == null)
29
- continue;
30
- this.#bits |= button.pressed ? bit : 0;
31
- }
32
- }
33
- }
34
- reset() {
35
- this.#bits = 0;
36
- }
37
- }
38
- //# sourceMappingURL=gamepad-poller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gamepad-poller.js","sourceRoot":"","sources":["../../src/input/gamepad-poller.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAa;IACxB,KAAK,GAAG,CAAC,CAAA;IACA,UAAU,GAAmD,EAAE,CAAA;IAC/D,YAAY,GAA4B,EAAE,CAAA;IAEnD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,OAAe;QACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IAED,SAAS,CAAC,MAAc,EAAE,GAAW;QACnC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;IACjC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,eAAe;YAAE,OAAM;QAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;gBACtD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBACnC,IAAI,IAAI,IAAI,IAAI;oBAAE,SAAQ;gBAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACzD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;YACD,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;gBACpC,IAAI,GAAG,IAAI,IAAI;oBAAE,SAAQ;gBACzB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC;CACF"}
@@ -1,44 +0,0 @@
1
- import { Cam } from '../graphics/cam.js';
2
- import type { XY } from '../types/2d.js';
3
- export type StandardButton = 'L' | 'R' | 'U' | 'D' | // Dpad.
4
- 'C' | 'B' | 'A' | // Primary, secondary, tertiary.
5
- 'S';
6
- export declare class Input<Button extends string = StandardButton> {
7
- #private;
8
- handled: boolean;
9
- /** The maximum duration in milliseconds permitted between combo inputs. */
10
- maxInterval: number;
11
- /** The minimum duration in milliseconds for an input to be considered held. */
12
- minHeld: number;
13
- constructor(cam: Readonly<Cam>, canvas: HTMLCanvasElement);
14
- /**
15
- * Combos are interpreted exactly both in buttons pressed per tick (eg, up
16
- * will not match up and down the way `isOn('Up')` will) and sequence (order
17
- * and length). Combos only test button on state.
18
- */
19
- isCombo(...combo: readonly (readonly Button[])[]): boolean;
20
- /** Like isOnCombo() but test if the last button set is triggered. */
21
- isComboStart(...combo: readonly (readonly Button[])[]): boolean;
22
- /** True if held on or off. */
23
- isHeld(): boolean;
24
- isOffStart(...buttons: readonly Button[]): boolean;
25
- /**
26
- * Test if all buttons are on. True if the buttons are pressed regardless of
27
- * whether other buttons are pressed. Eg, `isOn('Up')` will return true when
28
- * up is pressed or when up and down are pressed.
29
- */
30
- isOn(...buttons: readonly Button[]): boolean;
31
- isOnStart(...buttons: readonly Button[]): boolean;
32
- /** True if triggered on or off. */
33
- isStart(...buttons: readonly Button[]): boolean;
34
- mapAxis(less: Button, more: Button, ...axes: readonly number[]): void;
35
- mapButton(button: Button, ...indices: readonly number[]): void;
36
- mapClick(button: Button, ...clicks: readonly number[]): void;
37
- mapStandard(): void;
38
- mapKey(button: Button, ...keys: readonly string[]): void;
39
- get point(): Readonly<XY> | undefined;
40
- get pointType(): 'mouse' | 'touch' | 'pen' | undefined;
41
- poll(tick: number): void;
42
- register(op: 'add' | 'remove'): void;
43
- reset(): void;
44
- }
@@ -1,175 +0,0 @@
1
- import { Cam } from '../graphics/cam.js';
2
- import { GamepadPoller } from './gamepad-poller.js';
3
- import { KeyboardPoller } from './keyboard-poller.js';
4
- import { PointerPoller } from './pointer-poller.js';
5
- export class Input {
6
- handled = false;
7
- /** The maximum duration in milliseconds permitted between combo inputs. */
8
- maxInterval = 300;
9
- /** The minimum duration in milliseconds for an input to be considered held. */
10
- minHeld = 300;
11
- /** The time in milliseconds since the input changed. */
12
- #duration = 0;
13
- /** Prior button state, possibly 0, but not necessarily a combo member. */
14
- #prevBits = 0;
15
- /**
16
- * A sequence of nonzero buttons ordered from oldest (first) to latest (last).
17
- * Combos are terminated only by expiration.
18
- */
19
- #combo = [];
20
- /** Logical button to bit. */
21
- #bitByButton = {};
22
- #gamepad = new GamepadPoller();
23
- #keyboard = new KeyboardPoller();
24
- #pointer;
25
- #pollBits = 0;
26
- #pollTick = 0;
27
- constructor(cam, canvas) {
28
- this.#pointer = new PointerPoller(cam, canvas);
29
- }
30
- /**
31
- * Combos are interpreted exactly both in buttons pressed per tick (eg, up
32
- * will not match up and down the way `isOn('Up')` will) and sequence (order
33
- * and length). Combos only test button on state.
34
- */
35
- isCombo(...combo) {
36
- if (combo.length !== this.#combo.length)
37
- return false;
38
- for (const [i, buttons] of combo.entries()) {
39
- const bits = this.#buttonsToBits(buttons);
40
- if (this.#combo[i] !== bits)
41
- return false;
42
- }
43
- // #combo is a historical record of buttons. Whenever buttons changes, a new
44
- // entry is pushed. Make sure the current entry is the current state and
45
- // that the last entry's buttons haven't been released.
46
- return this.#combo[combo.length - 1] === this.#bits;
47
- }
48
- /** Like isOnCombo() but test if the last button set is triggered. */
49
- isComboStart(...combo) {
50
- return (this.isCombo(...combo) &&
51
- !!combo.at(-1)?.every(button => this.isOnStart(button)));
52
- }
53
- /** True if held on or off. */
54
- isHeld() {
55
- return this.#duration >= this.minHeld;
56
- }
57
- isOffStart(...buttons) {
58
- return !this.isOn(...buttons) && this.isStart(...buttons);
59
- }
60
- /**
61
- * Test if all buttons are on. True if the buttons are pressed regardless of
62
- * whether other buttons are pressed. Eg, `isOn('Up')` will return true when
63
- * up is pressed or when up and down are pressed.
64
- */
65
- isOn(...buttons) {
66
- const bits = this.#buttonsToBits(buttons);
67
- return (this.#bits & bits) === bits;
68
- }
69
- isOnStart(...buttons) {
70
- return this.isOn(...buttons) && this.isStart(...buttons);
71
- }
72
- /** True if triggered on or off. */
73
- isStart(...buttons) {
74
- const bits = this.#buttonsToBits(buttons);
75
- return (this.#bits & bits) !== (this.#prevBits & bits);
76
- }
77
- mapAxis(less, more, ...axes) {
78
- for (const axis of axes) {
79
- this.#gamepad.mapAxis(axis, this.#map(less), this.#map(more));
80
- }
81
- }
82
- mapButton(button, ...indices) {
83
- for (const index of indices) {
84
- this.#gamepad.mapButton(index, this.#map(button));
85
- }
86
- }
87
- mapClick(button, ...clicks) {
88
- for (const click of clicks)
89
- this.#pointer.map(click, this.#map(button));
90
- }
91
- mapStandard() {
92
- this.mapKey('L', 'ArrowLeft', 'a');
93
- this.mapKey('R', 'ArrowRight', 'd');
94
- this.mapKey('U', 'ArrowUp', 'w');
95
- this.mapKey('D', 'ArrowDown', 's');
96
- this.mapKey('C', 'z');
97
- this.mapKey('B', 'x');
98
- this.mapKey('A', 'c');
99
- this.mapKey('S', 'Enter', 'Escape');
100
- // https://w3c.github.io/gamepad/#remapping
101
- this.mapAxis('L', 'R', 0, 2);
102
- this.mapAxis('U', 'D', 1, 3);
103
- this.mapButton('L', 14);
104
- this.mapButton('R', 15);
105
- this.mapButton('U', 12);
106
- this.mapButton('D', 13);
107
- this.mapButton('A', 0);
108
- this.mapButton('S', 9);
109
- this.mapClick('A', 1);
110
- }
111
- mapKey(button, ...keys) {
112
- for (const key of keys)
113
- this.#keyboard.map(key, this.#map(button));
114
- }
115
- get point() {
116
- return this.#pointer.xy;
117
- }
118
- get pointType() {
119
- return this.#pointer.type;
120
- }
121
- poll(tick) {
122
- this.handled = false;
123
- this.#duration += this.#pollTick;
124
- this.#prevBits = this.#pollBits;
125
- this.#gamepad.poll();
126
- if (this.#duration > this.maxInterval &&
127
- (this.#bits === 0 || this.#bits !== this.#prevBits)) {
128
- // Expired.
129
- this.#duration = 0;
130
- this.#combo.length = 0;
131
- }
132
- else if (this.#bits !== this.#prevBits) {
133
- // Some button state has changed and at least one button is still pressed.
134
- this.#duration = 0;
135
- if (this.#bits !== 0)
136
- this.#combo.push(this.#bits);
137
- }
138
- else if (this.#bits !== 0 && this.#bits === this.#prevBits) {
139
- // Held. Update combo with the latest buttons.
140
- this.#combo.pop();
141
- this.#combo.push(this.#bits);
142
- }
143
- this.#pollTick = tick;
144
- this.#pollBits = this.#bits;
145
- }
146
- register(op) {
147
- this.#keyboard.register(op);
148
- this.#pointer.register(op);
149
- }
150
- reset() {
151
- this.handled = false;
152
- this.#gamepad.reset();
153
- this.#keyboard.reset();
154
- this.#pointer.reset();
155
- }
156
- /**
157
- * The current state and prospective combo member. A zero value can never be a
158
- * combo member but is necessary to persist in previous to distinguish the off
159
- * state between repeated button presses like up, up.
160
- */
161
- get #bits() {
162
- return this.#gamepad.bits | this.#keyboard.bits | this.#pointer.bits;
163
- }
164
- #buttonsToBits(buttons) {
165
- let bits = 0;
166
- for (const button of buttons)
167
- bits |= this.#bitByButton[button] ?? 0;
168
- return bits;
169
- }
170
- #map(button) {
171
- return (this.#bitByButton[button] ??=
172
- 1 << Object.keys(this.#bitByButton).length);
173
- }
174
- }
175
- //# sourceMappingURL=input.js.map