@oidoid/void 0.1.0-4 → 0.1.0-7

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 (307) 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/favicon16.webp +0 -0
  5. package/dist/public/favicon/favicon192.png +0 -0
  6. package/dist/public/favicon/favicon192.webp +0 -0
  7. package/dist/public/favicon/favicon32.png +0 -0
  8. package/dist/public/favicon/favicon32.webp +0 -0
  9. package/dist/public/favicon/favicon48.png +0 -0
  10. package/dist/public/favicon/favicon48.webp +0 -0
  11. package/dist/public/favicon/favicon64.png +0 -0
  12. package/dist/public/favicon/favicon64.webp +0 -0
  13. package/dist/public/index.js +98 -0
  14. package/dist/public/index.js.map +7 -0
  15. package/dist/public/preload-atlas.png +0 -0
  16. package/dist/public/preload-atlas.webp +0 -0
  17. package/dist/public/void-v0.1.0-6+20251020.7cdf98d.html +111 -0
  18. package/dist/public/void-v0.1.0-6+20251020.e4e9eef.html +111 -0
  19. package/dist/public/void-v0.1.0-7+20251021.7cdf98d.html +111 -0
  20. package/dist/schema/config-file.d.ts +32 -0
  21. package/dist/schema/config-file.js +41 -0
  22. package/dist/schema/config-file.js.map +1 -0
  23. package/dist/schema/config-file.v0.json +68 -0
  24. package/dist/src/audio.d.ts +7 -0
  25. package/dist/src/audio.js +25 -0
  26. package/dist/src/audio.js.map +1 -0
  27. package/dist/src/demo/assets/manifest.json +41 -0
  28. package/dist/src/demo/assets/preload-atlas.json +193 -0
  29. package/dist/src/demo/ents/clock-ent.d.ts +11 -0
  30. package/dist/src/demo/ents/clock-ent.js +26 -0
  31. package/dist/src/demo/ents/clock-ent.js.map +1 -0
  32. package/dist/src/demo/ents/render-toggle-ent.d.ts +12 -0
  33. package/dist/src/demo/ents/render-toggle-ent.js +41 -0
  34. package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
  35. package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
  36. package/dist/src/demo/ents/work-counter-ent.js +20 -0
  37. package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
  38. package/dist/src/demo/game.d.ts +12 -0
  39. package/dist/src/demo/game.js +135 -0
  40. package/dist/src/demo/game.js.map +1 -0
  41. package/dist/src/demo/index.d.ts +1 -0
  42. package/dist/src/demo/index.js +8 -0
  43. package/dist/src/demo/index.js.map +1 -0
  44. package/dist/src/demo/tsconfig.json +15 -0
  45. package/dist/src/demo/types/tag.d.ts +2 -0
  46. package/dist/src/demo/types/tag.js +2 -0
  47. package/dist/src/demo/types/tag.js.map +1 -0
  48. package/dist/src/demo/void.json +11 -0
  49. package/dist/src/ents/button-ent.d.ts +39 -0
  50. package/dist/src/ents/button-ent.js +128 -0
  51. package/dist/src/ents/button-ent.js.map +1 -0
  52. package/dist/src/ents/cursor-ent.d.ts +18 -0
  53. package/dist/src/ents/cursor-ent.js +63 -0
  54. package/dist/src/ents/cursor-ent.js.map +1 -0
  55. package/dist/src/ents/ent.d.ts +7 -0
  56. package/dist/src/ents/ent.js +2 -0
  57. package/dist/src/ents/ent.js.map +1 -0
  58. package/dist/src/ents/follow-cam-ent.d.ts +25 -0
  59. package/dist/src/ents/follow-cam-ent.js +87 -0
  60. package/dist/src/ents/follow-cam-ent.js.map +1 -0
  61. package/dist/src/ents/nine-patch-ent.d.ts +43 -0
  62. package/dist/src/ents/nine-patch-ent.js +143 -0
  63. package/dist/src/ents/nine-patch-ent.js.map +1 -0
  64. package/dist/src/ents/text-ent.d.ts +23 -0
  65. package/dist/src/ents/text-ent.js +109 -0
  66. package/dist/src/ents/text-ent.js.map +1 -0
  67. package/dist/src/ents/zoo.d.ts +17 -0
  68. package/dist/src/ents/zoo.js +45 -0
  69. package/dist/src/ents/zoo.js.map +1 -0
  70. package/dist/src/graphics/atlas-parser.d.ts +4 -0
  71. package/dist/src/graphics/atlas-parser.js +27 -0
  72. package/dist/src/graphics/atlas-parser.js.map +1 -0
  73. package/dist/src/graphics/atlas.d.ts +49 -0
  74. package/dist/src/graphics/atlas.js +7 -0
  75. package/dist/src/graphics/atlas.js.map +1 -0
  76. package/dist/src/graphics/cam.d.ts +89 -0
  77. package/dist/src/graphics/cam.js +220 -0
  78. package/dist/src/graphics/cam.js.map +1 -0
  79. package/dist/src/graphics/gl.d.ts +24 -0
  80. package/dist/src/graphics/gl.js +70 -0
  81. package/dist/src/graphics/gl.js.map +1 -0
  82. package/dist/src/graphics/layer.d.ts +21 -0
  83. package/dist/src/graphics/layer.js +23 -0
  84. package/dist/src/graphics/layer.js.map +1 -0
  85. package/dist/src/graphics/renderer.d.ts +36 -0
  86. package/dist/src/graphics/renderer.js +180 -0
  87. package/dist/src/graphics/renderer.js.map +1 -0
  88. package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
  89. package/dist/src/graphics/sprite-frag.glsl.js +35 -0
  90. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
  91. package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
  92. package/dist/src/graphics/sprite-vert.glsl.js +68 -0
  93. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
  94. package/dist/src/graphics/sprite.d.ts +108 -0
  95. package/dist/src/graphics/sprite.js +301 -0
  96. package/dist/src/graphics/sprite.js.map +1 -0
  97. package/dist/src/index.d.ts +30 -0
  98. package/dist/src/index.js +33 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/input/context-menu.d.ts +8 -0
  101. package/dist/src/input/context-menu.js +25 -0
  102. package/dist/src/input/context-menu.js.map +1 -0
  103. package/dist/src/input/gamepad.d.ts +18 -0
  104. package/dist/src/input/gamepad.js +49 -0
  105. package/dist/src/input/gamepad.js.map +1 -0
  106. package/dist/src/input/input.d.ts +148 -0
  107. package/dist/src/input/input.js +383 -0
  108. package/dist/src/input/input.js.map +1 -0
  109. package/dist/src/input/keyboard.d.ts +17 -0
  110. package/dist/src/input/keyboard.js +46 -0
  111. package/dist/src/input/keyboard.js.map +1 -0
  112. package/dist/src/input/pointer.d.ts +53 -0
  113. package/dist/src/input/pointer.js +162 -0
  114. package/dist/src/input/pointer.js.map +1 -0
  115. package/dist/src/input/wheel.d.ts +12 -0
  116. package/dist/src/input/wheel.js +30 -0
  117. package/dist/src/input/wheel.js.map +1 -0
  118. package/dist/src/looper.d.ts +17 -0
  119. package/dist/src/looper.js +51 -0
  120. package/dist/src/looper.js.map +1 -0
  121. package/dist/src/mem/pool.d.ts +31 -0
  122. package/dist/src/mem/pool.js +98 -0
  123. package/dist/src/mem/pool.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 +7 -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 +19 -0
  160. package/dist/src/utils/debug.js +35 -0
  161. package/dist/src/utils/debug.js.map +1 -0
  162. package/dist/src/utils/delay-interval.d.ts +7 -0
  163. package/dist/src/utils/delay-interval.js +29 -0
  164. package/dist/src/utils/delay-interval.js.map +1 -0
  165. package/dist/src/utils/dom-util.d.ts +3 -0
  166. package/dist/src/utils/dom-util.js +29 -0
  167. package/dist/src/utils/dom-util.js.map +1 -0
  168. package/dist/src/utils/fetch-util.d.ts +3 -0
  169. package/dist/src/utils/fetch-util.js +24 -0
  170. package/dist/src/utils/fetch-util.js.map +1 -0
  171. package/dist/src/utils/math.d.ts +6 -0
  172. package/dist/src/utils/math.js +18 -0
  173. package/dist/src/utils/math.js.map +1 -0
  174. package/dist/src/utils/vibrate.d.ts +1 -0
  175. package/dist/src/utils/vibrate.js +4 -0
  176. package/dist/src/utils/vibrate.js.map +1 -0
  177. package/dist/src/void.d.ts +48 -0
  178. package/dist/src/void.js +102 -0
  179. package/dist/src/void.js.map +1 -0
  180. package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
  181. package/dist/tools/atlas-pack/aseprite.js +16 -0
  182. package/dist/tools/atlas-pack/aseprite.js.map +1 -0
  183. package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
  184. package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
  185. package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
  186. package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
  187. package/dist/tools/atlas-pack/atlas-pack.js +22 -0
  188. package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
  189. package/dist/tools/bundle/bundle.d.ts +3 -0
  190. package/dist/tools/bundle/bundle.js +48 -0
  191. package/dist/tools/bundle/bundle.js.map +1 -0
  192. package/dist/tools/bundle/html-plugin.d.ts +3 -0
  193. package/dist/tools/bundle/html-plugin.js +90 -0
  194. package/dist/tools/bundle/html-plugin.js.map +1 -0
  195. package/dist/tools/tsconfig-base.json +48 -0
  196. package/dist/tools/tsconfig.json +19 -0
  197. package/dist/tools/types/config.d.ts +27 -0
  198. package/dist/tools/types/config.js +31 -0
  199. package/dist/tools/types/config.js.map +1 -0
  200. package/dist/tools/types/package-json.d.ts +4 -0
  201. package/dist/tools/types/package-json.js +2 -0
  202. package/dist/tools/types/package-json.js.map +1 -0
  203. package/dist/tools/utils/argv.d.ts +12 -0
  204. package/dist/tools/utils/argv.js +19 -0
  205. package/dist/tools/utils/argv.js.map +1 -0
  206. package/dist/tools/utils/exec.d.ts +3 -0
  207. package/dist/tools/utils/exec.js +15 -0
  208. package/dist/tools/utils/exec.js.map +1 -0
  209. package/dist/tools/utils/file-util.d.ts +1 -0
  210. package/dist/tools/utils/file-util.js +13 -0
  211. package/dist/tools/utils/file-util.js.map +1 -0
  212. package/dist/tools/utils/html-parser.d.ts +1 -0
  213. package/dist/tools/utils/html-parser.js +10 -0
  214. package/dist/tools/utils/html-parser.js.map +1 -0
  215. package/dist/tools/void.d.ts +15 -0
  216. package/dist/tools/void.js +31 -0
  217. package/dist/tools/void.js.map +1 -0
  218. package/package.json +31 -41
  219. package/readme.md +1 -1
  220. package/schema/config-file.test.ts +55 -0
  221. package/schema/config-file.ts +69 -0
  222. package/schema/config-file.v0.json +68 -0
  223. package/tools/atlas-pack/aseprite.ts +60 -0
  224. package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
  225. package/tools/atlas-pack/atlas-json-parser.ts +159 -0
  226. package/tools/atlas-pack/atlas-pack.ts +51 -0
  227. package/tools/bundle/bundle.ts +64 -0
  228. package/tools/bundle/html-plugin.ts +135 -0
  229. package/tools/types/config.ts +65 -0
  230. package/tools/types/package-json.ts +4 -0
  231. package/tools/utils/argv.test.ts +41 -0
  232. package/tools/utils/argv.ts +29 -0
  233. package/tools/utils/exec.ts +22 -0
  234. package/tools/utils/file-util.ts +11 -0
  235. package/tools/utils/html-parser.ts +9 -0
  236. package/tools/void.ts +55 -0
  237. package/dist/atlas/anim.d.ts +0 -30
  238. package/dist/atlas/anim.js +0 -16
  239. package/dist/atlas/anim.js.map +0 -1
  240. package/dist/atlas/aseprite.d.ts +0 -37
  241. package/dist/atlas/aseprite.js +0 -2
  242. package/dist/atlas/aseprite.js.map +0 -1
  243. package/dist/atlas/atlas-parser.d.ts +0 -52
  244. package/dist/atlas/atlas-parser.js +0 -109
  245. package/dist/atlas/atlas-parser.js.map +0 -1
  246. package/dist/atlas/atlas.d.ts +0 -4
  247. package/dist/atlas/atlas.js +0 -2
  248. package/dist/atlas/atlas.js.map +0 -1
  249. package/dist/audio/synth.d.ts +0 -4
  250. package/dist/audio/synth.js +0 -21
  251. package/dist/audio/synth.js.map +0 -1
  252. package/dist/graphics/bitmap.d.ts +0 -14
  253. package/dist/graphics/bitmap.js +0 -14
  254. package/dist/graphics/bitmap.js.map +0 -1
  255. package/dist/graphics/cam.d.ts +0 -16
  256. package/dist/graphics/cam.js +0 -42
  257. package/dist/graphics/cam.js.map +0 -1
  258. package/dist/graphics/frag.glsl.d.ts +0 -1
  259. package/dist/graphics/frag.glsl.js +0 -15
  260. package/dist/graphics/frag.glsl.js.map +0 -1
  261. package/dist/graphics/frame-listener.d.ts +0 -16
  262. package/dist/graphics/frame-listener.js +0 -83
  263. package/dist/graphics/frame-listener.js.map +0 -1
  264. package/dist/graphics/renderer.d.ts +0 -12
  265. package/dist/graphics/renderer.js +0 -184
  266. package/dist/graphics/renderer.js.map +0 -1
  267. package/dist/graphics/vert.glsl.d.ts +0 -1
  268. package/dist/graphics/vert.glsl.js +0 -46
  269. package/dist/graphics/vert.glsl.js.map +0 -1
  270. package/dist/index.d.ts +0 -31
  271. package/dist/index.js +0 -79
  272. package/dist/index.js.map +0 -1
  273. package/dist/input/gamepad-poller.d.ts +0 -8
  274. package/dist/input/gamepad-poller.js +0 -38
  275. package/dist/input/gamepad-poller.js.map +0 -1
  276. package/dist/input/input.d.ts +0 -44
  277. package/dist/input/input.js +0 -175
  278. package/dist/input/input.js.map +0 -1
  279. package/dist/input/keyboard-poller.d.ts +0 -7
  280. package/dist/input/keyboard-poller.js +0 -30
  281. package/dist/input/keyboard-poller.js.map +0 -1
  282. package/dist/input/pointer-poller.d.ts +0 -12
  283. package/dist/input/pointer-poller.js +0 -67
  284. package/dist/input/pointer-poller.js.map +0 -1
  285. package/dist/sprite/sprite.d.ts +0 -51
  286. package/dist/sprite/sprite.js +0 -161
  287. package/dist/sprite/sprite.js.map +0 -1
  288. package/dist/storage/json-storage.d.ts +0 -4
  289. package/dist/storage/json-storage.js +0 -13
  290. package/dist/storage/json-storage.js.map +0 -1
  291. package/dist/test/tsconfig.json +0 -14
  292. package/dist/text/font.d.ts +0 -6
  293. package/dist/text/font.js +0 -18
  294. package/dist/text/font.js.map +0 -1
  295. package/dist/text/text-layout.d.ts +0 -11
  296. package/dist/text/text-layout.js +0 -73
  297. package/dist/text/text-layout.js.map +0 -1
  298. package/dist/tsconfig.json +0 -13
  299. package/dist/types/2d.d.ts +0 -9
  300. package/dist/types/2d.js +0 -2
  301. package/dist/types/2d.js.map +0 -1
  302. package/dist/void.js +0 -60
  303. package/dist/void.js.map +0 -7
  304. package/dist/void.meta.json +0 -289
  305. package/src/atlas/anim.js +0 -17
  306. package/tools/atlas-parser.js +0 -120
  307. package/tools/void.js +0 -143
@@ -0,0 +1,109 @@
1
+ import { memProp5x6 } from 'mem-font';
2
+ import { Layer } from "../graphics/layer.js";
3
+ import { fontCharToTag } from "../text/font.js";
4
+ import { layoutText } from "../text/text-layout.js";
5
+ import { xyEq } from "../types/geo.js";
6
+ export class TextEnt {
7
+ #maxW = Infinity;
8
+ #layout = 'Outdated';
9
+ #z = Layer.UIA;
10
+ #scale = 1;
11
+ #sprites = [];
12
+ #str = '';
13
+ #wh = { w: 0, h: 0 };
14
+ #xy = { x: 0, y: 0 };
15
+ free(v) {
16
+ v.sprites.free(...this.#sprites);
17
+ }
18
+ layout(v) {
19
+ if (this.#layout !== 'Outdated')
20
+ return false;
21
+ let len = 0;
22
+ const layout = layoutText({
23
+ font: memProp5x6,
24
+ maxW: this.#maxW,
25
+ scale: this.#scale,
26
+ start: this.#xy,
27
+ str: this.#str
28
+ });
29
+ this.#wh = { w: layout.wh.w, h: layout.wh.h };
30
+ for (const [i, char] of layout.chars.entries()) {
31
+ if (char == null)
32
+ continue;
33
+ const sprite = (this.#sprites[len] ??= v.sprites.alloc());
34
+ sprite.x = char.x;
35
+ sprite.y = char.y;
36
+ sprite.tag = fontCharToTag(memProp5x6, this.#str[i]);
37
+ sprite.stretch = true;
38
+ sprite.w *= this.#scale;
39
+ sprite.h *= this.#scale;
40
+ sprite.z = this.#z;
41
+ len++;
42
+ }
43
+ while (this.#sprites.length > len)
44
+ v.sprites.free(this.#sprites.pop());
45
+ this.#layout = 'Updated';
46
+ return true;
47
+ }
48
+ get maxW() {
49
+ return this.#maxW;
50
+ }
51
+ set maxW(w) {
52
+ if (w === this.#maxW)
53
+ return;
54
+ this.#maxW = w;
55
+ this.#layout = 'Outdated';
56
+ }
57
+ get scale() {
58
+ return this.#scale;
59
+ }
60
+ set scale(scale) {
61
+ if (scale === this.#scale)
62
+ return;
63
+ this.#scale = scale;
64
+ this.#layout = 'Outdated';
65
+ }
66
+ get text() {
67
+ return this.#str;
68
+ }
69
+ set text(str) {
70
+ if (str === this.#str)
71
+ return;
72
+ this.#str = str;
73
+ this.#layout = 'Outdated';
74
+ }
75
+ update(v) {
76
+ if (this.#layout === 'Rendered')
77
+ return;
78
+ if (this.#layout === 'Outdated')
79
+ this.layout(v);
80
+ this.#layout = 'Rendered';
81
+ return true;
82
+ }
83
+ get scaledLeading() {
84
+ return memProp5x6.leading * this.#scale;
85
+ }
86
+ get wh() {
87
+ return this.#wh;
88
+ }
89
+ get xy() {
90
+ return this.#xy;
91
+ }
92
+ set xy(xy) {
93
+ if (xyEq(xy, this.#xy))
94
+ return;
95
+ this.#xy.x = xy.x;
96
+ this.#xy.y = xy.y;
97
+ this.#layout = 'Outdated';
98
+ }
99
+ get z() {
100
+ return this.#z;
101
+ }
102
+ set z(layer) {
103
+ if (layer === this.#z)
104
+ return;
105
+ this.#z = layer;
106
+ this.#layout = 'Outdated';
107
+ }
108
+ }
109
+ //# sourceMappingURL=text-ent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-ent.js","sourceRoot":"","sources":["../../../src/ents/text-ent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TagFormat } from '../graphics/atlas.ts';
2
+ import type { Void } from '../void.ts';
3
+ import { CursorEnt } from './cursor-ent.ts';
4
+ import type { Ent } from './ent.ts';
5
+ /**
6
+ * ents are updated in insertion order. composed ents are updated by their
7
+ * owning ents.
8
+ */
9
+ export declare class Zoo<out Tag extends TagFormat> {
10
+ #private;
11
+ add(...ents: readonly Ent<Tag>[]): void;
12
+ clear(): void;
13
+ get cursor(): CursorEnt<Tag> | undefined;
14
+ get invalid(): boolean;
15
+ remove(...ents: readonly Readonly<Ent<Tag>>[]): void;
16
+ update(v: Void<Tag, string>): void;
17
+ }
@@ -0,0 +1,45 @@
1
+ import { debug } from "../utils/debug.js";
2
+ import { CursorEnt } from "./cursor-ent.js";
3
+ /**
4
+ * ents are updated in insertion order. composed ents are updated by their
5
+ * owning ents.
6
+ */
7
+ export class Zoo {
8
+ #cursor;
9
+ #ents = new Set();
10
+ #invalid = false;
11
+ add(...ents) {
12
+ for (const ent of ents) {
13
+ this.#ents.add(ent);
14
+ if (ent instanceof CursorEnt)
15
+ this.#cursor = ent;
16
+ }
17
+ }
18
+ clear() {
19
+ this.#cursor = undefined;
20
+ this.#ents.clear();
21
+ }
22
+ get cursor() {
23
+ return this.#cursor;
24
+ }
25
+ get invalid() {
26
+ return this.#invalid;
27
+ }
28
+ remove(...ents) {
29
+ for (const ent of ents) {
30
+ this.#ents.delete(ent);
31
+ if (ent === this.#cursor)
32
+ this.#cursor = undefined;
33
+ }
34
+ }
35
+ update(v) {
36
+ this.#invalid = false;
37
+ for (const ent of this.#ents)
38
+ if (ent.update?.(v)) {
39
+ if (!this.#invalid && debug?.invalid)
40
+ console.debug('ent update invalid', ent);
41
+ this.#invalid = true;
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=zoo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoo.js","sourceRoot":"","sources":["../../../src/ents/zoo.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAA;AAGzC;;;GAGG;AACH,MAAM,OAAO,GAAG;IACd,OAAO,CAA4B;IAC1B,KAAK,GAAkB,IAAI,GAAG,EAAE,CAAA;IACzC,QAAQ,GAAY,KAAK,CAAA;IAEzB,GAAG,CAAC,GAAG,IAAyB;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnB,IAAI,GAAG,YAAY,SAAS;gBAAE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;QAClD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QACxB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,MAAM,CAAC,GAAG,IAAmC;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QACpD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,CAAoB;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACrB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK;YAC1B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,OAAO;oBAClC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;gBAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;YACtB,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { type Anim, type Atlas, type AtlasJSON } from './atlas.ts';
2
+ export declare function parseAtlas(json: Readonly<AtlasJSON>): Atlas;
3
+ /** @internal */
4
+ export declare function parseXYWH(anim: Readonly<Anim>, celXY: readonly number[], i: number): number[];
@@ -0,0 +1,27 @@
1
+ import { animCels } from "./atlas.js";
2
+ export function parseAtlas(json) {
3
+ return {
4
+ anim: json.anim,
5
+ celXYWH: parseCelXYWH(json),
6
+ tags: Object.keys(json.anim)
7
+ };
8
+ }
9
+ function parseCelXYWH(json) {
10
+ const cels = [];
11
+ let i = 0;
12
+ for (const anim of Object.values(json.anim)) {
13
+ cels.push(...parseXYWH(anim, json.celXY, i));
14
+ i += anim.cels * 2;
15
+ }
16
+ return cels;
17
+ }
18
+ /** @internal */
19
+ export function parseXYWH(anim, celXY, i) {
20
+ const xywh = [];
21
+ for (let ii = 0; ii < animCels; ii++) {
22
+ const iii = i + 2 * (ii % anim.cels);
23
+ xywh.push(celXY[iii], celXY[iii + 1], anim.w, anim.h);
24
+ }
25
+ return xywh;
26
+ }
27
+ //# sourceMappingURL=atlas-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlas-parser.js","sourceRoot":"","sources":["../../../src/graphics/atlas-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,QAAQ,EAAC,MAAM,YAAY,CAAA;AAE1E,MAAM,UAAU,UAAU,CAAC,IAAyB;IAClD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;KAC7B,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAyB;IAC7C,MAAM,IAAI,GAAG,EAAE,CAAA;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,SAAS,CACvB,IAAoB,EACpB,KAAwB,EACxB,CAAS;IAET,MAAM,IAAI,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Box } from '../types/geo.ts';
2
+ import type { Millis } from '../types/time.ts';
3
+ /** every animation is padded to 16 cels as needed by repeating the sequence. */
4
+ export declare const animCels: number;
5
+ /** max animation loop duration. */
6
+ export declare const animMillis: Millis;
7
+ /** 62.5 millis. */
8
+ export declare const celMillis: Millis;
9
+ export type Atlas = {
10
+ anim: {
11
+ [tag: string]: Anim;
12
+ };
13
+ /**
14
+ * cell source XYWH by `Anim.id` and `Anim.cel`. every animation is padded to
15
+ * 16 cels (`maxAnimCels`) as needed by repeating the sequence.
16
+ */
17
+ celXYWH: number[];
18
+ /** tag by `Anim.id`. */
19
+ tags: string[];
20
+ };
21
+ export type AtlasJSON = {
22
+ anim: {
23
+ [tag: string]: Anim;
24
+ };
25
+ /**
26
+ * cel source XY by `Anim.id` and `Anim.cel` for one cycle. truncated to
27
+ * `animCels`.
28
+ */
29
+ celXY: number[];
30
+ };
31
+ export type Anim = {
32
+ /**
33
+ * number of cels in a full animation cycle including cels extended for
34
+ * duration and the second half of pingpongs.
35
+ */
36
+ cels: number;
37
+ /** outgoing collision rectangle (red / blue). */
38
+ hitbox?: Box | undefined;
39
+ /** incoming collision rectangle (green / blue). */
40
+ hurtbox?: Box | undefined;
41
+ /** atlas tag index. */
42
+ id: number;
43
+ /** clipbox / source width. */
44
+ w: number;
45
+ /** clipbox / source height. */
46
+ h: number;
47
+ };
48
+ /** `--tagname-format={filestem}--{animation}`. */
49
+ export type TagFormat = `${string}--${string}`;
@@ -0,0 +1,7 @@
1
+ /** every animation is padded to 16 cels as needed by repeating the sequence. */
2
+ export const animCels = 16;
3
+ /** max animation loop duration. */
4
+ export const animMillis = 1000;
5
+ /** 62.5 millis. */
6
+ export const celMillis = (animMillis / animCels);
7
+ //# sourceMappingURL=atlas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlas.js","sourceRoot":"","sources":["../../../src/graphics/atlas.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAAW,EAAE,CAAA;AAClC,mCAAmC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAW,IAAc,CAAA;AAChD,mBAAmB;AACnB,MAAM,CAAC,MAAM,SAAS,GAAW,CAAC,UAAU,GAAG,QAAQ,CAAW,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { type Box, type CompassDir, type WH, type XY } from '../types/geo.ts';
2
+ import { Layer } from './layer.ts';
3
+ export type LevelClientLocalXY = {
4
+ /** position relative canvas top-left (in DPI scale). */
5
+ client: XY;
6
+ /**
7
+ * position relative canvas top-left in level scale (like level xy but no cam
8
+ * offset) within cam.
9
+ */
10
+ local: XY;
11
+ /** level x-coord within cam. */
12
+ x: number;
13
+ /** level y-coord within cam. */
14
+ y: number;
15
+ };
16
+ type Canvas = {
17
+ width: number;
18
+ height: number;
19
+ style: {
20
+ width: string;
21
+ height: string;
22
+ };
23
+ parentElement: {
24
+ clientWidth: number;
25
+ clientHeight: number;
26
+ } | null;
27
+ };
28
+ /** given a min WH and scale, size the camera to the max WH. */
29
+ export declare class Cam {
30
+ #private;
31
+ center(xy: Readonly<XY>): void;
32
+ /** position in fractional level coordinates. */
33
+ clientToXY(client: Readonly<XY>): XY;
34
+ /**
35
+ * position relative canvas top-left in level scale (like level xy but no cam
36
+ * offset). often used for UI that is fixed within the cam.
37
+ */
38
+ clientToXYLocal(client: Readonly<XY>): XY;
39
+ follow(wh: Readonly<WH>, z: Layer, pivot: CompassDir, opts?: {
40
+ readonly fill?: 'X' | 'Y' | 'XY' | undefined;
41
+ readonly margin?: Partial<Readonly<WH>> | undefined;
42
+ readonly modulo?: Partial<Readonly<XY>> | undefined;
43
+ }): Box;
44
+ /** positive int in level px. */
45
+ get h(): number;
46
+ isVisible(box: Readonly<XY & Partial<WH>>): boolean;
47
+ /** true if cam moved or resized since last update. */
48
+ get invalid(): boolean;
49
+ /** positive int or fraction depending on mode. */
50
+ get minScale(): number;
51
+ set minScale(scale: number);
52
+ /**
53
+ * positive int or infinite min dimensions. set to
54
+ * `{w: Infinity, h: Infinity}` to always use min scale.
55
+ */
56
+ get minWH(): Readonly<WH>;
57
+ set minWH(wh: Readonly<WH>);
58
+ get mode(): 'Int' | 'Fraction';
59
+ set mode(mode: 'Int' | 'Fraction');
60
+ get portrait(): boolean;
61
+ postupdate(): void;
62
+ /** positive int or fraction depending on mode. */
63
+ get scale(): number;
64
+ toString(): string;
65
+ /**
66
+ * call after input processing but before ent processing. ents that move the
67
+ * camera should be called immediately after update so that the invalid state
68
+ * can be considered.
69
+ */
70
+ update(canvas: Canvas): void;
71
+ /** positive int in level px. */
72
+ get w(): number;
73
+ /**
74
+ * positive int dimensions in client px of canvas (often
75
+ * `canvas.parentElement.clientWidth/Height` since the canvas is resized)
76
+ * which is assumed to be max WH.
77
+ */
78
+ get whClient(): Readonly<WH>;
79
+ /** fractional. */
80
+ get x(): number;
81
+ set x(x: number);
82
+ /** fractional. */
83
+ get y(): number;
84
+ set y(y: number);
85
+ /** nonnegative int or fraction depending on mode. */
86
+ get zoomOut(): number;
87
+ set zoomOut(out: number);
88
+ }
89
+ export {};
@@ -0,0 +1,220 @@
1
+ import { boxHits } from "../types/geo.js";
2
+ import { debug } from "../utils/debug.js";
3
+ import { Layer } from "./layer.js";
4
+ /** given a min WH and scale, size the camera to the max WH. */
5
+ export class Cam {
6
+ #devicePixelRatio = 0;
7
+ #h = 1;
8
+ #invalid = true;
9
+ #minScale = 1;
10
+ #minWH = { w: Infinity, h: Infinity };
11
+ #mode = 'Int';
12
+ #scale = 1;
13
+ #w = 1;
14
+ #whClient = { w: 1, h: 1 };
15
+ #x = 0;
16
+ #y = 0;
17
+ #zoomOut = 0;
18
+ center(xy) {
19
+ this.x = Math.floor(xy.x - this.w / 2);
20
+ this.y = Math.floor(xy.y - this.h / 2);
21
+ }
22
+ /** position in fractional level coordinates. */
23
+ clientToXY(client) {
24
+ const local = this.clientToXYLocal(client);
25
+ return { x: this.#x + local.x, y: this.#y + local.y };
26
+ }
27
+ /**
28
+ * position relative canvas top-left in level scale (like level xy but no cam
29
+ * offset). often used for UI that is fixed within the cam.
30
+ */
31
+ clientToXYLocal(client) {
32
+ return {
33
+ x: (client.x / this.#whClient.w) * this.#w,
34
+ y: (client.y / this.#whClient.h) * this.#h
35
+ };
36
+ }
37
+ follow(wh, z, pivot, opts) {
38
+ const marginW = opts?.margin?.w ?? 0;
39
+ let x = z > Layer.UIG ? Math.trunc(this.x) : 0;
40
+ switch (pivot) {
41
+ case 'SW':
42
+ case 'W':
43
+ case 'NW':
44
+ x += marginW;
45
+ break;
46
+ case 'SE':
47
+ case 'E':
48
+ case 'NE':
49
+ x += this.w - (wh.w + marginW);
50
+ break;
51
+ case 'N':
52
+ case 'S':
53
+ case 'Origin':
54
+ x += Math.trunc(this.w / 2) - Math.trunc(wh.w / 2);
55
+ break;
56
+ }
57
+ x -= x % ((opts?.modulo?.x ?? x) || 1);
58
+ const marginH = opts?.margin?.h ?? 0;
59
+ let y = z > Layer.UIG ? Math.trunc(this.y) : 0;
60
+ switch (pivot) {
61
+ case 'N':
62
+ case 'NE':
63
+ case 'NW':
64
+ y += marginH;
65
+ break;
66
+ case 'SE':
67
+ case 'S':
68
+ case 'SW':
69
+ y += this.h - (wh.h + marginH);
70
+ break;
71
+ case 'E':
72
+ case 'W':
73
+ case 'Origin':
74
+ y += Math.trunc(this.h / 2) - Math.trunc(wh.h / 2);
75
+ break;
76
+ }
77
+ y -= y % ((opts?.modulo?.y ?? y) || 1);
78
+ const w = opts?.fill === 'X' || opts?.fill === 'XY' ? this.w - 2 * marginW : wh.w;
79
+ const h = opts?.fill === 'Y' || opts?.fill === 'XY' ? this.h - 2 * marginH : wh.h;
80
+ return { x, y, w, h };
81
+ }
82
+ /** positive int in level px. */
83
+ get h() {
84
+ return this.#h;
85
+ }
86
+ isVisible(box) {
87
+ return boxHits(this, box);
88
+ }
89
+ /** true if cam moved or resized since last update. */
90
+ get invalid() {
91
+ return this.#invalid;
92
+ }
93
+ /** positive int or fraction depending on mode. */
94
+ get minScale() {
95
+ return this.#minScale;
96
+ }
97
+ set minScale(scale) {
98
+ if (this.#scale === scale)
99
+ return;
100
+ this.#scale = scale;
101
+ this.#invalidateWH();
102
+ }
103
+ /**
104
+ * positive int or infinite min dimensions. set to
105
+ * `{w: Infinity, h: Infinity}` to always use min scale.
106
+ */
107
+ get minWH() {
108
+ return this.#minWH;
109
+ }
110
+ set minWH(wh) {
111
+ if (this.#minWH.w === wh.w && this.#minWH.h === wh.h)
112
+ return;
113
+ this.#minWH.w = wh.w;
114
+ this.#minWH.h = wh.h;
115
+ this.#invalidateWH();
116
+ }
117
+ get mode() {
118
+ return this.#mode;
119
+ }
120
+ set mode(mode) {
121
+ if (this.#mode === mode)
122
+ return;
123
+ this.#mode = mode;
124
+ this.#invalidateWH();
125
+ }
126
+ get portrait() {
127
+ return this.h > this.w;
128
+ }
129
+ postupdate() {
130
+ this.#invalid = false;
131
+ }
132
+ /** positive int or fraction depending on mode. */
133
+ get scale() {
134
+ return this.#scale;
135
+ }
136
+ toString() {
137
+ return `Cam{(${this.x} ${this.y}) ${this.w}×${this.h}}`;
138
+ }
139
+ /**
140
+ * call after input processing but before ent processing. ents that move the
141
+ * camera should be called immediately after update so that the invalid state
142
+ * can be considered.
143
+ */
144
+ update(canvas) {
145
+ if (!canvas.parentElement)
146
+ throw Error('canvas has no parent');
147
+ const { clientWidth, clientHeight } = canvas.parentElement;
148
+ this.#invalid ||=
149
+ this.#whClient.w !== clientWidth ||
150
+ this.#whClient.h !== clientHeight ||
151
+ // doesn't seem like this should be necessary but it is when moving across
152
+ // monitors.
153
+ this.#devicePixelRatio !== devicePixelRatio;
154
+ if (!this.#invalid)
155
+ return;
156
+ this.#devicePixelRatio = devicePixelRatio;
157
+ this.#whClient.w = clientWidth;
158
+ this.#whClient.h = clientHeight;
159
+ this.#invalidateWH();
160
+ canvas.width = this.#w;
161
+ canvas.height = this.#h;
162
+ // ~parentW / parentH.
163
+ canvas.style.width = `${(this.#w * this.#scale) / devicePixelRatio}px`;
164
+ canvas.style.height = `${(this.#h * this.#scale) / devicePixelRatio}px`;
165
+ }
166
+ /** positive int in level px. */
167
+ get w() {
168
+ return this.#w;
169
+ }
170
+ /**
171
+ * positive int dimensions in client px of canvas (often
172
+ * `canvas.parentElement.clientWidth/Height` since the canvas is resized)
173
+ * which is assumed to be max WH.
174
+ */
175
+ get whClient() {
176
+ return this.#whClient;
177
+ }
178
+ /** fractional. */
179
+ get x() {
180
+ return this.#x;
181
+ }
182
+ set x(x) {
183
+ this.#invalid ||= this.x !== x;
184
+ this.#x = x;
185
+ }
186
+ /** fractional. */
187
+ get y() {
188
+ return this.#y;
189
+ }
190
+ set y(y) {
191
+ this.#invalid ||= this.y !== y;
192
+ this.#y = y;
193
+ }
194
+ /** nonnegative int or fraction depending on mode. */
195
+ get zoomOut() {
196
+ return this.#zoomOut;
197
+ }
198
+ set zoomOut(out) {
199
+ out = Math.max(0, out);
200
+ if (this.#zoomOut === out)
201
+ return;
202
+ this.#zoomOut = out;
203
+ this.#invalidateWH();
204
+ }
205
+ #invalidateWH() {
206
+ if (!this.#invalid && debug?.invalid)
207
+ console.debug('cam invalid');
208
+ this.#invalid = true;
209
+ const phy = {
210
+ w: this.#whClient.w * devicePixelRatio,
211
+ h: this.#whClient.h * devicePixelRatio
212
+ };
213
+ const scale = Math.max(this.#minScale, Math.min(phy.w / this.#minWH.w, phy.h / this.#minWH.h) -
214
+ (this.#mode === 'Int' ? Math.trunc(this.#zoomOut) : this.#zoomOut));
215
+ this.#scale = this.#mode === 'Int' ? Math.trunc(scale) : scale;
216
+ this.#w = Math.ceil(phy.w / this.#scale);
217
+ this.#h = Math.ceil(phy.h / this.#scale);
218
+ }
219
+ }
220
+ //# sourceMappingURL=cam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cam.js","sourceRoot":"","sources":["../../../src/graphics/cam.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,OAAO,EAIR,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAuBhC,+DAA+D;AAC/D,MAAM,OAAO,GAAG;IACd,iBAAiB,GAAW,CAAC,CAAA;IAC7B,EAAE,GAAW,CAAC,CAAA;IACd,QAAQ,GAAY,IAAI,CAAA;IACxB,SAAS,GAAW,CAAC,CAAA;IACZ,MAAM,GAAO,EAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAC,CAAA;IAChD,KAAK,GAAuB,KAAK,CAAA;IACjC,MAAM,GAAW,CAAC,CAAA;IAClB,EAAE,GAAW,CAAC,CAAA;IACL,SAAS,GAAO,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAA;IACrC,EAAE,GAAW,CAAC,CAAA;IACd,EAAE,GAAW,CAAC,CAAA;IACd,QAAQ,GAAW,CAAC,CAAA;IAEpB,MAAM,CAAC,EAAgB;QACrB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACtC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,gDAAgD;IAChD,UAAU,CAAC,MAAoB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QAC1C,OAAO,EAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,EAAC,CAAA;IACrD,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,MAAoB;QAClC,OAAO;YACL,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;YAC1C,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;SAC3C,CAAA;IACH,CAAC;IAED,MAAM,CACJ,EAAgB,EAChB,CAAQ,EACR,KAAiB,EACjB,IAIC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,IAAI,CAAC;YACV,KAAK,GAAG,CAAC;YACT,KAAK,IAAI;gBACP,CAAC,IAAI,OAAO,CAAA;gBACZ,MAAK;YACP,KAAK,IAAI,CAAC;YACV,KAAK,GAAG,CAAC;YACT,KAAK,IAAI;gBACP,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;gBAC9B,MAAK;YACP,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,QAAQ;gBACX,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBAClD,MAAK;QACT,CAAC;QACD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEtC,MAAM,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,GAAG,CAAC;YACT,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACP,CAAC,IAAI,OAAO,CAAA;gBACZ,MAAK;YACP,KAAK,IAAI,CAAC;YACV,KAAK,GAAG,CAAC;YACT,KAAK,IAAI;gBACP,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;gBAC9B,MAAK;YACP,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,QAAQ;gBACX,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBAClD,MAAK;QACT,CAAC;QACD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEtC,MAAM,CAAC,GACL,IAAI,EAAE,IAAI,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACzE,MAAM,CAAC,GACL,IAAI,EAAE,IAAI,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAEzE,OAAO,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAA;IACrB,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,SAAS,CAAC,GAA+B;QACvC,OAAO,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,sDAAsD;IACtD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,KAAa;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,OAAM;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,EAAgB;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAAE,OAAM;QAC5D,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACpB,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACpB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,IAAwB;QAC/B,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,OAAM;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACxB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;IACvB,CAAC;IAED,kDAAkD;IAClD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,QAAQ;QACN,OAAO,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAA;IACzD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAC9D,MAAM,EAAC,WAAW,EAAE,YAAY,EAAC,GAAG,MAAM,CAAC,aAAa,CAAA;QAExD,IAAI,CAAC,QAAQ;YACX,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,WAAW;gBAChC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,YAAY;gBACjC,0EAA0E;gBAC1E,YAAY;gBACZ,IAAI,CAAC,iBAAiB,KAAK,gBAAgB,CAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAM;QAC1B,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;QACzC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,YAAY,CAAA;QAC/B,IAAI,CAAC,aAAa,EAAE,CAAA;QAEpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAA;QACtB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;QACvB,sBAAsB;QACtB,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,gBAAgB,IAAI,CAAA;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,gBAAgB,IAAI,CAAA;IACzE,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED;;;;OAIG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,IAAI,CAAC,CAAC,CAAS;QACb,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IACb,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,IAAI,CAAC,CAAC,CAAS;QACb,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IACb,CAAC;IAED,qDAAqD;IACrD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,GAAW;QACrB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG;YAAE,OAAM;QACjC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAA;QACnB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QAEpB,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,gBAAgB;YACtC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,gBAAgB;SACvC,CAAA;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACpD,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CACrE,CAAA;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAE9D,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /** @internal */
2
+ export type GL2 = WebGL2RenderingContext;
3
+ /** @internal */
4
+ export type GLProgram = WebGLProgram;
5
+ /** @internal */
6
+ export type GLShader = WebGLShader;
7
+ /** @internal */
8
+ export type GLTexture = WebGLTexture;
9
+ /** @internal */
10
+ export type GLUniformLocation = WebGLUniformLocation;
11
+ /** @internal */
12
+ export type GLUniformMap = {
13
+ [name: string]: GLUniformLocation;
14
+ };
15
+ /** @internal */
16
+ export type Shader = {
17
+ program: GLProgram | null;
18
+ buffer: WebGLBuffer | null;
19
+ uniform: GLUniformMap;
20
+ vao: WebGLVertexArrayObject | null;
21
+ textures: GLTexture[];
22
+ };
23
+ /** @internal */
24
+ export declare function Shader(gl: GL2, vertGLSL: string, fragGLSL: string, textures: GLTexture[]): Shader;