@sadhaka/loom-engine 0.10.0 → 0.12.0
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/COMMERCIAL_LICENSE_TERMS.md +74 -0
- package/LICENSE +103 -21
- package/README.md +523 -344
- package/dist/engine.d.ts +6 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +35 -1
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/renderer/shaders/sprite-shader-source.d.ts +4 -0
- package/dist/renderer/shaders/sprite-shader-source.d.ts.map +1 -0
- package/dist/renderer/shaders/sprite-shader-source.js +83 -0
- package/dist/renderer/shaders/sprite-shader-source.js.map +1 -0
- package/dist/renderer/sprite-batcher.d.ts +30 -0
- package/dist/renderer/sprite-batcher.d.ts.map +1 -0
- package/dist/renderer/sprite-batcher.js +146 -0
- package/dist/renderer/sprite-batcher.js.map +1 -0
- package/dist/renderer/texture-atlas.d.ts +24 -0
- package/dist/renderer/texture-atlas.d.ts.map +1 -0
- package/dist/renderer/texture-atlas.js +173 -0
- package/dist/renderer/texture-atlas.js.map +1 -0
- package/dist/renderer/webgl2-device.d.ts +53 -0
- package/dist/renderer/webgl2-device.d.ts.map +1 -0
- package/dist/renderer/webgl2-device.js +596 -0
- package/dist/renderer/webgl2-device.js.map +1 -0
- package/package.json +63 -56
package/dist/engine.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IGraphicsDevice } from './renderer/graphics-device.js';
|
|
1
|
+
import type { IGraphicsDevice, DeviceBackend } from './renderer/graphics-device.js';
|
|
2
2
|
import { type CameraView } from './renderer/camera.js';
|
|
3
3
|
import { World } from './world.js';
|
|
4
4
|
import { AudioBus } from './audio/audio-bus.js';
|
|
@@ -7,7 +7,12 @@ export interface EngineOptions {
|
|
|
7
7
|
canvas: HTMLCanvasElement;
|
|
8
8
|
inputWindow?: Window | null;
|
|
9
9
|
skipAudio?: boolean;
|
|
10
|
+
backend?: DeviceBackend;
|
|
11
|
+
device?: IGraphicsDevice;
|
|
10
12
|
}
|
|
13
|
+
export type DeviceFactory = (canvas: HTMLCanvasElement) => IGraphicsDevice;
|
|
14
|
+
export declare function registerBackend(name: DeviceBackend, factory: DeviceFactory): void;
|
|
15
|
+
export declare function isBackendRegistered(name: DeviceBackend): boolean;
|
|
11
16
|
export declare class Engine {
|
|
12
17
|
readonly device: IGraphicsDevice;
|
|
13
18
|
readonly world: World;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,KAAK,EAA+B,MAAM,YAAY,CAAC;AA2BhE,OAAO,EAAE,QAAQ,EAAsB,MAAM,sBAAsB,CAAC;AACpE,OAAO,EACL,YAAY,EAGb,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,iBAAiB,CAAC;IAI1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAI5B,SAAS,CAAC,EAAE,OAAO,CAAC;IASpB,OAAO,CAAC,EAAE,aAAa,CAAC;IAIxB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAQD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,iBAAiB,KAAK,eAAe,CAAC;AAQ3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAEjF;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAEhE;AAOD,qBAAa,MAAM;IACjB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEhC,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO;IA0BP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAsF1C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmBzB,SAAS,IAAI,IAAI;IAOjB,OAAO,IAAI,IAAI;CAKhB"}
|
package/dist/engine.js
CHANGED
|
@@ -44,6 +44,20 @@ import { KnotContextResource } from './director/knot-context-resource.js';
|
|
|
44
44
|
import { RESOURCE_DIRECTOR_LOG, createDirectorEventLog, } from './director/director-system.js';
|
|
45
45
|
import { RESOURCE_TIME, RESOURCE_CAMERA, RESOURCE_DEVICE, createTimeResource, } from './resources.js';
|
|
46
46
|
import { clamp } from './util/math.js';
|
|
47
|
+
const backendRegistry = new Map();
|
|
48
|
+
backendRegistry.set('canvas2d', (canvas) => new Canvas2DDevice(canvas));
|
|
49
|
+
// Register a backend factory. Devices call this from their module
|
|
50
|
+
// load to make the string-based `backend:` selection work without
|
|
51
|
+
// engine.ts knowing about them. Idempotent: re-registration replaces
|
|
52
|
+
// the prior factory.
|
|
53
|
+
export function registerBackend(name, factory) {
|
|
54
|
+
backendRegistry.set(name, factory);
|
|
55
|
+
}
|
|
56
|
+
// Probe whether a backend is registered. Useful for diagnostic code
|
|
57
|
+
// or tests asserting a backend was loaded.
|
|
58
|
+
export function isBackendRegistered(name) {
|
|
59
|
+
return backendRegistry.has(name);
|
|
60
|
+
}
|
|
47
61
|
// Max delta clamp. Long pauses (background tab, breakpoint) shouldn't
|
|
48
62
|
// produce one giant dt that breaks physics. 1/30s is the spec frame
|
|
49
63
|
// loop guidance.
|
|
@@ -67,8 +81,28 @@ export class Engine {
|
|
|
67
81
|
// Constructs an Engine + default resources + default pools +
|
|
68
82
|
// default render system. Caller registers their own systems
|
|
69
83
|
// afterward via engine.world.addSystem.
|
|
84
|
+
//
|
|
85
|
+
// Backend selection precedence:
|
|
86
|
+
// 1. opts.device - if provided, used as-is (tree-shake friendly)
|
|
87
|
+
// 2. opts.backend - looked up in backendRegistry; throws if a
|
|
88
|
+
// non-default backend is requested but its device module was
|
|
89
|
+
// never imported.
|
|
90
|
+
// 3. 'canvas2d' default factory.
|
|
70
91
|
static create(opts) {
|
|
71
|
-
|
|
92
|
+
let device;
|
|
93
|
+
if (opts.device) {
|
|
94
|
+
device = opts.device;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const backend = opts.backend ?? 'canvas2d';
|
|
98
|
+
const factory = backendRegistry.get(backend);
|
|
99
|
+
if (!factory) {
|
|
100
|
+
throw new Error("Engine.create: backend '" + backend + "' is not registered. " +
|
|
101
|
+
"For 'webgl2', import { WebGL2Device } from '@sadhaka/loom-engine' before calling Engine.create - " +
|
|
102
|
+
"the module self-registers on import. Alternatively pass opts.device directly.");
|
|
103
|
+
}
|
|
104
|
+
device = factory(opts.canvas);
|
|
105
|
+
}
|
|
72
106
|
const camera = createCamera(opts.canvas.width, opts.canvas.height);
|
|
73
107
|
const world = new World();
|
|
74
108
|
const time = createTimeResource();
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,gEAAgE;AAChE,mEAAmE;AACnE,mEAAmE;AACnE,EAAE;AACF,6CAA6C;AAC7C,2BAA2B;AAC3B,2BAA2B;AAC3B,gCAAgC;AAChC,yBAAyB;AACzB,iCAAiC;AACjC,2BAA2B;AAC3B,wDAAwD;AACxD,uBAAuB;AACvB,EAAE;AACF,oEAAoE;AACpE,+CAA+C;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const LOOM_ENGINE_VERSION = "0.
|
|
1
|
+
export declare const LOOM_ENGINE_VERSION = "0.12.0";
|
|
2
2
|
export type { Vec2, Vec3, Rect } from './util/math.js';
|
|
3
3
|
export { vec2, vec3, rect, clamp, lerp, smoothstep, approxEq, rectContains, rectIntersects, visibleInView, } from './util/math.js';
|
|
4
4
|
export type { ColorRGBA } from './util/color.js';
|
|
@@ -13,12 +13,17 @@ export { SYSTEM_PHASE_INPUT, SYSTEM_PHASE_LOGIC, SYSTEM_PHASE_PHYSICS, SYSTEM_PH
|
|
|
13
13
|
export type { TimeResource, VeilBudgetResource } from './resources.js';
|
|
14
14
|
export { ResourceRegistry, createTimeResource, createVeilBudgetResource, RESOURCE_TIME, RESOURCE_CAMERA, RESOURCE_DEVICE, RESOURCE_VEIL_BUDGET, } from './resources.js';
|
|
15
15
|
export { SpriteRenderSystem } from './systems/sprite-render-system.js';
|
|
16
|
-
export { Engine } from './engine.js';
|
|
17
|
-
export type { EngineOptions } from './engine.js';
|
|
16
|
+
export { Engine, registerBackend, isBackendRegistered } from './engine.js';
|
|
17
|
+
export type { EngineOptions, DeviceFactory } from './engine.js';
|
|
18
18
|
export type { IGraphicsDevice, AtlasHandle, AtlasDescriptor, TextStyle, DeviceBackend, } from './renderer/graphics-device.js';
|
|
19
19
|
export type { CameraView } from './renderer/camera.js';
|
|
20
20
|
export { createCamera, getCameraViewRect, worldToScreen, screenToWorld, } from './renderer/camera.js';
|
|
21
21
|
export { Canvas2DDevice, } from './renderer/canvas2d-device.js';
|
|
22
|
+
export { WebGL2Device } from './renderer/webgl2-device.js';
|
|
23
|
+
export { TextureAtlas, makeParticleDiscAtlas, } from './renderer/texture-atlas.js';
|
|
24
|
+
export { SpriteBatcher, FLOATS_PER_INSTANCE, } from './renderer/sprite-batcher.js';
|
|
25
|
+
export type { BlendMode, FlushHandler, } from './renderer/sprite-batcher.js';
|
|
26
|
+
export { SPRITE_VERT_SRC, SPRITE_FRAG_SRC, UNIT_QUAD_VERTICES, } from './renderer/shaders/sprite-shader-source.js';
|
|
22
27
|
export { ISO_TILE_WIDTH, ISO_TILE_HEIGHT, ISO_HALF_W, ISO_HALF_H, ISO_Z_SCALE, tileToIso, worldToIso, isoToTile, isoDepthKey, } from './renderer/iso-projection.js';
|
|
23
28
|
export type { SpriteFrame, SpriteAnchor, SpriteSheetManifest, LoadedSpriteSheet, LoaderOptions, } from './asset/sprite-sheet-loader.js';
|
|
24
29
|
export { loadSpriteSheet, computeFrameIndex, SpriteSheetLoadError, } from './asset/sprite-sheet-loader.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,12 @@
|
|
|
3
3
|
// Phase 2 adds the ECS layer: World, System scheduler, Resources,
|
|
4
4
|
// SpritePool, SpriteRenderSystem, and the high-level Engine facade
|
|
5
5
|
// that wires everything together with sane defaults.
|
|
6
|
-
|
|
6
|
+
// Keep this string in agreement with package.json.version. Bump both
|
|
7
|
+
// in the same commit when cutting a release. Audit L-01 (0.10.0):
|
|
8
|
+
// the previous suffix `-perf-9-1` lingered after package.json was
|
|
9
|
+
// bumped to 0.10.0, surfacing as a drift bug in
|
|
10
|
+
// engine.LOOM_ENGINE_VERSION-based diagnostics.
|
|
11
|
+
export const LOOM_ENGINE_VERSION = '0.12.0';
|
|
7
12
|
export { vec2, vec3, rect, clamp, lerp, smoothstep, approxEq, rectContains, rectIntersects, visibleInView, } from './util/math.js';
|
|
8
13
|
export { rgba, hexToRgba, rgbaToHexString, rgbaToCssString, colorLerp, COLOR_WHITE, COLOR_BLACK, COLOR_TRANSPARENT, COLOR_KNOT_STR, COLOR_KNOT_DEX, COLOR_KNOT_INT, COLOR_KNOT_CENTER, } from './util/color.js';
|
|
9
14
|
export { EntityAllocator, NULL_ENTITY, entityIndex, entityGeneration, makeEntity, } from './entity.js';
|
|
@@ -16,9 +21,18 @@ export { ResourceRegistry, createTimeResource, createVeilBudgetResource, RESOURC
|
|
|
16
21
|
// Default systems
|
|
17
22
|
export { SpriteRenderSystem } from './systems/sprite-render-system.js';
|
|
18
23
|
// Engine facade
|
|
19
|
-
export { Engine } from './engine.js';
|
|
24
|
+
export { Engine, registerBackend, isBackendRegistered } from './engine.js';
|
|
20
25
|
export { createCamera, getCameraViewRect, worldToScreen, screenToWorld, } from './renderer/camera.js';
|
|
21
26
|
export { Canvas2DDevice, } from './renderer/canvas2d-device.js';
|
|
27
|
+
// WebGL2 backend (Phase 14.1). Importing this symbol triggers the
|
|
28
|
+
// module's self-registration of the 'webgl2' backend factory, so
|
|
29
|
+
// Engine.create({ backend: 'webgl2' }) starts working from then on.
|
|
30
|
+
// Canvas2D-only consumers do not import this and the entire WebGL2
|
|
31
|
+
// path tree-shakes out of the bundle.
|
|
32
|
+
export { WebGL2Device } from './renderer/webgl2-device.js';
|
|
33
|
+
export { TextureAtlas, makeParticleDiscAtlas, } from './renderer/texture-atlas.js';
|
|
34
|
+
export { SpriteBatcher, FLOATS_PER_INSTANCE, } from './renderer/sprite-batcher.js';
|
|
35
|
+
export { SPRITE_VERT_SRC, SPRITE_FRAG_SRC, UNIT_QUAD_VERTICES, } from './renderer/shaders/sprite-shader-source.js';
|
|
22
36
|
export { ISO_TILE_WIDTH, ISO_TILE_HEIGHT, ISO_HALF_W, ISO_HALF_H, ISO_Z_SCALE, tileToIso, worldToIso, isoToTile, isoDepthKey, } from './renderer/iso-projection.js';
|
|
23
37
|
export { loadSpriteSheet, computeFrameIndex, SpriteSheetLoadError, } from './asset/sprite-sheet-loader.js';
|
|
24
38
|
export { synthesizeDefaultClip, clipDurationMs, frameInClipAt, manifestFrameIndex, } from './animation/animation-clip.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,qDAAqD;AAErD,MAAM,CAAC,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprite-shader-source.d.ts","sourceRoot":"","sources":["../../../src/renderer/shaders/sprite-shader-source.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,eAAe,EAAE,MAkClB,CAAC;AAEb,eAAO,MAAM,eAAe,EAAE,MAkBlB,CAAC;AAMb,eAAO,MAAM,kBAAkB,EAAE,YAO/B,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// GLSL ES 3.00 shader source for the WebGL2 sprite batcher.
|
|
2
|
+
//
|
|
3
|
+
// One pair of shaders services every batched draw the WebGL2Device
|
|
4
|
+
// performs - sprites, tiles, particles, glyphs - by treating each
|
|
5
|
+
// quad as an instance with its own screen-space origin, pixel size,
|
|
6
|
+
// atlas UV rect, and RGBA tint. The vertex shader maps a static unit
|
|
7
|
+
// quad onto the per-instance origin/size and forwards UV + tint to
|
|
8
|
+
// the fragment shader, which samples the bound atlas and multiplies
|
|
9
|
+
// by tint.
|
|
10
|
+
//
|
|
11
|
+
// The host (JS) is responsible for iso projection and camera
|
|
12
|
+
// transform, mirroring what Canvas2DDevice does today. Keeping that
|
|
13
|
+
// math out of the shader makes the GL path identical-output to the
|
|
14
|
+
// Canvas2D path - very useful for parity testing and later perf
|
|
15
|
+
// tuning. The trade is per-instance JS work that could in principle
|
|
16
|
+
// move to the GPU; we measure that in phase 14.3.
|
|
17
|
+
export const SPRITE_VERT_SRC = [
|
|
18
|
+
'#version 300 es',
|
|
19
|
+
'precision highp float;',
|
|
20
|
+
'',
|
|
21
|
+
'// Per-vertex unit-quad position. Six vertices forming two',
|
|
22
|
+
'// triangles cover (0,0)-(1,1) in normalized quad space.',
|
|
23
|
+
'layout(location = 0) in vec2 a_quadVertex;',
|
|
24
|
+
'',
|
|
25
|
+
'// Per-instance attributes - vertexAttribDivisor(1).',
|
|
26
|
+
'layout(location = 1) in vec2 a_origin; // screen-pixel top-left of the quad',
|
|
27
|
+
'layout(location = 2) in vec2 a_size; // screen-pixel width, height',
|
|
28
|
+
'layout(location = 3) in vec4 a_uvRect; // u0, v0, u1, v1 within atlas',
|
|
29
|
+
'layout(location = 4) in vec4 a_tint; // r, g, b, a',
|
|
30
|
+
'',
|
|
31
|
+
'uniform vec2 u_viewport; // viewport in pixels',
|
|
32
|
+
'',
|
|
33
|
+
'out vec2 v_uv;',
|
|
34
|
+
'out vec4 v_tint;',
|
|
35
|
+
'',
|
|
36
|
+
'void main() {',
|
|
37
|
+
' vec2 screenPx = a_origin + a_quadVertex * a_size;',
|
|
38
|
+
' // Map screen-pixel to clip-space NDC. Origin is top-left in',
|
|
39
|
+
' // pixel space; flip Y to match GL clip-space.',
|
|
40
|
+
' vec2 ndc;',
|
|
41
|
+
' ndc.x = (screenPx.x / u_viewport.x) * 2.0 - 1.0;',
|
|
42
|
+
' ndc.y = 1.0 - (screenPx.y / u_viewport.y) * 2.0;',
|
|
43
|
+
' gl_Position = vec4(ndc, 0.0, 1.0);',
|
|
44
|
+
'',
|
|
45
|
+
' // UV is linearly interpolated between the rect corners using',
|
|
46
|
+
' // the unit-quad position as the mix factor.',
|
|
47
|
+
' v_uv = mix(a_uvRect.xy, a_uvRect.zw, a_quadVertex);',
|
|
48
|
+
' v_tint = a_tint;',
|
|
49
|
+
'}',
|
|
50
|
+
'',
|
|
51
|
+
].join('\n');
|
|
52
|
+
export const SPRITE_FRAG_SRC = [
|
|
53
|
+
'#version 300 es',
|
|
54
|
+
'precision highp float;',
|
|
55
|
+
'',
|
|
56
|
+
'in vec2 v_uv;',
|
|
57
|
+
'in vec4 v_tint;',
|
|
58
|
+
'',
|
|
59
|
+
'uniform sampler2D u_atlas;',
|
|
60
|
+
'',
|
|
61
|
+
'out vec4 outColor;',
|
|
62
|
+
'',
|
|
63
|
+
'void main() {',
|
|
64
|
+
' vec4 sampled = texture(u_atlas, v_uv);',
|
|
65
|
+
' vec4 c = sampled * v_tint;',
|
|
66
|
+
' if (c.a <= 0.0) discard;',
|
|
67
|
+
' outColor = c;',
|
|
68
|
+
'}',
|
|
69
|
+
'',
|
|
70
|
+
].join('\n');
|
|
71
|
+
// Static unit-quad vertex data: two triangles covering 0..1 in xy.
|
|
72
|
+
// Vertex order top-left, bottom-left, top-right, top-right, bottom-
|
|
73
|
+
// left, bottom-right matches the UV mapping in the vertex shader.
|
|
74
|
+
// Six vertices x 2 floats = 12 floats.
|
|
75
|
+
export const UNIT_QUAD_VERTICES = new Float32Array([
|
|
76
|
+
0, 0, // top-left
|
|
77
|
+
0, 1, // bottom-left
|
|
78
|
+
1, 0, // top-right
|
|
79
|
+
1, 0, // top-right
|
|
80
|
+
0, 1, // bottom-left
|
|
81
|
+
1, 1, // bottom-right
|
|
82
|
+
]);
|
|
83
|
+
//# sourceMappingURL=sprite-shader-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprite-shader-source.js","sourceRoot":"","sources":["../../../src/renderer/shaders/sprite-shader-source.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,mEAAmE;AACnE,kEAAkE;AAClE,oEAAoE;AACpE,qEAAqE;AACrE,mEAAmE;AACnE,oEAAoE;AACpE,WAAW;AACX,EAAE;AACF,6DAA6D;AAC7D,oEAAoE;AACpE,mEAAmE;AACnE,gEAAgE;AAChE,oEAAoE;AACpE,kDAAkD;AAElD,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,iBAAiB;IACjB,wBAAwB;IACxB,EAAE;IACF,4DAA4D;IAC5D,0DAA0D;IAC1D,4CAA4C;IAC5C,EAAE;IACF,sDAAsD;IACtD,+EAA+E;IAC/E,wEAAwE;IACxE,yEAAyE;IACzE,wDAAwD;IACxD,EAAE;IACF,gDAAgD;IAChD,EAAE;IACF,gBAAgB;IAChB,kBAAkB;IAClB,EAAE;IACF,eAAe;IACf,qDAAqD;IACrD,gEAAgE;IAChE,kDAAkD;IAClD,aAAa;IACb,oDAAoD;IACpD,oDAAoD;IACpD,sCAAsC;IACtC,EAAE;IACF,iEAAiE;IACjE,gDAAgD;IAChD,uDAAuD;IACvD,oBAAoB;IACpB,GAAG;IACH,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,iBAAiB;IACjB,wBAAwB;IACxB,EAAE;IACF,eAAe;IACf,iBAAiB;IACjB,EAAE;IACF,4BAA4B;IAC5B,EAAE;IACF,oBAAoB;IACpB,EAAE;IACF,eAAe;IACf,0CAA0C;IAC1C,8BAA8B;IAC9B,4BAA4B;IAC5B,iBAAiB;IACjB,GAAG;IACH,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,mEAAmE;AACnE,oEAAoE;AACpE,kEAAkE;AAClE,uCAAuC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAiB,IAAI,YAAY,CAAC;IAC/D,CAAC,EAAE,CAAC,EAAI,WAAW;IACnB,CAAC,EAAE,CAAC,EAAI,cAAc;IACtB,CAAC,EAAE,CAAC,EAAI,YAAY;IACpB,CAAC,EAAE,CAAC,EAAI,YAAY;IACpB,CAAC,EAAE,CAAC,EAAI,cAAc;IACtB,CAAC,EAAE,CAAC,EAAI,eAAe;CACxB,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TextureAtlas } from './texture-atlas.js';
|
|
2
|
+
export type BlendMode = 'alpha' | 'add';
|
|
3
|
+
export declare const FLOATS_PER_INSTANCE: number;
|
|
4
|
+
export type FlushHandler = (atlas: TextureAtlas, blendMode: BlendMode, data: Float32Array, count: number) => void;
|
|
5
|
+
export declare class SpriteBatcher {
|
|
6
|
+
private buffer;
|
|
7
|
+
private capacity;
|
|
8
|
+
private count;
|
|
9
|
+
private currentAtlas;
|
|
10
|
+
private currentBlend;
|
|
11
|
+
private flushCount;
|
|
12
|
+
private instanceTotal;
|
|
13
|
+
private readonly flushHandler;
|
|
14
|
+
constructor(flushHandler: FlushHandler, initialCapacity?: number);
|
|
15
|
+
beginFrame(): void;
|
|
16
|
+
submit(atlas: TextureAtlas, blendMode: BlendMode, originX: number, originY: number, sizeX: number, sizeY: number, u0: number, v0: number, u1: number, v1: number, tintR: number, tintG: number, tintB: number, tintA: number): void;
|
|
17
|
+
flush(): void;
|
|
18
|
+
endFrame(): void;
|
|
19
|
+
getStats(out: {
|
|
20
|
+
flushCount: number;
|
|
21
|
+
instanceTotal: number;
|
|
22
|
+
capacity: number;
|
|
23
|
+
}): void;
|
|
24
|
+
_peekCount(): number;
|
|
25
|
+
_peekCurrentAtlas(): TextureAtlas | null;
|
|
26
|
+
_peekCurrentBlend(): BlendMode;
|
|
27
|
+
_peekBuffer(): Float32Array;
|
|
28
|
+
private grow;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=sprite-batcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprite-batcher.d.ts","sourceRoot":"","sources":["../../src/renderer/sprite-batcher.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAExC,eAAO,MAAM,mBAAmB,EAAE,MAAW,CAAC;AAO9C,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,KACV,IAAI,CAAC;AAIV,qBAAa,aAAa;IAIxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAsB;IAI1C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAEhC,YAAY,EAAE,YAAY,EAAE,eAAe,GAAE,MAAyB;IAUlF,UAAU,IAAI,IAAI;IAalB,MAAM,CACJ,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI;IAoCP,KAAK,IAAI,IAAI;IAYb,QAAQ,IAAI,IAAI;IAQhB,QAAQ,CAAC,GAAG,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASpF,UAAU,IAAI,MAAM;IAGpB,iBAAiB,IAAI,YAAY,GAAG,IAAI;IAGxC,iBAAiB,IAAI,SAAS;IAG9B,WAAW,IAAI,YAAY;IAO3B,OAAO,CAAC,IAAI;CAOb"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// SpriteBatcher - per-frame instance accumulator for the WebGL2 path.
|
|
2
|
+
//
|
|
3
|
+
// Pure CPU-side: holds a growable Float32Array of per-instance data
|
|
4
|
+
// and tracks the current batch key (atlas + blend mode). submit()
|
|
5
|
+
// appends; if the batch key changes it flushes the current run via
|
|
6
|
+
// a handler the device wires up at construction. flush() also runs
|
|
7
|
+
// from endFrame to drain any pending instances.
|
|
8
|
+
//
|
|
9
|
+
// 12 floats per instance:
|
|
10
|
+
// [origin.x, origin.y, size.x, size.y,
|
|
11
|
+
// uv0.x, uv0.y, uv1.x, uv1.y,
|
|
12
|
+
// tint.r, tint.g, tint.b, tint.a]
|
|
13
|
+
//
|
|
14
|
+
// Why: a single drawArraysInstanced call covers the whole batch with
|
|
15
|
+
// one CPU->GPU upload of the instance buffer. Atlas swap forces a
|
|
16
|
+
// flush because the bound texture changes; blend-mode swap forces a
|
|
17
|
+
// flush because gl.blendFunc state changes.
|
|
18
|
+
//
|
|
19
|
+
// Submission order is preserved within a batch. Higher-level systems
|
|
20
|
+
// (SpriteRenderSystem) sort globally before submitting; the batcher
|
|
21
|
+
// trusts that order. Subsequent atlas batches reset the order chain
|
|
22
|
+
// but never mix across atlases - that is intentional, the cost is
|
|
23
|
+
// borne by the consumer (sort by atlas then by depth if global
|
|
24
|
+
// ordering across atlases matters).
|
|
25
|
+
export const FLOATS_PER_INSTANCE = 12;
|
|
26
|
+
const INITIAL_CAPACITY = 1024;
|
|
27
|
+
export class SpriteBatcher {
|
|
28
|
+
// Instance data buffer. Grows by doubling when capacity is hit.
|
|
29
|
+
// Backing typed-array stays referentially stable when count is
|
|
30
|
+
// below capacity to avoid per-frame allocation.
|
|
31
|
+
buffer;
|
|
32
|
+
capacity;
|
|
33
|
+
// Current run state.
|
|
34
|
+
count = 0;
|
|
35
|
+
currentAtlas = null;
|
|
36
|
+
currentBlend = 'alpha';
|
|
37
|
+
// Flush statistics. Reset at beginFrame; surfaced by getStats for
|
|
38
|
+
// tests + diagnostics.
|
|
39
|
+
flushCount = 0;
|
|
40
|
+
instanceTotal = 0;
|
|
41
|
+
flushHandler;
|
|
42
|
+
constructor(flushHandler, initialCapacity = INITIAL_CAPACITY) {
|
|
43
|
+
this.flushHandler = flushHandler;
|
|
44
|
+
this.capacity = Math.max(64, initialCapacity);
|
|
45
|
+
this.buffer = new Float32Array(this.capacity * FLOATS_PER_INSTANCE);
|
|
46
|
+
}
|
|
47
|
+
// Reset for a new frame. Counts go to zero; batch state cleared.
|
|
48
|
+
// Flushes any pending instances first as a safety net (endFrame
|
|
49
|
+
// should have done this, but we belt-and-suspenders to keep the
|
|
50
|
+
// device contract clean).
|
|
51
|
+
beginFrame() {
|
|
52
|
+
if (this.count > 0 && this.currentAtlas) {
|
|
53
|
+
this.flush();
|
|
54
|
+
}
|
|
55
|
+
this.count = 0;
|
|
56
|
+
this.currentAtlas = null;
|
|
57
|
+
this.currentBlend = 'alpha';
|
|
58
|
+
this.flushCount = 0;
|
|
59
|
+
this.instanceTotal = 0;
|
|
60
|
+
}
|
|
61
|
+
// Submit one instance to the batcher. Triggers flush if the
|
|
62
|
+
// (atlas, blendMode) key differs from the current batch.
|
|
63
|
+
submit(atlas, blendMode, originX, originY, sizeX, sizeY, u0, v0, u1, v1, tintR, tintG, tintB, tintA) {
|
|
64
|
+
if (atlas.released)
|
|
65
|
+
return;
|
|
66
|
+
if (this.currentAtlas !== atlas || this.currentBlend !== blendMode) {
|
|
67
|
+
// Atlas / blend change forces a batch break. Flush the current
|
|
68
|
+
// run before installing the new key.
|
|
69
|
+
if (this.count > 0 && this.currentAtlas) {
|
|
70
|
+
this.flush();
|
|
71
|
+
}
|
|
72
|
+
this.currentAtlas = atlas;
|
|
73
|
+
this.currentBlend = blendMode;
|
|
74
|
+
}
|
|
75
|
+
if (this.count >= this.capacity) {
|
|
76
|
+
this.grow();
|
|
77
|
+
}
|
|
78
|
+
var off = this.count * FLOATS_PER_INSTANCE;
|
|
79
|
+
var b = this.buffer;
|
|
80
|
+
b[off + 0] = originX;
|
|
81
|
+
b[off + 1] = originY;
|
|
82
|
+
b[off + 2] = sizeX;
|
|
83
|
+
b[off + 3] = sizeY;
|
|
84
|
+
b[off + 4] = u0;
|
|
85
|
+
b[off + 5] = v0;
|
|
86
|
+
b[off + 6] = u1;
|
|
87
|
+
b[off + 7] = v1;
|
|
88
|
+
b[off + 8] = tintR;
|
|
89
|
+
b[off + 9] = tintG;
|
|
90
|
+
b[off + 10] = tintB;
|
|
91
|
+
b[off + 11] = tintA;
|
|
92
|
+
this.count++;
|
|
93
|
+
}
|
|
94
|
+
// Flush the current run via the device-supplied handler. No-op if
|
|
95
|
+
// nothing pending or no atlas selected.
|
|
96
|
+
flush() {
|
|
97
|
+
if (this.count === 0 || !this.currentAtlas)
|
|
98
|
+
return;
|
|
99
|
+
var atlas = this.currentAtlas;
|
|
100
|
+
var blend = this.currentBlend;
|
|
101
|
+
var n = this.count;
|
|
102
|
+
this.flushHandler(atlas, blend, this.buffer, n);
|
|
103
|
+
this.flushCount++;
|
|
104
|
+
this.instanceTotal += n;
|
|
105
|
+
this.count = 0;
|
|
106
|
+
}
|
|
107
|
+
// Final drain - call from endFrame to push the last partial batch.
|
|
108
|
+
endFrame() {
|
|
109
|
+
if (this.count > 0 && this.currentAtlas) {
|
|
110
|
+
this.flush();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Diagnostics. Returned object is owned by the caller; we copy
|
|
114
|
+
// into it to avoid allocating per-frame.
|
|
115
|
+
getStats(out) {
|
|
116
|
+
out.flushCount = this.flushCount;
|
|
117
|
+
out.instanceTotal = this.instanceTotal;
|
|
118
|
+
out.capacity = this.capacity;
|
|
119
|
+
}
|
|
120
|
+
// Test-only inspection helpers. Not part of the public API but
|
|
121
|
+
// exported so the test file can assert internal state without
|
|
122
|
+
// brittle reflection.
|
|
123
|
+
_peekCount() {
|
|
124
|
+
return this.count;
|
|
125
|
+
}
|
|
126
|
+
_peekCurrentAtlas() {
|
|
127
|
+
return this.currentAtlas;
|
|
128
|
+
}
|
|
129
|
+
_peekCurrentBlend() {
|
|
130
|
+
return this.currentBlend;
|
|
131
|
+
}
|
|
132
|
+
_peekBuffer() {
|
|
133
|
+
return this.buffer;
|
|
134
|
+
}
|
|
135
|
+
// Grow by doubling. Float32Array does not resize in place; we
|
|
136
|
+
// allocate a new buffer and copy the live prefix. Triggered when
|
|
137
|
+
// submit overruns capacity.
|
|
138
|
+
grow() {
|
|
139
|
+
var next = this.capacity * 2;
|
|
140
|
+
var b = new Float32Array(next * FLOATS_PER_INSTANCE);
|
|
141
|
+
b.set(this.buffer.subarray(0, this.count * FLOATS_PER_INSTANCE));
|
|
142
|
+
this.buffer = b;
|
|
143
|
+
this.capacity = next;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=sprite-batcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprite-batcher.js","sourceRoot":"","sources":["../../src/renderer/sprite-batcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AtlasDescriptor } from './graphics-device.js';
|
|
2
|
+
export declare class TextureAtlas {
|
|
3
|
+
texture: WebGLTexture | null;
|
|
4
|
+
readonly width: number;
|
|
5
|
+
readonly height: number;
|
|
6
|
+
readonly uvRects: Float32Array;
|
|
7
|
+
readonly frameSizes: Float32Array;
|
|
8
|
+
readonly frameCount: number;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
private sourceImage;
|
|
11
|
+
released: boolean;
|
|
12
|
+
constructor(gl: WebGL2RenderingContext | null, desc: AtlasDescriptor);
|
|
13
|
+
upload(gl: WebGL2RenderingContext): void;
|
|
14
|
+
bind(gl: WebGL2RenderingContext): void;
|
|
15
|
+
handleContextLoss(): void;
|
|
16
|
+
dispose(gl: WebGL2RenderingContext | null): void;
|
|
17
|
+
lookupUVRect(frame: number, out: Float32Array, offset: number): boolean;
|
|
18
|
+
lookupFrameSize(frame: number, out: {
|
|
19
|
+
w: number;
|
|
20
|
+
h: number;
|
|
21
|
+
}): boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function makeParticleDiscAtlas(gl: WebGL2RenderingContext | null): TextureAtlas | null;
|
|
24
|
+
//# sourceMappingURL=texture-atlas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texture-atlas.d.ts","sourceRoot":"","sources":["../../src/renderer/texture-atlas.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,qBAAa,YAAY;IAGvB,OAAO,EAAE,YAAY,GAAG,IAAI,CAAQ;IAKpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAI/B,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;IAElC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAG5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAItB,OAAO,CAAC,WAAW,CAAqD;IAIxE,QAAQ,EAAE,OAAO,CAAS;gBAEd,EAAE,EAAE,sBAAsB,GAAG,IAAI,EAAE,IAAI,EAAE,eAAe;IAmCpE,MAAM,CAAC,EAAE,EAAE,sBAAsB,GAAG,IAAI;IAkCxC,IAAI,CAAC,EAAE,EAAE,sBAAsB,GAAG,IAAI;IAMtC,iBAAiB,IAAI,IAAI;IAIzB,OAAO,CAAC,EAAE,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI;IAWhD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAWvE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;CAOvE;AASD,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,sBAAsB,GAAG,IAAI,GAChC,YAAY,GAAG,IAAI,CAqBrB"}
|