@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.
- package/dist/meta.json +1 -0
- package/dist/package.json +66 -0
- package/dist/public/favicon/favicon16.png +0 -0
- package/dist/public/favicon/favicon192.png +0 -0
- package/dist/public/favicon/favicon32.png +0 -0
- package/dist/public/favicon/favicon48.png +0 -0
- package/dist/public/favicon/favicon512.png +0 -0
- package/dist/public/favicon/favicon64.png +0 -0
- package/dist/public/index.html +23 -0
- package/dist/public/index.js +3844 -0
- package/dist/public/index.js.map +7 -0
- package/dist/public/manifest.json +1 -0
- package/dist/public/preload-atlas.png +0 -0
- package/dist/public/void-v0.1.0-4.html +111 -0
- package/dist/public/void-v0.1.0-5.html +111 -0
- package/dist/public/void-v0.1.0-6.html +111 -0
- package/dist/schema/config-file.d.ts +32 -0
- package/dist/schema/config-file.js +41 -0
- package/dist/schema/config-file.js.map +1 -0
- package/dist/schema/config-file.v0.json +68 -0
- package/dist/src/audio.d.ts +7 -0
- package/dist/src/audio.js +25 -0
- package/dist/src/audio.js.map +1 -0
- package/dist/src/demo/assets/manifest.json +46 -0
- package/dist/src/demo/assets/preload-atlas.json +193 -0
- package/dist/src/demo/ents/clock-ent.d.ts +10 -0
- package/dist/src/demo/ents/clock-ent.js +26 -0
- package/dist/src/demo/ents/clock-ent.js.map +1 -0
- package/dist/src/demo/ents/render-toggle-ent.d.ts +10 -0
- package/dist/src/demo/ents/render-toggle-ent.js +38 -0
- package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
- package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
- package/dist/src/demo/ents/work-counter-ent.js +24 -0
- package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
- package/dist/src/demo/game.d.ts +13 -0
- package/dist/src/demo/game.js +155 -0
- package/dist/src/demo/game.js.map +1 -0
- package/dist/src/demo/index.d.ts +1 -0
- package/dist/src/demo/index.js +8 -0
- package/dist/src/demo/index.js.map +1 -0
- package/dist/src/demo/tsconfig.json +15 -0
- package/dist/src/demo/types/tag.d.ts +2 -0
- package/dist/src/demo/types/tag.js +2 -0
- package/dist/src/demo/types/tag.js.map +1 -0
- package/dist/src/demo/void.json +11 -0
- package/dist/src/ents/button-ent.d.ts +38 -0
- package/dist/src/ents/button-ent.js +124 -0
- package/dist/src/ents/button-ent.js.map +1 -0
- package/dist/src/ents/cursor-ent.d.ts +18 -0
- package/dist/src/ents/cursor-ent.js +58 -0
- package/dist/src/ents/cursor-ent.js.map +1 -0
- package/dist/src/ents/ent.d.ts +7 -0
- package/dist/src/ents/ent.js +2 -0
- package/dist/src/ents/ent.js.map +1 -0
- package/dist/src/ents/follow-cam-ent.d.ts +25 -0
- package/dist/src/ents/follow-cam-ent.js +87 -0
- package/dist/src/ents/follow-cam-ent.js.map +1 -0
- package/dist/src/ents/nine-patch-ent.d.ts +43 -0
- package/dist/src/ents/nine-patch-ent.js +143 -0
- package/dist/src/ents/nine-patch-ent.js.map +1 -0
- package/dist/src/ents/text-ent.d.ts +23 -0
- package/dist/src/ents/text-ent.js +109 -0
- package/dist/src/ents/text-ent.js.map +1 -0
- package/dist/src/ents/zoo.d.ts +16 -0
- package/dist/src/ents/zoo.js +38 -0
- package/dist/src/ents/zoo.js.map +1 -0
- package/dist/src/graphics/atlas-parser.d.ts +4 -0
- package/dist/src/graphics/atlas-parser.js +27 -0
- package/dist/src/graphics/atlas-parser.js.map +1 -0
- package/dist/src/graphics/atlas.d.ts +49 -0
- package/dist/src/graphics/atlas.js +7 -0
- package/dist/src/graphics/atlas.js.map +1 -0
- package/dist/src/graphics/cam.d.ts +89 -0
- package/dist/src/graphics/cam.js +211 -0
- package/dist/src/graphics/cam.js.map +1 -0
- package/dist/src/graphics/gl.d.ts +24 -0
- package/dist/src/graphics/gl.js +70 -0
- package/dist/src/graphics/gl.js.map +1 -0
- package/dist/src/graphics/layer.d.ts +21 -0
- package/dist/src/graphics/layer.js +23 -0
- package/dist/src/graphics/layer.js.map +1 -0
- package/dist/src/graphics/renderer.d.ts +22 -0
- package/dist/src/graphics/renderer.js +168 -0
- package/dist/src/graphics/renderer.js.map +1 -0
- package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
- package/dist/src/graphics/sprite-frag.glsl.js +35 -0
- package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
- package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
- package/dist/src/graphics/sprite-vert.glsl.js +68 -0
- package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
- package/dist/src/graphics/sprite.d.ts +108 -0
- package/dist/src/graphics/sprite.js +301 -0
- package/dist/src/graphics/sprite.js.map +1 -0
- package/dist/src/index.d.ts +30 -0
- package/dist/src/index.js +33 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/input/context-menu.d.ts +8 -0
- package/dist/src/input/context-menu.js +25 -0
- package/dist/src/input/context-menu.js.map +1 -0
- package/dist/src/input/gamepad.d.ts +18 -0
- package/dist/src/input/gamepad.js +49 -0
- package/dist/src/input/gamepad.js.map +1 -0
- package/dist/src/input/input.d.ts +148 -0
- package/dist/src/input/input.js +383 -0
- package/dist/src/input/input.js.map +1 -0
- package/dist/src/input/keyboard.d.ts +17 -0
- package/dist/src/input/keyboard.js +46 -0
- package/dist/src/input/keyboard.js.map +1 -0
- package/dist/src/input/pointer.d.ts +53 -0
- package/dist/src/input/pointer.js +162 -0
- package/dist/src/input/pointer.js.map +1 -0
- package/dist/src/input/wheel.d.ts +12 -0
- package/dist/src/input/wheel.js +30 -0
- package/dist/src/input/wheel.js.map +1 -0
- package/dist/src/looper.d.ts +15 -0
- package/dist/src/looper.js +48 -0
- package/dist/src/looper.js.map +1 -0
- package/dist/src/mem/pool.d.ts +31 -0
- package/dist/src/mem/pool.js +98 -0
- package/dist/src/mem/pool.js.map +1 -0
- package/dist/src/pixel-ratio-observer.d.ts +10 -0
- package/dist/src/pixel-ratio-observer.js +26 -0
- package/dist/src/pixel-ratio-observer.js.map +1 -0
- package/dist/src/random/random.d.ts +8 -0
- package/dist/src/random/random.js +23 -0
- package/dist/src/random/random.js.map +1 -0
- package/dist/src/storage/local-storage.d.ts +3 -0
- package/dist/src/storage/local-storage.js +11 -0
- package/dist/src/storage/local-storage.js.map +1 -0
- package/dist/src/text/font.d.ts +6 -0
- package/dist/src/text/font.js +20 -0
- package/dist/src/text/font.js.map +1 -0
- package/dist/src/text/mem-prop-5x6.json +573 -0
- package/dist/src/text/text-layout.d.ts +19 -0
- package/dist/src/text/text-layout.js +85 -0
- package/dist/src/text/text-layout.js.map +1 -0
- package/dist/src/tsconfig.json +15 -0
- package/dist/src/types/geo.d.ts +38 -0
- package/dist/src/types/geo.js +61 -0
- package/dist/src/types/geo.js.map +1 -0
- package/dist/src/types/json.d.ts +31 -0
- package/dist/src/types/json.js +2 -0
- package/dist/src/types/json.js.map +1 -0
- package/dist/src/types/time.d.ts +19 -0
- package/dist/src/types/time.js +10 -0
- package/dist/src/types/time.js.map +1 -0
- package/dist/src/types/void-version.d.ts +9 -0
- package/dist/src/types/void-version.js +2 -0
- package/dist/src/types/void-version.js.map +1 -0
- package/dist/src/utils/async-util.d.ts +11 -0
- package/dist/src/utils/async-util.js +36 -0
- package/dist/src/utils/async-util.js.map +1 -0
- package/dist/src/utils/canvas-util.d.ts +7 -0
- package/dist/src/utils/canvas-util.js +128 -0
- package/dist/src/utils/canvas-util.js.map +1 -0
- package/dist/src/utils/color-util.d.ts +1 -0
- package/dist/src/utils/color-util.js +4 -0
- package/dist/src/utils/color-util.js.map +1 -0
- package/dist/src/utils/debug.d.ts +17 -0
- package/dist/src/utils/debug.js +34 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/dom-util.d.ts +3 -0
- package/dist/src/utils/dom-util.js +29 -0
- package/dist/src/utils/dom-util.js.map +1 -0
- package/dist/src/utils/fetch-util.d.ts +3 -0
- package/dist/src/utils/fetch-util.js +24 -0
- package/dist/src/utils/fetch-util.js.map +1 -0
- package/dist/src/utils/math.d.ts +6 -0
- package/dist/src/utils/math.js +18 -0
- package/dist/src/utils/math.js.map +1 -0
- package/dist/src/utils/vibrate.d.ts +1 -0
- package/dist/src/utils/vibrate.js +4 -0
- package/dist/src/utils/vibrate.js.map +1 -0
- package/dist/src/void.d.ts +43 -0
- package/dist/src/void.js +95 -0
- package/dist/src/void.js.map +1 -0
- package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
- package/dist/tools/atlas-pack/aseprite.js +16 -0
- package/dist/tools/atlas-pack/aseprite.js.map +1 -0
- package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
- package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
- package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
- package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
- package/dist/tools/atlas-pack/atlas-pack.js +17 -0
- package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
- package/dist/tools/bundle/bundle.d.ts +3 -0
- package/dist/tools/bundle/bundle.js +48 -0
- package/dist/tools/bundle/bundle.js.map +1 -0
- package/dist/tools/bundle/html-plugin.d.ts +3 -0
- package/dist/tools/bundle/html-plugin.js +88 -0
- package/dist/tools/bundle/html-plugin.js.map +1 -0
- package/dist/tools/tsconfig-base.json +45 -0
- package/dist/tools/tsconfig.json +21 -0
- package/dist/tools/types/config.d.ts +20 -0
- package/dist/tools/types/config.js +22 -0
- package/dist/tools/types/config.js.map +1 -0
- package/dist/tools/utils/argv.d.ts +12 -0
- package/dist/tools/utils/argv.js +19 -0
- package/dist/tools/utils/argv.js.map +1 -0
- package/dist/tools/utils/exec.d.ts +3 -0
- package/dist/tools/utils/exec.js +15 -0
- package/dist/tools/utils/exec.js.map +1 -0
- package/dist/tools/utils/file-util.d.ts +1 -0
- package/dist/tools/utils/file-util.js +13 -0
- package/dist/tools/utils/file-util.js.map +1 -0
- package/dist/tools/utils/html-parser.d.ts +1 -0
- package/dist/tools/utils/html-parser.js +10 -0
- package/dist/tools/utils/html-parser.js.map +1 -0
- package/dist/tools/void.d.ts +17 -0
- package/dist/tools/void.js +30 -0
- package/dist/tools/void.js.map +1 -0
- package/package.json +33 -39
- package/readme.md +1 -1
- package/schema/config-file.test.ts +55 -0
- package/schema/config-file.ts +69 -0
- package/schema/config-file.v0.json +68 -0
- package/tools/atlas-pack/aseprite.ts +60 -0
- package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
- package/tools/atlas-pack/atlas-json-parser.ts +159 -0
- package/tools/atlas-pack/atlas-pack.ts +38 -0
- package/tools/bundle/bundle.ts +65 -0
- package/tools/bundle/html-plugin.ts +135 -0
- package/tools/types/config.ts +43 -0
- package/tools/utils/argv.test.ts +41 -0
- package/tools/utils/argv.ts +29 -0
- package/tools/utils/exec.ts +22 -0
- package/tools/utils/file-util.ts +11 -0
- package/tools/utils/html-parser.ts +9 -0
- package/tools/void.ts +54 -0
- package/dist/atlas/aseprite.d.ts +0 -37
- package/dist/atlas/aseprite.js +0 -2
- package/dist/atlas/aseprite.js.map +0 -1
- package/dist/atlas/atlas-parser.d.ts +0 -52
- package/dist/atlas/atlas-parser.js +0 -109
- package/dist/atlas/atlas-parser.js.map +0 -1
- package/dist/atlas/atlas.d.ts +0 -12
- package/dist/atlas/atlas.js +0 -2
- package/dist/atlas/atlas.js.map +0 -1
- package/dist/audio/synth.d.ts +0 -4
- package/dist/audio/synth.js +0 -21
- package/dist/audio/synth.js.map +0 -1
- package/dist/graphics/bitmap.d.ts +0 -14
- package/dist/graphics/bitmap.js +0 -14
- package/dist/graphics/bitmap.js.map +0 -1
- package/dist/graphics/cam.d.ts +0 -16
- package/dist/graphics/cam.js +0 -42
- package/dist/graphics/cam.js.map +0 -1
- package/dist/graphics/frag.glsl.d.ts +0 -1
- package/dist/graphics/frag.glsl.js +0 -15
- package/dist/graphics/frag.glsl.js.map +0 -1
- package/dist/graphics/frame-listener.d.ts +0 -16
- package/dist/graphics/frame-listener.js +0 -83
- package/dist/graphics/frame-listener.js.map +0 -1
- package/dist/graphics/renderer.d.ts +0 -12
- package/dist/graphics/renderer.js +0 -185
- package/dist/graphics/renderer.js.map +0 -1
- package/dist/graphics/vert.glsl.d.ts +0 -1
- package/dist/graphics/vert.glsl.js +0 -46
- package/dist/graphics/vert.glsl.js.map +0 -1
- package/dist/index.d.ts +0 -31
- package/dist/index.js +0 -79
- package/dist/index.js.map +0 -1
- package/dist/input/gamepad-poller.d.ts +0 -8
- package/dist/input/gamepad-poller.js +0 -38
- package/dist/input/gamepad-poller.js.map +0 -1
- package/dist/input/input.d.ts +0 -44
- package/dist/input/input.js +0 -175
- package/dist/input/input.js.map +0 -1
- package/dist/input/keyboard-poller.d.ts +0 -7
- package/dist/input/keyboard-poller.js +0 -30
- package/dist/input/keyboard-poller.js.map +0 -1
- package/dist/input/pointer-poller.d.ts +0 -12
- package/dist/input/pointer-poller.js +0 -67
- package/dist/input/pointer-poller.js.map +0 -1
- package/dist/sprite/sprite.d.ts +0 -51
- package/dist/sprite/sprite.js +0 -161
- package/dist/sprite/sprite.js.map +0 -1
- package/dist/storage/json-storage.d.ts +0 -4
- package/dist/storage/json-storage.js +0 -13
- package/dist/storage/json-storage.js.map +0 -1
- package/dist/test/tsconfig.json +0 -14
- package/dist/text/font.d.ts +0 -6
- package/dist/text/font.js +0 -18
- package/dist/text/font.js.map +0 -1
- package/dist/text/text-layout.d.ts +0 -11
- package/dist/text/text-layout.js +0 -73
- package/dist/text/text-layout.js.map +0 -1
- package/dist/tsconfig.json +0 -13
- package/dist/types/2d.d.ts +0 -9
- package/dist/types/2d.js +0 -2
- package/dist/types/2d.js.map +0 -1
- package/dist/void.js +0 -60
- package/dist/void.js.map +0 -7
- package/dist/void.meta.json +0 -299
- package/tools/void.js +0 -143
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @arg {Aseprite} ase
|
|
3
|
-
* @return {Atlas}
|
|
4
|
-
*/
|
|
5
|
-
export function parseAtlas(ase: Aseprite): Atlas;
|
|
6
|
-
/**
|
|
7
|
-
* @arg {number} id
|
|
8
|
-
* @arg {AsepriteTagSpan} span
|
|
9
|
-
* @arg {AsepriteFrameMap} map
|
|
10
|
-
* @arg {readonly AsepriteSlice[]} slices
|
|
11
|
-
* @return {Anim}
|
|
12
|
-
* @internal
|
|
13
|
-
*/
|
|
14
|
-
export function parseAnim(id: number, span: AsepriteTagSpan, map: AsepriteFrameMap, slices: readonly AsepriteSlice[]): Anim;
|
|
15
|
-
/**
|
|
16
|
-
* @arg {AsepriteFrame} frame
|
|
17
|
-
* @return {Readonly<XY>}
|
|
18
|
-
* @internal
|
|
19
|
-
*/
|
|
20
|
-
export function parseCel(frame: AsepriteFrame): Readonly<XY>;
|
|
21
|
-
/**
|
|
22
|
-
* @arg {AsepriteTagSpan} span
|
|
23
|
-
* @arg {readonly AsepriteSlice[]} slices
|
|
24
|
-
* @return {Readonly<Box>}
|
|
25
|
-
* @internal
|
|
26
|
-
*/
|
|
27
|
-
export function parseHitbox(span: AsepriteTagSpan, slices: readonly AsepriteSlice[]): Readonly<Box>;
|
|
28
|
-
/** @typedef {import('./aseprite.js').AnimTag} AnimTag */
|
|
29
|
-
/** @typedef {import('./aseprite.js').Aseprite} Aseprite */
|
|
30
|
-
/** @typedef {import('./aseprite.js').AsepriteAnimTagFrame} AsepriteAnimTagFrame */
|
|
31
|
-
/** @typedef {import('./aseprite.js').AsepriteFrame} AsepriteFrame */
|
|
32
|
-
/** @typedef {import('./aseprite.js').AsepriteFrameMap} AsepriteFrameMap */
|
|
33
|
-
/** @typedef {import('./aseprite.js').AsepriteSlice} AsepriteSlice */
|
|
34
|
-
/** @typedef {import('./aseprite.js').AsepriteTagSpan} AsepriteTagSpan */
|
|
35
|
-
/** @typedef {import('./atlas.js').Anim} Anim */
|
|
36
|
-
/** @typedef {import('./atlas.js').Atlas} Atlas */
|
|
37
|
-
/** @typedef {import('../types/2d.js').Box} Box */
|
|
38
|
-
/** @typedef {import('../types/2d.js').WH} WH */
|
|
39
|
-
/** @typedef {import('../types/2d.js').XY} XY */
|
|
40
|
-
export const maxAnimCels: 16;
|
|
41
|
-
export type AnimTag = import('./aseprite.js').AnimTag;
|
|
42
|
-
export type Aseprite = import('./aseprite.js').Aseprite;
|
|
43
|
-
export type AsepriteAnimTagFrame = import('./aseprite.js').AsepriteAnimTagFrame;
|
|
44
|
-
export type AsepriteFrame = import('./aseprite.js').AsepriteFrame;
|
|
45
|
-
export type AsepriteFrameMap = import('./aseprite.js').AsepriteFrameMap;
|
|
46
|
-
export type AsepriteSlice = import('./aseprite.js').AsepriteSlice;
|
|
47
|
-
export type AsepriteTagSpan = import('./aseprite.js').AsepriteTagSpan;
|
|
48
|
-
export type Anim = import('./atlas.js').Anim;
|
|
49
|
-
export type Atlas = import('./atlas.js').Atlas;
|
|
50
|
-
export type Box = import('../types/2d.js').Box;
|
|
51
|
-
export type WH = import('../types/2d.js').WH;
|
|
52
|
-
export type XY = import('../types/2d.js').XY;
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/** @typedef {import('./aseprite.js').AnimTag} AnimTag */
|
|
2
|
-
/** @typedef {import('./aseprite.js').Aseprite} Aseprite */
|
|
3
|
-
/** @typedef {import('./aseprite.js').AsepriteAnimTagFrame} AsepriteAnimTagFrame */
|
|
4
|
-
/** @typedef {import('./aseprite.js').AsepriteFrame} AsepriteFrame */
|
|
5
|
-
/** @typedef {import('./aseprite.js').AsepriteFrameMap} AsepriteFrameMap */
|
|
6
|
-
/** @typedef {import('./aseprite.js').AsepriteSlice} AsepriteSlice */
|
|
7
|
-
/** @typedef {import('./aseprite.js').AsepriteTagSpan} AsepriteTagSpan */
|
|
8
|
-
/** @typedef {import('./atlas.js').Anim} Anim */
|
|
9
|
-
/** @typedef {import('./atlas.js').Atlas} Atlas */
|
|
10
|
-
/** @typedef {import('../types/2d.js').Box} Box */
|
|
11
|
-
/** @typedef {import('../types/2d.js').WH} WH */
|
|
12
|
-
/** @typedef {import('../types/2d.js').XY} XY */
|
|
13
|
-
export const maxAnimCels = 16;
|
|
14
|
-
/**
|
|
15
|
-
* @arg {Aseprite} ase
|
|
16
|
-
* @return {Atlas}
|
|
17
|
-
*/
|
|
18
|
-
export function parseAtlas(ase) {
|
|
19
|
-
const atlas = new Map();
|
|
20
|
-
for (const span of ase.meta.frameTags) {
|
|
21
|
-
const tag = parseTag(span.name);
|
|
22
|
-
if (atlas.has(tag))
|
|
23
|
-
throw Error(`duplicate tag "${tag}" in atlas`);
|
|
24
|
-
const id = atlas.size * maxAnimCels;
|
|
25
|
-
atlas.set(tag, parseAnim(id, span, ase.frames, ase.meta.slices));
|
|
26
|
-
}
|
|
27
|
-
const extraSlices = ase.meta.slices.filter(slice => !atlas.has(parseTag(slice.name)));
|
|
28
|
-
if (extraSlices.length)
|
|
29
|
-
throw Error(`unknown hitbox tags in atlas: ${extraSlices.map(slice => slice.name).join(', ')}`);
|
|
30
|
-
return Object.fromEntries(atlas);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* @arg {number} id
|
|
34
|
-
* @arg {AsepriteTagSpan} span
|
|
35
|
-
* @arg {AsepriteFrameMap} map
|
|
36
|
-
* @arg {readonly AsepriteSlice[]} slices
|
|
37
|
-
* @return {Anim}
|
|
38
|
-
* @internal
|
|
39
|
-
*/
|
|
40
|
-
export function parseAnim(id, span, map, slices) {
|
|
41
|
-
const frames = [...parseAnimFrames(span, map)];
|
|
42
|
-
if (!frames[0])
|
|
43
|
-
throw Error('animation missing frames');
|
|
44
|
-
return {
|
|
45
|
-
id,
|
|
46
|
-
w: frames[0].sourceSize.w,
|
|
47
|
-
h: frames[0].sourceSize.h,
|
|
48
|
-
cels: frames.map(parseCel),
|
|
49
|
-
hitbox: parseHitbox(span, slices),
|
|
50
|
-
tag: parseTag(span.name)
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* @arg {AsepriteTagSpan} span
|
|
55
|
-
* @arg {AsepriteFrameMap} map
|
|
56
|
-
* @return {IterableIterator<AsepriteFrame>}
|
|
57
|
-
*/
|
|
58
|
-
function* parseAnimFrames(span, map) {
|
|
59
|
-
for (let i = span.from; i <= span.to && i - span.from < maxAnimCels; i++) {
|
|
60
|
-
const animTagFrame = /** @type {AsepriteAnimTagFrame} */ (`${span.name}--${i}`);
|
|
61
|
-
const frame = map[animTagFrame];
|
|
62
|
-
if (!frame)
|
|
63
|
-
throw Error(`missing frame "${animTagFrame}"`);
|
|
64
|
-
yield frame;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* @arg {AsepriteFrame} frame
|
|
69
|
-
* @return {Readonly<XY>}
|
|
70
|
-
* @internal
|
|
71
|
-
*/
|
|
72
|
-
export function parseCel(frame) {
|
|
73
|
-
return {
|
|
74
|
-
x: frame.frame.x + (frame.frame.w - frame.sourceSize.w) / 2,
|
|
75
|
-
y: frame.frame.y + (frame.frame.h - frame.sourceSize.h) / 2
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* @arg {AsepriteTagSpan} span
|
|
80
|
-
* @arg {readonly AsepriteSlice[]} slices
|
|
81
|
-
* @return {Readonly<Box>}
|
|
82
|
-
* @internal
|
|
83
|
-
*/
|
|
84
|
-
export function parseHitbox(span, slices) {
|
|
85
|
-
const tagSlices = slices.filter(slice => slice.name === span.name);
|
|
86
|
-
if (tagSlices.length > 1) {
|
|
87
|
-
throw Error(`tag "${span.name}" has multiple hitboxes`);
|
|
88
|
-
}
|
|
89
|
-
const box = tagSlices[0]?.keys[0]?.bounds ?? { x: 0, y: 0, w: 0, h: 0 };
|
|
90
|
-
// https://github.com/aseprite/aseprite/issues/3524
|
|
91
|
-
for (const key of tagSlices[0]?.keys ?? []) {
|
|
92
|
-
if (key.bounds.x !== box.x ||
|
|
93
|
-
key.bounds.y !== box.y ||
|
|
94
|
-
key.bounds.w !== box.w ||
|
|
95
|
-
key.bounds.h !== box.h)
|
|
96
|
-
throw Error(`tag "${span.name}" hitbox varies across frames`);
|
|
97
|
-
}
|
|
98
|
-
return box;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* @arg {string} tag
|
|
102
|
-
* @return {AnimTag}
|
|
103
|
-
*/
|
|
104
|
-
function parseTag(tag) {
|
|
105
|
-
if (!tag.includes('--'))
|
|
106
|
-
throw Error(`tag "${tag}" is malformed`);
|
|
107
|
-
return /** @type {AnimTag} */ (tag);
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=atlas-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atlas-parser.js","sourceRoot":"","sources":["../../src/atlas/atlas-parser.js"],"names":[],"mappings":"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"}
|
package/dist/atlas/atlas.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Box, WH, XY } from '../types/2d.js';
|
|
2
|
-
import type { AnimTag } from './aseprite.js';
|
|
3
|
-
export type Atlas<T extends AnimTag = AnimTag> = {
|
|
4
|
-
readonly [tag in T]: Anim<T>;
|
|
5
|
-
};
|
|
6
|
-
export type Anim<T extends AnimTag = AnimTag> = {
|
|
7
|
-
readonly cels: readonly Readonly<XY>[];
|
|
8
|
-
readonly hitbox: Readonly<Box>;
|
|
9
|
-
/** A multiple of 16 (maxAnimCels). */
|
|
10
|
-
readonly id: number;
|
|
11
|
-
readonly tag: T;
|
|
12
|
-
} & Readonly<WH>;
|
package/dist/atlas/atlas.js
DELETED
package/dist/atlas/atlas.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atlas.js","sourceRoot":"","sources":["../../src/atlas/atlas.ts"],"names":[],"mappings":""}
|
package/dist/audio/synth.d.ts
DELETED
package/dist/audio/synth.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export class Synth {
|
|
2
|
-
#context;
|
|
3
|
-
beep(type, startHz, endHz, duration // why can't this be short?
|
|
4
|
-
) {
|
|
5
|
-
this.#context ??= new AudioContext();
|
|
6
|
-
const now = this.#context.currentTime;
|
|
7
|
-
const end = now + duration;
|
|
8
|
-
const oscillator = this.#context.createOscillator();
|
|
9
|
-
oscillator.type = type;
|
|
10
|
-
oscillator.frequency.setValueAtTime(startHz, now);
|
|
11
|
-
oscillator.frequency.exponentialRampToValueAtTime(endHz, end);
|
|
12
|
-
const gain = this.#context.createGain();
|
|
13
|
-
gain.gain.setValueAtTime(1, now);
|
|
14
|
-
gain.gain.exponentialRampToValueAtTime(0.01, end);
|
|
15
|
-
oscillator.connect(gain);
|
|
16
|
-
gain.connect(this.#context.destination);
|
|
17
|
-
oscillator.start();
|
|
18
|
-
oscillator.stop(end);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=synth.js.map
|
package/dist/audio/synth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"synth.js","sourceRoot":"","sources":["../../src/audio/synth.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,KAAK;IAChB,QAAQ,CAAe;IAEvB,IAAI,CACF,IAAoB,EACpB,OAAe,EACf,KAAa,EACb,QAAgB,CAAC,2BAA2B;;QAE5C,IAAI,CAAC,QAAQ,KAAK,IAAI,YAAY,EAAE,CAAA;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAA;QACrC,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAA;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAA;QACnD,UAAU,CAAC,IAAI,GAAG,IAAI,CAAA;QACtB,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACjD,UAAU,CAAC,SAAS,CAAC,4BAA4B,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAEjD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAEvC,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type Bitmap = {
|
|
2
|
-
/** 8x: i16, 8y: i16 */
|
|
3
|
-
readonly _xy: number;
|
|
4
|
-
/** w: u12, h: u12 */
|
|
5
|
-
readonly _wh: number;
|
|
6
|
-
/** id+cel: u15, flipX: b1, flipY: b1, zend: b1, z: u3 */
|
|
7
|
-
readonly _iffzz: number;
|
|
8
|
-
};
|
|
9
|
-
export declare class BitmapBuffer {
|
|
10
|
-
readonly buffer: Uint32Array;
|
|
11
|
-
size: number;
|
|
12
|
-
constructor(capacity: number);
|
|
13
|
-
push(bmp: Readonly<Bitmap>): void;
|
|
14
|
-
}
|
package/dist/graphics/bitmap.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export class BitmapBuffer {
|
|
2
|
-
buffer;
|
|
3
|
-
size = 0;
|
|
4
|
-
constructor(capacity) {
|
|
5
|
-
this.buffer = new Uint32Array(capacity * 3);
|
|
6
|
-
}
|
|
7
|
-
push(bmp) {
|
|
8
|
-
this.buffer[this.size * 3] = bmp._xy;
|
|
9
|
-
this.buffer[this.size * 3 + 1] = bmp._wh;
|
|
10
|
-
this.buffer[this.size * 3 + 2] = bmp._iffzz;
|
|
11
|
-
this.size++;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=bitmap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bitmap.js","sourceRoot":"","sources":["../../src/graphics/bitmap.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAY;IACd,MAAM,CAAa;IAC5B,IAAI,GAAG,CAAC,CAAA;IAER,YAAY,QAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,CAAC,GAAqB;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAA;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;CACF"}
|
package/dist/graphics/cam.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Box, WH, XY } from '../types/2d.js';
|
|
2
|
-
export declare class Cam implements Box {
|
|
3
|
-
#private;
|
|
4
|
-
minWH: WH;
|
|
5
|
-
minScale: number;
|
|
6
|
-
x: number;
|
|
7
|
-
y: number;
|
|
8
|
-
lvl: Box;
|
|
9
|
-
get h(): number;
|
|
10
|
-
/** Fill or just barely not fill the viewport in scaled pixels. */
|
|
11
|
-
resize(zoomOut?: number): void;
|
|
12
|
-
get scale(): number;
|
|
13
|
-
/** Returns the integral position in level coordinates. */
|
|
14
|
-
toLevelXY(clientXY: Readonly<XY>): XY;
|
|
15
|
-
get w(): number;
|
|
16
|
-
}
|
package/dist/graphics/cam.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export class Cam {
|
|
2
|
-
minWH = { w: 256, h: 256 };
|
|
3
|
-
minScale = 1;
|
|
4
|
-
x = 0; //xy?
|
|
5
|
-
y = 0;
|
|
6
|
-
lvl = { x: -4096, y: -4096, w: 8191, h: 8191 };
|
|
7
|
-
#clientWH = { w: 1, h: 1 };
|
|
8
|
-
#scale = 1;
|
|
9
|
-
#w = this.minWH.w;
|
|
10
|
-
#h = this.minWH.h;
|
|
11
|
-
get h() {
|
|
12
|
-
return this.#h;
|
|
13
|
-
}
|
|
14
|
-
/** Fill or just barely not fill the viewport in scaled pixels. */
|
|
15
|
-
resize(zoomOut) {
|
|
16
|
-
// WH of body in CSS px; document.body.getBoundingClientRect() returns
|
|
17
|
-
// incorrectly large sizing on mobile that includes the address bar
|
|
18
|
-
this.#clientWH.w = innerWidth;
|
|
19
|
-
this.#clientWH.h = innerHeight;
|
|
20
|
-
const nativeW = Math.round(this.#clientWH.w * devicePixelRatio); // physical
|
|
21
|
-
const nativeH = Math.round(this.#clientWH.h * devicePixelRatio);
|
|
22
|
-
this.#scale = Math.max(this.minScale, Math.floor(Math.min(nativeW / this.minWH.w, nativeH / this.minWH.h)) -
|
|
23
|
-
(zoomOut ?? 0) // Default is to zoom in as much as possible.
|
|
24
|
-
);
|
|
25
|
-
this.#w = Math.floor(nativeW / this.#scale);
|
|
26
|
-
this.#h = Math.floor(nativeH / this.#scale);
|
|
27
|
-
}
|
|
28
|
-
get scale() {
|
|
29
|
-
return this.#scale;
|
|
30
|
-
}
|
|
31
|
-
/** Returns the integral position in level coordinates. */
|
|
32
|
-
toLevelXY(clientXY) {
|
|
33
|
-
return {
|
|
34
|
-
x: Math.round(this.x + (clientXY.x / this.#clientWH.w) * this.#w),
|
|
35
|
-
y: Math.round(this.y + (clientXY.y / this.#clientWH.h) * this.#h)
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
get w() {
|
|
39
|
-
return this.#w;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=cam.js.map
|
package/dist/graphics/cam.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cam.js","sourceRoot":"","sources":["../../src/graphics/cam.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG;IACd,KAAK,GAAO,EAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAC,CAAA;IAC5B,QAAQ,GAAW,CAAC,CAAA;IACpB,CAAC,GAAW,CAAC,CAAA,CAAC,KAAK;IACnB,CAAC,GAAW,CAAC,CAAA;IACb,GAAG,GAAQ,EAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAC,CAAA;IAExC,SAAS,GAAO,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAA;IACrC,MAAM,GAAG,CAAC,CAAA;IACV,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACjB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAC,OAAgB;QACrB,sEAAsE;QACtE,mEAAmE;QACnE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,UAAU,CAAA;QAC7B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,WAAW,CAAA;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAA,CAAC,WAAW;QAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAA;QAE/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,6CAA6C;SAC/D,CAAA;QACD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,0DAA0D;IAC1D,SAAS,CAAC,QAAsB;QAC9B,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACjE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;SAClE,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const fragGLSL = "#version 300 es\nuniform mediump sampler2D uSpritesheet;\nuniform mediump uvec2 uSpritesheetSize;\n\nflat in highp ivec4 vTexXYWH;\nin highp vec2 vDstWH;\n\nout highp vec4 oFrag;\n\nvoid main() {\n highp vec2 px = vec2(vTexXYWH.xy) + mod(vDstWH, vec2(vTexXYWH.zw));\n oFrag = texture(uSpritesheet, px / vec2(uSpritesheetSize));\n if(oFrag.a < 1.) discard;\n}";
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export const fragGLSL = `#version 300 es
|
|
2
|
-
uniform mediump sampler2D uSpritesheet;
|
|
3
|
-
uniform mediump uvec2 uSpritesheetSize;
|
|
4
|
-
|
|
5
|
-
flat in highp ivec4 vTexXYWH;
|
|
6
|
-
in highp vec2 vDstWH;
|
|
7
|
-
|
|
8
|
-
out highp vec4 oFrag;
|
|
9
|
-
|
|
10
|
-
void main() {
|
|
11
|
-
highp vec2 px = vec2(vTexXYWH.xy) + mod(vDstWH, vec2(vTexXYWH.zw));
|
|
12
|
-
oFrag = texture(uSpritesheet, px / vec2(uSpritesheetSize));
|
|
13
|
-
if(oFrag.a < 1.) discard;
|
|
14
|
-
}`;
|
|
15
|
-
//# sourceMappingURL=frag.glsl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frag.glsl.js","sourceRoot":"","sources":["../../src/graphics/frag.glsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;EAatB,CAAA"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Input } from '../input/input.js';
|
|
2
|
-
import { BitmapBuffer } from './bitmap.js';
|
|
3
|
-
import { Cam } from './cam.js';
|
|
4
|
-
import { Renderer } from './renderer.js';
|
|
5
|
-
export declare class FrameListener {
|
|
6
|
-
#private;
|
|
7
|
-
/** The running lifetime in milliseconds. */
|
|
8
|
-
age: number;
|
|
9
|
-
/** The exact duration in milliseconds to apply on a given update step. */
|
|
10
|
-
tick: number;
|
|
11
|
-
constructor(canvas: HTMLCanvasElement, input: Input<string>, renderer: Renderer);
|
|
12
|
-
cancel(): void;
|
|
13
|
-
get frame(): number;
|
|
14
|
-
register(op: 'add' | 'remove'): void;
|
|
15
|
-
render(cam: Readonly<Cam>, buffer: BitmapBuffer, loop?: () => void): void;
|
|
16
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { Input } from '../input/input.js';
|
|
2
|
-
import { BitmapBuffer } from './bitmap.js';
|
|
3
|
-
import { Cam } from './cam.js';
|
|
4
|
-
import { Renderer } from './renderer.js';
|
|
5
|
-
export class FrameListener {
|
|
6
|
-
/** The running lifetime in milliseconds. */
|
|
7
|
-
age = 0;
|
|
8
|
-
/** The exact duration in milliseconds to apply on a given update step. */
|
|
9
|
-
tick = 0;
|
|
10
|
-
#canvas;
|
|
11
|
-
#frame;
|
|
12
|
-
#loop;
|
|
13
|
-
#time;
|
|
14
|
-
#input;
|
|
15
|
-
#renderer;
|
|
16
|
-
constructor(canvas, input, renderer) {
|
|
17
|
-
this.#canvas = canvas;
|
|
18
|
-
this.#input = input;
|
|
19
|
-
this.#renderer = renderer;
|
|
20
|
-
}
|
|
21
|
-
cancel() {
|
|
22
|
-
if (this.#frame != null)
|
|
23
|
-
cancelAnimationFrame(this.#frame);
|
|
24
|
-
this.#frame = undefined;
|
|
25
|
-
this.tick = 0;
|
|
26
|
-
this.#time = undefined;
|
|
27
|
-
this.#input.reset();
|
|
28
|
-
this.#loop = undefined;
|
|
29
|
-
}
|
|
30
|
-
get frame() {
|
|
31
|
-
// Assume 60 FPS so games can scale to this number regardless of actual.
|
|
32
|
-
return Math.trunc(this.age / 16.666666666666668);
|
|
33
|
-
}
|
|
34
|
-
register(op) {
|
|
35
|
-
const fn = `${op}EventListener`;
|
|
36
|
-
for (const type of ['webglcontextrestored', 'webglcontextlost']) {
|
|
37
|
-
this.#canvas[fn](type, this.#onEvent, true);
|
|
38
|
-
}
|
|
39
|
-
globalThis[fn]('visibilitychange', this.#onEvent, true);
|
|
40
|
-
if (op === 'add')
|
|
41
|
-
this.#renderer.initGL();
|
|
42
|
-
this.#input.register(op);
|
|
43
|
-
}
|
|
44
|
-
render(cam, buffer, loop) {
|
|
45
|
-
this.#loop = loop;
|
|
46
|
-
if (!this.#isVisible() || !this.#renderer.hasContext())
|
|
47
|
-
return;
|
|
48
|
-
if (this.#loop)
|
|
49
|
-
this.#frame ??= requestAnimationFrame(this.#onFrame);
|
|
50
|
-
this.#renderer.render(cam, this.frame, buffer);
|
|
51
|
-
}
|
|
52
|
-
#isVisible() {
|
|
53
|
-
return document.visibilityState === 'visible';
|
|
54
|
-
}
|
|
55
|
-
#onEvent = (event) => {
|
|
56
|
-
event.preventDefault();
|
|
57
|
-
if (event.type === 'webglcontextrestored')
|
|
58
|
-
this.#renderer.initGL();
|
|
59
|
-
if (this.#renderer.hasContext() && this.#isVisible()) {
|
|
60
|
-
if (this.#loop)
|
|
61
|
-
this.#frame ??= requestAnimationFrame(this.#onFrame);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
if (this.#frame != null)
|
|
65
|
-
cancelAnimationFrame(this.#frame);
|
|
66
|
-
this.#frame = undefined;
|
|
67
|
-
this.tick = 0;
|
|
68
|
-
this.#time = undefined;
|
|
69
|
-
this.#input.reset();
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
#onFrame = (time) => {
|
|
73
|
-
this.#frame = undefined;
|
|
74
|
-
this.tick = time - (this.#time ?? time);
|
|
75
|
-
this.#time = time;
|
|
76
|
-
this.age += this.tick;
|
|
77
|
-
const loop = this.#loop;
|
|
78
|
-
this.#loop = undefined;
|
|
79
|
-
this.#input.poll(this.tick);
|
|
80
|
-
loop?.();
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=frame-listener.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frame-listener.js","sourceRoot":"","sources":["../../src/graphics/frame-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { type Atlas } from '../atlas/atlas.js';
|
|
2
|
-
import { BitmapBuffer } from './bitmap.js';
|
|
3
|
-
import { Cam } from './cam.js';
|
|
4
|
-
export declare class Renderer {
|
|
5
|
-
#private;
|
|
6
|
-
constructor(atlas: Atlas, canvas: HTMLCanvasElement, spritesheet: HTMLImageElement);
|
|
7
|
-
clearColor(rgba: number): void;
|
|
8
|
-
initGL(): void;
|
|
9
|
-
get loseContext(): WEBGL_lose_context | null;
|
|
10
|
-
hasContext(): boolean;
|
|
11
|
-
render(cam: Readonly<Cam>, frame: number, bmps: Readonly<BitmapBuffer>): void;
|
|
12
|
-
}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { maxAnimCels } from '../atlas/atlas-parser.js';
|
|
2
|
-
import {} from '../atlas/atlas.js';
|
|
3
|
-
import { BitmapBuffer } from './bitmap.js';
|
|
4
|
-
import { Cam } from './cam.js';
|
|
5
|
-
import { fragGLSL } from './frag.glsl.js';
|
|
6
|
-
import { vertGLSL } from './vert.glsl.js';
|
|
7
|
-
const uv = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0]);
|
|
8
|
-
export class Renderer {
|
|
9
|
-
#bmpBuffer = null;
|
|
10
|
-
#canvas;
|
|
11
|
-
#cels;
|
|
12
|
-
#gl;
|
|
13
|
-
#loseContext = null;
|
|
14
|
-
#spritesheet;
|
|
15
|
-
#uniforms = {};
|
|
16
|
-
#vertArray = null;
|
|
17
|
-
constructor(atlas, canvas, spritesheet) {
|
|
18
|
-
this.#canvas = canvas;
|
|
19
|
-
this.#spritesheet = spritesheet;
|
|
20
|
-
this.#cels = new Uint16Array(newCels(atlas));
|
|
21
|
-
}
|
|
22
|
-
clearColor(rgba) {
|
|
23
|
-
this.#gl.clearColor(((rgba >>> 24) & 0xff) / 0xff, ((rgba >>> 16) & 0xff) / 0xff, ((rgba >>> 8) & 0xff) / 0xff, ((rgba >>> 0) & 0xff) / 0xff);
|
|
24
|
-
}
|
|
25
|
-
initGL() {
|
|
26
|
-
const gl = this.#canvas.getContext('webgl2', {
|
|
27
|
-
antialias: false,
|
|
28
|
-
desynchronized: true, // breaks render stats
|
|
29
|
-
powerPreference: 'high-performance'
|
|
30
|
-
});
|
|
31
|
-
if (!gl)
|
|
32
|
-
throw Error('WebGL v2 unsupported');
|
|
33
|
-
this.#gl = gl;
|
|
34
|
-
// Allow transparent textures to be layered.
|
|
35
|
-
gl.enable(gl.BLEND);
|
|
36
|
-
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
37
|
-
// Enable z-buffer for [0, 1] ([foreground, background]).
|
|
38
|
-
gl.enable(gl.DEPTH_TEST);
|
|
39
|
-
gl.depthRange(0, 1);
|
|
40
|
-
gl.clearDepth(1);
|
|
41
|
-
gl.depthFunc(gl.LESS);
|
|
42
|
-
// Disable image colorspace conversions. The default is browser dependent.
|
|
43
|
-
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false);
|
|
44
|
-
const pgm = loadProgram(gl, vertGLSL, fragGLSL);
|
|
45
|
-
this.#uniforms = getUniformLocations(gl, pgm);
|
|
46
|
-
gl.uniform2ui(this.#uniforms.uSpritesheetSize, this.#spritesheet.naturalWidth, this.#spritesheet.naturalHeight);
|
|
47
|
-
this.#vertArray = gl.createVertexArray();
|
|
48
|
-
gl.bindVertexArray(this.#vertArray);
|
|
49
|
-
const uvBuffer = gl.createBuffer();
|
|
50
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);
|
|
51
|
-
gl.enableVertexAttribArray(0);
|
|
52
|
-
gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0);
|
|
53
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
54
|
-
this.#bmpBuffer = gl.createBuffer();
|
|
55
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, this.#bmpBuffer);
|
|
56
|
-
gl.enableVertexAttribArray(1);
|
|
57
|
-
gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 12, 0);
|
|
58
|
-
gl.vertexAttribDivisor(1, 1);
|
|
59
|
-
gl.enableVertexAttribArray(2);
|
|
60
|
-
gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, 12, 4);
|
|
61
|
-
gl.vertexAttribDivisor(2, 1);
|
|
62
|
-
gl.enableVertexAttribArray(3);
|
|
63
|
-
gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, 12, 8);
|
|
64
|
-
gl.vertexAttribDivisor(3, 1);
|
|
65
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
66
|
-
gl.bindVertexArray(null);
|
|
67
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);
|
|
68
|
-
gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);
|
|
69
|
-
gl.bindBuffer(this.#gl.ARRAY_BUFFER, null);
|
|
70
|
-
gl.uniform1i(this.#uniforms.uCels, 0);
|
|
71
|
-
gl.activeTexture(gl.TEXTURE0);
|
|
72
|
-
const dataTex = gl.createTexture();
|
|
73
|
-
gl.bindTexture(gl.TEXTURE_2D, dataTex);
|
|
74
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
75
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
76
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16UI, 1, this.#cels.length / 4, // 4 u8s per row
|
|
77
|
-
0, gl.RGBA_INTEGER, gl.UNSIGNED_SHORT, this.#cels);
|
|
78
|
-
gl.uniform1i(this.#uniforms.uSpritesheet, 1);
|
|
79
|
-
gl.activeTexture(gl.TEXTURE1);
|
|
80
|
-
const spritesheetTex = gl.createTexture();
|
|
81
|
-
gl.bindTexture(gl.TEXTURE_2D, spritesheetTex);
|
|
82
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
83
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
84
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.#spritesheet);
|
|
85
|
-
this.#loseContext = gl.getExtension('WEBGL_lose_context');
|
|
86
|
-
}
|
|
87
|
-
get loseContext() {
|
|
88
|
-
return this.#loseContext;
|
|
89
|
-
}
|
|
90
|
-
hasContext() {
|
|
91
|
-
return !this.#gl.isContextLost();
|
|
92
|
-
}
|
|
93
|
-
render(cam, frame, bmps) {
|
|
94
|
-
this.#resize(cam);
|
|
95
|
-
this.#gl.clear(this.#gl.COLOR_BUFFER_BIT | this.#gl.DEPTH_BUFFER_BIT);
|
|
96
|
-
this.#gl.uniform4i(this.#uniforms.uCam, cam.x, cam.y, cam.w, cam.h);
|
|
97
|
-
this.#gl.uniform1ui(this.#uniforms.uFrame, frame);
|
|
98
|
-
this.#gl.bindVertexArray(this.#vertArray);
|
|
99
|
-
this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#bmpBuffer);
|
|
100
|
-
this.#gl.bufferData(this.#gl.ARRAY_BUFFER, bmps.buffer, this.#gl.STREAM_DRAW);
|
|
101
|
-
this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, null);
|
|
102
|
-
this.#gl.drawArraysInstanced(this.#gl.TRIANGLE_STRIP, 0, uv.length / 2, // d
|
|
103
|
-
bmps.size);
|
|
104
|
-
this.#gl.bindVertexArray(null);
|
|
105
|
-
}
|
|
106
|
-
#resize(cam) {
|
|
107
|
-
const canvas = this.#canvas;
|
|
108
|
-
const nativeWH = { w: cam.w * cam.scale, h: cam.h * cam.scale };
|
|
109
|
-
if (canvas.width !== nativeWH.w || canvas.height !== nativeWH.h) {
|
|
110
|
-
canvas.width = nativeWH.w;
|
|
111
|
-
canvas.height = nativeWH.h;
|
|
112
|
-
this.#gl.viewport(0, 0, nativeWH.w, nativeWH.h);
|
|
113
|
-
}
|
|
114
|
-
// These pixels may be greater than, less than, or equal to native.
|
|
115
|
-
const clientW = nativeWH.w / devicePixelRatio;
|
|
116
|
-
const clientH = nativeWH.h / devicePixelRatio;
|
|
117
|
-
const diffW = Number.parseFloat(canvas.style.width.slice(0, -2)) - clientW;
|
|
118
|
-
const diffH = Number.parseFloat(canvas.style.height.slice(0, -2)) - clientH;
|
|
119
|
-
if (!Number.isFinite(diffW) ||
|
|
120
|
-
Math.abs(diffW) >= 0.5 ||
|
|
121
|
-
!Number.isFinite(diffH) ||
|
|
122
|
-
Math.abs(diffH) >= 0.5) {
|
|
123
|
-
canvas.style.width = `${clientW}px`;
|
|
124
|
-
canvas.style.height = `${clientH}px`;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
function compileShader(gl, type, src) {
|
|
129
|
-
const shader = gl.createShader(type);
|
|
130
|
-
if (!shader)
|
|
131
|
-
throw Error('shader creation failed');
|
|
132
|
-
gl.shaderSource(shader, src.trim());
|
|
133
|
-
gl.compileShader(shader);
|
|
134
|
-
const log = gl.getShaderInfoLog(shader)?.slice(0, -1);
|
|
135
|
-
if (log)
|
|
136
|
-
console.warn(log);
|
|
137
|
-
return shader;
|
|
138
|
-
}
|
|
139
|
-
function getUniformLocations(gl, pgm) {
|
|
140
|
-
if (!pgm)
|
|
141
|
-
return {};
|
|
142
|
-
const len = gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS);
|
|
143
|
-
const locations = {};
|
|
144
|
-
for (let i = 0; i < len; ++i) {
|
|
145
|
-
const uniform = gl.getActiveUniform(pgm, i);
|
|
146
|
-
if (uniform == null)
|
|
147
|
-
throw Error(`missing shader uniform at index ${i}`);
|
|
148
|
-
locations[uniform.name] = gl.getUniformLocation(pgm, uniform.name);
|
|
149
|
-
}
|
|
150
|
-
return locations;
|
|
151
|
-
}
|
|
152
|
-
function loadProgram(gl, vertGLSL, fragGLSL) {
|
|
153
|
-
const pgm = gl.createProgram();
|
|
154
|
-
if (!pgm)
|
|
155
|
-
return null;
|
|
156
|
-
const vert = compileShader(gl, gl.VERTEX_SHADER, vertGLSL);
|
|
157
|
-
const frag = compileShader(gl, gl.FRAGMENT_SHADER, fragGLSL);
|
|
158
|
-
gl.attachShader(pgm, vert);
|
|
159
|
-
gl.attachShader(pgm, frag);
|
|
160
|
-
gl.linkProgram(pgm);
|
|
161
|
-
gl.useProgram(pgm);
|
|
162
|
-
const log = gl.getProgramInfoLog(pgm)?.slice(0, -1);
|
|
163
|
-
if (log)
|
|
164
|
-
console.warn(log);
|
|
165
|
-
gl.detachShader(pgm, frag);
|
|
166
|
-
gl.detachShader(pgm, vert);
|
|
167
|
-
gl.deleteShader(frag);
|
|
168
|
-
gl.deleteShader(vert);
|
|
169
|
-
return pgm;
|
|
170
|
-
}
|
|
171
|
-
/** XYWH ordered by ID and padded to 16-cel blocks. */
|
|
172
|
-
function newCels(atlas) {
|
|
173
|
-
const cels = [];
|
|
174
|
-
for (const anim of Object.values(atlas)) {
|
|
175
|
-
// Animations are inserted in ID order.
|
|
176
|
-
for (const cel of anim.cels)
|
|
177
|
-
cels.push(cel.x, cel.y, anim.w, anim.h);
|
|
178
|
-
for (let i = anim.cels.length; i < maxAnimCels; i++) {
|
|
179
|
-
const cel = anim.cels[i % anim.cels.length];
|
|
180
|
-
cels.push(cel.x, cel.y, anim.w, anim.h);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return cels;
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=renderer.js.map
|