@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.
- package/dist/meta.json +1 -0
- package/dist/package.json +66 -0
- package/dist/public/favicon/favicon16.png +0 -0
- package/dist/public/favicon/favicon16.webp +0 -0
- package/dist/public/favicon/favicon192.png +0 -0
- package/dist/public/favicon/favicon192.webp +0 -0
- package/dist/public/favicon/favicon32.png +0 -0
- package/dist/public/favicon/favicon32.webp +0 -0
- package/dist/public/favicon/favicon48.png +0 -0
- package/dist/public/favicon/favicon48.webp +0 -0
- package/dist/public/favicon/favicon64.png +0 -0
- package/dist/public/favicon/favicon64.webp +0 -0
- package/dist/public/index.js +98 -0
- package/dist/public/index.js.map +7 -0
- package/dist/public/preload-atlas.png +0 -0
- package/dist/public/preload-atlas.webp +0 -0
- package/dist/public/void-v0.1.0-6+20251020.7cdf98d.html +111 -0
- package/dist/public/void-v0.1.0-6+20251020.e4e9eef.html +111 -0
- package/dist/public/void-v0.1.0-7+20251021.7cdf98d.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 +41 -0
- package/dist/src/demo/assets/preload-atlas.json +193 -0
- package/dist/src/demo/ents/clock-ent.d.ts +11 -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 +12 -0
- package/dist/src/demo/ents/render-toggle-ent.js +41 -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 +20 -0
- package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
- package/dist/src/demo/game.d.ts +12 -0
- package/dist/src/demo/game.js +135 -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 +39 -0
- package/dist/src/ents/button-ent.js +128 -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 +63 -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 +17 -0
- package/dist/src/ents/zoo.js +45 -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 +220 -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 +36 -0
- package/dist/src/graphics/renderer.js +180 -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 +17 -0
- package/dist/src/looper.js +51 -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/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 +7 -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 +19 -0
- package/dist/src/utils/debug.js +35 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/delay-interval.d.ts +7 -0
- package/dist/src/utils/delay-interval.js +29 -0
- package/dist/src/utils/delay-interval.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 +48 -0
- package/dist/src/void.js +102 -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 +22 -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 +90 -0
- package/dist/tools/bundle/html-plugin.js.map +1 -0
- package/dist/tools/tsconfig-base.json +48 -0
- package/dist/tools/tsconfig.json +19 -0
- package/dist/tools/types/config.d.ts +27 -0
- package/dist/tools/types/config.js +31 -0
- package/dist/tools/types/config.js.map +1 -0
- package/dist/tools/types/package-json.d.ts +4 -0
- package/dist/tools/types/package-json.js +2 -0
- package/dist/tools/types/package-json.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 +15 -0
- package/dist/tools/void.js +31 -0
- package/dist/tools/void.js.map +1 -0
- package/package.json +31 -41
- 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 +51 -0
- package/tools/bundle/bundle.ts +64 -0
- package/tools/bundle/html-plugin.ts +135 -0
- package/tools/types/config.ts +65 -0
- package/tools/types/package-json.ts +4 -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 +55 -0
- package/dist/atlas/anim.d.ts +0 -30
- package/dist/atlas/anim.js +0 -16
- package/dist/atlas/anim.js.map +0 -1
- 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 -4
- 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 -184
- 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 -289
- package/src/atlas/anim.js +0 -17
- package/tools/atlas-parser.js +0 -120
- package/tools/void.js +0 -143
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { debug } from "../utils/debug.js";
|
|
2
|
+
/** @internal */
|
|
3
|
+
export function Shader(gl, vertGLSL, fragGLSL, textures) {
|
|
4
|
+
const program = loadProgram(gl, vertGLSL, fragGLSL);
|
|
5
|
+
gl.useProgram(program);
|
|
6
|
+
return {
|
|
7
|
+
buffer: gl.createBuffer(),
|
|
8
|
+
program,
|
|
9
|
+
textures,
|
|
10
|
+
uniform: GLUniformMap(gl, program),
|
|
11
|
+
vao: gl.createVertexArray()
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function GLUniformMap(gl, pgm) {
|
|
15
|
+
const len = pgm ? gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS) : 0;
|
|
16
|
+
const map = debug?.render
|
|
17
|
+
? new Proxy({}, {
|
|
18
|
+
get(target, k) {
|
|
19
|
+
if (target[k] == null)
|
|
20
|
+
throw Error(`no shader uniform "${k}"`);
|
|
21
|
+
return target[k];
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
: {};
|
|
25
|
+
for (let i = 0; i < len; ++i) {
|
|
26
|
+
const uniform = gl.getActiveUniform(pgm, i);
|
|
27
|
+
if (!uniform)
|
|
28
|
+
throw Error(`no shader uniform at index ${i}`);
|
|
29
|
+
const location = gl.getUniformLocation(pgm, uniform.name);
|
|
30
|
+
if (!location)
|
|
31
|
+
throw Error(`no shader uniform "${uniform.name}"`);
|
|
32
|
+
const name = uniform.name.replace('[0]', ''); // arrays.
|
|
33
|
+
map[name] = location;
|
|
34
|
+
}
|
|
35
|
+
return map;
|
|
36
|
+
}
|
|
37
|
+
function loadProgram(gl, vertGLSL, fragGLSL) {
|
|
38
|
+
const pgm = gl.createProgram();
|
|
39
|
+
if (!pgm)
|
|
40
|
+
return null;
|
|
41
|
+
const vert = compileShader(gl, 'VERTEX_SHADER', vertGLSL);
|
|
42
|
+
const frag = compileShader(gl, 'FRAGMENT_SHADER', fragGLSL);
|
|
43
|
+
if (!vert || !frag)
|
|
44
|
+
return null;
|
|
45
|
+
gl.attachShader(pgm, vert);
|
|
46
|
+
gl.attachShader(pgm, frag);
|
|
47
|
+
gl.linkProgram(pgm);
|
|
48
|
+
if (debug?.render && !gl.getProgramParameter(pgm, gl.LINK_STATUS)) {
|
|
49
|
+
const log = gl.getProgramInfoLog(pgm)?.slice(0, -1);
|
|
50
|
+
throw Error(`shader link failure; ${log}`);
|
|
51
|
+
}
|
|
52
|
+
gl.detachShader(pgm, frag);
|
|
53
|
+
gl.detachShader(pgm, vert);
|
|
54
|
+
gl.deleteShader(frag);
|
|
55
|
+
gl.deleteShader(vert);
|
|
56
|
+
return pgm;
|
|
57
|
+
}
|
|
58
|
+
function compileShader(gl, type, glsl) {
|
|
59
|
+
const shader = gl.createShader(gl[type]);
|
|
60
|
+
if (!shader)
|
|
61
|
+
return shader;
|
|
62
|
+
gl.shaderSource(shader, glsl.trim());
|
|
63
|
+
gl.compileShader(shader);
|
|
64
|
+
if (debug?.render && !gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
65
|
+
const log = gl.getShaderInfoLog(shader)?.slice(0, -1);
|
|
66
|
+
throw Error(`shader compile failure; ${log}`);
|
|
67
|
+
}
|
|
68
|
+
return shader;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=gl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gl.js","sourceRoot":"","sources":["../../../src/graphics/gl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const Layer: {
|
|
2
|
+
readonly Top: 0;
|
|
3
|
+
readonly UIA: 1;
|
|
4
|
+
readonly UIB: 2;
|
|
5
|
+
readonly UIC: 3;
|
|
6
|
+
readonly UID: 4;
|
|
7
|
+
readonly UIE: 5;
|
|
8
|
+
readonly UIF: 6;
|
|
9
|
+
readonly UIG: 7;
|
|
10
|
+
readonly A: 8;
|
|
11
|
+
readonly B: 9;
|
|
12
|
+
readonly C: 10;
|
|
13
|
+
readonly D: 11;
|
|
14
|
+
readonly E: 12;
|
|
15
|
+
readonly F: 13;
|
|
16
|
+
readonly Bottom: 14;
|
|
17
|
+
readonly Hidden: 15;
|
|
18
|
+
};
|
|
19
|
+
export type Layer = (typeof Layer)[keyof typeof Layer];
|
|
20
|
+
/** negative is above. returns [top, bottom]; hidden is out of domain. */
|
|
21
|
+
export declare function layerOffset(layer: Layer, offset: number): Layer;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const Layer = {
|
|
2
|
+
Top: 0,
|
|
3
|
+
UIA: 1,
|
|
4
|
+
UIB: 2,
|
|
5
|
+
UIC: 3,
|
|
6
|
+
UID: 4,
|
|
7
|
+
UIE: 5,
|
|
8
|
+
UIF: 6,
|
|
9
|
+
UIG: 7,
|
|
10
|
+
A: 8,
|
|
11
|
+
B: 9,
|
|
12
|
+
C: 10,
|
|
13
|
+
D: 11,
|
|
14
|
+
E: 12,
|
|
15
|
+
F: 13,
|
|
16
|
+
Bottom: 14,
|
|
17
|
+
Hidden: 15
|
|
18
|
+
};
|
|
19
|
+
/** negative is above. returns [top, bottom]; hidden is out of domain. */
|
|
20
|
+
export function layerOffset(layer, offset) {
|
|
21
|
+
return Math.max(Layer.Top, Math.min(Layer.Bottom, layer + offset));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../../../src/graphics/layer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;CACF,CAAA;AAGV,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,MAAc;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAU,CAAA;AAC7E,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Pool } from '../mem/pool.ts';
|
|
2
|
+
import { type WH } from '../types/geo.ts';
|
|
3
|
+
import type { Millis } from '../types/time.ts';
|
|
4
|
+
import type { Atlas, TagFormat } from './atlas.ts';
|
|
5
|
+
import type { Cam } from './cam.ts';
|
|
6
|
+
import { type GL2, Shader } from './gl.ts';
|
|
7
|
+
import { type Sprite } from './sprite.ts';
|
|
8
|
+
/** @internal */
|
|
9
|
+
export type Context = {
|
|
10
|
+
gl: GL2;
|
|
11
|
+
spriteShader: Shader;
|
|
12
|
+
viewport: WH;
|
|
13
|
+
};
|
|
14
|
+
export declare class Renderer {
|
|
15
|
+
#private;
|
|
16
|
+
/** when off, ents should avoid requesting renders. */
|
|
17
|
+
always: boolean;
|
|
18
|
+
clears: number;
|
|
19
|
+
invalid: boolean;
|
|
20
|
+
loseContext: WEBGL_lose_context | undefined;
|
|
21
|
+
constructor(preloadAtlas: Readonly<Atlas>, canvas: HTMLCanvasElement, looper: {
|
|
22
|
+
readonly age: Millis;
|
|
23
|
+
});
|
|
24
|
+
clear(rgba: number): void;
|
|
25
|
+
draw(pool: Readonly<Pool<Sprite<TagFormat>>>): void;
|
|
26
|
+
get hasContext(): boolean;
|
|
27
|
+
load(preloadAtlas: Readonly<HTMLImageElement> | undefined): void;
|
|
28
|
+
predraw(cam: Readonly<Cam>): void;
|
|
29
|
+
register(op: 'add' | 'remove'): this;
|
|
30
|
+
setDepth(enable: boolean): void;
|
|
31
|
+
[Symbol.dispose](): void;
|
|
32
|
+
/** @internal */
|
|
33
|
+
_Context(): Context | undefined;
|
|
34
|
+
}
|
|
35
|
+
declare function GL2(canvas: HTMLCanvasElement): GL2 | undefined;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { whEq } from "../types/geo.js";
|
|
2
|
+
import { debug } from "../utils/debug.js";
|
|
3
|
+
import { Shader } from "./gl.js";
|
|
4
|
+
import { drawableBytes } from "./sprite.js";
|
|
5
|
+
import { spriteFragGLSL } from "./sprite-frag.glsl.js";
|
|
6
|
+
import { spriteVertGLSL } from "./sprite-vert.glsl.js";
|
|
7
|
+
const uv = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0]);
|
|
8
|
+
export class Renderer {
|
|
9
|
+
/** when off, ents should avoid requesting renders. */
|
|
10
|
+
always = debug?.render === 'always';
|
|
11
|
+
clears = 0;
|
|
12
|
+
invalid = false;
|
|
13
|
+
loseContext;
|
|
14
|
+
#canvas;
|
|
15
|
+
#clearRGBA = 0;
|
|
16
|
+
#depth = true;
|
|
17
|
+
#ctx;
|
|
18
|
+
#looper;
|
|
19
|
+
#preloadAtlas;
|
|
20
|
+
#preloadAtlasImage;
|
|
21
|
+
constructor(preloadAtlas, canvas, looper) {
|
|
22
|
+
this.#preloadAtlas = preloadAtlas;
|
|
23
|
+
this.#canvas = canvas;
|
|
24
|
+
this.#looper = looper;
|
|
25
|
+
}
|
|
26
|
+
clear(rgba) {
|
|
27
|
+
if (!this.#ctx)
|
|
28
|
+
return;
|
|
29
|
+
const { gl } = this.#ctx;
|
|
30
|
+
if (this.#clearRGBA !== rgba) {
|
|
31
|
+
this.#clearRGBA = rgba;
|
|
32
|
+
gl.clearColor(((rgba >>> 24) & 0xff) / 0xff, ((rgba >>> 16) & 0xff) / 0xff, ((rgba >>> 8) & 0xff) / 0xff, ((rgba >>> 0) & 0xff) / 0xff);
|
|
33
|
+
}
|
|
34
|
+
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
|
|
35
|
+
this.clears++;
|
|
36
|
+
}
|
|
37
|
+
draw(pool) {
|
|
38
|
+
if (!this.#preloadAtlasImage || !this.#ctx)
|
|
39
|
+
return;
|
|
40
|
+
const { gl, spriteShader } = this.#ctx;
|
|
41
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, spriteShader.buffer);
|
|
42
|
+
gl.bufferData(gl.ARRAY_BUFFER, pool.view, gl.DYNAMIC_DRAW, 0, pool.size * drawableBytes);
|
|
43
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
44
|
+
gl.bindVertexArray(spriteShader.vao);
|
|
45
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, uv.length / 2, // d
|
|
46
|
+
pool.size);
|
|
47
|
+
gl.bindVertexArray(null);
|
|
48
|
+
this.invalid = false;
|
|
49
|
+
}
|
|
50
|
+
get hasContext() {
|
|
51
|
+
return this.#ctx != null;
|
|
52
|
+
}
|
|
53
|
+
load(preloadAtlas) {
|
|
54
|
+
this.#preloadAtlasImage = preloadAtlas;
|
|
55
|
+
this.#ctx = this._Context();
|
|
56
|
+
}
|
|
57
|
+
predraw(cam) {
|
|
58
|
+
if (!this.#ctx)
|
|
59
|
+
return;
|
|
60
|
+
const { gl, spriteShader, viewport } = this.#ctx;
|
|
61
|
+
if (!whEq(viewport, cam)) {
|
|
62
|
+
gl.viewport(0, 0, cam.w, cam.h);
|
|
63
|
+
viewport.w = cam.w;
|
|
64
|
+
viewport.h = cam.h;
|
|
65
|
+
}
|
|
66
|
+
gl.useProgram(spriteShader.program);
|
|
67
|
+
gl.uniform4i(spriteShader.uniform.uCam, cam.x, cam.y, cam.w, cam.h);
|
|
68
|
+
gl.uniform1f(spriteShader.uniform.uAge, this.#looper.age);
|
|
69
|
+
for (const [i, tex] of spriteShader.textures.entries()) {
|
|
70
|
+
gl.activeTexture(gl.TEXTURE0 + i);
|
|
71
|
+
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
register(op) {
|
|
75
|
+
this.#canvas[`${op}EventListener`]('webglcontextlost', this.#onContextLost);
|
|
76
|
+
this.#canvas[`${op}EventListener`]('webglcontextrestored', this.#onContextRestored);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
setDepth(enable) {
|
|
80
|
+
this.#depth = enable;
|
|
81
|
+
if (!this.#ctx)
|
|
82
|
+
return;
|
|
83
|
+
if (enable)
|
|
84
|
+
this.#ctx.gl.enable(this.#ctx.gl.DEPTH_TEST);
|
|
85
|
+
else
|
|
86
|
+
this.#ctx.gl.disable(this.#ctx.gl.DEPTH_TEST);
|
|
87
|
+
}
|
|
88
|
+
[Symbol.dispose]() {
|
|
89
|
+
this.register('remove');
|
|
90
|
+
}
|
|
91
|
+
/** @internal */
|
|
92
|
+
_Context() {
|
|
93
|
+
const gl = this.#ctx?.gl ?? GL2(this.#canvas);
|
|
94
|
+
if (!gl)
|
|
95
|
+
return;
|
|
96
|
+
const shader = Shader(gl, spriteVertGLSL, spriteFragGLSL, [
|
|
97
|
+
gl.createTexture(),
|
|
98
|
+
gl.createTexture()
|
|
99
|
+
]);
|
|
100
|
+
// allow translucent textures to be layered.
|
|
101
|
+
gl.enable(gl.BLEND);
|
|
102
|
+
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
103
|
+
this.setDepth(this.#depth);
|
|
104
|
+
// enable z-buffer for [0, 1] ([foreground, background]).
|
|
105
|
+
gl.depthRange(0, 1);
|
|
106
|
+
gl.clearDepth(1);
|
|
107
|
+
gl.depthFunc(gl.LESS);
|
|
108
|
+
// disable image colorspace conversions. the default is browser dependent.
|
|
109
|
+
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false);
|
|
110
|
+
gl.bindVertexArray(shader.vao);
|
|
111
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
|
|
112
|
+
gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW);
|
|
113
|
+
gl.enableVertexAttribArray(0);
|
|
114
|
+
gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0);
|
|
115
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
116
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, shader.buffer);
|
|
117
|
+
gl.enableVertexAttribArray(1);
|
|
118
|
+
gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, drawableBytes, 0);
|
|
119
|
+
gl.vertexAttribDivisor(1, 1);
|
|
120
|
+
gl.enableVertexAttribArray(2);
|
|
121
|
+
gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, drawableBytes, 4);
|
|
122
|
+
gl.vertexAttribDivisor(2, 1);
|
|
123
|
+
gl.enableVertexAttribArray(3);
|
|
124
|
+
gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, drawableBytes, 8);
|
|
125
|
+
gl.vertexAttribDivisor(3, 1);
|
|
126
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
127
|
+
gl.bindTexture(gl.TEXTURE_2D, shader.textures[0]);
|
|
128
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
129
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
130
|
+
if (this.#preloadAtlasImage)
|
|
131
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.#preloadAtlasImage);
|
|
132
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
133
|
+
gl.bindTexture(gl.TEXTURE_2D, shader.textures[1]);
|
|
134
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
135
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
136
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16UI, // source XYWH cannot be > 65535.
|
|
137
|
+
1, this.#preloadAtlas.celXYWH.length / 4, // 4 u16s per row
|
|
138
|
+
0, gl.RGBA_INTEGER, gl.UNSIGNED_SHORT, new Uint16Array(this.#preloadAtlas.celXYWH));
|
|
139
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
140
|
+
gl.bindVertexArray(null);
|
|
141
|
+
gl.uniform1i(shader.uniform.uTex, 0);
|
|
142
|
+
gl.uniform1i(shader.uniform.uCels, 1);
|
|
143
|
+
if (this.#preloadAtlasImage)
|
|
144
|
+
gl.uniform2ui(shader.uniform.uTexWH, this.#preloadAtlasImage.naturalWidth, this.#preloadAtlasImage.naturalHeight);
|
|
145
|
+
if (!this.invalid && debug?.invalid)
|
|
146
|
+
console.debug('renderer invalid');
|
|
147
|
+
this.invalid = true;
|
|
148
|
+
// keep outside of #context so it can be restored.
|
|
149
|
+
this.loseContext = gl.getExtension('WEBGL_lose_context') ?? undefined;
|
|
150
|
+
return (this.#ctx = { gl, spriteShader: shader, viewport: { w: 0, h: 0 } });
|
|
151
|
+
}
|
|
152
|
+
#onContextLost = (ev) => {
|
|
153
|
+
ev.preventDefault(); // required.
|
|
154
|
+
console.debug('[render] WebGL context lost');
|
|
155
|
+
this.#ctx = undefined;
|
|
156
|
+
};
|
|
157
|
+
#onContextRestored = () => {
|
|
158
|
+
console.debug('[render] WebGL context restored');
|
|
159
|
+
this.#ctx = this._Context();
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function GL2(canvas) {
|
|
163
|
+
const gl = canvas.getContext('webgl2', {
|
|
164
|
+
// to-do: expose.
|
|
165
|
+
antialias: false,
|
|
166
|
+
powerPreference: 'low-power',
|
|
167
|
+
// avoid flicker caused by clearing the drawing buffer. see
|
|
168
|
+
// https://developer.chrome.com/blog/desynchronized/.
|
|
169
|
+
preserveDrawingBuffer: true,
|
|
170
|
+
...(!debug?.render && { desynchronized: true })
|
|
171
|
+
});
|
|
172
|
+
if (!gl) {
|
|
173
|
+
console.debug('[render] no GL context');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (debug?.render && !gl.getContextAttributes()?.desynchronized)
|
|
177
|
+
console.debug('[render] no WebGL DOM desynchronization');
|
|
178
|
+
return gl;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/graphics/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const spriteFragGLSL: string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const spriteFragGLSL = `#version 300 es
|
|
2
|
+
#pragma debug(${debug?.render ? 'on' : 'off'})
|
|
3
|
+
#pragma optimize(${debug?.render ? 'off' : 'on'})
|
|
4
|
+
|
|
5
|
+
precision highp int;
|
|
6
|
+
precision highp float;
|
|
7
|
+
precision highp usampler2D;
|
|
8
|
+
|
|
9
|
+
uniform sampler2D uTex;
|
|
10
|
+
uniform uvec2 uTexWH;
|
|
11
|
+
|
|
12
|
+
flat in uint vStretch;
|
|
13
|
+
flat in ivec4 vTexXYWH;
|
|
14
|
+
flat in int vZ;
|
|
15
|
+
in vec2 vDstWH;
|
|
16
|
+
flat in ivec2 vDstWHFixed;
|
|
17
|
+
|
|
18
|
+
out vec4 oRGBA;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
if (vZ == ${Layer.Hidden} || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)
|
|
22
|
+
discard;
|
|
23
|
+
|
|
24
|
+
vec2 px = vec2(vTexXYWH.xy) + (
|
|
25
|
+
vStretch == 1u ? (vDstWH * vec2(vTexXYWH.zw) / vec2(vDstWHFixed))
|
|
26
|
+
: mod(vDstWH, vec2(vTexXYWH.zw))
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
oRGBA = texture(uTex, px / vec2(uTexWH));
|
|
30
|
+
if(oRGBA.a < .001) discard;
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
import { debug } from "../utils/debug.js";
|
|
34
|
+
import { Layer } from "./layer.js";
|
|
35
|
+
//# sourceMappingURL=sprite-frag.glsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprite-frag.glsl.js","sourceRoot":"","sources":["../../../src/graphics/sprite-frag.glsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAW;gBACtB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;mBACzB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;cAkBjC,KAAK,CAAC,MAAM;;;;;;;;;;;CAWzB,CAAA;AAED,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const spriteVertGLSL: string;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export const spriteVertGLSL = `#version 300 es
|
|
2
|
+
#pragma debug(${debug?.render ? 'on' : 'off'})
|
|
3
|
+
#pragma optimize(${debug?.render ? 'off' : 'on'})
|
|
4
|
+
|
|
5
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2
|
|
6
|
+
precision highp int;
|
|
7
|
+
precision highp float;
|
|
8
|
+
precision highp usampler2D;
|
|
9
|
+
|
|
10
|
+
uniform ivec4 uCam;
|
|
11
|
+
uniform usampler2D uCels;
|
|
12
|
+
uniform float uAge;
|
|
13
|
+
|
|
14
|
+
layout (location=0) in ivec2 iUV;
|
|
15
|
+
layout (location=1) in uint iy8_x24;
|
|
16
|
+
layout (location=2) in uint iw8_sxyz_llll_y16;
|
|
17
|
+
layout (location=3) in uint ii11_c5_h12_w4;
|
|
18
|
+
|
|
19
|
+
const int maxY = 0x20000;
|
|
20
|
+
const int layers = 16;
|
|
21
|
+
const int maxDepth = maxY * layers;
|
|
22
|
+
|
|
23
|
+
flat out uint vStretch;
|
|
24
|
+
flat out ivec4 vTexXYWH;
|
|
25
|
+
flat out int vZ;
|
|
26
|
+
out vec2 vDstWH;
|
|
27
|
+
flat out ivec2 vDstWHFixed;
|
|
28
|
+
|
|
29
|
+
void main() {
|
|
30
|
+
int x = (int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64;
|
|
31
|
+
int y = (int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64;
|
|
32
|
+
int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);
|
|
33
|
+
bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);
|
|
34
|
+
bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);
|
|
35
|
+
bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);
|
|
36
|
+
bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);
|
|
37
|
+
int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.
|
|
38
|
+
int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.
|
|
39
|
+
int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));
|
|
40
|
+
int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);
|
|
41
|
+
|
|
42
|
+
// https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel
|
|
43
|
+
float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);
|
|
44
|
+
|
|
45
|
+
ivec2 targetWH = iUV * ivec2(w, h);
|
|
46
|
+
|
|
47
|
+
vec2 end = vec2(x + targetWH.x, y + targetWH.y);
|
|
48
|
+
// UI layers are always given in screen coordinates.
|
|
49
|
+
// to-do: how to handle non-int mode?
|
|
50
|
+
vec2 camXY = z < ${Layer.A} ? vec2(0, 0) : vec2(uCam.xy);
|
|
51
|
+
vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);
|
|
52
|
+
gl_Position = vec4(clip, depth, 1);
|
|
53
|
+
|
|
54
|
+
int frame = (((int(uAge / ${celMillis}) & 0x1f) - cel) + ${animCels}) & 0xf;
|
|
55
|
+
uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);
|
|
56
|
+
vTexXYWH = ivec4(texXYWH);
|
|
57
|
+
vZ = z;
|
|
58
|
+
|
|
59
|
+
vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));
|
|
60
|
+
vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);
|
|
61
|
+
|
|
62
|
+
vStretch = stretch ? 1u : 0u;
|
|
63
|
+
}
|
|
64
|
+
`;
|
|
65
|
+
import { debug } from "../utils/debug.js";
|
|
66
|
+
import { animCels, celMillis } from "./atlas.js";
|
|
67
|
+
import { Layer } from "./layer.js";
|
|
68
|
+
//# sourceMappingURL=sprite-vert.glsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprite-vert.glsl.js","sourceRoot":"","sources":["../../../src/graphics/sprite-vert.glsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAW;gBACtB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;mBACzB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA+C1B,KAAK,CAAC,CAAC;;;;8BAIE,SAAS,sBAAsB,QAAQ;;;;;;;;;;CAUpE,CAAA;AAED,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type Anim, type Atlas, type TagFormat } from '../graphics/atlas.ts';
|
|
2
|
+
import type { Block } from '../mem/pool.ts';
|
|
3
|
+
import { type Box, type WH, type XY } from '../types/geo.ts';
|
|
4
|
+
import type { Millis } from '../types/time.ts';
|
|
5
|
+
import type { Layer } from './layer.ts';
|
|
6
|
+
export declare const drawableBytes: number;
|
|
7
|
+
/** granularity (0.015625) of `Drawable` coords. */
|
|
8
|
+
export declare const drawableEpsilon: number;
|
|
9
|
+
export declare const drawableMaxWH: WH;
|
|
10
|
+
/**
|
|
11
|
+
* everything not requiring an atlas. the box is the drawn region. assume little
|
|
12
|
+
* endian.
|
|
13
|
+
*
|
|
14
|
+
* 0 xxxx xxxx x [-131072, 131071.984375] (1/64th fixed-point). 1b sign, 17b
|
|
15
|
+
* 1 xxxx xxxx int, 6b fraction.
|
|
16
|
+
* 2 xxxx xxxx
|
|
17
|
+
* 3 yyyy yyyy y.
|
|
18
|
+
* 4 yyyy yyyy
|
|
19
|
+
* 5 yyyy yyyy
|
|
20
|
+
* 6 sxyz llll stretch, flip x, flip y, zend, z layer (4b).
|
|
21
|
+
* 7 wwww wwww width [0, 4095]. zero means discard.
|
|
22
|
+
* 8 hhhh wwww height. zero means discard.
|
|
23
|
+
* 9 hhhh hhhh
|
|
24
|
+
* a iiic cccc animation ID [0, 2047], animation cel [0, 31].
|
|
25
|
+
* b iiii iiii
|
|
26
|
+
*
|
|
27
|
+
* animations default to looping without CPU interaction.
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export declare abstract class Drawable implements Block, Box {
|
|
31
|
+
#private;
|
|
32
|
+
i: number;
|
|
33
|
+
constructor(pool: {
|
|
34
|
+
readonly view: DataView<ArrayBuffer>;
|
|
35
|
+
}, i: number);
|
|
36
|
+
above(draw: Readonly<Drawable>): boolean;
|
|
37
|
+
get cel(): number;
|
|
38
|
+
/**
|
|
39
|
+
* [0, 31]. rendered cel offset. call reset() to play animation from start.
|
|
40
|
+
*/
|
|
41
|
+
set cel(cel: number);
|
|
42
|
+
/** test if render area overlaps box or sprite render area. */
|
|
43
|
+
clips(box: Readonly<XY & Partial<WH>>): boolean;
|
|
44
|
+
get flipX(): boolean;
|
|
45
|
+
set flipX(flip: boolean);
|
|
46
|
+
get flipY(): boolean;
|
|
47
|
+
set flipY(flip: boolean);
|
|
48
|
+
get h(): number;
|
|
49
|
+
/** [0, 4095]. */
|
|
50
|
+
set h(h: number);
|
|
51
|
+
get id(): number;
|
|
52
|
+
/** [0, 2047]. */
|
|
53
|
+
set id(id: number);
|
|
54
|
+
get stretch(): boolean;
|
|
55
|
+
/** wrap texture (default) or stretch to width and height. */
|
|
56
|
+
set stretch(stretch: boolean);
|
|
57
|
+
get w(): number;
|
|
58
|
+
/** [0, 4095]. */
|
|
59
|
+
set w(w: number);
|
|
60
|
+
get x(): number;
|
|
61
|
+
/** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */
|
|
62
|
+
set x(x: number);
|
|
63
|
+
get xy(): XY;
|
|
64
|
+
set xy(xy: Readonly<XY>);
|
|
65
|
+
get y(): number;
|
|
66
|
+
/** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */
|
|
67
|
+
set y(y: number);
|
|
68
|
+
get z(): Layer;
|
|
69
|
+
/** layer [0 (closest), 14 (furthest)]; 15 is hidden. */
|
|
70
|
+
set z(z: Layer);
|
|
71
|
+
get zend(): boolean;
|
|
72
|
+
/** z-order by top (default) or bottom of box. */
|
|
73
|
+
set zend(end: boolean);
|
|
74
|
+
}
|
|
75
|
+
export declare class Sprite<out Tag extends TagFormat> extends Drawable {
|
|
76
|
+
#private;
|
|
77
|
+
constructor(pool: {
|
|
78
|
+
readonly view: DataView<ArrayBuffer>;
|
|
79
|
+
}, i: number, atlas: Readonly<Atlas>, looper: {
|
|
80
|
+
readonly age: Millis;
|
|
81
|
+
});
|
|
82
|
+
get anim(): Anim;
|
|
83
|
+
get flipX(): boolean;
|
|
84
|
+
set flipX(flip: boolean);
|
|
85
|
+
get flipY(): boolean;
|
|
86
|
+
set flipY(flip: boolean);
|
|
87
|
+
get h(): number;
|
|
88
|
+
set h(h: number);
|
|
89
|
+
get hitbox(): Box | undefined;
|
|
90
|
+
hits(box: Readonly<XY | Box>): boolean;
|
|
91
|
+
get hurtbox(): Box | undefined;
|
|
92
|
+
get id(): number;
|
|
93
|
+
set id(id: number);
|
|
94
|
+
/** true if animation has played once. */
|
|
95
|
+
get looped(): boolean;
|
|
96
|
+
/** sets cel to animation start. */
|
|
97
|
+
reset(): void;
|
|
98
|
+
get tag(): Tag;
|
|
99
|
+
/** sets animation, resets cel, dimensions, hitbox, and hurtbox. */
|
|
100
|
+
set tag(tag: Tag);
|
|
101
|
+
toString(): string;
|
|
102
|
+
get w(): number;
|
|
103
|
+
set w(w: number);
|
|
104
|
+
get x(): number;
|
|
105
|
+
set x(x: number);
|
|
106
|
+
get y(): number;
|
|
107
|
+
set y(y: number);
|
|
108
|
+
}
|