@oidoid/void 0.1.0-1
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/bin/ase +14 -0
- package/dist/atlas/aseprite.d.ts +37 -0
- package/dist/atlas/aseprite.js +2 -0
- package/dist/atlas/aseprite.js.map +1 -0
- package/dist/atlas/atlas.d.ts +20 -0
- package/dist/atlas/atlas.js +68 -0
- package/dist/atlas/atlas.js.map +1 -0
- package/dist/audio/synth.d.ts +4 -0
- package/dist/audio/synth.js +21 -0
- package/dist/audio/synth.js.map +1 -0
- package/dist/graphics/bitmap.d.ts +14 -0
- package/dist/graphics/bitmap.js +14 -0
- package/dist/graphics/bitmap.js.map +1 -0
- package/dist/graphics/cam.d.ts +16 -0
- package/dist/graphics/cam.js +42 -0
- package/dist/graphics/cam.js.map +1 -0
- package/dist/graphics/frag.glsl.d.ts +1 -0
- package/dist/graphics/frag.glsl.js +15 -0
- package/dist/graphics/frag.glsl.js.map +1 -0
- package/dist/graphics/frame-listener.d.ts +16 -0
- package/dist/graphics/frame-listener.js +83 -0
- package/dist/graphics/frame-listener.js.map +1 -0
- package/dist/graphics/renderer.d.ts +12 -0
- package/dist/graphics/renderer.js +184 -0
- package/dist/graphics/renderer.js.map +1 -0
- package/dist/graphics/vert.glsl.d.ts +1 -0
- package/dist/graphics/vert.glsl.js +46 -0
- package/dist/graphics/vert.glsl.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/input/gamepad-poller.d.ts +8 -0
- package/dist/input/gamepad-poller.js +38 -0
- package/dist/input/gamepad-poller.js.map +1 -0
- package/dist/input/input.d.ts +44 -0
- package/dist/input/input.js +175 -0
- package/dist/input/input.js.map +1 -0
- package/dist/input/keyboard-poller.d.ts +7 -0
- package/dist/input/keyboard-poller.js +30 -0
- package/dist/input/keyboard-poller.js.map +1 -0
- package/dist/input/pointer-poller.d.ts +12 -0
- package/dist/input/pointer-poller.js +67 -0
- package/dist/input/pointer-poller.js.map +1 -0
- package/dist/sprite/sprite.d.ts +51 -0
- package/dist/sprite/sprite.js +161 -0
- package/dist/sprite/sprite.js.map +1 -0
- package/dist/storage/json-storage.d.ts +4 -0
- package/dist/storage/json-storage.js +13 -0
- package/dist/storage/json-storage.js.map +1 -0
- package/dist/test/tsconfig.json +13 -0
- package/dist/text/font.d.ts +6 -0
- package/dist/text/font.js +18 -0
- package/dist/text/font.js.map +1 -0
- package/dist/text/text-layout.d.ts +11 -0
- package/dist/text/text-layout.js +73 -0
- package/dist/text/text-layout.js.map +1 -0
- package/dist/tsconfig.json +12 -0
- package/dist/types/2d.d.ts +9 -0
- package/dist/types/2d.js +2 -0
- package/dist/types/2d.js.map +1 -0
- package/dist/void.js +60 -0
- package/dist/void.js.map +7 -0
- package/dist/void.meta.json +294 -0
- package/license.text +661 -0
- package/package.json +73 -0
- package/readme.md +33 -0
package/dist/void.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/audio/synth.ts", "../src/graphics/bitmap.ts", "../src/graphics/cam.ts", "../src/input/gamepad-poller.ts", "../src/input/keyboard-poller.ts", "../src/input/pointer-poller.ts", "../src/input/input.ts", "../src/graphics/frag.glsl.ts", "../src/graphics/vert.glsl.ts", "../src/graphics/renderer.ts", "../src/graphics/frame-listener.ts", "../src/sprite/sprite.ts", "../src/storage/json-storage.ts", "../src/text/font.ts", "../src/text/text-layout.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["export class Synth {\n #context?: AudioContext\n\n beep(\n type: OscillatorType,\n startHz: number,\n endHz: number,\n duration: number // why can't this be short?\n ): void {\n this.#context ??= new AudioContext()\n const now = this.#context.currentTime\n const end = now + duration\n\n const oscillator = this.#context.createOscillator()\n oscillator.type = type\n oscillator.frequency.setValueAtTime(startHz, now)\n oscillator.frequency.exponentialRampToValueAtTime(endHz, end)\n\n const gain = this.#context.createGain()\n gain.gain.setValueAtTime(1, now)\n gain.gain.exponentialRampToValueAtTime(0.01, end)\n\n oscillator.connect(gain)\n gain.connect(this.#context.destination)\n\n oscillator.start()\n oscillator.stop(end)\n }\n}\n", "export type Bitmap = {\n /** 8x: i16, 8y: i16 */\n readonly _xy: number\n /** w: u12, h: u12 */\n readonly _wh: number\n /** id+cel: u15, flipX: b1, flipY: b1, zend: b1, z: u3 */\n readonly _iffzz: number\n}\n\nexport class BitmapBuffer {\n readonly buffer: Uint32Array\n size = 0\n\n constructor(capacity: number) {\n this.buffer = new Uint32Array(capacity * 3)\n }\n\n push(bmp: Readonly<Bitmap>): void {\n this.buffer[this.size * 3] = bmp._xy\n this.buffer[this.size * 3 + 1] = bmp._wh\n this.buffer[this.size * 3 + 2] = bmp._iffzz\n this.size++\n }\n}\n", "import type {Box, WH, XY} from '../types/2d.js'\n\nexport class Cam implements Box {\n minWH: WH = {w: 256, h: 256}\n minScale: number = 1\n x: number = 0 //xy?\n y: number = 0\n lvl: Box = {x: -4096, y: -4096, w: 8191, h: 8191}\n\n readonly #clientWH: WH = {w: 1, h: 1}\n #scale = 1\n #w = this.minWH.w\n #h = this.minWH.h\n\n get h(): number {\n return this.#h\n }\n\n /** Fill or just barely not fill the viewport in scaled pixels. */\n resize(zoomOut?: number): void {\n // WH of body in CSS px; document.body.getBoundingClientRect() returns\n // incorrectly large sizing on mobile that includes the address bar\n this.#clientWH.w = innerWidth\n this.#clientWH.h = innerHeight\n\n const nativeW = Math.round(this.#clientWH.w * devicePixelRatio) // physical\n const nativeH = Math.round(this.#clientWH.h * devicePixelRatio)\n\n this.#scale = Math.max(\n this.minScale,\n Math.floor(Math.min(nativeW / this.minWH.w, nativeH / this.minWH.h)) -\n (zoomOut ?? 0) // Default is to zoom in as much as possible.\n )\n this.#w = Math.floor(nativeW / this.#scale)\n this.#h = Math.floor(nativeH / this.#scale)\n }\n\n get scale(): number {\n return this.#scale\n }\n\n /** Returns the integral position in level coordinates. */\n toLevelXY(clientXY: Readonly<XY>): XY {\n return {\n x: Math.round(this.x + (clientXY.x / this.#clientWH.w) * this.#w),\n y: Math.round(this.y + (clientXY.y / this.#clientWH.h) * this.#h)\n }\n }\n\n get w(): number {\n return this.#w\n }\n}\n", "export class GamepadPoller {\n #bits = 0\n readonly #bitByAxis: {[axis: number]: [less: number, more: number]} = {}\n readonly #bitByButton: {[btn: number]: number} = {}\n\n get bits(): number {\n return this.#bits\n }\n\n mapAxis(axis: number, lessBit: number, moreBit: number): void {\n this.#bitByAxis[axis] = [lessBit, moreBit]\n }\n\n mapButton(button: number, bit: number): void {\n this.#bitByButton[button] = bit\n }\n\n poll(): void {\n if (!isSecureContext) return\n this.#bits = 0\n for (const pad of navigator.getGamepads()) {\n for (const [index, axis] of pad?.axes.entries() ?? []) {\n const bits = this.#bitByAxis[index]\n if (bits == null) continue\n const bit = axis < 0 ? bits[0] : axis === 0 ? 0 : bits[1]\n this.#bits |= Math.abs(axis) >= 0.5 ? bit : 0\n }\n for (const [index, button] of pad?.buttons.entries() ?? []) {\n const bit = this.#bitByButton[index]\n if (bit == null) continue\n this.#bits |= button.pressed ? bit : 0\n }\n }\n }\n\n reset(): void {\n this.#bits = 0\n }\n}\n", "export class KeyboardPoller {\n #bits = 0\n readonly #bitByKey: {[key: string]: number} = {}\n\n get bits(): number {\n return this.#bits\n }\n\n map(key: string, bit: number): void {\n this.#bitByKey[key] = bit\n }\n\n register(op: 'add' | 'remove'): void {\n const fn = <const>`${op}EventListener`\n // keyup is not received if window loses focus.\n globalThis[fn]('blur', this.reset, {capture: true, passive: true})\n for (const type of ['keydown', 'keyup']) {\n const callback = <EventListenerOrEventListenerObject>this.#onKey\n globalThis[fn](type, callback, {capture: true, passive: true})\n }\n }\n\n reset = (): void => {\n this.#bits = 0\n }\n\n #onKey = (ev: KeyboardEvent): void => {\n const on = ev.type === 'keydown'\n const bit = this.#bitByKey[ev.key]\n if (bit == null) return\n this.#bits = on ? this.#bits | bit : this.#bits & ~bit\n }\n}\n", "import {Cam} from '../graphics/cam.js'\nimport type {XY} from '../types/2d.js'\n\nexport class PointerPoller {\n readonly #bitByButton: {[btn: number]: number} = {}\n #bits: number = 0\n readonly #cam: Readonly<Cam>\n readonly #canvas: HTMLCanvasElement\n readonly #clientXY: XY = {x: 0, y: 0}\n #type?: 'mouse' | 'touch' | 'pen' | undefined\n #xy?: Readonly<XY> | undefined\n\n constructor(cam: Readonly<Cam>, canvas: HTMLCanvasElement) {\n this.#cam = cam\n this.#canvas = canvas\n }\n\n get bits(): number {\n return this.#bits\n }\n\n map(button: number, bit: number): void {\n this.#bitByButton[button] = bit\n }\n\n get type(): 'mouse' | 'touch' | 'pen' | undefined {\n return this.#type\n }\n\n register(op: 'add' | 'remove'): void {\n const fn = <const>`${op}EventListener`\n this.#canvas[fn]('pointercancel', this.reset, {\n capture: true,\n passive: true\n })\n for (const type of ['pointerdown', 'pointermove', 'pointerup']) {\n this.#canvas[fn](\n type,\n <EventListenerOrEventListenerObject>this.#onPointEvent,\n {capture: true, passive: type !== 'pointerdown'}\n )\n }\n this.#canvas[fn]('contextmenu', this.#onContextMenuEvent, {capture: true})\n }\n\n reset = (): void => {\n this.#bits = 0\n this.#type = undefined\n this.#xy = undefined\n }\n\n get xy(): Readonly<XY> | undefined {\n return this.#xy\n }\n\n #onContextMenuEvent = (ev: Event): void => ev.preventDefault()\n\n #onPointEvent = (ev: PointerEvent): void => {\n // Ignore non-primary inputs to avoid flickering between distant points.\n if (!ev.isPrimary) return\n\n if (ev.type === 'pointerdown') this.#canvas.setPointerCapture(ev.pointerId)\n ;({clientX: this.#clientXY.x, clientY: this.#clientXY.y} = ev)\n\n this.#bits = this.#evButtonsToBits(ev.buttons)\n this.#type = (<const>['mouse', 'touch', 'pen']).find(\n type => type === ev.pointerType\n )\n this.#xy = this.#cam.toLevelXY(this.#clientXY)\n\n const passive = ev.type !== 'pointerdown'\n if (!passive) ev.preventDefault()\n }\n\n #evButtonsToBits(buttons: number): number {\n let bits = 0\n for (let button = 1; button <= buttons; button <<= 1) {\n if ((button & buttons) !== button) continue\n bits |= this.#bitByButton[button] ?? 0\n }\n return bits\n }\n}\n", "import {Cam} from '../graphics/cam.js'\nimport type {XY} from '../types/2d.js'\nimport {GamepadPoller} from './gamepad-poller.js'\nimport {KeyboardPoller} from './keyboard-poller.js'\nimport {PointerPoller} from './pointer-poller.js'\n\n// prettier-ignore\nexport type StandardButton =\n 'L' | 'R' | 'U' | 'D' | // Dpad.\n 'C' | 'B' | 'A' | // Primary, secondary, tertiary.\n 'S' // Start.\n\nexport class Input<Button extends string = StandardButton> {\n handled = false\n /** The maximum duration in milliseconds permitted between combo inputs. */\n maxInterval = 300\n /** The minimum duration in milliseconds for an input to be considered held. */\n minHeld = 300\n\n /** The time in milliseconds since the input changed. */\n #duration = 0\n /** Prior button state, possibly 0, but not necessarily a combo member. */\n #prevBits = 0\n /**\n * A sequence of nonzero buttons ordered from oldest (first) to latest (last).\n * Combos are terminated only by expiration.\n */\n readonly #combo: number[] = []\n /** Logical button to bit. */\n readonly #bitByButton = <{[btn in Button]: number}>{}\n readonly #gamepad = new GamepadPoller()\n readonly #keyboard = new KeyboardPoller()\n readonly #pointer: PointerPoller\n #pollBits = 0\n #pollTick = 0\n\n constructor(cam: Readonly<Cam>, canvas: HTMLCanvasElement) {\n this.#pointer = new PointerPoller(cam, canvas)\n }\n\n /**\n * Combos are interpreted exactly both in buttons pressed per tick (eg, up\n * will not match up and down the way `isOn('Up')` will) and sequence (order\n * and length). Combos only test button on state.\n */\n isCombo(...combo: readonly (readonly Button[])[]): boolean {\n if (combo.length !== this.#combo.length) return false\n for (const [i, buttons] of combo.entries()) {\n const bits = this.#buttonsToBits(buttons)\n if (this.#combo[i] !== bits) return false\n }\n // #combo is a historical record of buttons. Whenever buttons changes, a new\n // entry is pushed. Make sure the current entry is the current state and\n // that the last entry's buttons haven't been released.\n return this.#combo[combo.length - 1] === this.#bits\n }\n\n /** Like isOnCombo() but test if the last button set is triggered. */\n isComboStart(...combo: readonly (readonly Button[])[]): boolean {\n return (\n this.isCombo(...combo) &&\n !!combo.at(-1)?.every(button => this.isOnStart(button))\n )\n }\n\n /** True if held on or off. */\n isHeld(): boolean {\n return this.#duration >= this.minHeld\n }\n\n isOffStart(...buttons: readonly Button[]): boolean {\n return !this.isOn(...buttons) && this.isStart(...buttons)\n }\n\n /**\n * Test if all buttons are on. True if the buttons are pressed regardless of\n * whether other buttons are pressed. Eg, `isOn('Up')` will return true when\n * up is pressed or when up and down are pressed.\n */\n isOn(...buttons: readonly Button[]): boolean {\n const bits = this.#buttonsToBits(buttons)\n return (this.#bits & bits) === bits\n }\n\n isOnStart(...buttons: readonly Button[]): boolean {\n return this.isOn(...buttons) && this.isStart(...buttons)\n }\n\n /** True if triggered on or off. */\n isStart(...buttons: readonly Button[]): boolean {\n const bits = this.#buttonsToBits(buttons)\n return (this.#bits & bits) !== (this.#prevBits & bits)\n }\n\n mapAxis(less: Button, more: Button, ...axes: readonly number[]): void {\n for (const axis of axes) {\n this.#gamepad.mapAxis(axis, this.#map(less), this.#map(more))\n }\n }\n\n mapButton(button: Button, ...indices: readonly number[]): void {\n for (const index of indices) {\n this.#gamepad.mapButton(index, this.#map(button))\n }\n }\n\n mapClick(button: Button, ...clicks: readonly number[]): void {\n for (const click of clicks) this.#pointer.map(click, this.#map(button))\n }\n\n mapStandard(): void {\n this.mapKey(<Button>'L', 'ArrowLeft', 'a')\n this.mapKey(<Button>'R', 'ArrowRight', 'd')\n this.mapKey(<Button>'U', 'ArrowUp', 'w')\n this.mapKey(<Button>'D', 'ArrowDown', 's')\n this.mapKey(<Button>'C', 'z')\n this.mapKey(<Button>'B', 'x')\n this.mapKey(<Button>'A', 'c')\n this.mapKey(<Button>'S', 'Enter', 'Escape')\n\n // https://w3c.github.io/gamepad/#remapping\n this.mapAxis(<Button>'L', <Button>'R', 0, 2)\n this.mapAxis(<Button>'U', <Button>'D', 1, 3)\n this.mapButton(<Button>'L', 14)\n this.mapButton(<Button>'R', 15)\n this.mapButton(<Button>'U', 12)\n this.mapButton(<Button>'D', 13)\n this.mapButton(<Button>'A', 0)\n this.mapButton(<Button>'S', 9)\n\n this.mapClick(<Button>'A', 1)\n }\n\n mapKey(button: Button, ...keys: readonly string[]): void {\n for (const key of keys) this.#keyboard.map(key, this.#map(button))\n }\n\n get point(): Readonly<XY> | undefined {\n return this.#pointer.xy\n }\n\n get pointType(): 'mouse' | 'touch' | 'pen' | undefined {\n return this.#pointer.type\n }\n\n poll(tick: number): void {\n this.handled = false\n this.#duration += this.#pollTick\n this.#prevBits = this.#pollBits\n\n this.#gamepad.poll()\n if (\n this.#duration > this.maxInterval &&\n (this.#bits === 0 || this.#bits !== this.#prevBits)\n ) {\n // Expired.\n this.#duration = 0\n this.#combo.length = 0\n } else if (this.#bits !== this.#prevBits) {\n // Some button state has changed and at least one button is still pressed.\n this.#duration = 0\n if (this.#bits !== 0) this.#combo.push(this.#bits)\n } else if (this.#bits !== 0 && this.#bits === this.#prevBits) {\n // Held. Update combo with the latest buttons.\n this.#combo.pop()\n this.#combo.push(this.#bits)\n }\n\n this.#pollTick = tick\n this.#pollBits = this.#bits\n }\n\n register(op: 'add' | 'remove'): void {\n this.#keyboard.register(op)\n this.#pointer.register(op)\n }\n\n reset(): void {\n this.handled = false\n this.#gamepad.reset()\n this.#keyboard.reset()\n this.#pointer.reset()\n }\n\n /**\n * The current state and prospective combo member. A zero value can never be a\n * combo member but is necessary to persist in previous to distinguish the off\n * state between repeated button presses like up, up.\n */\n get #bits(): number {\n return this.#gamepad.bits | this.#keyboard.bits | this.#pointer.bits\n }\n\n #buttonsToBits(buttons: readonly Button[]): number {\n let bits = 0\n for (const button of buttons) bits |= this.#bitByButton[button] ?? 0\n return bits\n }\n\n #map(button: Button): number {\n return (this.#bitByButton[button] ??=\n 1 << Object.keys(this.#bitByButton).length)\n }\n}\n", "export 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}`\n", "export const vertGLSL = `#version 300 es\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2\nuniform lowp usampler2D uCels;\nuniform mediump ivec4 uCam;\nuniform highp uint uFrame;\n\nlayout (location=0) in lowp ivec2 iUV;\nlayout (location=1) in highp uint iXY;\nlayout (location=2) in highp uint iWH;\nlayout (location=3) in highp uint iIFFZZ;\n\nflat out highp ivec4 vTexXYWH;\nout highp vec2 vDstWH;\n\nconst mediump int maxY = 0x1000;\nconst lowp int maxZ = 8;\nconst mediump int maxDepth = maxY * maxZ;\n\nvoid main() {\n mediump int x = int(iXY) >> 19;\n mediump int y = int(iXY << 16) >> 19;\n lowp int z = int(iIFFZZ & 0x7u);\n bool zend = bool(iIFFZZ & 0x8u);\n bool flipX = bool(iIFFZZ & 0x20u);\n bool flipY = bool(iIFFZZ & 0x10u);\n mediump int id = int((iIFFZZ >> 6) & 0x7ff0u);\n lowp int cel = int((iIFFZZ >> 6) & 0xfu);\n mediump int w = int((iWH >> 12) & 0xfffu);\n mediump int h = int(iWH & 0xfffu);\n\n lowp int frame = ((int(uFrame) - cel) / 4) & 0xf;\n mediump uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);\n\n // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel\n highp float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);\n\n highp ivec2 targetWH = ivec2(iUV) * ivec2(w, h);\n highp ivec2 origWH = ivec2(iUV) * ivec2(texXYWH.zw);\n\n highp vec2 end = vec2(x + targetWH.x, y + targetWH.y);\n highp vec2 clip = ((-2. * vec2(uCam.xy) + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);\n gl_Position = vec4(clip, depth, 1);\n vTexXYWH = ivec4(texXYWH);\n vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));\n}`\n", "import {maxAnimCels, type Anim, type Atlas} from '../atlas/atlas.js'\nimport {BitmapBuffer} from './bitmap.js'\nimport {Cam} from './cam.js'\nimport {fragGLSL} from './frag.glsl.js'\nimport {vertGLSL} from './vert.glsl.js'\n\ntype GLUniforms = {readonly [name: string]: WebGLUniformLocation | null}\ntype GL = WebGL2RenderingContext\ntype GLProgram = WebGLProgram | null\n\nconst uv: Readonly<Int8Array> = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0])\n\nexport class Renderer {\n #bmpBuffer: Readonly<WebGLBuffer> | null = null\n readonly #canvas: HTMLCanvasElement\n readonly #cels: Readonly<Uint16Array>\n #gl!: GL\n #loseContext: Readonly<WEBGL_lose_context | null> = null\n readonly #spritesheet: HTMLImageElement\n #uniforms: Readonly<GLUniforms> = {}\n #vertArray: WebGLVertexArrayObject | null = null\n\n constructor(\n atlas: Atlas,\n canvas: HTMLCanvasElement,\n spritesheet: HTMLImageElement\n ) {\n this.#canvas = canvas\n this.#spritesheet = spritesheet\n this.#cels = new Uint16Array(newCels(atlas))\n }\n\n clearColor(rgba: number): void {\n this.#gl.clearColor(\n ((rgba >>> 24) & 0xff) / 0xff,\n ((rgba >>> 16) & 0xff) / 0xff,\n ((rgba >>> 8) & 0xff) / 0xff,\n ((rgba >>> 0) & 0xff) / 0xff\n )\n }\n\n initGL(): void {\n const gl = this.#canvas.getContext('webgl2', {\n antialias: false,\n desynchronized: true, // breaks render stats\n powerPreference: 'high-performance'\n })\n if (!gl) throw Error('WebGL v2 unsupported')\n this.#gl = gl\n\n // Allow transparent textures to be layered.\n gl.enable(gl.BLEND)\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\n\n // Enable z-buffer for [0, 1] ([foreground, background]).\n gl.enable(gl.DEPTH_TEST)\n gl.depthRange(0, 1)\n gl.clearDepth(1)\n gl.depthFunc(gl.LESS)\n\n // Disable image colorspace conversions. The default is browser dependent.\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false)\n\n const pgm = loadProgram(gl, vertGLSL, fragGLSL)\n this.#uniforms = getUniformLocations(gl, pgm)\n\n gl.uniform2ui(\n this.#uniforms.uSpritesheetSize!,\n this.#spritesheet.naturalWidth,\n this.#spritesheet.naturalHeight\n )\n\n this.#vertArray = gl.createVertexArray()\n gl.bindVertexArray(this.#vertArray)\n\n const uvBuffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n this.#bmpBuffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, this.#bmpBuffer)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 12, 0)\n gl.vertexAttribDivisor(1, 1)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, 12, 4)\n gl.vertexAttribDivisor(2, 1)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, 12, 8)\n gl.vertexAttribDivisor(3, 1)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindVertexArray(null)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer)\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW)\n gl.bindBuffer(this.#gl.ARRAY_BUFFER, null)\n\n gl.uniform1i(this.#uniforms.uCels!, 0)\n gl.activeTexture(gl.TEXTURE0)\n const dataTex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, dataTex)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA16UI,\n 1,\n this.#cels.length / 4, // 4 u8s per row\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_SHORT,\n this.#cels\n )\n\n gl.uniform1i(this.#uniforms.uSpritesheet!, 1)\n gl.activeTexture(gl.TEXTURE1)\n const spritesheetTex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, spritesheetTex)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.#spritesheet\n )\n\n this.#loseContext = gl.getExtension('WEBGL_lose_context')\n }\n\n get loseContext(): WEBGL_lose_context | null {\n return this.#loseContext\n }\n\n hasContext(): boolean {\n return !this.#gl.isContextLost()\n }\n\n render(\n cam: Readonly<Cam>,\n frame: number,\n bmps: Readonly<BitmapBuffer>\n ): void {\n this.#resize(cam)\n this.#gl.clear(this.#gl.COLOR_BUFFER_BIT | this.#gl.DEPTH_BUFFER_BIT)\n\n this.#gl.uniform4i(this.#uniforms.uCam!, cam.x, cam.y, cam.w, cam.h)\n this.#gl.uniform1ui(this.#uniforms.uFrame!, frame)\n\n this.#gl.bindVertexArray(this.#vertArray)\n\n this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#bmpBuffer)\n this.#gl.bufferData(\n this.#gl.ARRAY_BUFFER,\n bmps.buffer,\n this.#gl.STREAM_DRAW\n )\n this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, null)\n\n this.#gl.drawArraysInstanced(\n this.#gl.TRIANGLE_STRIP,\n 0,\n uv.length / 2, // d\n bmps.size\n )\n\n this.#gl.bindVertexArray(null)\n }\n\n #resize(cam: Readonly<Cam>): void {\n const canvas = this.#canvas\n const nativeWH = {w: cam.w * cam.scale, h: cam.h * cam.scale}\n\n if (canvas.width !== nativeWH.w || canvas.height !== nativeWH.h) {\n canvas.width = nativeWH.w\n canvas.height = nativeWH.h\n this.#gl.viewport(0, 0, nativeWH.w, nativeWH.h)\n }\n\n // These pixels may be greater than, less than, or equal to native.\n const clientW = nativeWH.w / devicePixelRatio\n const clientH = nativeWH.h / devicePixelRatio\n const diffW = Number.parseFloat(canvas.style.width.slice(0, -2)) - clientW\n const diffH = Number.parseFloat(canvas.style.height.slice(0, -2)) - clientH\n if (\n !Number.isFinite(diffW) ||\n Math.abs(diffW) >= 0.5 ||\n !Number.isFinite(diffH) ||\n Math.abs(diffH) >= 0.5\n ) {\n canvas.style.width = `${clientW}px`\n canvas.style.height = `${clientH}px`\n }\n }\n}\n\nfunction compileShader(gl: GL, type: number, src: string): WebGLShader {\n const shader = gl.createShader(type)\n if (!shader) throw Error('shader creation failed')\n gl.shaderSource(shader, src.trim())\n gl.compileShader(shader)\n\n const log = gl.getShaderInfoLog(shader)?.slice(0, -1)\n if (log) console.warn(log)\n\n return shader\n}\n\nfunction getUniformLocations(gl: GL, pgm: GLProgram): GLUniforms {\n if (!pgm) return {}\n const len = gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS)\n const locations: {[name: string]: WebGLUniformLocation | null} = {}\n for (let i = 0; i < len; ++i) {\n const uniform = gl.getActiveUniform(pgm, i)\n if (uniform == null) throw Error(`missing shader uniform at index ${i}`)\n locations[uniform.name] = gl.getUniformLocation(pgm, uniform.name)\n }\n return locations\n}\n\nfunction loadProgram(gl: GL, vertGLSL: string, fragGLSL: string): GLProgram {\n const pgm = gl.createProgram()\n if (!pgm) return null\n\n const vert = compileShader(gl, gl.VERTEX_SHADER, vertGLSL)\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, fragGLSL)\n gl.attachShader(pgm, vert)\n gl.attachShader(pgm, frag)\n gl.linkProgram(pgm)\n gl.useProgram(pgm)\n\n const log = gl.getProgramInfoLog(pgm)?.slice(0, -1)\n if (log) console.warn(log)\n\n gl.detachShader(pgm, frag)\n gl.detachShader(pgm, vert)\n gl.deleteShader(frag)\n gl.deleteShader(vert)\n\n return pgm\n}\n\n/** XYWH ordered by ID and padded to 16-cel blocks. */\nfunction newCels(atlas: Atlas): readonly number[] {\n const cels = []\n for (const anim of Object.values<Anim>(atlas)) {\n // Animations are inserted in ID order.\n for (const cel of anim.cels) cels.push(cel.x, cel.y, anim.w, anim.h)\n for (let i = anim.cels.length; i < maxAnimCels; i++) {\n const cel = anim.cels[i % anim.cels.length]!\n cels.push(cel.x, cel.y, anim.w, anim.h)\n }\n }\n return cels\n}\n", "import {Input} from '../input/input.js'\nimport {BitmapBuffer} from './bitmap.js'\nimport {Cam} from './cam.js'\nimport {Renderer} from './renderer.js'\n\nexport class FrameListener {\n /** The running lifetime in milliseconds. */\n age = 0\n /** The exact duration in milliseconds to apply on a given update step. */\n tick = 0\n\n readonly #canvas: HTMLCanvasElement\n #frame?: number | undefined\n #loop?: (() => void) | undefined\n #time?: number | undefined\n readonly #input: Input\n readonly #renderer: Renderer\n\n constructor(\n canvas: HTMLCanvasElement,\n input: Input<string>,\n renderer: Renderer\n ) {\n this.#canvas = canvas\n this.#input = input\n this.#renderer = renderer\n }\n\n cancel(): void {\n if (this.#frame != null) cancelAnimationFrame(this.#frame)\n this.#frame = undefined\n this.tick = 0\n this.#time = undefined\n this.#input.reset()\n this.#loop = undefined\n }\n\n get frame(): number {\n // Assume 60 FPS so games can scale to this number regardless of actual.\n return Math.trunc(this.age / 16.666666666666668)\n }\n\n register(op: 'add' | 'remove'): void {\n const fn = <const>`${op}EventListener`\n for (const type of ['webglcontextrestored', 'webglcontextlost']) {\n this.#canvas[fn](type, this.#onEvent, true)\n }\n globalThis[fn]('visibilitychange', this.#onEvent, true)\n if (op === 'add') this.#renderer.initGL()\n this.#input.register(op)\n }\n\n render(cam: Readonly<Cam>, buffer: BitmapBuffer, loop?: () => void): void {\n this.#loop = loop\n if (!this.#isVisible() || !this.#renderer.hasContext()) return\n if (this.#loop) this.#frame ??= requestAnimationFrame(this.#onFrame)\n this.#renderer.render(cam, this.frame, buffer)\n }\n\n #isVisible(): boolean {\n return document.visibilityState === 'visible'\n }\n\n #onEvent = (event: Event): void => {\n event.preventDefault()\n if (event.type === 'webglcontextrestored') this.#renderer.initGL()\n\n if (this.#renderer.hasContext() && this.#isVisible()) {\n if (this.#loop) this.#frame ??= requestAnimationFrame(this.#onFrame)\n } else {\n if (this.#frame != null) cancelAnimationFrame(this.#frame)\n this.#frame = undefined\n this.tick = 0\n this.#time = undefined\n this.#input.reset()\n }\n }\n\n #onFrame = (time: number): void => {\n this.#frame = undefined\n this.tick = time - (this.#time ?? time)\n this.#time = time\n this.age += this.tick\n const loop = this.#loop\n this.#loop = undefined\n this.#input.poll(this.tick)\n loop?.()\n }\n}\n", "import type {AnimTag} from '../atlas/aseprite.js'\nimport type {Anim, Atlas} from '../atlas/atlas.js'\nimport type {Bitmap} from '../graphics/bitmap.js'\nimport type {Box, WH, XY} from '../types/2d.js'\n\nexport type SpriteJSON = {\n cel?: number\n flip?: string\n tag: string\n x?: number\n y?: number\n z?: number\n w?: number\n h?: number\n zend?: boolean\n}\n\nexport class Sprite<T extends AnimTag = AnimTag> implements Bitmap, Box {\n static parse<T extends AnimTag = AnimTag>(\n atlas: Atlas<T>,\n json: Readonly<SpriteJSON>\n ): Sprite<T> {\n if (!(json.tag in atlas)) throw Error(`atlas missing tag \"${json.tag}\"`)\n const sprite = new Sprite(atlas, <T>json.tag)\n sprite.cel = json.cel ?? 0\n sprite.flipX = json.flip === 'X' || json.flip === 'XY'\n sprite.flipY = json.flip === 'Y' || json.flip === 'XY'\n sprite.x = json.x ?? 0\n sprite.y = json.y ?? 0\n sprite.z = json.z ?? 0\n sprite.zend = json.zend ?? false\n if (json.w != null) sprite.w = json.w\n if (json.h != null) sprite.h = json.h\n return sprite\n }\n\n readonly hitbox: Box = {x: 0, y: 0, w: 0, h: 0}\n\n _iffzz = 0\n _xy = 0\n _wh = 0\n\n #anim: Anim<T> = <Anim<T>>{}\n #atlas: Atlas<T>\n\n constructor(atlas: Atlas<T>, tag: T) {\n this.#atlas = atlas\n this.tag = tag\n }\n\n above(sprite: Readonly<Sprite>): boolean {\n const compare =\n this.z === sprite.z\n ? (sprite.zend ? sprite.y + sprite.h : sprite.y) -\n (this.zend ? this.y + this.h : this.y)\n : this.z - sprite.z\n return compare < 0\n }\n\n get cel(): number {\n return (this._iffzz >> 6) & 0xf\n }\n\n /** Set to frame number to start at the beginning. */\n set cel(cel: number) {\n this._iffzz = (this._iffzz & 0xfffffc3f) | ((cel & 0xf) << 6)\n }\n\n get flipX(): boolean {\n return !!(this._iffzz & 0x20)\n }\n\n set flipX(flip: boolean) {\n if (this.flipX === flip) return\n if (flip) {\n this._iffzz |= 0x20\n const diff = this.hitbox.x - this.x\n this.hitbox.x = this.x + this.hitbox.w - diff\n } else {\n this._iffzz &= 0xffffffdf\n const diff = this.hitbox.x - this.hitbox.w\n this.hitbox.x = this.x + diff\n }\n }\n\n get flipY(): boolean {\n return !!(this._iffzz & 0x10)\n }\n\n set flipY(flip: boolean) {\n if (this.flipY === flip) return\n if (flip) {\n this._iffzz |= 0x10\n const diff = this.hitbox.y - this.y\n this.hitbox.y = this.y + this.hitbox.h - diff\n } else {\n this._iffzz &= 0xffffffef\n const diff = this.hitbox.y - this.hitbox.h\n this.hitbox.y = this.y + diff\n }\n }\n\n get h(): number {\n return this._wh & 0xfff\n }\n\n set h(h: number) {\n this._wh = (this._wh & 0xfffff000) | (h & 0xfff)\n }\n\n hits(box: Readonly<XY & Partial<WH>>): boolean {\n if (!this.hitbox.w || !this.hitbox.h) return false\n if (box instanceof Sprite) box = box.hitbox\n return (\n this.hitbox.x < box.x + (box.w ?? 0) &&\n this.hitbox.x + this.hitbox.w > box.x &&\n this.hitbox.y < box.y + (box.h ?? 0) &&\n this.hitbox.y + this.hitbox.h > box.y\n )\n }\n\n overlaps(box: Readonly<XY & Partial<WH>>): boolean {\n return (\n this.x < box.x + (box.w ?? 0) &&\n this.x + this.w > box.x &&\n this.y < box.y + (box.h ?? 0) &&\n this.y + this.h > box.y\n )\n }\n\n get tag(): T {\n return this.#anim.tag\n }\n\n set tag(tag: T) {\n if (tag === this.#anim.tag) return\n this.#anim = this.#atlas[tag]\n const {hitbox} = this.#anim\n this.hitbox.x = this.x + (this.flipX ? hitbox.w - hitbox.x : hitbox.x)\n this.hitbox.y = this.y + (this.flipY ? hitbox.h - hitbox.y : hitbox.y)\n this.hitbox.w = this.#anim.hitbox.w\n this.hitbox.h = this.#anim.hitbox.h\n this.w = this.#anim.w\n this.h = this.#anim.h\n this._iffzz = (this._iffzz & 0xfffe0003f) | (this.#anim.id << 6)\n }\n\n toString(): string {\n return `${this.tag} (${this.x}, ${this.y}) ${this.w}\u00D7${this.h}`\n }\n\n get w(): number {\n return (this._wh >> 12) & 0xfff\n }\n\n set w(w: number) {\n this._wh = (this._wh & 0xff000fff) | ((w & 0xfff) << 12)\n }\n\n get x(): number {\n return (this._xy >> 16) / 8\n }\n\n set x(x: number) {\n const diff = x - this.x\n this._xy = (this._xy & 0x0000ffff) | (((8 * x) & 0xffff) << 16)\n this.hitbox.x += diff\n }\n\n set xy(xy: Readonly<XY>) {\n this.x = xy.x\n this.y = xy.y\n }\n\n get y(): number {\n return ((this._xy << 16) >> 16) / 8\n }\n\n set y(y: number) {\n const diff = y - this.y\n this._xy = (this._xy & 0xffff0000) | ((8 * y) & 0xffff)\n this.hitbox.y += diff\n }\n\n get z(): number {\n return this._iffzz & 7\n }\n\n /** Greater is further. */\n set z(z: number) {\n this._iffzz = (this._iffzz & 0xfffffff8) | (z & 0x7)\n }\n\n get zend(): boolean {\n return !!(this._iffzz & 0x8)\n }\n\n set zend(end: boolean) {\n if (end) this._iffzz |= 0x8\n else this._iffzz &= 0xfffffff7\n }\n}\n", "export class JSONStorage {\n get<T>(key: string): T | undefined {\n const val = localStorage.getItem(key)\n return val == null ? undefined : JSON.parse(val)\n }\n\n put<T>(key: string, val: T): void {\n if (val == null) localStorage.removeItem(key)\n else localStorage.setItem(key, JSON.stringify(val))\n }\n}\n", "import type {Font} from 'mem-font'\nimport type {AnimTag} from '../atlas/aseprite.js'\n\nexport function fontCharToTag(self: Font, char: string): AnimTag {\n let pt = char.codePointAt(0)\n if (pt == null || pt > 0xff) pt = 63 // ?\n return `${self.id}--${pt.toString(16).padStart(2, '0')}`\n}\n\n/** @arg rhs Undefined means end of line. */\nexport function fontKerning(\n self: Font,\n lhs: string,\n rhs: string | undefined\n): number {\n if (rhs == null) return self.endOfLineKerning\n if (/^\\s*$/.test(lhs) || /^\\s*$/.test(rhs)) return self.whitespaceKerning\n return self.kerning[lhs + rhs] ?? self.defaultKerning\n}\n\nexport function fontCharWidth(self: Font, letter: string): number {\n return self.charWidth[letter] ?? self.defaultCharWidth\n}\n", "import type {Font} from 'mem-font'\nimport type {Box, XY} from '../types/2d.js'\nimport {fontCharWidth, fontKerning} from './font.js'\n\nexport type TextLayout = {\n /** The length of this array matches the string length. */\n readonly chars: (Readonly<Box> | undefined)[]\n /** The offset in pixels. to-do: should this be passed in? */\n readonly cursor: Readonly<XY>\n}\n\nexport function layoutText(font: Font, str: string, maxW: number): TextLayout {\n const chars = []\n let cursor = {x: 0, y: 0}\n while (chars.length < str.length) {\n const i = chars.length\n const char = str[i]!\n let layout\n if (char === '\\n') layout = layoutNewline(font, cursor)\n else if (/^\\s*$/.test(char)) {\n layout = layoutSpace(font, cursor, maxW, tracking(font, char, str[i + 1]))\n } else {\n layout = layoutWord(font, cursor, maxW, str, i)\n if (cursor.x > 0 && layout.cursor.y === nextLine(font, cursor.y).y) {\n const wordW = maxW - cursor.x + layout.cursor.x\n if (wordW <= maxW) {\n // Word can fit on one line if cursor is reset to the start of line.\n cursor = nextLine(font, cursor.y)\n layout = layoutWord(font, cursor, maxW, str, i)\n }\n }\n }\n chars.push(...layout.chars)\n cursor.x = layout.cursor.x\n cursor.y = layout.cursor.y\n }\n return {chars, cursor}\n}\n\n/** @internal */\nexport function layoutWord(\n font: Font,\n cursor: Readonly<XY>,\n maxW: number,\n word: string,\n index: number\n): TextLayout {\n const chars = []\n let {x, y} = cursor\n for (;;) {\n const char = word[index]\n if (!char || /^\\s*$/.test(char)) break\n\n const span = tracking(font, char, word[index + 1])\n if (x > 0 && x + span > maxW) ({x, y} = nextLine(font, y))\n\n // Width is not span since, with kerning, that may exceed the actual\n // width of the character's sprite. For example, if w has the maximal\n // character width of five pixels and a one pixel kerning for a given pair\n // of characters, it will have a span of six pixels which is greater than\n // the maximal five pixel sprite that can be rendered.\n chars.push({x, y, w: fontCharWidth(font, char), h: font.cellHeight})\n x += span\n\n index++\n }\n return {chars, cursor: {x, y}}\n}\n\nfunction nextLine(font: Font, y: number): XY {\n return {x: 0, y: y + font.lineHeight}\n}\n\nfunction layoutNewline(font: Font, cursor: Readonly<XY>): TextLayout {\n return {chars: [undefined], cursor: nextLine(font, cursor.y)}\n}\n\n/**\n * @arg span The distance in pixels from the start of the current character to\n * the start of the next including scale.\n */\nfunction layoutSpace(\n font: Font,\n cursor: Readonly<XY>,\n width: number,\n span: number\n): TextLayout {\n const nextCursor =\n cursor.x > 0 && cursor.x + span >= width\n ? nextLine(font, cursor.y)\n : {x: cursor.x + span, y: cursor.y}\n return {chars: [undefined], cursor: nextCursor}\n}\n\n/** Returns the distance in pixels from the start of lhs to the start of rhs. */\nfunction tracking(font: Font, lhs: string, rhs: string | undefined): number {\n return fontCharWidth(font, lhs) + fontKerning(font, lhs, rhs)\n}\n", "// \u2500\u2500\u2500oidoid>\u00B0\u2500\u2500\nimport type {AnimTag} from './atlas/aseprite.js'\nimport type {Atlas} from './atlas/atlas.js'\nimport {Synth} from './audio/synth.js'\nimport {BitmapBuffer, type Bitmap} from './graphics/bitmap.js'\nimport {Cam} from './graphics/cam.js'\nimport {FrameListener} from './graphics/frame-listener.js'\nimport {Renderer} from './graphics/renderer.js'\nimport {Input, type StandardButton} from './input/input.js'\nimport {Sprite} from './sprite/sprite.js'\nimport {JSONStorage} from './storage/json-storage.js'\n\nexport type {Font} from 'mem-font'\nexport type {AnimTag} from './atlas/aseprite.js'\nexport type {Atlas} from './atlas/atlas.js'\nexport {Sprite} from './sprite/sprite.js'\nexport type {SpriteJSON} from './sprite/sprite.js'\nexport {fontCharToTag} from './text/font.js'\nexport {layoutText, type TextLayout} from './text/text-layout.js'\nexport type {Box, WH, XY} from './types/2d.js'\n\ndeclare const atlas: Atlas\ndeclare const atlasURI: string\n\nexport class Void<\n Tag extends AnimTag = AnimTag,\n Button extends string = StandardButton\n> {\n static async new<\n Tag extends AnimTag = AnimTag,\n Button extends string = StandardButton\n >(): Promise<Void<Tag, Button>> {\n return new Void(await loadImage(atlasURI))\n }\n\n readonly atlas: Atlas<Tag> = <Atlas<Tag>>atlas\n readonly cam: Cam = new Cam()\n readonly ctrl: Input<Button>\n readonly kv = new JSONStorage()\n readonly synth = new Synth()\n\n readonly #bitmaps: BitmapBuffer = new BitmapBuffer(1_000_000)\n readonly #framer: FrameListener\n readonly #renderer: Renderer\n\n constructor(spritesheet: HTMLImageElement) {\n const meta = document.createElement('meta')\n meta.name = 'viewport'\n // Don't wait for double-tap scaling on mobile.\n meta.content = 'maximum-scale=1, minimum-scale=1, user-scalable=no'\n document.head.appendChild(meta)\n\n document.body.style.margin = '0'\n document.body.style.width = '100vw'\n document.body.style.height = '100vh'\n document.body.style.overflow = 'hidden'\n\n const canvas = document.createElement('canvas')\n canvas.style.cursor = 'none'\n canvas.style.display = 'block' // No line height spacing.\n canvas.style.imageRendering = 'pixelated'\n // Update on each pointermove *touch* Event like *mouse* Events.\n canvas.style.touchAction = 'none'\n document.body.append(canvas)\n\n this.ctrl = new Input(this.cam, canvas)\n this.#renderer = new Renderer(atlas, canvas, spritesheet)\n this.#framer = new FrameListener(canvas, this.ctrl, this.#renderer)\n this.#framer.register('add')\n this.background = 0x000000ff\n }\n\n set background(rgba: number) {\n document.body.style.background = `#${rgba.toString(16).padStart(8, '0')}`\n this.#renderer.clearColor(rgba)\n }\n\n blit(bmp: Readonly<Bitmap>): void {\n this.#bitmaps.push(bmp)\n }\n\n get frame(): number {\n return this.#framer.frame\n }\n\n render(loop?: () => void): void {\n this.cam.resize()\n this.#framer.render(this.cam, this.#bitmaps, loop)\n this.#bitmaps.size = 0\n }\n\n sprite(tag: Tag): Sprite<Tag> {\n return new Sprite<Tag>(this.atlas, tag)\n }\n\n stop(): void {\n this.#framer.cancel()\n this.#framer.register('remove')\n this.ctrl.register('remove')\n }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = () => reject(img)\n img.src = src\n })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Synth", "#context", "type", "startHz", "endHz", "duration", "now", "end", "oscillator", "gain", "BitmapBuffer", "capacity", "bmp", "Cam", "#clientWH", "#scale", "#w", "#h", "zoomOut", "nativeW", "nativeH", "clientXY", "GamepadPoller", "#bits", "#bitByAxis", "#bitByButton", "axis", "lessBit", "moreBit", "button", "bit", "pad", "index", "bits", "KeyboardPoller", "#bits", "#bitByKey", "key", "bit", "op", "fn", "type", "callback", "#onKey", "ev", "on", "PointerPoller", "#bitByButton", "#bits", "#cam", "#canvas", "#clientXY", "#type", "#xy", "cam", "canvas", "button", "bit", "op", "fn", "type", "#onPointEvent", "#onContextMenuEvent", "ev", "#evButtonsToBits", "buttons", "bits", "Input", "#duration", "#prevBits", "#combo", "#bitByButton", "#gamepad", "GamepadPoller", "#keyboard", "KeyboardPoller", "#pointer", "#pollBits", "#pollTick", "cam", "canvas", "PointerPoller", "combo", "i", "buttons", "bits", "#buttonsToBits", "#bits", "button", "less", "more", "axes", "axis", "#map", "indices", "index", "clicks", "click", "keys", "key", "tick", "op", "fragGLSL", "vertGLSL", "uv", "Renderer", "#bmpBuffer", "#canvas", "#cels", "#gl", "#loseContext", "#spritesheet", "#uniforms", "#vertArray", "atlas", "canvas", "spritesheet", "newCels", "rgba", "gl", "pgm", "loadProgram", "vertGLSL", "fragGLSL", "getUniformLocations", "uvBuffer", "dataTex", "spritesheetTex", "cam", "frame", "bmps", "#resize", "nativeWH", "clientW", "clientH", "diffW", "diffH", "compileShader", "type", "src", "shader", "log", "len", "locations", "i", "uniform", "vert", "frag", "cels", "anim", "cel", "FrameListener", "#canvas", "#frame", "#loop", "#time", "#input", "#renderer", "canvas", "input", "renderer", "op", "fn", "type", "#onEvent", "cam", "buffer", "loop", "#isVisible", "#onFrame", "event", "time", "Sprite", "_Sprite", "atlas", "json", "sprite", "#anim", "#atlas", "tag", "cel", "flip", "diff", "h", "box", "hitbox", "w", "x", "xy", "y", "z", "end", "JSONStorage", "key", "val", "fontCharToTag", "self", "char", "pt", "fontKerning", "lhs", "rhs", "fontCharWidth", "letter", "layoutText", "font", "str", "maxW", "chars", "cursor", "i", "char", "layout", "layoutNewline", "layoutSpace", "tracking", "layoutWord", "nextLine", "word", "index", "x", "y", "span", "fontCharWidth", "width", "nextCursor", "lhs", "rhs", "fontKerning", "Void", "_Void", "loadImage", "Cam", "JSONStorage", "Synth", "#bitmaps", "BitmapBuffer", "#framer", "#renderer", "spritesheet", "meta", "canvas", "Input", "Renderer", "FrameListener", "rgba", "bmp", "loop", "tag", "Sprite", "src", "resolve", "reject", "img"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
{
|
|
2
|
+
"inputs": {
|
|
3
|
+
"src/audio/synth.ts": {
|
|
4
|
+
"bytes": 766,
|
|
5
|
+
"imports": [],
|
|
6
|
+
"format": "esm"
|
|
7
|
+
},
|
|
8
|
+
"src/graphics/bitmap.ts": {
|
|
9
|
+
"bytes": 560,
|
|
10
|
+
"imports": [],
|
|
11
|
+
"format": "esm"
|
|
12
|
+
},
|
|
13
|
+
"src/graphics/cam.ts": {
|
|
14
|
+
"bytes": 1507,
|
|
15
|
+
"imports": [],
|
|
16
|
+
"format": "esm"
|
|
17
|
+
},
|
|
18
|
+
"src/input/gamepad-poller.ts": {
|
|
19
|
+
"bytes": 1073,
|
|
20
|
+
"imports": [],
|
|
21
|
+
"format": "esm"
|
|
22
|
+
},
|
|
23
|
+
"src/input/keyboard-poller.ts": {
|
|
24
|
+
"bytes": 883,
|
|
25
|
+
"imports": [],
|
|
26
|
+
"format": "esm"
|
|
27
|
+
},
|
|
28
|
+
"src/input/pointer-poller.ts": {
|
|
29
|
+
"bytes": 2287,
|
|
30
|
+
"imports": [
|
|
31
|
+
{
|
|
32
|
+
"path": "src/graphics/cam.ts",
|
|
33
|
+
"kind": "import-statement",
|
|
34
|
+
"original": "../graphics/cam.js"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"format": "esm"
|
|
38
|
+
},
|
|
39
|
+
"src/input/input.ts": {
|
|
40
|
+
"bytes": 6534,
|
|
41
|
+
"imports": [
|
|
42
|
+
{
|
|
43
|
+
"path": "src/graphics/cam.ts",
|
|
44
|
+
"kind": "import-statement",
|
|
45
|
+
"original": "../graphics/cam.js"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"path": "src/input/gamepad-poller.ts",
|
|
49
|
+
"kind": "import-statement",
|
|
50
|
+
"original": "./gamepad-poller.js"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"path": "src/input/keyboard-poller.ts",
|
|
54
|
+
"kind": "import-statement",
|
|
55
|
+
"original": "./keyboard-poller.js"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"path": "src/input/pointer-poller.ts",
|
|
59
|
+
"kind": "import-statement",
|
|
60
|
+
"original": "./pointer-poller.js"
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"format": "esm"
|
|
64
|
+
},
|
|
65
|
+
"src/atlas/atlas.ts": {
|
|
66
|
+
"bytes": 3019,
|
|
67
|
+
"imports": [],
|
|
68
|
+
"format": "esm"
|
|
69
|
+
},
|
|
70
|
+
"src/graphics/frag.glsl.ts": {
|
|
71
|
+
"bytes": 375,
|
|
72
|
+
"imports": [],
|
|
73
|
+
"format": "esm"
|
|
74
|
+
},
|
|
75
|
+
"src/graphics/vert.glsl.ts": {
|
|
76
|
+
"bytes": 1655,
|
|
77
|
+
"imports": [],
|
|
78
|
+
"format": "esm"
|
|
79
|
+
},
|
|
80
|
+
"src/graphics/renderer.ts": {
|
|
81
|
+
"bytes": 7855,
|
|
82
|
+
"imports": [
|
|
83
|
+
{
|
|
84
|
+
"path": "src/atlas/atlas.ts",
|
|
85
|
+
"kind": "import-statement",
|
|
86
|
+
"original": "../atlas/atlas.js"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"path": "src/graphics/bitmap.ts",
|
|
90
|
+
"kind": "import-statement",
|
|
91
|
+
"original": "./bitmap.js"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"path": "src/graphics/cam.ts",
|
|
95
|
+
"kind": "import-statement",
|
|
96
|
+
"original": "./cam.js"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"path": "src/graphics/frag.glsl.ts",
|
|
100
|
+
"kind": "import-statement",
|
|
101
|
+
"original": "./frag.glsl.js"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"path": "src/graphics/vert.glsl.ts",
|
|
105
|
+
"kind": "import-statement",
|
|
106
|
+
"original": "./vert.glsl.js"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"format": "esm"
|
|
110
|
+
},
|
|
111
|
+
"src/graphics/frame-listener.ts": {
|
|
112
|
+
"bytes": 2530,
|
|
113
|
+
"imports": [
|
|
114
|
+
{
|
|
115
|
+
"path": "src/input/input.ts",
|
|
116
|
+
"kind": "import-statement",
|
|
117
|
+
"original": "../input/input.js"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"path": "src/graphics/bitmap.ts",
|
|
121
|
+
"kind": "import-statement",
|
|
122
|
+
"original": "./bitmap.js"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"path": "src/graphics/cam.ts",
|
|
126
|
+
"kind": "import-statement",
|
|
127
|
+
"original": "./cam.js"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"path": "src/graphics/renderer.ts",
|
|
131
|
+
"kind": "import-statement",
|
|
132
|
+
"original": "./renderer.js"
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"format": "esm"
|
|
136
|
+
},
|
|
137
|
+
"src/sprite/sprite.ts": {
|
|
138
|
+
"bytes": 4846,
|
|
139
|
+
"imports": [],
|
|
140
|
+
"format": "esm"
|
|
141
|
+
},
|
|
142
|
+
"src/storage/json-storage.ts": {
|
|
143
|
+
"bytes": 316,
|
|
144
|
+
"imports": [],
|
|
145
|
+
"format": "esm"
|
|
146
|
+
},
|
|
147
|
+
"src/text/font.ts": {
|
|
148
|
+
"bytes": 741,
|
|
149
|
+
"imports": [],
|
|
150
|
+
"format": "esm"
|
|
151
|
+
},
|
|
152
|
+
"src/text/text-layout.ts": {
|
|
153
|
+
"bytes": 3127,
|
|
154
|
+
"imports": [
|
|
155
|
+
{
|
|
156
|
+
"path": "src/text/font.ts",
|
|
157
|
+
"kind": "import-statement",
|
|
158
|
+
"original": "./font.js"
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"format": "esm"
|
|
162
|
+
},
|
|
163
|
+
"src/index.ts": {
|
|
164
|
+
"bytes": 3443,
|
|
165
|
+
"imports": [
|
|
166
|
+
{
|
|
167
|
+
"path": "src/audio/synth.ts",
|
|
168
|
+
"kind": "import-statement",
|
|
169
|
+
"original": "./audio/synth.js"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"path": "src/graphics/bitmap.ts",
|
|
173
|
+
"kind": "import-statement",
|
|
174
|
+
"original": "./graphics/bitmap.js"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"path": "src/graphics/cam.ts",
|
|
178
|
+
"kind": "import-statement",
|
|
179
|
+
"original": "./graphics/cam.js"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"path": "src/graphics/frame-listener.ts",
|
|
183
|
+
"kind": "import-statement",
|
|
184
|
+
"original": "./graphics/frame-listener.js"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"path": "src/graphics/renderer.ts",
|
|
188
|
+
"kind": "import-statement",
|
|
189
|
+
"original": "./graphics/renderer.js"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"path": "src/input/input.ts",
|
|
193
|
+
"kind": "import-statement",
|
|
194
|
+
"original": "./input/input.js"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"path": "src/sprite/sprite.ts",
|
|
198
|
+
"kind": "import-statement",
|
|
199
|
+
"original": "./sprite/sprite.js"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"path": "src/storage/json-storage.ts",
|
|
203
|
+
"kind": "import-statement",
|
|
204
|
+
"original": "./storage/json-storage.js"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"path": "src/sprite/sprite.ts",
|
|
208
|
+
"kind": "import-statement",
|
|
209
|
+
"original": "./sprite/sprite.js"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"path": "src/text/font.ts",
|
|
213
|
+
"kind": "import-statement",
|
|
214
|
+
"original": "./text/font.js"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"path": "src/text/text-layout.ts",
|
|
218
|
+
"kind": "import-statement",
|
|
219
|
+
"original": "./text/text-layout.js"
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
"format": "esm"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
"outputs": {
|
|
226
|
+
"dist/void.js.map": {
|
|
227
|
+
"imports": [],
|
|
228
|
+
"exports": [],
|
|
229
|
+
"inputs": {},
|
|
230
|
+
"bytes": 64296
|
|
231
|
+
},
|
|
232
|
+
"dist/void.js": {
|
|
233
|
+
"imports": [],
|
|
234
|
+
"exports": [
|
|
235
|
+
"Sprite",
|
|
236
|
+
"Void",
|
|
237
|
+
"fontCharToTag",
|
|
238
|
+
"layoutText"
|
|
239
|
+
],
|
|
240
|
+
"entryPoint": "src/index.ts",
|
|
241
|
+
"inputs": {
|
|
242
|
+
"src/audio/synth.ts": {
|
|
243
|
+
"bytesInOutput": 367
|
|
244
|
+
},
|
|
245
|
+
"src/graphics/bitmap.ts": {
|
|
246
|
+
"bytesInOutput": 196
|
|
247
|
+
},
|
|
248
|
+
"src/graphics/cam.ts": {
|
|
249
|
+
"bytesInOutput": 609
|
|
250
|
+
},
|
|
251
|
+
"src/input/gamepad-poller.ts": {
|
|
252
|
+
"bytesInOutput": 437
|
|
253
|
+
},
|
|
254
|
+
"src/input/keyboard-poller.ts": {
|
|
255
|
+
"bytesInOutput": 372
|
|
256
|
+
},
|
|
257
|
+
"src/input/pointer-poller.ts": {
|
|
258
|
+
"bytesInOutput": 899
|
|
259
|
+
},
|
|
260
|
+
"src/input/input.ts": {
|
|
261
|
+
"bytesInOutput": 2040
|
|
262
|
+
},
|
|
263
|
+
"src/graphics/frag.glsl.ts": {
|
|
264
|
+
"bytesInOutput": 357
|
|
265
|
+
},
|
|
266
|
+
"src/graphics/vert.glsl.ts": {
|
|
267
|
+
"bytesInOutput": 1637
|
|
268
|
+
},
|
|
269
|
+
"src/graphics/renderer.ts": {
|
|
270
|
+
"bytesInOutput": 4131
|
|
271
|
+
},
|
|
272
|
+
"src/graphics/frame-listener.ts": {
|
|
273
|
+
"bytesInOutput": 1090
|
|
274
|
+
},
|
|
275
|
+
"src/sprite/sprite.ts": {
|
|
276
|
+
"bytesInOutput": 2370
|
|
277
|
+
},
|
|
278
|
+
"src/storage/json-storage.ts": {
|
|
279
|
+
"bytesInOutput": 173
|
|
280
|
+
},
|
|
281
|
+
"src/index.ts": {
|
|
282
|
+
"bytesInOutput": 1202
|
|
283
|
+
},
|
|
284
|
+
"src/text/font.ts": {
|
|
285
|
+
"bytesInOutput": 311
|
|
286
|
+
},
|
|
287
|
+
"src/text/text-layout.ts": {
|
|
288
|
+
"bytesInOutput": 784
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
"bytes": 17074
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|