@flighthq/render-gl 0.1.0 → 0.2.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/dist/glDraw.d.ts +4 -1
- package/dist/glDraw.d.ts.map +1 -1
- package/dist/glDraw.js +54 -24
- package/dist/glDraw.js.map +1 -1
- package/dist/glRenderState.d.ts.map +1 -1
- package/dist/glRenderState.js +4 -2
- package/dist/glRenderState.js.map +1 -1
- package/dist/glRenderTargetPool.d.ts.map +1 -1
- package/dist/glRenderTargetPool.js +7 -0
- package/dist/glRenderTargetPool.js.map +1 -1
- package/package.json +10 -5
- package/src/glBackground.test.ts +3 -1
- package/src/glDraw.test.ts +163 -1
- package/src/glRenderTargetPool.test.ts +13 -0
package/dist/glDraw.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import type { GlBitmapShader, GlRenderState } from '@flighthq/types';
|
|
1
|
+
import type { GlBitmapShader, GlBlendRealization, GlRenderState } from '@flighthq/types';
|
|
2
2
|
import { BlendMode } from '@flighthq/types';
|
|
3
3
|
export declare function applyGlBlendMode(state: GlRenderState, blendMode: BlendMode | null): void;
|
|
4
4
|
export declare function bindGlTexture(state: GlRenderState, imageSource: CanvasImageSource): WebGLTexture;
|
|
5
5
|
export declare function createGlTexture(state: GlRenderState): WebGLTexture;
|
|
6
6
|
export declare function drawGlQuad(state: GlRenderState, x0: number, y0: number, x1: number, y1: number, u0: number, v0: number, u1: number, v1: number): void;
|
|
7
7
|
export declare function enableGlBlendModeSupport(state: GlRenderState): void;
|
|
8
|
+
export declare function isBlendModeSupported(state: GlRenderState, blendMode: BlendMode): boolean;
|
|
9
|
+
export declare function registerDefaultGlBlendModes(state: GlRenderState): void;
|
|
10
|
+
export declare function registerGlBlendMode(state: GlRenderState, blendMode: BlendMode, realization: GlBlendRealization): void;
|
|
8
11
|
export declare function setGlQuadMatrixFromOffset(state: GlRenderState, a: number, b: number, c: number, d: number, tx: number, ty: number, dx: number, dy: number): void;
|
|
9
12
|
export declare function updateGlTexture(state: GlRenderState, texture: WebGLTexture, canvas: HTMLCanvasElement): void;
|
|
10
13
|
export declare function useGlProgram(state: GlRenderState, shader?: GlBitmapShader): void;
|
package/dist/glDraw.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glDraw.d.ts","sourceRoot":"","sources":["../src/glDraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"glDraw.d.ts","sourceRoot":"","sources":["../src/glDraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAQxF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,GAAG,YAAY,CA2BhG;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,CAYlE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI,CA0BN;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAGnE;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAExF;AAKD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEtE;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAGrH;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EACpB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI,CAcN;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAW5G;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAShF"}
|
package/dist/glDraw.js
CHANGED
|
@@ -1,35 +1,20 @@
|
|
|
1
1
|
import { BlendMode } from '@flighthq/types';
|
|
2
2
|
import { getGlRenderStateRuntime } from './glRenderState';
|
|
3
3
|
import { setGlAttributes, setGlMatrixFromValues } from './glShader';
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
const WEBGL_BLEND_MODE = {
|
|
10
|
-
[BlendMode.Add]: ['ONE', 'ONE'],
|
|
11
|
-
[BlendMode.Alpha]: null,
|
|
12
|
-
[BlendMode.Darken]: null,
|
|
13
|
-
[BlendMode.Difference]: null,
|
|
14
|
-
[BlendMode.Erase]: null,
|
|
15
|
-
[BlendMode.Hardlight]: null,
|
|
16
|
-
[BlendMode.Invert]: null,
|
|
17
|
-
[BlendMode.Layer]: NORMAL_BLEND,
|
|
18
|
-
[BlendMode.Lighten]: null,
|
|
19
|
-
[BlendMode.Multiply]: null,
|
|
20
|
-
[BlendMode.Normal]: NORMAL_BLEND,
|
|
21
|
-
[BlendMode.Overlay]: null,
|
|
22
|
-
[BlendMode.Screen]: null,
|
|
23
|
-
[BlendMode.Shader]: null,
|
|
24
|
-
[BlendMode.Subtract]: null,
|
|
25
|
-
};
|
|
4
|
+
// Applies the blend mode's registered fixed-function realization to the GL context, skipping the
|
|
5
|
+
// work when the mode is unchanged. A mode with no registered realization (an unregistered vendor
|
|
6
|
+
// mode, or a built-in with no fixed-function equivalent such as Overlay) degrades to normal
|
|
7
|
+
// premultiplied compositing. Register realizations with registerGlBlendMode /
|
|
8
|
+
// registerDefaultGlBlendModes before drawing.
|
|
26
9
|
export function applyGlBlendMode(state, blendMode) {
|
|
27
10
|
const runtime = getGlRenderStateRuntime(state);
|
|
28
11
|
if (blendMode === runtime.currentBlendMode)
|
|
29
12
|
return;
|
|
30
13
|
runtime.currentBlendMode = blendMode;
|
|
31
|
-
const
|
|
32
|
-
|
|
14
|
+
const gl = state.gl;
|
|
15
|
+
const realization = (blendMode !== null ? runtime.glBlendModeRegistry?.get(blendMode) : null) ?? NORMAL_BLEND;
|
|
16
|
+
gl.blendEquation(gl[realization.equation ?? 'FUNC_ADD']);
|
|
17
|
+
gl.blendFunc(gl[realization.src], gl[realization.dst]);
|
|
33
18
|
}
|
|
34
19
|
export function bindGlTexture(state, imageSource) {
|
|
35
20
|
const runtime = getGlRenderStateRuntime(state);
|
|
@@ -101,8 +86,29 @@ export function drawGlQuad(state, x0, y0, x1, y1, u0, v0, u1, v1) {
|
|
|
101
86
|
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
|
|
102
87
|
}
|
|
103
88
|
export function enableGlBlendModeSupport(state) {
|
|
89
|
+
registerDefaultGlBlendModes(state);
|
|
104
90
|
state.applyBlendMode = applyGlBlendMode;
|
|
105
91
|
}
|
|
92
|
+
// Reports whether the render state has a fixed-function realization registered for the mode. A false
|
|
93
|
+
// result means applyGlBlendMode would fall back to normal compositing for it — either an unregistered
|
|
94
|
+
// vendor mode or a built-in (Overlay, HardLight, Difference, Invert) that needs a shader pass.
|
|
95
|
+
export function isBlendModeSupported(state, blendMode) {
|
|
96
|
+
return getGlRenderStateRuntime(state).glBlendModeRegistry?.has(blendMode) ?? false;
|
|
97
|
+
}
|
|
98
|
+
// Registers the built-in fixed-function blend modes on the state. Overlay/HardLight/Difference/Invert
|
|
99
|
+
// are intentionally omitted — they have no fixed-function equivalent and need a shader pass — so they
|
|
100
|
+
// stay unregistered and fall back to normal compositing.
|
|
101
|
+
export function registerDefaultGlBlendModes(state) {
|
|
102
|
+
for (const [mode, realization] of DEFAULT_GL_BLEND_MODES)
|
|
103
|
+
registerGlBlendMode(state, mode, realization);
|
|
104
|
+
}
|
|
105
|
+
// Binds a fixed-function realization to a blend mode on this render state. Last-write-wins, so a
|
|
106
|
+
// caller can override a built-in mode or add a vendor-prefixed one; the registry is created lazily on
|
|
107
|
+
// first registration so a state that never enables blend support carries no map.
|
|
108
|
+
export function registerGlBlendMode(state, blendMode, realization) {
|
|
109
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
110
|
+
(runtime.glBlendModeRegistry ??= new Map()).set(blendMode, realization);
|
|
111
|
+
}
|
|
106
112
|
export function setGlQuadMatrixFromOffset(state, a, b, c, d, tx, ty, dx, dy) {
|
|
107
113
|
const runtime = getGlRenderStateRuntime(state);
|
|
108
114
|
setGlMatrixFromValues(state.gl, runtime.shaderLoc, runtime.matrixArray, a, b, c, d, tx + a * dx + c * dy, ty + b * dx + d * dy, runtime.renderTargetViewport ?? state.canvas);
|
|
@@ -129,4 +135,28 @@ export function useGlProgram(state, shader) {
|
|
|
129
135
|
runtime.currentProgram = program;
|
|
130
136
|
}
|
|
131
137
|
}
|
|
138
|
+
const NORMAL_BLEND = { src: 'ONE', dst: 'ONE_MINUS_SRC_ALPHA' };
|
|
139
|
+
// The built-in blend modes registerDefaultGlBlendModes installs, each with its fixed-function
|
|
140
|
+
// realization. Overlay/HardLight/Difference/Invert are deliberately absent — they have no
|
|
141
|
+
// fixed-function equivalent and need a shader pass.
|
|
142
|
+
const DEFAULT_GL_BLEND_MODES = [
|
|
143
|
+
[BlendMode.Add, { src: 'ONE', dst: 'ONE' }],
|
|
144
|
+
[BlendMode.Darken, { src: 'ONE', dst: 'ONE', equation: 'MIN' }],
|
|
145
|
+
[BlendMode.Erase, { src: 'ZERO', dst: 'ONE_MINUS_SRC_ALPHA' }],
|
|
146
|
+
[BlendMode.Layer, NORMAL_BLEND],
|
|
147
|
+
[BlendMode.Lighten, { src: 'ONE', dst: 'ONE', equation: 'MAX' }],
|
|
148
|
+
// Premultiplied multiply: result = src.rgb*dst + dst*(1-src.a). The (1-src.a) term restores the
|
|
149
|
+
// destination where the source is transparent or partially covered (antialiased edges, the quad's
|
|
150
|
+
// transparent surround), so those pixels leave the backdrop untouched instead of multiplying it
|
|
151
|
+
// toward black — the straight-alpha (DST_COLOR, ZERO) form fringes there because this pipeline
|
|
152
|
+
// uploads and shades premultiplied. Exact for an opaque backdrop.
|
|
153
|
+
[BlendMode.Multiply, { src: 'DST_COLOR', dst: 'ONE_MINUS_SRC_ALPHA' }],
|
|
154
|
+
// No blending: result = src (the premultiplied source replaces the destination). For opaque
|
|
155
|
+
// content this matches Normal; unlike Normal it does not composite, so semi-transparent source
|
|
156
|
+
// pixels overwrite the backdrop instead of blending over it.
|
|
157
|
+
[BlendMode.None, { src: 'ONE', dst: 'ZERO' }],
|
|
158
|
+
[BlendMode.Normal, NORMAL_BLEND],
|
|
159
|
+
[BlendMode.Screen, { src: 'ONE', dst: 'ONE_MINUS_SRC_COLOR' }],
|
|
160
|
+
[BlendMode.Subtract, { src: 'ONE', dst: 'ONE', equation: 'FUNC_REVERSE_SUBTRACT' }],
|
|
161
|
+
];
|
|
132
162
|
//# sourceMappingURL=glDraw.js.map
|
package/dist/glDraw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glDraw.js","sourceRoot":"","sources":["../src/glDraw.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"glDraw.js","sourceRoot":"","sources":["../src/glDraw.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEpE,iGAAiG;AACjG,iGAAiG;AACjG,4FAA4F;AAC5F,8EAA8E;AAC9E,8CAA8C;AAC9C,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,SAA2B;IAChF,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,OAAO,CAAC,gBAAgB;QAAE,OAAO;IACnD,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,WAAW,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;IAC9G,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC;IACzD,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAoB,EAAE,WAA8B;IAChF,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QAC7D,OAAO,GAAG,EAAE,CAAC,aAAa,EAAG,CAAC;QAC9B,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC/D,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC/D,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;QACrE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;QACrE,4FAA4F;QAC5F,yFAAyF;QACzF,4FAA4F;QAC5F,8FAA8F;QAC9F,4FAA4F;QAC5F,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAC;QACxD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,WAA6B,CAAC,CAAC;QACnG,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;QAC9C,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IAC7D,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,EAAG,CAAC;IACpC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC/D,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC/D,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;IACrE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;IACrE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAoB,EACpB,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU;IAEV,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACjF,MAAM,CAAC,GAAG,cAAc,CAAC;IACzB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACX,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACX,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACX,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACX,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACX,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACX,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACjD,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC/B,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAoB;IAC3D,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACnC,KAAK,CAAC,cAAc,GAAG,gBAAgB,CAAC;AAC1C,CAAC;AAED,qGAAqG;AACrG,sGAAsG;AACtG,+FAA+F;AAC/F,MAAM,UAAU,oBAAoB,CAAC,KAAoB,EAAE,SAAoB;IAC7E,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;AACrF,CAAC;AAED,sGAAsG;AACtG,sGAAsG;AACtG,yDAAyD;AACzD,MAAM,UAAU,2BAA2B,CAAC,KAAoB;IAC9D,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,sBAAsB;QAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC1G,CAAC;AAED,iGAAiG;AACjG,sGAAsG;AACtG,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,KAAoB,EAAE,SAAoB,EAAE,WAA+B;IAC7G,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,OAAO,CAAC,mBAAmB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAoB,EACpB,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAS,EACT,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU;IAEV,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,qBAAqB,CACnB,KAAK,CAAC,EAAE,EACR,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,WAAW,EACnB,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EACpB,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EACpB,OAAO,CAAC,oBAAoB,IAAI,KAAK,CAAC,MAAM,CAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAE,OAAqB,EAAE,MAAyB;IACpG,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;QACvC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;IACnC,CAAC;IACD,0EAA0E;IAC1E,0FAA0F;IAC1F,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAC;IACxD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAoB,EAAE,MAAuB;IACxE,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IACvD,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;QACvC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAuB,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC;AAEpF,8FAA8F;AAC9F,0FAA0F;AAC1F,oDAAoD;AACpD,MAAM,sBAAsB,GAA0D;IACpF,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC;IAC9D,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC;IAC/B,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChE,gGAAgG;IAChG,kGAAkG;IAClG,gGAAgG;IAChG,+FAA+F;IAC/F,kEAAkE;IAClE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC;IACtE,4FAA4F;IAC5F,+FAA+F;IAC/F,6DAA6D;IAC7D,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;IAChC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC;IAC9D,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC;CACpF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderState.d.ts","sourceRoot":"","sources":["../src/glRenderState.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAK5F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"glRenderState.d.ts","sourceRoot":"","sources":["../src/glRenderState.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAK5F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,aAAa,CA4EpH;AAMD,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAeD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAsB/D;AAID,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,CAElF;AAcD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CASvE"}
|
package/dist/glRenderState.js
CHANGED
|
@@ -57,6 +57,8 @@ export function createGlRenderState(canvas, options = {}) {
|
|
|
57
57
|
runtime.spriteBatchInstanceBuffer = null;
|
|
58
58
|
runtime.spriteBatchInstanceData = new Float32Array(13 * 256);
|
|
59
59
|
runtime.spriteBatchTexture = null;
|
|
60
|
+
// Color-adjustment fold state (mode/data/buffer + the compiled programs) is not allocated here: it
|
|
61
|
+
// is owned by the opt-in enableGlColorAdjustment, so a state that never tints carries none of it.
|
|
60
62
|
runtime.textureCache = new WeakMap();
|
|
61
63
|
runtime.quadVertexBuffer = quadVertexBuffer;
|
|
62
64
|
runtime.quadIndexBuffer = quadIndexBuffer;
|
|
@@ -98,8 +100,6 @@ export function destroyGlRenderState(state) {
|
|
|
98
100
|
programs.add(runtime.shaderLoc.program);
|
|
99
101
|
if (runtime.defaultBitmapShader)
|
|
100
102
|
programs.add(runtime.defaultBitmapShader.program);
|
|
101
|
-
if (runtime.colorTransformBitmapShader)
|
|
102
|
-
programs.add(runtime.colorTransformBitmapShader.program);
|
|
103
103
|
if (runtime.particleShader)
|
|
104
104
|
programs.add(runtime.particleShader.program);
|
|
105
105
|
if (runtime.quadBatchShader)
|
|
@@ -122,6 +122,8 @@ export function destroyGlRenderState(state) {
|
|
|
122
122
|
gl.deleteBuffer(runtime.spriteBatchInstanceBuffer);
|
|
123
123
|
if (runtime.spriteBatchMaterialBuffer)
|
|
124
124
|
gl.deleteBuffer(runtime.spriteBatchMaterialBuffer);
|
|
125
|
+
if (runtime.spriteBatchColorTransformBuffer)
|
|
126
|
+
gl.deleteBuffer(runtime.spriteBatchColorTransformBuffer);
|
|
125
127
|
}
|
|
126
128
|
// Resolves the package-private GPU runtime attached to a GlRenderState. Mutable by design: the
|
|
127
129
|
// render path writes its fields every frame.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderState.js","sourceRoot":"","sources":["../src/glRenderState.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"glRenderState.js","sourceRoot":"","sources":["../src/glRenderState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderTargetPool.d.ts","sourceRoot":"","sources":["../src/glRenderTargetPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"glRenderTargetPool.d.ts","sourceRoot":"","sources":["../src/glRenderTargetPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAcjH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,kBAAkB,EACxB,UAAU,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAC3C,cAAc,CAoBhB;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAG9F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAE5F"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { clearGlRenderTarget } from './glFullscreenPass';
|
|
1
2
|
import { createGlRenderTarget, destroyGlRenderTarget } from './glRenderTarget';
|
|
2
3
|
// Lends reusable intermediate targets to multi-pass effect recipes. acquire/release are paired
|
|
3
4
|
// brackets: every acquireGlRenderTarget must have a matching releaseGlRenderTarget. A released
|
|
4
5
|
// target returns to the free list (its GPU storage is kept) rather than being destroyed.
|
|
6
|
+
//
|
|
7
|
+
// Acquired targets are handed back clean: a reused target is cleared before return so a non-covering
|
|
8
|
+
// pass never composites onto a previous user's contents (a freshly created target is already zeroed by
|
|
9
|
+
// the GL implementation). Clean surfaces are the default; skipping the clear would be an opt-in
|
|
10
|
+
// optimization for provably-covering consumers, not the baseline behavior.
|
|
5
11
|
export function acquireGlRenderTarget(state, pool, descriptor) {
|
|
6
12
|
const w = Math.max(1, Math.ceil(descriptor.width));
|
|
7
13
|
const h = Math.max(1, Math.ceil(descriptor.height));
|
|
@@ -14,6 +20,7 @@ export function acquireGlRenderTarget(state, pool, descriptor) {
|
|
|
14
20
|
candidate.format === format &&
|
|
15
21
|
candidate.sampleCount === sampleCount) {
|
|
16
22
|
pool.free.splice(i, 1);
|
|
23
|
+
clearGlRenderTarget(state, candidate);
|
|
17
24
|
return candidate;
|
|
18
25
|
}
|
|
19
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderTargetPool.js","sourceRoot":"","sources":["../src/glRenderTargetPool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,+FAA+F;AAC/F,+FAA+F;AAC/F,yFAAyF;
|
|
1
|
+
{"version":3,"file":"glRenderTargetPool.js","sourceRoot":"","sources":["../src/glRenderTargetPool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,+FAA+F;AAC/F,+FAA+F;AAC/F,yFAAyF;AACzF,EAAE;AACF,qGAAqG;AACrG,uGAAuG;AACvG,gGAAgG;AAChG,2EAA2E;AAE3E,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,IAAwB,EACxB,UAA4C;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,OAAO,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,IACE,SAAS,CAAC,KAAK,KAAK,CAAC;YACrB,SAAS,CAAC,MAAM,KAAK,CAAC;YACtB,SAAS,CAAC,MAAM,KAAK,MAAM;YAC3B,SAAS,CAAC,WAAW,KAAK,WAAW,EACrC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAoB,EAAE,IAAwB;IACtF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI;QAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAwB,EAAE,MAAsB;IACpF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/render-gl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/flighthq/flight.git",
|
|
7
|
+
"directory": "packages/render-gl"
|
|
8
|
+
},
|
|
4
9
|
"type": "module",
|
|
5
10
|
"main": "dist/index.js",
|
|
6
11
|
"types": "dist/index.d.ts",
|
|
@@ -27,10 +32,10 @@
|
|
|
27
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
28
33
|
},
|
|
29
34
|
"dependencies": {
|
|
30
|
-
"@flighthq/displayobject": "0.
|
|
31
|
-
"@flighthq/geometry": "0.
|
|
32
|
-
"@flighthq/render": "0.
|
|
33
|
-
"@flighthq/types": "0.
|
|
35
|
+
"@flighthq/displayobject": "0.2.0",
|
|
36
|
+
"@flighthq/geometry": "0.2.0",
|
|
37
|
+
"@flighthq/render": "0.2.0",
|
|
38
|
+
"@flighthq/types": "0.2.0"
|
|
34
39
|
},
|
|
35
40
|
"devDependencies": {
|
|
36
41
|
"typescript": "^5.3.0"
|
package/src/glBackground.test.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BlendMode } from '@flighthq/types';
|
|
2
|
+
|
|
1
3
|
import { renderGlBackground } from './glBackground';
|
|
2
4
|
import { getGlRenderStateRuntime } from './glRenderState';
|
|
3
5
|
import { createGlState } from './glTestHelper';
|
|
@@ -30,7 +32,7 @@ describe('renderGlBackground', () => {
|
|
|
30
32
|
it('resets currentBlendMode to null', () => {
|
|
31
33
|
const { state } = createGlState();
|
|
32
34
|
const runtime = getGlRenderStateRuntime(state);
|
|
33
|
-
runtime.currentBlendMode =
|
|
35
|
+
runtime.currentBlendMode = BlendMode.Add;
|
|
34
36
|
renderGlBackground(state);
|
|
35
37
|
expect(runtime.currentBlendMode).toBeNull();
|
|
36
38
|
});
|
package/src/glDraw.test.ts
CHANGED
|
@@ -6,6 +6,9 @@ import {
|
|
|
6
6
|
createGlTexture,
|
|
7
7
|
drawGlQuad,
|
|
8
8
|
enableGlBlendModeSupport,
|
|
9
|
+
isBlendModeSupported,
|
|
10
|
+
registerDefaultGlBlendModes,
|
|
11
|
+
registerGlBlendMode,
|
|
9
12
|
setGlQuadMatrixFromOffset,
|
|
10
13
|
updateGlTexture,
|
|
11
14
|
useGlProgram,
|
|
@@ -17,6 +20,7 @@ import { createGlState } from './glTestHelper';
|
|
|
17
20
|
describe('applyGlBlendMode', () => {
|
|
18
21
|
it('does not call blendFunc when blend mode has not changed', () => {
|
|
19
22
|
const { state, gl } = createGlState();
|
|
23
|
+
registerDefaultGlBlendModes(state);
|
|
20
24
|
getGlRenderStateRuntime(state).currentBlendMode = BlendMode.Normal;
|
|
21
25
|
applyGlBlendMode(state, BlendMode.Normal);
|
|
22
26
|
expect(gl.blendFunc).not.toHaveBeenCalled();
|
|
@@ -24,6 +28,7 @@ describe('applyGlBlendMode', () => {
|
|
|
24
28
|
|
|
25
29
|
it('sets normal blend (ONE, ONE_MINUS_SRC_ALPHA) for BlendMode.Normal', () => {
|
|
26
30
|
const { state, gl } = createGlState();
|
|
31
|
+
registerDefaultGlBlendModes(state);
|
|
27
32
|
applyGlBlendMode(state, BlendMode.Normal);
|
|
28
33
|
const g = gl as unknown as { ONE: number; ONE_MINUS_SRC_ALPHA: number };
|
|
29
34
|
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE_MINUS_SRC_ALPHA);
|
|
@@ -31,12 +36,89 @@ describe('applyGlBlendMode', () => {
|
|
|
31
36
|
|
|
32
37
|
it('sets additive blend (ONE, ONE) for BlendMode.Add', () => {
|
|
33
38
|
const { state, gl } = createGlState();
|
|
39
|
+
registerDefaultGlBlendModes(state);
|
|
34
40
|
applyGlBlendMode(state, BlendMode.Add);
|
|
35
41
|
const g = gl as unknown as { ONE: number };
|
|
36
42
|
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE);
|
|
37
43
|
});
|
|
38
44
|
|
|
39
|
-
it('
|
|
45
|
+
it('sets (DST_COLOR, ONE_MINUS_SRC_ALPHA) for BlendMode.Multiply', () => {
|
|
46
|
+
const { state, gl } = createGlState();
|
|
47
|
+
registerDefaultGlBlendModes(state);
|
|
48
|
+
applyGlBlendMode(state, BlendMode.Multiply);
|
|
49
|
+
const g = gl as unknown as { DST_COLOR: number; ONE_MINUS_SRC_ALPHA: number };
|
|
50
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.DST_COLOR, g.ONE_MINUS_SRC_ALPHA);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('sets (ONE, ZERO) for BlendMode.None', () => {
|
|
54
|
+
const { state, gl } = createGlState();
|
|
55
|
+
registerDefaultGlBlendModes(state);
|
|
56
|
+
applyGlBlendMode(state, BlendMode.None);
|
|
57
|
+
const g = gl as unknown as { ONE: number; ZERO: number };
|
|
58
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ZERO);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('sets (ONE, ONE_MINUS_SRC_COLOR) for BlendMode.Screen', () => {
|
|
62
|
+
const { state, gl } = createGlState();
|
|
63
|
+
registerDefaultGlBlendModes(state);
|
|
64
|
+
applyGlBlendMode(state, BlendMode.Screen);
|
|
65
|
+
const g = gl as unknown as { ONE: number; ONE_MINUS_SRC_COLOR: number };
|
|
66
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE_MINUS_SRC_COLOR);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('sets the MIN blend equation with (ONE, ONE) for BlendMode.Darken', () => {
|
|
70
|
+
const { state, gl } = createGlState();
|
|
71
|
+
registerDefaultGlBlendModes(state);
|
|
72
|
+
applyGlBlendMode(state, BlendMode.Darken);
|
|
73
|
+
const g = gl as unknown as { ONE: number; MIN: number };
|
|
74
|
+
expect(gl.blendEquation).toHaveBeenCalledWith(g.MIN);
|
|
75
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('sets the MAX blend equation with (ONE, ONE) for BlendMode.Lighten', () => {
|
|
79
|
+
const { state, gl } = createGlState();
|
|
80
|
+
registerDefaultGlBlendModes(state);
|
|
81
|
+
applyGlBlendMode(state, BlendMode.Lighten);
|
|
82
|
+
const g = gl as unknown as { ONE: number; MAX: number };
|
|
83
|
+
expect(gl.blendEquation).toHaveBeenCalledWith(g.MAX);
|
|
84
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('sets the reverse-subtract equation with (ONE, ONE) for BlendMode.Subtract', () => {
|
|
88
|
+
const { state, gl } = createGlState();
|
|
89
|
+
registerDefaultGlBlendModes(state);
|
|
90
|
+
applyGlBlendMode(state, BlendMode.Subtract);
|
|
91
|
+
const g = gl as unknown as { ONE: number; FUNC_REVERSE_SUBTRACT: number };
|
|
92
|
+
expect(gl.blendEquation).toHaveBeenCalledWith(g.FUNC_REVERSE_SUBTRACT);
|
|
93
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('sets (ZERO, ONE_MINUS_SRC_ALPHA) for BlendMode.Erase', () => {
|
|
97
|
+
const { state, gl } = createGlState();
|
|
98
|
+
registerDefaultGlBlendModes(state);
|
|
99
|
+
applyGlBlendMode(state, BlendMode.Erase);
|
|
100
|
+
const g = gl as unknown as { ZERO: number; ONE_MINUS_SRC_ALPHA: number };
|
|
101
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ZERO, g.ONE_MINUS_SRC_ALPHA);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('resets the blend equation to FUNC_ADD for a mode that does not carry one', () => {
|
|
105
|
+
const { state, gl } = createGlState();
|
|
106
|
+
registerDefaultGlBlendModes(state);
|
|
107
|
+
applyGlBlendMode(state, BlendMode.Darken);
|
|
108
|
+
applyGlBlendMode(state, BlendMode.Normal);
|
|
109
|
+
const g = gl as unknown as { FUNC_ADD: number };
|
|
110
|
+
expect(gl.blendEquation).toHaveBeenLastCalledWith(g.FUNC_ADD);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('falls back to normal blend for a mode with no registered realization', () => {
|
|
114
|
+
const { state, gl } = createGlState();
|
|
115
|
+
registerDefaultGlBlendModes(state);
|
|
116
|
+
applyGlBlendMode(state, BlendMode.Overlay);
|
|
117
|
+
const g = gl as unknown as { ONE: number; ONE_MINUS_SRC_ALPHA: number };
|
|
118
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ONE, g.ONE_MINUS_SRC_ALPHA);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('falls back to normal blend when no modes are registered at all', () => {
|
|
40
122
|
const { state, gl } = createGlState();
|
|
41
123
|
applyGlBlendMode(state, BlendMode.Multiply);
|
|
42
124
|
const g = gl as unknown as { ONE: number; ONE_MINUS_SRC_ALPHA: number };
|
|
@@ -45,12 +127,14 @@ describe('applyGlBlendMode', () => {
|
|
|
45
127
|
|
|
46
128
|
it('updates currentBlendMode after the change', () => {
|
|
47
129
|
const { state } = createGlState();
|
|
130
|
+
registerDefaultGlBlendModes(state);
|
|
48
131
|
applyGlBlendMode(state, BlendMode.Add);
|
|
49
132
|
expect(getGlRenderStateRuntime(state).currentBlendMode).toBe(BlendMode.Add);
|
|
50
133
|
});
|
|
51
134
|
|
|
52
135
|
it('calls blendFunc again when mode switches', () => {
|
|
53
136
|
const { state, gl } = createGlState();
|
|
137
|
+
registerDefaultGlBlendModes(state);
|
|
54
138
|
applyGlBlendMode(state, BlendMode.Normal);
|
|
55
139
|
applyGlBlendMode(state, BlendMode.Add);
|
|
56
140
|
expect(gl.blendFunc).toHaveBeenCalledTimes(2);
|
|
@@ -242,6 +326,84 @@ describe('enableGlBlendModeSupport', () => {
|
|
|
242
326
|
state.applyBlendMode!(state, BlendMode.Add);
|
|
243
327
|
expect(gl.blendFunc).toHaveBeenCalled();
|
|
244
328
|
});
|
|
329
|
+
|
|
330
|
+
it('registers the default blend modes', () => {
|
|
331
|
+
const { state } = createGlState();
|
|
332
|
+
enableGlBlendModeSupport(state);
|
|
333
|
+
expect(isBlendModeSupported(state, BlendMode.Multiply)).toBe(true);
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
describe('isBlendModeSupported', () => {
|
|
338
|
+
it('returns false when no modes are registered', () => {
|
|
339
|
+
const { state } = createGlState();
|
|
340
|
+
expect(isBlendModeSupported(state, BlendMode.Normal)).toBe(false);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it('returns true for a registered built-in mode', () => {
|
|
344
|
+
const { state } = createGlState();
|
|
345
|
+
registerDefaultGlBlendModes(state);
|
|
346
|
+
expect(isBlendModeSupported(state, BlendMode.Screen)).toBe(true);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('returns false for a built-in with no fixed-function realization', () => {
|
|
350
|
+
const { state } = createGlState();
|
|
351
|
+
registerDefaultGlBlendModes(state);
|
|
352
|
+
expect(isBlendModeSupported(state, BlendMode.Overlay)).toBe(false);
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it('returns true for a custom registered mode', () => {
|
|
356
|
+
const { state } = createGlState();
|
|
357
|
+
registerGlBlendMode(state, 'acme.Foo', { src: 'ONE', dst: 'ZERO' });
|
|
358
|
+
expect(isBlendModeSupported(state, 'acme.Foo')).toBe(true);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
describe('registerDefaultGlBlendModes', () => {
|
|
363
|
+
it('registers the tier-1 fixed-function modes', () => {
|
|
364
|
+
const { state } = createGlState();
|
|
365
|
+
registerDefaultGlBlendModes(state);
|
|
366
|
+
for (const mode of [
|
|
367
|
+
BlendMode.Normal,
|
|
368
|
+
BlendMode.Layer,
|
|
369
|
+
BlendMode.Add,
|
|
370
|
+
BlendMode.Multiply,
|
|
371
|
+
BlendMode.Screen,
|
|
372
|
+
BlendMode.Darken,
|
|
373
|
+
BlendMode.Lighten,
|
|
374
|
+
BlendMode.Subtract,
|
|
375
|
+
BlendMode.Erase,
|
|
376
|
+
]) {
|
|
377
|
+
expect(isBlendModeSupported(state, mode)).toBe(true);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('does not register the shader-only modes', () => {
|
|
382
|
+
const { state } = createGlState();
|
|
383
|
+
registerDefaultGlBlendModes(state);
|
|
384
|
+
for (const mode of [BlendMode.Overlay, BlendMode.HardLight, BlendMode.Difference, BlendMode.Invert]) {
|
|
385
|
+
expect(isBlendModeSupported(state, mode)).toBe(false);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
describe('registerGlBlendMode', () => {
|
|
391
|
+
it('makes a custom mode applied through gl.blendFunc', () => {
|
|
392
|
+
const { state, gl } = createGlState();
|
|
393
|
+
registerGlBlendMode(state, 'acme.Foo', { src: 'DST_COLOR', dst: 'ZERO' });
|
|
394
|
+
applyGlBlendMode(state, 'acme.Foo');
|
|
395
|
+
const g = gl as unknown as { DST_COLOR: number; ZERO: number };
|
|
396
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.DST_COLOR, g.ZERO);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it('overrides a built-in mode last-write-wins', () => {
|
|
400
|
+
const { state, gl } = createGlState();
|
|
401
|
+
registerDefaultGlBlendModes(state);
|
|
402
|
+
registerGlBlendMode(state, BlendMode.Add, { src: 'ZERO', dst: 'ONE' });
|
|
403
|
+
applyGlBlendMode(state, BlendMode.Add);
|
|
404
|
+
const g = gl as unknown as { ONE: number; ZERO: number };
|
|
405
|
+
expect(gl.blendFunc).toHaveBeenCalledWith(g.ZERO, g.ONE);
|
|
406
|
+
});
|
|
245
407
|
});
|
|
246
408
|
|
|
247
409
|
describe('setGlQuadMatrixFromOffset', () => {
|
|
@@ -49,6 +49,19 @@ describe('acquireGlRenderTarget', () => {
|
|
|
49
49
|
const reused = acquireGlRenderTarget(state, pool, { width: 10.9, height: 0.4 });
|
|
50
50
|
expect(reused).toBe(first);
|
|
51
51
|
});
|
|
52
|
+
|
|
53
|
+
it('clears a reused target so it is handed back clean', () => {
|
|
54
|
+
const { state, gl } = createGlState();
|
|
55
|
+
const pool = createGlRenderTargetPool();
|
|
56
|
+
const first = acquireGlRenderTarget(state, pool, { width: 64, height: 48 });
|
|
57
|
+
releaseGlRenderTarget(pool, first);
|
|
58
|
+
|
|
59
|
+
// Only the reuse path clears — spy after the first (fresh) acquire so we measure just the reuse.
|
|
60
|
+
const clearSpy = vi.spyOn(gl, 'clear');
|
|
61
|
+
const reused = acquireGlRenderTarget(state, pool, { width: 64, height: 48 });
|
|
62
|
+
expect(reused).toBe(first);
|
|
63
|
+
expect(clearSpy).toHaveBeenCalled();
|
|
64
|
+
});
|
|
52
65
|
});
|
|
53
66
|
|
|
54
67
|
describe('createGlRenderTargetPool', () => {
|