@flighthq/render-gl 0.1.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/glBackground.d.ts +3 -0
- package/dist/glBackground.d.ts.map +1 -0
- package/dist/glBackground.js +17 -0
- package/dist/glBackground.js.map +1 -0
- package/dist/glDraw.d.ts +11 -0
- package/dist/glDraw.d.ts.map +1 -0
- package/dist/glDraw.js +132 -0
- package/dist/glDraw.js.map +1 -0
- package/dist/glElement.d.ts +2 -0
- package/dist/glElement.d.ts.map +1 -0
- package/dist/glElement.js +9 -0
- package/dist/glElement.js.map +1 -0
- package/dist/glFullscreenPass.d.ts +11 -0
- package/dist/glFullscreenPass.d.ts.map +1 -0
- package/dist/glFullscreenPass.js +114 -0
- package/dist/glFullscreenPass.js.map +1 -0
- package/dist/glMaterialRegistry.d.ts +5 -0
- package/dist/glMaterialRegistry.d.ts.map +1 -0
- package/dist/glMaterialRegistry.js +25 -0
- package/dist/glMaterialRegistry.js.map +1 -0
- package/dist/glProgram.d.ts +4 -0
- package/dist/glProgram.d.ts.map +1 -0
- package/dist/glProgram.js +37 -0
- package/dist/glProgram.js.map +1 -0
- package/dist/glReadback.d.ts +3 -0
- package/dist/glReadback.d.ts.map +1 -0
- package/dist/glReadback.js +33 -0
- package/dist/glReadback.js.map +1 -0
- package/dist/glRenderState.d.ts +7 -0
- package/dist/glRenderState.d.ts.map +1 -0
- package/dist/glRenderState.js +153 -0
- package/dist/glRenderState.js.map +1 -0
- package/dist/glRenderTarget.d.ts +41 -0
- package/dist/glRenderTarget.d.ts.map +1 -0
- package/dist/glRenderTarget.js +284 -0
- package/dist/glRenderTarget.js.map +1 -0
- package/dist/glRenderTargetPool.d.ts +6 -0
- package/dist/glRenderTargetPool.d.ts.map +1 -0
- package/dist/glRenderTargetPool.js +33 -0
- package/dist/glRenderTargetPool.js.map +1 -0
- package/dist/glShader.d.ts +39 -0
- package/dist/glShader.d.ts.map +1 -0
- package/dist/glShader.js +116 -0
- package/dist/glShader.js.map +1 -0
- package/dist/glShaderBinding.d.ts +21 -0
- package/dist/glShaderBinding.d.ts.map +1 -0
- package/dist/glShaderBinding.js +60 -0
- package/dist/glShaderBinding.js.map +1 -0
- package/dist/glShaderRegistry.d.ts +5 -0
- package/dist/glShaderRegistry.d.ts.map +1 -0
- package/dist/glShaderRegistry.js +6 -0
- package/dist/glShaderRegistry.js.map +1 -0
- package/dist/glShaderTypes.d.ts +2 -0
- package/dist/glShaderTypes.d.ts.map +1 -0
- package/dist/glShaderTypes.js +2 -0
- package/dist/glShaderTypes.js.map +1 -0
- package/dist/glTestHelper.d.ts +14 -0
- package/dist/glTestHelper.d.ts.map +1 -0
- package/dist/glTestHelper.js +69 -0
- package/dist/glTestHelper.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -0
- package/package.json +40 -0
- package/src/glBackground.test.ts +43 -0
- package/src/glDraw.test.ts +360 -0
- package/src/glElement.test.ts +38 -0
- package/src/glFullscreenPass.test.ts +185 -0
- package/src/glMaterialRegistry.test.ts +48 -0
- package/src/glProgram.test.ts +59 -0
- package/src/glReadback.test.ts +82 -0
- package/src/glRenderState.test.ts +186 -0
- package/src/glRenderTarget.test.ts +317 -0
- package/src/glRenderTargetPool.test.ts +97 -0
- package/src/glShader.test.ts +331 -0
- package/src/glShaderBinding.test.ts +149 -0
- package/src/glShaderRegistry.test.ts +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glBackground.d.ts","sourceRoot":"","sources":["../src/glBackground.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAa7D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getGlRenderStateRuntime } from './glRenderState';
|
|
2
|
+
export function renderGlBackground(state) {
|
|
3
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
4
|
+
const gl = state.gl;
|
|
5
|
+
const viewport = runtime.renderTargetViewport ?? state.canvas;
|
|
6
|
+
gl.viewport(0, 0, viewport.width, viewport.height);
|
|
7
|
+
const rgba = state.backgroundColorRgba;
|
|
8
|
+
if (rgba.length >= 4 && rgba[3] > 0) {
|
|
9
|
+
gl.clearColor(rgba[0], rgba[1], rgba[2], rgba[3]);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
gl.clearColor(0, 0, 0, 0);
|
|
13
|
+
}
|
|
14
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
15
|
+
runtime.currentBlendMode = null;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=glBackground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glBackground.js","sourceRoot":"","sources":["../src/glBackground.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,IAAI,KAAK,CAAC,MAAM,CAAC;IAC9D,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,mBAAmB,CAAC;IACvC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAClC,CAAC"}
|
package/dist/glDraw.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GlBitmapShader, GlRenderState } from '@flighthq/types';
|
|
2
|
+
import { BlendMode } from '@flighthq/types';
|
|
3
|
+
export declare function applyGlBlendMode(state: GlRenderState, blendMode: BlendMode | null): void;
|
|
4
|
+
export declare function bindGlTexture(state: GlRenderState, imageSource: CanvasImageSource): WebGLTexture;
|
|
5
|
+
export declare function createGlTexture(state: GlRenderState): WebGLTexture;
|
|
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
|
+
export declare function enableGlBlendModeSupport(state: GlRenderState): void;
|
|
8
|
+
export declare function setGlQuadMatrixFromOffset(state: GlRenderState, a: number, b: number, c: number, d: number, tx: number, ty: number, dx: number, dy: number): void;
|
|
9
|
+
export declare function updateGlTexture(state: GlRenderState, texture: WebGLTexture, canvas: HTMLCanvasElement): void;
|
|
10
|
+
export declare function useGlProgram(state: GlRenderState, shader?: GlBitmapShader): void;
|
|
11
|
+
//# sourceMappingURL=glDraw.d.ts.map
|
|
@@ -0,0 +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;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA+B5C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAMxF;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,CAEnE;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
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { BlendMode } from '@flighthq/types';
|
|
2
|
+
import { getGlRenderStateRuntime } from './glRenderState';
|
|
3
|
+
import { setGlAttributes, setGlMatrixFromValues } from './glShader';
|
|
4
|
+
const NORMAL_BLEND = ['ONE', 'ONE_MINUS_SRC_ALPHA'];
|
|
5
|
+
// Auditable map from a blend-mode intent to the Gl fixed-function blendFunc factors
|
|
6
|
+
// (premultiplied alpha) that realize it. `null` means there is no fixed-function
|
|
7
|
+
// equivalent — such modes would need shader-based blending — so the intent degrades to
|
|
8
|
+
// normal compositing.
|
|
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
|
+
};
|
|
26
|
+
export function applyGlBlendMode(state, blendMode) {
|
|
27
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
28
|
+
if (blendMode === runtime.currentBlendMode)
|
|
29
|
+
return;
|
|
30
|
+
runtime.currentBlendMode = blendMode;
|
|
31
|
+
const [src, dst] = (blendMode !== null ? WEBGL_BLEND_MODE[blendMode] : null) ?? NORMAL_BLEND;
|
|
32
|
+
state.gl.blendFunc(state.gl[src], state.gl[dst]);
|
|
33
|
+
}
|
|
34
|
+
export function bindGlTexture(state, imageSource) {
|
|
35
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
36
|
+
const gl = state.gl;
|
|
37
|
+
const textureCache = runtime.textureCache;
|
|
38
|
+
let texture = textureCache.get(imageSource);
|
|
39
|
+
if (!texture) {
|
|
40
|
+
const filter = state.allowSmoothing ? gl.LINEAR : gl.NEAREST;
|
|
41
|
+
texture = gl.createTexture();
|
|
42
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
43
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
|
|
44
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
|
|
45
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
46
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
47
|
+
// Both image and canvas sources present straight (un-premultiplied) alpha to texImage2D, so
|
|
48
|
+
// premultiply on upload to match the premultiplied (ONE, ONE_MINUS_SRC_ALPHA) blend used
|
|
49
|
+
// everywhere — uploaded images, canvas-backed shapes/text, and render-target composites. (A
|
|
50
|
+
// straight-alpha texture under premultiplied blend blows RGB out to full, turning a 40%-white
|
|
51
|
+
// shape opaque white.) Mirrors updateGlTexture, which already premultiplies canvas uploads.
|
|
52
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
53
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, imageSource);
|
|
54
|
+
textureCache.set(imageSource, texture);
|
|
55
|
+
runtime.currentTexture = texture;
|
|
56
|
+
}
|
|
57
|
+
else if (runtime.currentTexture !== texture) {
|
|
58
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
59
|
+
runtime.currentTexture = texture;
|
|
60
|
+
}
|
|
61
|
+
return texture;
|
|
62
|
+
}
|
|
63
|
+
export function createGlTexture(state) {
|
|
64
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
65
|
+
const gl = state.gl;
|
|
66
|
+
const filter = state.allowSmoothing ? gl.LINEAR : gl.NEAREST;
|
|
67
|
+
const texture = gl.createTexture();
|
|
68
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
69
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
|
|
70
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
|
|
71
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
72
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
73
|
+
runtime.currentTexture = texture;
|
|
74
|
+
return texture;
|
|
75
|
+
}
|
|
76
|
+
export function drawGlQuad(state, x0, y0, x1, y1, u0, v0, u1, v1) {
|
|
77
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
78
|
+
const gl = state.gl;
|
|
79
|
+
const { quadVertexData, quadVertexBuffer, quadIndexBuffer, shaderLoc } = runtime;
|
|
80
|
+
const v = quadVertexData;
|
|
81
|
+
v[0] = x0;
|
|
82
|
+
v[1] = y0;
|
|
83
|
+
v[2] = u0;
|
|
84
|
+
v[3] = v0;
|
|
85
|
+
v[4] = x1;
|
|
86
|
+
v[5] = y0;
|
|
87
|
+
v[6] = u1;
|
|
88
|
+
v[7] = v0;
|
|
89
|
+
v[8] = x1;
|
|
90
|
+
v[9] = y1;
|
|
91
|
+
v[10] = u1;
|
|
92
|
+
v[11] = v1;
|
|
93
|
+
v[12] = x0;
|
|
94
|
+
v[13] = y1;
|
|
95
|
+
v[14] = u0;
|
|
96
|
+
v[15] = v1;
|
|
97
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, quadVertexBuffer);
|
|
98
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, v);
|
|
99
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, quadIndexBuffer);
|
|
100
|
+
setGlAttributes(gl, shaderLoc);
|
|
101
|
+
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
|
|
102
|
+
}
|
|
103
|
+
export function enableGlBlendModeSupport(state) {
|
|
104
|
+
state.applyBlendMode = applyGlBlendMode;
|
|
105
|
+
}
|
|
106
|
+
export function setGlQuadMatrixFromOffset(state, a, b, c, d, tx, ty, dx, dy) {
|
|
107
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
108
|
+
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);
|
|
109
|
+
}
|
|
110
|
+
export function updateGlTexture(state, texture, canvas) {
|
|
111
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
112
|
+
const gl = state.gl;
|
|
113
|
+
if (runtime.currentTexture !== texture) {
|
|
114
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
115
|
+
runtime.currentTexture = texture;
|
|
116
|
+
}
|
|
117
|
+
// Browsers pass canvas pixel data to Gl as straight (unmultiplied) alpha.
|
|
118
|
+
// Premultiply on upload so the texture matches the (ONE, ONE_MINUS_SRC_ALPHA) blend mode.
|
|
119
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
120
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
|
|
121
|
+
}
|
|
122
|
+
export function useGlProgram(state, shader) {
|
|
123
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
124
|
+
const resolved = shader ?? runtime.defaultBitmapShader;
|
|
125
|
+
runtime.shaderLoc = resolved.locations;
|
|
126
|
+
const program = resolved.program;
|
|
127
|
+
if (runtime.currentProgram !== program) {
|
|
128
|
+
state.gl.useProgram(program);
|
|
129
|
+
runtime.currentProgram = program;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=glDraw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glDraw.js","sourceRoot":"","sources":["../src/glDraw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glElement.d.ts","sourceRoot":"","sources":["../src/glElement.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,iBAAiB,CAO9G"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function createGlCanvasElement(width, height, pixelRatio = 1) {
|
|
2
|
+
const canvas = document.createElement('canvas');
|
|
3
|
+
canvas.style.width = `${width}px`;
|
|
4
|
+
canvas.style.height = `${height}px`;
|
|
5
|
+
canvas.width = width * pixelRatio;
|
|
6
|
+
canvas.height = height * pixelRatio;
|
|
7
|
+
return canvas;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=glElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glElement.js","sourceRoot":"","sources":["../src/glElement.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,MAAc,EAAE,aAAqB,CAAC;IACzF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;IACpC,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;IAClC,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GlFullscreenProgram, GlRenderState, GlRenderTarget } from '@flighthq/types';
|
|
2
|
+
/** Clears a render target to fully transparent and binds it as the current framebuffer. */
|
|
3
|
+
export declare function clearGlRenderTarget(state: GlRenderState, target: GlRenderTarget): void;
|
|
4
|
+
export declare function compileGlFullscreenProgram(gl: WebGL2RenderingContext, fragmentSource: string): GlFullscreenProgram;
|
|
5
|
+
/**
|
|
6
|
+
* Draws a fullscreen pass: binds `inputs[i]` to texture unit i and its `u_texture{i}` sampler, binds
|
|
7
|
+
* `dest` (or the canvas when null), sets normal premultiplied-alpha blending, calls `setUniforms` for
|
|
8
|
+
* per-pass uploads, then draws the quad.
|
|
9
|
+
*/
|
|
10
|
+
export declare function drawGlFullscreenPass(state: GlRenderState, program: Readonly<GlFullscreenProgram>, inputs: ReadonlyArray<WebGLTexture>, dest: Readonly<GlRenderTarget> | null, setUniforms: (gl: WebGL2RenderingContext, program: Readonly<GlFullscreenProgram>) => void): void;
|
|
11
|
+
//# sourceMappingURL=glFullscreenPass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glFullscreenPass.d.ts","sourceRoot":"","sources":["../src/glFullscreenPass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAmB1F,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAatF;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,GAAG,mBAAmB,CAkBlH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EACtC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,EACrC,WAAW,EAAE,CAAC,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,KAAK,IAAI,GACxF,IAAI,CAgCN"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createGlProgram } from './glProgram';
|
|
2
|
+
import { getGlRenderStateRuntime } from './glRenderState';
|
|
3
|
+
// The substrate-level fullscreen-pass primitive: draw a clip-space quad through a fragment shader,
|
|
4
|
+
// reading N input textures and writing to a target (or the canvas). Filter and effect recipes draw
|
|
5
|
+
// through this; it is not filter-specific. Shaders read inputs via `u_texture0..N-1` (and `u_texture`
|
|
6
|
+
// is accepted as an alias for unit 0).
|
|
7
|
+
const FULLSCREEN_VERTEX_SRC = `#version 300 es
|
|
8
|
+
in vec2 a_position;
|
|
9
|
+
in vec2 a_texCoord;
|
|
10
|
+
out vec2 v_texCoord;
|
|
11
|
+
void main() {
|
|
12
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
13
|
+
v_texCoord = a_texCoord;
|
|
14
|
+
}`;
|
|
15
|
+
/** Clears a render target to fully transparent and binds it as the current framebuffer. */
|
|
16
|
+
export function clearGlRenderTarget(state, target) {
|
|
17
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
18
|
+
const gl = state.gl;
|
|
19
|
+
if (runtime.currentFramebuffer !== target.framebuffer) {
|
|
20
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);
|
|
21
|
+
runtime.currentFramebuffer = target.framebuffer;
|
|
22
|
+
}
|
|
23
|
+
gl.viewport(0, 0, target.width, target.height);
|
|
24
|
+
runtime.renderTargetViewport = { width: target.width, height: target.height };
|
|
25
|
+
gl.clearColor(0, 0, 0, 0);
|
|
26
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
27
|
+
runtime.currentTexture = null;
|
|
28
|
+
runtime.currentBlendMode = null;
|
|
29
|
+
}
|
|
30
|
+
export function compileGlFullscreenProgram(gl, fragmentSource) {
|
|
31
|
+
const program = createGlProgram(gl, FULLSCREEN_VERTEX_SRC, fragmentSource, 'Fullscreen pass');
|
|
32
|
+
const textures = [];
|
|
33
|
+
for (let i = 0; i < 8; i++) {
|
|
34
|
+
const loc = gl.getUniformLocation(program, `u_texture${i}`);
|
|
35
|
+
if (loc)
|
|
36
|
+
textures.push(loc);
|
|
37
|
+
}
|
|
38
|
+
const single = gl.getUniformLocation(program, 'u_texture');
|
|
39
|
+
if (textures.length === 0 && single)
|
|
40
|
+
textures.push(single);
|
|
41
|
+
return {
|
|
42
|
+
program,
|
|
43
|
+
locPosition: gl.getAttribLocation(program, 'a_position'),
|
|
44
|
+
locTexCoord: gl.getAttribLocation(program, 'a_texCoord'),
|
|
45
|
+
texture: textures[0] ?? single,
|
|
46
|
+
textures,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Draws a fullscreen pass: binds `inputs[i]` to texture unit i and its `u_texture{i}` sampler, binds
|
|
51
|
+
* `dest` (or the canvas when null), sets normal premultiplied-alpha blending, calls `setUniforms` for
|
|
52
|
+
* per-pass uploads, then draws the quad.
|
|
53
|
+
*/
|
|
54
|
+
export function drawGlFullscreenPass(state, program, inputs, dest, setUniforms) {
|
|
55
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
56
|
+
const gl = state.gl;
|
|
57
|
+
if (runtime.currentProgram !== program.program) {
|
|
58
|
+
gl.useProgram(program.program);
|
|
59
|
+
runtime.currentProgram = program.program;
|
|
60
|
+
}
|
|
61
|
+
const destFramebuffer = dest?.framebuffer ?? null;
|
|
62
|
+
if (runtime.currentFramebuffer !== destFramebuffer) {
|
|
63
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, destFramebuffer);
|
|
64
|
+
runtime.currentFramebuffer = destFramebuffer;
|
|
65
|
+
}
|
|
66
|
+
const destWidth = dest?.width ?? state.canvas.width;
|
|
67
|
+
const destHeight = dest?.height ?? state.canvas.height;
|
|
68
|
+
gl.viewport(0, 0, destWidth, destHeight);
|
|
69
|
+
runtime.renderTargetViewport = dest ? { width: destWidth, height: destHeight } : null;
|
|
70
|
+
for (let i = 0; i < inputs.length; i++) {
|
|
71
|
+
gl.activeTexture(gl.TEXTURE0 + i);
|
|
72
|
+
gl.bindTexture(gl.TEXTURE_2D, inputs[i]);
|
|
73
|
+
if (program.textures[i])
|
|
74
|
+
gl.uniform1i(program.textures[i], i);
|
|
75
|
+
}
|
|
76
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
77
|
+
runtime.currentTexture = null;
|
|
78
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
79
|
+
runtime.currentBlendMode = null;
|
|
80
|
+
setUniforms(gl, program);
|
|
81
|
+
drawGlFullscreenQuad(state, program);
|
|
82
|
+
}
|
|
83
|
+
function drawGlFullscreenQuad(state, program) {
|
|
84
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
85
|
+
const gl = state.gl;
|
|
86
|
+
const v = runtime.quadVertexData;
|
|
87
|
+
// x, y, u, v per corner — a clip-space quad with bottom-left-origin texcoords.
|
|
88
|
+
v[0] = -1;
|
|
89
|
+
v[1] = -1;
|
|
90
|
+
v[2] = 0;
|
|
91
|
+
v[3] = 0;
|
|
92
|
+
v[4] = 1;
|
|
93
|
+
v[5] = -1;
|
|
94
|
+
v[6] = 1;
|
|
95
|
+
v[7] = 0;
|
|
96
|
+
v[8] = 1;
|
|
97
|
+
v[9] = 1;
|
|
98
|
+
v[10] = 1;
|
|
99
|
+
v[11] = 1;
|
|
100
|
+
v[12] = -1;
|
|
101
|
+
v[13] = 1;
|
|
102
|
+
v[14] = 0;
|
|
103
|
+
v[15] = 1;
|
|
104
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, runtime.quadVertexBuffer);
|
|
105
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, v);
|
|
106
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, runtime.quadIndexBuffer);
|
|
107
|
+
gl.enableVertexAttribArray(program.locPosition);
|
|
108
|
+
gl.enableVertexAttribArray(program.locTexCoord);
|
|
109
|
+
gl.vertexAttribPointer(program.locPosition, 2, gl.FLOAT, false, 16, 0);
|
|
110
|
+
gl.vertexAttribPointer(program.locTexCoord, 2, gl.FLOAT, false, 16, 8);
|
|
111
|
+
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
|
|
112
|
+
runtime.shaderLoc = runtime.defaultBitmapShader.locations;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=glFullscreenPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glFullscreenPass.js","sourceRoot":"","sources":["../src/glFullscreenPass.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GlMaterialRenderer, GlRenderState, Kind, Material } from '@flighthq/types';
|
|
2
|
+
export declare function getGlMaterialRenderer(state: GlRenderState, kind: Kind): GlMaterialRenderer | null;
|
|
3
|
+
export declare function registerGlMaterialRenderer(state: GlRenderState, kind: Kind, renderer: GlMaterialRenderer): void;
|
|
4
|
+
export declare function resolveGlMaterialRenderer(state: GlRenderState, material: Material | null): GlMaterialRenderer | null;
|
|
5
|
+
//# sourceMappingURL=glMaterialRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glMaterialRegistry.d.ts","sourceRoot":"","sources":["../src/glMaterialRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKzF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAEjG;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAG/G;AAMD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAQpH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DefaultMaterialKind } from '@flighthq/types';
|
|
2
|
+
import { getGlRenderStateRuntime } from './glRenderState';
|
|
3
|
+
export function getGlMaterialRenderer(state, kind) {
|
|
4
|
+
return getGlRenderStateRuntime(state).materialRendererMap?.get(kind) ?? null;
|
|
5
|
+
}
|
|
6
|
+
export function registerGlMaterialRenderer(state, kind, renderer) {
|
|
7
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
8
|
+
(runtime.materialRendererMap ??= new Map()).set(kind, renderer);
|
|
9
|
+
}
|
|
10
|
+
// Resolves a node's material to its registered renderer: by the material's kind, else the renderer
|
|
11
|
+
// registered for DefaultMaterialKind, else null. The render path knows nothing about which materials
|
|
12
|
+
// exist — every material (including the default) enters only through user registration, and an
|
|
13
|
+
// unresolved material is a no-op (the node does not render), never a built-in fallback.
|
|
14
|
+
export function resolveGlMaterialRenderer(state, material) {
|
|
15
|
+
const map = getGlRenderStateRuntime(state).materialRendererMap;
|
|
16
|
+
if (map === undefined)
|
|
17
|
+
return null;
|
|
18
|
+
if (material !== null) {
|
|
19
|
+
const renderer = map.get(material.kind);
|
|
20
|
+
if (renderer !== undefined)
|
|
21
|
+
return renderer;
|
|
22
|
+
}
|
|
23
|
+
return map.get(DefaultMaterialKind) ?? null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=glMaterialRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glMaterialRegistry.js","sourceRoot":"","sources":["../src/glMaterialRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,KAAoB,EAAE,IAAU;IACpE,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAoB,EAAE,IAAU,EAAE,QAA4B;IACvG,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,OAAO,CAAC,mBAAmB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,mGAAmG;AACnG,qGAAqG;AACrG,+FAA+F;AAC/F,wFAAwF;AACxF,MAAM,UAAU,yBAAyB,CAAC,KAAoB,EAAE,QAAyB;IACvF,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC;IAC/D,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function compileGlShader(gl: WebGL2RenderingContext, type: number, source: string, label?: string): WebGLShader;
|
|
2
|
+
export declare function createGlProgram(gl: WebGL2RenderingContext, vertexSource: string, fragmentSource: string, label?: string): WebGLProgram;
|
|
3
|
+
export declare function linkGlProgram(gl: WebGL2RenderingContext, program: WebGLProgram, label?: string): void;
|
|
4
|
+
//# sourceMappingURL=glProgram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glProgram.d.ts","sourceRoot":"","sources":["../src/glProgram.ts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,CAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAO,GAAG,WAAW,CAQnH;AAID,wBAAgB,eAAe,CAC7B,EAAE,EAAE,sBAAsB,EAC1B,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,KAAK,SAAO,GACX,YAAY,CAUd;AAID,wBAAgB,aAAa,CAAC,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAO,GAAG,IAAI,CAKnG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Shared GL shader-compile/link primitives. Every GL program in the SDK is built through these so the
|
|
2
|
+
// COMPILE_STATUS / LINK_STATUS checks are applied uniformly. Those queries are not only error handling:
|
|
3
|
+
// they force a driver that defers compilation/linking (KHR_parallel_shader_compile) to finish before the
|
|
4
|
+
// program's first use — without them the first draw on a cold GPU runs a not-yet-linked program and
|
|
5
|
+
// renders nothing. They also turn a silent shader failure into a thrown error carrying the driver's info
|
|
6
|
+
// log; `label` prefixes that message so the failing program is identifiable.
|
|
7
|
+
export function compileGlShader(gl, type, source, label = 'GL') {
|
|
8
|
+
const shader = gl.createShader(type);
|
|
9
|
+
gl.shaderSource(shader, source);
|
|
10
|
+
gl.compileShader(shader);
|
|
11
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
12
|
+
throw new Error(`${label} shader compile error: ${gl.getShaderInfoLog(shader)}`);
|
|
13
|
+
}
|
|
14
|
+
return shader;
|
|
15
|
+
}
|
|
16
|
+
// Compiles a vertex+fragment source pair into a linked, ready-to-use program. The shaders are deleted
|
|
17
|
+
// once linked — the program retains them — so the caller owns only the returned program.
|
|
18
|
+
export function createGlProgram(gl, vertexSource, fragmentSource, label = 'GL') {
|
|
19
|
+
const vertexShader = compileGlShader(gl, gl.VERTEX_SHADER, vertexSource, label);
|
|
20
|
+
const fragmentShader = compileGlShader(gl, gl.FRAGMENT_SHADER, fragmentSource, label);
|
|
21
|
+
const program = gl.createProgram();
|
|
22
|
+
gl.attachShader(program, vertexShader);
|
|
23
|
+
gl.attachShader(program, fragmentShader);
|
|
24
|
+
linkGlProgram(gl, program, label);
|
|
25
|
+
gl.deleteShader(vertexShader);
|
|
26
|
+
gl.deleteShader(fragmentShader);
|
|
27
|
+
return program;
|
|
28
|
+
}
|
|
29
|
+
// Links an already-assembled program (shaders attached, any pre-link configuration such as
|
|
30
|
+
// transform-feedback varyings done) and throws if linking failed.
|
|
31
|
+
export function linkGlProgram(gl, program, label = 'GL') {
|
|
32
|
+
gl.linkProgram(program);
|
|
33
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
34
|
+
throw new Error(`${label} program link error: ${gl.getProgramInfoLog(program)}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=glProgram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glProgram.js","sourceRoot":"","sources":["../src/glProgram.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,wGAAwG;AACxG,yGAAyG;AACzG,oGAAoG;AACpG,yGAAyG;AACzG,6EAA6E;AAE7E,MAAM,UAAU,eAAe,CAAC,EAA0B,EAAE,IAAY,EAAE,MAAc,EAAE,KAAK,GAAG,IAAI;IACpG,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAE,CAAC;IACtC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sGAAsG;AACtG,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAC7B,EAA0B,EAC1B,YAAoB,EACpB,cAAsB,EACtB,KAAK,GAAG,IAAI;IAEZ,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAChF,MAAM,cAAc,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,EAAG,CAAC;IACpC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACzC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAC9B,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,2FAA2F;AAC3F,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,EAA0B,EAAE,OAAqB,EAAE,KAAK,GAAG,IAAI;IAC3F,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wBAAwB,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { GlRenderState, GlRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function readGlRenderTargetPixels(state: GlRenderState, target: Readonly<GlRenderTarget>, x: number, y: number, width: number, height: number, out: Uint8Array | Float32Array): boolean;
|
|
3
|
+
//# sourceMappingURL=glReadback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glReadback.d.ts","sourceRoot":"","sources":["../src/glReadback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAarE,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,UAAU,GAAG,YAAY,GAC7B,OAAO,CAoBT"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getGlRenderStateRuntime } from './glRenderState';
|
|
2
|
+
// Reads pixel data from a render target's resolve texture into `out`. Binds the resolve
|
|
3
|
+
// framebuffer (or the draw framebuffer for single-sample targets) for reading, then calls
|
|
4
|
+
// readPixels. Returns false when the framebuffer is incomplete or the target has no texture.
|
|
5
|
+
//
|
|
6
|
+
// For MSAA targets, call resolveGlRenderTarget before readGlRenderTargetPixels so the
|
|
7
|
+
// multisample data is blitted to the resolve texture first.
|
|
8
|
+
//
|
|
9
|
+
// `out` must be a Uint8Array for rgba8 targets or a Float32Array for rgba16f/rgba32f targets.
|
|
10
|
+
// The pixel rectangle must lie within the target dimensions; out-of-bounds reads return zeros.
|
|
11
|
+
export function readGlRenderTargetPixels(state, target, x, y, width, height, out) {
|
|
12
|
+
if (target.width <= 0 || target.height <= 0)
|
|
13
|
+
return false;
|
|
14
|
+
const runtime = getGlRenderStateRuntime(state);
|
|
15
|
+
const gl = state.gl;
|
|
16
|
+
// Read from the resolve framebuffer (single-sample textures) or the draw framebuffer when
|
|
17
|
+
// no resolve pass is needed. The resolve FBO is always texture-backed; the draw FBO for
|
|
18
|
+
// single-sample targets is the same as the texture FBO.
|
|
19
|
+
const readFbo = target.resolveFramebuffer ?? target.framebuffer;
|
|
20
|
+
const prevFbo = runtime.currentFramebuffer;
|
|
21
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, readFbo);
|
|
22
|
+
const status = gl.checkFramebufferStatus(gl.READ_FRAMEBUFFER);
|
|
23
|
+
if (status !== gl.FRAMEBUFFER_COMPLETE) {
|
|
24
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, prevFbo);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const format = gl.RGBA;
|
|
28
|
+
const type = out instanceof Float32Array ? gl.FLOAT : gl.UNSIGNED_BYTE;
|
|
29
|
+
gl.readPixels(x, y, width, height, format, type, out);
|
|
30
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, prevFbo);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=glReadback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glReadback.js","sourceRoot":"","sources":["../src/glReadback.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,wFAAwF;AACxF,0FAA0F;AAC1F,6FAA6F;AAC7F,EAAE;AACF,sFAAsF;AACtF,4DAA4D;AAC5D,EAAE;AACF,8FAA8F;AAC9F,+FAA+F;AAC/F,MAAM,UAAU,wBAAwB,CACtC,KAAoB,EACpB,MAAgC,EAChC,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,GAA8B;IAE9B,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,0FAA0F;IAC1F,wFAAwF;IACxF,wDAAwD;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,WAAW,CAAC;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC3C,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAC9D,IAAI,MAAM,KAAK,EAAE,CAAC,oBAAoB,EAAE,CAAC;QACvC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,YAAY,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC;IACvE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GlRenderOptions, GlRenderState, GlRenderStateRuntime } from '@flighthq/types';
|
|
2
|
+
export declare function createGlRenderState(canvas: HTMLCanvasElement, options?: Partial<GlRenderOptions>): GlRenderState;
|
|
3
|
+
export declare function createGlRenderStateRuntime(): GlRenderStateRuntime;
|
|
4
|
+
export declare function destroyGlRenderState(state: GlRenderState): void;
|
|
5
|
+
export declare function getGlRenderStateRuntime(state: GlRenderState): GlRenderStateRuntime;
|
|
6
|
+
export declare function invalidateGlRenderStateCache(state: GlRenderState): void;
|
|
7
|
+
//# sourceMappingURL=glRenderState.d.ts.map
|
|
@@ -0,0 +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,CA0EpH;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"}
|