@webex/ladon-ts 4.5.1 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/build/module/config.json.js +26 -0
- package/build/module/config.json.js.map +1 -0
- package/build/module/index.d.ts +3 -0
- package/build/module/index.js +41 -8
- package/build/module/index.js.map +1 -0
- package/build/module/lib/config-builder.d.ts +180 -0
- package/build/module/lib/config-builder.js +336 -0
- package/build/module/lib/config-builder.js.map +1 -0
- package/build/module/lib/config-types.d.ts +98 -0
- package/build/module/lib/config-types.js +6 -0
- package/build/module/lib/config-types.js.map +1 -0
- package/build/module/lib/config.d.ts +30 -105
- package/build/module/lib/config.js +22 -151
- package/build/module/lib/config.js.map +1 -0
- package/build/module/lib/generator.d.ts +2 -1
- package/build/module/lib/generator.js +212 -273
- package/build/module/lib/generator.js.map +1 -0
- package/build/module/lib/pipeline.d.ts +3 -2
- package/build/module/lib/pipeline.js +158 -218
- package/build/module/lib/pipeline.js.map +1 -0
- package/build/module/lib/preload.d.ts +9 -0
- package/build/module/lib/preload.js +8 -0
- package/build/module/lib/preload.js.map +1 -0
- package/build/module/lib/renderer/blur-renderer.d.ts +5 -4
- package/build/module/lib/renderer/blur-renderer.js +102 -126
- package/build/module/lib/renderer/blur-renderer.js.map +1 -0
- package/build/module/lib/renderer/ladon-renderer.d.ts +2 -1
- package/build/module/lib/renderer/passthrough-renderer.d.ts +5 -4
- package/build/module/lib/renderer/passthrough-renderer.js +25 -44
- package/build/module/lib/renderer/passthrough-renderer.js.map +1 -0
- package/build/module/lib/renderer/replacement-renderer.d.ts +8 -5
- package/build/module/lib/renderer/replacement-renderer.js +84 -99
- package/build/module/lib/renderer/replacement-renderer.js.map +1 -0
- package/build/module/lib/renderer/webgl-renderer.d.ts +11 -3
- package/build/module/lib/renderer/webgl-renderer.js +168 -115
- package/build/module/lib/renderer/webgl-renderer.js.map +1 -0
- package/build/module/lib/shared-resource-manager.d.ts +40 -31
- package/build/module/lib/shared-resource-manager.js +151 -189
- package/build/module/lib/shared-resource-manager.js.map +1 -0
- package/build/module/lib/util.d.ts +10 -0
- package/build/module/lib/util.js +92 -179
- package/build/module/lib/util.js.map +1 -0
- package/build/module/lib/version.d.ts +1 -1
- package/build/module/lib/version.js +5 -2
- package/build/module/lib/version.js.map +1 -0
- package/package.json +21 -5
- package/build/module/lib/renderer/ladon-renderer.js +0 -2
- package/build/module/lib/renderer.js +0 -6
|
@@ -1,36 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
out vec4 outColor;
|
|
21
|
-
|
|
1
|
+
import { compileShader as i, linkProgram as g } from "../util.js";
|
|
2
|
+
import { WebGLRenderer as h } from "./webgl-renderer.js";
|
|
3
|
+
class c extends h {
|
|
4
|
+
constructor(t, r) {
|
|
5
|
+
super(t, r), this.output_canvas = t, this.config = r;
|
|
6
|
+
const e = this.config.render.background.getContext("2d", { willReadFrequently: !0 });
|
|
7
|
+
if (!e)
|
|
8
|
+
throw new Error("[ladon-ts] - could not get background canvas context 2d");
|
|
9
|
+
this.background_canvas_ctx = e, this.fragment_shader = this.buildFragmentShader();
|
|
10
|
+
const s = i(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src), a = i(
|
|
11
|
+
this.gl,
|
|
12
|
+
this.gl.FRAGMENT_SHADER,
|
|
13
|
+
this.fragment_shader
|
|
14
|
+
);
|
|
15
|
+
this.program = g(this.gl, s, a), this.gl.useProgram(this.program), this.setSharedUniforms(this.program), this.setupBackgroundTexture();
|
|
16
|
+
}
|
|
17
|
+
buildFragmentShader() {
|
|
18
|
+
return `${this.fragment_shader_header}
|
|
19
|
+
|
|
22
20
|
uniform sampler2D u_background;
|
|
23
|
-
uniform sampler2D u_image;
|
|
24
|
-
uniform sampler2D u_mask;
|
|
25
|
-
uniform vec2 u_resolution;
|
|
26
21
|
|
|
27
|
-
|
|
28
|
-
// Retrieve the mask and inverse mask
|
|
29
|
-
float get_mask(vec2 st) {
|
|
30
|
-
float maskValue = texture(u_mask, st).r;
|
|
31
|
-
// Apply a smooth gradient at the edges of the mask
|
|
32
|
-
return smoothstep(0.45, 0.55, maskValue);
|
|
33
|
-
}
|
|
22
|
+
${this.shared_shader_functions}
|
|
34
23
|
|
|
35
24
|
void main() {
|
|
36
25
|
${this.getUVCalculation()}
|
|
@@ -39,72 +28,68 @@ void main() {
|
|
|
39
28
|
vec3 image = texture(u_image, st).rgb;
|
|
40
29
|
float mask = get_mask(st);
|
|
41
30
|
|
|
42
|
-
|
|
43
|
-
vec3 color = background * (1.0 - mask) + image * mask;
|
|
31
|
+
vec3 color = mix(background, image, mask);
|
|
44
32
|
outColor = vec4(color, 1.0);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this.gl.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZW1lbnQtcmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlbmRlcmVyL3JlcGxhY2VtZW50LXJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsYUFBYTtJQXFDbEQsWUFBbUIsYUFBZ0MsRUFBa0IsTUFBc0I7UUFDdkYsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQURkLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUFrQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQS9CbkYsb0JBQWUsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQW1CeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFOzs7Ozs7Ozs7O0NBVTVCLENBQUM7UUFLTSxNQUFNLHFCQUFxQixHQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQ2YsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDbkQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FDM0QsQ0FBQyxFQUNELENBQUMsRUFDQSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQTRCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUE0QixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQzlELENBQUMsSUFB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
|
|
33
|
+
}`;
|
|
34
|
+
}
|
|
35
|
+
setupBackgroundTexture() {
|
|
36
|
+
const t = this.background_canvas_ctx.getImageData(
|
|
37
|
+
0,
|
|
38
|
+
0,
|
|
39
|
+
this.config.render.background.width,
|
|
40
|
+
this.config.render.background.height
|
|
41
|
+
);
|
|
42
|
+
this.background_texture = this.createTexture(
|
|
43
|
+
this.gl.RGBA,
|
|
44
|
+
this.config.render.background.width,
|
|
45
|
+
this.config.render.background.height,
|
|
46
|
+
() => {
|
|
47
|
+
this.gl.texImage2D(
|
|
48
|
+
this.gl.TEXTURE_2D,
|
|
49
|
+
0,
|
|
50
|
+
this.gl.RGBA,
|
|
51
|
+
t.width,
|
|
52
|
+
t.height,
|
|
53
|
+
0,
|
|
54
|
+
this.gl.RGBA,
|
|
55
|
+
this.gl.UNSIGNED_BYTE,
|
|
56
|
+
t.data
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
const r = this.gl.getUniformLocation(this.program, "u_background");
|
|
61
|
+
if (!r)
|
|
62
|
+
throw new Error('[ladon-ts] - error finding "u_background" uniform');
|
|
63
|
+
this.gl.activeTexture(this.gl.TEXTURE2), this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture), this.gl.uniform1i(r, 2);
|
|
64
|
+
}
|
|
65
|
+
async render(t, r) {
|
|
66
|
+
if (this.uploadVideoStream(t), this.uploadMask(r), !this.config.render.static) {
|
|
67
|
+
const e = this.background_canvas_ctx.getImageData(
|
|
68
|
+
0,
|
|
69
|
+
0,
|
|
70
|
+
this.config.render.background.width,
|
|
71
|
+
this.config.render.background.height
|
|
72
|
+
).data;
|
|
73
|
+
this.gl.activeTexture(this.gl.TEXTURE2), this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture), this.gl.texImage2D(
|
|
74
|
+
this.gl.TEXTURE_2D,
|
|
75
|
+
0,
|
|
76
|
+
this.gl.RGBA,
|
|
77
|
+
this.config.render.background.width,
|
|
78
|
+
this.config.render.background.height,
|
|
79
|
+
0,
|
|
80
|
+
this.gl.RGBA,
|
|
81
|
+
this.gl.UNSIGNED_BYTE,
|
|
82
|
+
e
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
this.gl.useProgram(this.program), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3), this.postDraw();
|
|
86
|
+
}
|
|
87
|
+
async load() {
|
|
88
|
+
}
|
|
89
|
+
destroy() {
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
c as ReplacementRenderer
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=replacement-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replacement-renderer.js","sources":["../../../../src/lib/renderer/replacement-renderer.ts"],"sourcesContent":["// replacement-renderer.ts\n\nimport { PipelineConfig, ReplacementConfig } from '../config-types';\nimport { FrameData, LadonOutput } from '../generator';\nimport { compileShader, linkProgram } from '../util';\n\nimport { LadonRenderer } from './ladon-renderer';\nimport { WebGLRenderer } from './webgl-renderer';\n\nexport class ReplacementRenderer extends WebGLRenderer implements LadonRenderer {\n private program: WebGLProgram;\n private background_canvas_ctx: CanvasRenderingContext2D;\n\n protected background_texture!: WebGLTexture;\n protected fragment_shader!: string;\n\n constructor(public output_canvas: HTMLCanvasElement, public readonly config: PipelineConfig) {\n super(output_canvas, config);\n\n const background_canvas_ctx = (\n this.config.render as ReplacementConfig\n ).background.getContext('2d', { willReadFrequently: true });\n if (!background_canvas_ctx) {\n throw new Error('[ladon-ts] - could not get background canvas context 2d');\n }\n this.background_canvas_ctx = background_canvas_ctx;\n\n // Build the fragment shader\n this.fragment_shader = this.buildFragmentShader();\n\n // Compile and link shaders\n const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);\n const fragment_shader = compileShader(\n this.gl,\n this.gl.FRAGMENT_SHADER,\n this.fragment_shader\n );\n\n this.program = linkProgram(this.gl, vertex_shader, fragment_shader);\n this.gl.useProgram(this.program);\n\n this.setSharedUniforms(this.program);\n\n // Set up background texture\n this.setupBackgroundTexture();\n }\n\n protected buildFragmentShader(): string {\n return `${this.fragment_shader_header}\n \nuniform sampler2D u_background;\n\n${this.shared_shader_functions}\n\nvoid main() {\n ${this.getUVCalculation()}\n\n vec3 background = texture(u_background, st).rgb;\n vec3 image = texture(u_image, st).rgb;\n float mask = get_mask(st);\n\n vec3 color = mix(background, image, mask);\n outColor = vec4(color, 1.0);\n}`;\n }\n\n protected setupBackgroundTexture() {\n const backgroundData = this.background_canvas_ctx.getImageData(\n 0,\n 0,\n (this.config.render as ReplacementConfig).background.width,\n (this.config.render as ReplacementConfig).background.height\n );\n\n this.background_texture = this.createTexture(\n this.gl.RGBA,\n (this.config.render as ReplacementConfig).background.width,\n (this.config.render as ReplacementConfig).background.height,\n () => {\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n backgroundData.width,\n backgroundData.height,\n 0,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n backgroundData.data\n );\n }\n );\n\n const u_background = this.gl.getUniformLocation(this.program, 'u_background');\n if (!u_background) {\n throw new Error('[ladon-ts] - error finding \"u_background\" uniform');\n }\n this.gl.activeTexture(this.gl.TEXTURE2);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);\n this.gl.uniform1i(u_background, 2);\n }\n\n public async render(input: FrameData, mask?: LadonOutput): Promise<void> {\n this.uploadVideoStream(input);\n this.uploadMask(mask);\n\n if (!(this.config.render as ReplacementConfig).static) {\n const backgroundData = this.background_canvas_ctx.getImageData(\n 0,\n 0,\n (this.config.render as ReplacementConfig).background.width,\n (this.config.render as ReplacementConfig).background.height\n ).data;\n\n this.gl.activeTexture(this.gl.TEXTURE2);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n (this.config.render as ReplacementConfig).background.width,\n (this.config.render as ReplacementConfig).background.height,\n 0,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n backgroundData\n );\n }\n\n this.gl.useProgram(this.program);\n\n this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);\n\n this.postDraw();\n }\n\n public async load(): Promise<void> {\n // empty\n }\n\n public destroy(): void {\n // empty\n }\n}\n"],"names":["ReplacementRenderer","WebGLRenderer","output_canvas","config","background_canvas_ctx","vertex_shader","compileShader","fragment_shader","linkProgram","backgroundData","u_background","input","mask"],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { PipelineConfig } from '../config';
|
|
2
|
-
import { FrameData } from '../generator';
|
|
1
|
+
import { PipelineConfig } from '../config-types';
|
|
2
|
+
import { FrameData, LadonOutput } from '../generator';
|
|
3
|
+
|
|
4
|
+
declare type TextureInitializer = () => void;
|
|
3
5
|
export declare abstract class WebGLRenderer {
|
|
4
6
|
output_canvas: HTMLCanvasElement;
|
|
5
7
|
readonly config: PipelineConfig;
|
|
@@ -10,9 +12,15 @@ export declare abstract class WebGLRenderer {
|
|
|
10
12
|
protected mask_texture: WebGLTexture;
|
|
11
13
|
protected verts: Float32Array;
|
|
12
14
|
protected vertex_shader_src: string;
|
|
15
|
+
protected fragment_shader_header: string;
|
|
16
|
+
protected shared_shader_functions: string;
|
|
13
17
|
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
14
|
-
protected
|
|
18
|
+
protected initTexturesAndBuffers(): void;
|
|
19
|
+
protected createTexture(internalFormat: number, width: number, height: number, initializeTexture?: TextureInitializer): WebGLTexture;
|
|
20
|
+
protected getUVCalculation(): "vec2 st = vec2(1.0 - gl_FragCoord.x / u_resolution.x, gl_FragCoord.y / u_resolution.y);" | "vec2 st = vec2(gl_FragCoord.x / u_resolution.x, 1.0 - gl_FragCoord.y / u_resolution.y);";
|
|
15
21
|
protected setSharedUniforms(program: WebGLProgram): void;
|
|
16
22
|
protected uploadVideoStream(input: FrameData): void;
|
|
23
|
+
protected uploadMask(mask?: LadonOutput): void;
|
|
17
24
|
protected postDraw(): void;
|
|
18
25
|
}
|
|
26
|
+
export {};
|
|
@@ -1,121 +1,174 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { bilinearUpsample as h } from "../util.js";
|
|
2
|
+
class o {
|
|
3
|
+
constructor(t, i) {
|
|
4
|
+
this.output_canvas = t, this.config = i, this.verts = new Float32Array([
|
|
5
|
+
-1,
|
|
6
|
+
-1,
|
|
7
|
+
0,
|
|
8
|
+
// Vertex 1
|
|
9
|
+
-1,
|
|
10
|
+
1,
|
|
11
|
+
0,
|
|
12
|
+
// Vertex 2
|
|
13
|
+
1,
|
|
14
|
+
1,
|
|
15
|
+
0,
|
|
16
|
+
// Vertex 3
|
|
17
|
+
1,
|
|
18
|
+
1,
|
|
19
|
+
0,
|
|
20
|
+
// Vertex 4
|
|
21
|
+
1,
|
|
22
|
+
-1,
|
|
23
|
+
0,
|
|
24
|
+
// Vertex 5
|
|
25
|
+
-1,
|
|
26
|
+
-1,
|
|
27
|
+
0
|
|
28
|
+
// Vertex 6
|
|
29
|
+
]), this.vertex_shader_src = `#version 300 es
|
|
10
30
|
|
|
11
31
|
in vec4 position;
|
|
12
32
|
|
|
13
33
|
void main() {
|
|
14
34
|
gl_Position = position;
|
|
15
35
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
36
|
+
`, this.fragment_shader_header = `#version 300 es
|
|
37
|
+
precision highp float;
|
|
38
|
+
|
|
39
|
+
out vec4 outColor;
|
|
40
|
+
|
|
41
|
+
uniform sampler2D u_image;
|
|
42
|
+
uniform sampler2D u_mask;
|
|
43
|
+
uniform vec2 u_resolution;
|
|
44
|
+
`, this.shared_shader_functions = `
|
|
45
|
+
float get_mask(vec2 uv) {
|
|
46
|
+
float maskValue = texture(u_mask, uv).r;
|
|
47
|
+
return smoothstep(0.0, 1.0, maskValue);
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
const e = this.output_canvas.getContext("webgl2", { antialias: !0 });
|
|
51
|
+
if (e)
|
|
52
|
+
this.gl = e;
|
|
53
|
+
else {
|
|
54
|
+
const s = this.output_canvas.getContext("2d");
|
|
55
|
+
if (!s)
|
|
56
|
+
throw new Error("[ladon-ts] - output canvas context must be webgl2 or 2d");
|
|
57
|
+
this.output_canvas_2d = s, this.intermediate_canvas = document.createElement("canvas"), this.intermediate_canvas.height = this.config.input.height, this.intermediate_canvas.width = this.config.input.width;
|
|
58
|
+
const r = this.intermediate_canvas.getContext("webgl2", {
|
|
59
|
+
antialias: !0
|
|
60
|
+
});
|
|
61
|
+
if (!r)
|
|
62
|
+
throw new Error("[ladon-ts] - error getting output context webgl");
|
|
63
|
+
this.gl = r;
|
|
64
|
+
}
|
|
65
|
+
this.initTexturesAndBuffers();
|
|
66
|
+
}
|
|
67
|
+
initTexturesAndBuffers() {
|
|
68
|
+
this.image_texture = this.createTexture(
|
|
69
|
+
this.gl.RGBA,
|
|
70
|
+
this.config.input.width,
|
|
71
|
+
this.config.input.height
|
|
72
|
+
), this.mask_texture = this.createTexture(
|
|
73
|
+
this.gl.R8,
|
|
74
|
+
this.config.mask.upscaleSize.width,
|
|
75
|
+
this.config.mask.upscaleSize.height
|
|
76
|
+
);
|
|
77
|
+
const t = this.gl.createVertexArray();
|
|
78
|
+
if (!t)
|
|
79
|
+
throw new Error("[ladon-ts] - error creating vertex array");
|
|
80
|
+
this.gl.bindVertexArray(t);
|
|
81
|
+
const i = this.gl.createBuffer();
|
|
82
|
+
if (!i)
|
|
83
|
+
throw new Error("[ladon-ts] - error creating buffer");
|
|
84
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, i), this.gl.bufferData(this.gl.ARRAY_BUFFER, this.verts, this.gl.STATIC_DRAW), this.gl.vertexAttribPointer(0, 3, this.gl.FLOAT, !1, 0, 0), this.gl.enableVertexAttribArray(0), this.gl.viewport(0, 0, this.config.input.width, this.config.input.height);
|
|
85
|
+
}
|
|
86
|
+
createTexture(t, i, e, s = () => {
|
|
87
|
+
this.gl.texImage2D(
|
|
88
|
+
this.gl.TEXTURE_2D,
|
|
89
|
+
0,
|
|
90
|
+
t,
|
|
91
|
+
i,
|
|
92
|
+
e,
|
|
93
|
+
0,
|
|
94
|
+
t === this.gl.RGBA ? this.gl.RGBA : this.gl.RED,
|
|
95
|
+
this.gl.UNSIGNED_BYTE,
|
|
96
|
+
null
|
|
97
|
+
);
|
|
98
|
+
}) {
|
|
99
|
+
const r = this.gl.createTexture();
|
|
100
|
+
if (!r)
|
|
101
|
+
throw new Error("[ladon-ts] - error creating texture");
|
|
102
|
+
return this.gl.bindTexture(this.gl.TEXTURE_2D, r), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE), s(), this.gl.bindTexture(this.gl.TEXTURE_2D, null), r;
|
|
103
|
+
}
|
|
104
|
+
getUVCalculation() {
|
|
105
|
+
return this.config.render.horizontalMirror ? "vec2 st = vec2(1.0 - gl_FragCoord.x / u_resolution.x, gl_FragCoord.y / u_resolution.y);" : "vec2 st = vec2(gl_FragCoord.x / u_resolution.x, 1.0 - gl_FragCoord.y / u_resolution.y);";
|
|
106
|
+
}
|
|
107
|
+
setSharedUniforms(t) {
|
|
108
|
+
const i = this.gl.getUniformLocation(t, "u_resolution");
|
|
109
|
+
if (!i)
|
|
110
|
+
throw new Error('[ladon-ts] - error finding "u_resolution" uniform');
|
|
111
|
+
this.gl.uniform2f(i, this.config.input.width, this.config.input.height);
|
|
112
|
+
const e = this.gl.getUniformLocation(t, "u_image");
|
|
113
|
+
if (!e)
|
|
114
|
+
throw new Error('[ladon-ts] - error finding "u_image" uniform');
|
|
115
|
+
this.gl.activeTexture(this.gl.TEXTURE0), this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture), this.gl.uniform1i(e, 0);
|
|
116
|
+
const s = this.gl.getUniformLocation(t, "u_mask");
|
|
117
|
+
s && (this.gl.activeTexture(this.gl.TEXTURE1), this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture), this.gl.uniform1i(s, 1));
|
|
118
|
+
}
|
|
119
|
+
uploadVideoStream(t) {
|
|
120
|
+
this.gl.activeTexture(this.gl.TEXTURE0), this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture), t instanceof HTMLVideoElement ? this.gl.texImage2D(
|
|
121
|
+
this.gl.TEXTURE_2D,
|
|
122
|
+
0,
|
|
123
|
+
this.gl.RGBA,
|
|
124
|
+
this.gl.RGBA,
|
|
125
|
+
this.gl.UNSIGNED_BYTE,
|
|
126
|
+
t
|
|
127
|
+
) : this.gl.texImage2D(
|
|
128
|
+
this.gl.TEXTURE_2D,
|
|
129
|
+
0,
|
|
130
|
+
this.gl.RGBA,
|
|
131
|
+
this.config.input.width,
|
|
132
|
+
this.config.input.height,
|
|
133
|
+
0,
|
|
134
|
+
this.gl.RGBA,
|
|
135
|
+
this.gl.UNSIGNED_BYTE,
|
|
136
|
+
t
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
uploadMask(t) {
|
|
140
|
+
if (t != null && t.warm) {
|
|
141
|
+
const i = h(
|
|
142
|
+
t.data,
|
|
143
|
+
this.config.mask.outputSize.width,
|
|
144
|
+
this.config.mask.outputSize.height,
|
|
145
|
+
this.config.mask.upscaleSize.width,
|
|
146
|
+
this.config.mask.upscaleSize.height
|
|
147
|
+
);
|
|
148
|
+
this.gl.activeTexture(this.gl.TEXTURE1), this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture), this.gl.texImage2D(
|
|
149
|
+
this.gl.TEXTURE_2D,
|
|
150
|
+
0,
|
|
151
|
+
this.gl.R8,
|
|
152
|
+
this.config.mask.upscaleSize.width,
|
|
153
|
+
this.config.mask.upscaleSize.height,
|
|
154
|
+
0,
|
|
155
|
+
this.gl.RED,
|
|
156
|
+
this.gl.UNSIGNED_BYTE,
|
|
157
|
+
i
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
postDraw() {
|
|
162
|
+
this.output_canvas_2d && this.intermediate_canvas && this.output_canvas_2d.drawImage(
|
|
163
|
+
this.intermediate_canvas,
|
|
164
|
+
0,
|
|
165
|
+
0,
|
|
166
|
+
this.config.input.width,
|
|
167
|
+
this.config.input.height
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export {
|
|
172
|
+
o as WebGLRenderer
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=webgl-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl-renderer.js","sources":["../../../../src/lib/renderer/webgl-renderer.ts"],"sourcesContent":["// webgl-renderer.ts\n\nimport { PipelineConfig } from '../config-types';\nimport { FrameData, LadonOutput } from '../generator';\nimport { bilinearUpsample } from '../util';\n\ntype TextureInitializer = () => void;\nexport abstract class WebGLRenderer {\n protected intermediate_canvas?: HTMLCanvasElement;\n protected output_canvas_2d?: CanvasRenderingContext2D;\n\n protected gl: WebGL2RenderingContext;\n\n protected image_texture!: WebGLTexture;\n protected mask_texture!: WebGLTexture;\n\n protected verts = new Float32Array([\n -1.0,\n -1.0,\n 0.0, // Vertex 1\n -1.0,\n 1.0,\n 0.0, // Vertex 2\n 1.0,\n 1.0,\n 0.0, // Vertex 3\n 1.0,\n 1.0,\n 0.0, // Vertex 4\n 1.0,\n -1.0,\n 0.0, // Vertex 5\n -1.0,\n -1.0,\n 0.0, // Vertex 6\n ]);\n\n protected vertex_shader_src = `#version 300 es\n\nin vec4 position;\n\nvoid main() {\n gl_Position = position;\n}\n`;\n\n // Shared fragment shader code\n protected fragment_shader_header = `#version 300 es\nprecision highp float;\n\nout vec4 outColor;\n\nuniform sampler2D u_image;\nuniform sampler2D u_mask;\nuniform vec2 u_resolution;\n`;\n\n // Shared shader functions for enhanced edge blending\n protected shared_shader_functions = `\nfloat get_mask(vec2 uv) {\n float maskValue = texture(u_mask, uv).r;\n return smoothstep(0.0, 1.0, maskValue);\n}\n`;\n\n constructor(public output_canvas: HTMLCanvasElement, public readonly config: PipelineConfig) {\n const gl = this.output_canvas.getContext('webgl2', { antialias: true });\n\n if (!gl) {\n const output_2d = this.output_canvas.getContext('2d');\n\n if (!output_2d) {\n throw new Error('[ladon-ts] - output canvas context must be webgl2 or 2d');\n }\n\n this.output_canvas_2d = output_2d;\n this.intermediate_canvas = document.createElement('canvas');\n this.intermediate_canvas.height = this.config.input.height;\n this.intermediate_canvas.width = this.config.input.width;\n\n const gl_intermediate = this.intermediate_canvas.getContext('webgl2', {\n antialias: true,\n });\n\n if (!gl_intermediate) {\n throw new Error('[ladon-ts] - error getting output context webgl');\n }\n\n this.gl = gl_intermediate;\n } else {\n this.gl = gl;\n }\n\n // Initialize textures and buffers\n this.initTexturesAndBuffers();\n }\n\n protected initTexturesAndBuffers() {\n // Initialize image texture\n this.image_texture = this.createTexture(\n this.gl.RGBA,\n this.config.input.width,\n this.config.input.height\n );\n\n // Initialize mask texture\n this.mask_texture = this.createTexture(\n this.gl.R8,\n this.config.mask.upscaleSize.width,\n this.config.mask.upscaleSize.height\n );\n\n // Create and bind vertex array\n const vertex_array = this.gl.createVertexArray();\n if (!vertex_array) {\n throw new Error('[ladon-ts] - error creating vertex array');\n }\n this.gl.bindVertexArray(vertex_array);\n\n // Create and bind buffer\n const buffer = this.gl.createBuffer();\n if (!buffer) {\n throw new Error('[ladon-ts] - error creating buffer');\n }\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, this.verts, this.gl.STATIC_DRAW);\n this.gl.vertexAttribPointer(0, 3, this.gl.FLOAT, false, 0, 0);\n this.gl.enableVertexAttribArray(0);\n\n this.gl.viewport(0, 0, this.config.input.width, this.config.input.height);\n }\n\n protected createTexture(\n internalFormat: number,\n width: number,\n height: number,\n initializeTexture: TextureInitializer = () => {\n // Default initializer creates an empty texture\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n internalFormat,\n width,\n height,\n 0,\n internalFormat === this.gl.RGBA ? this.gl.RGBA : this.gl.RED,\n this.gl.UNSIGNED_BYTE,\n null\n );\n }\n ): WebGLTexture {\n const texture = this.gl.createTexture();\n if (!texture) {\n throw new Error('[ladon-ts] - error creating texture');\n }\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n\n // Set texture parameters\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n\n // Initialize the texture using the provided function\n initializeTexture();\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n return texture;\n }\n\n protected getUVCalculation() {\n if (this.config.render.horizontalMirror) {\n return `vec2 st = vec2(1.0 - gl_FragCoord.x / u_resolution.x, gl_FragCoord.y / u_resolution.y);`;\n }\n\n return `vec2 st = vec2(gl_FragCoord.x / u_resolution.x, 1.0 - gl_FragCoord.y / u_resolution.y);`;\n }\n\n protected setSharedUniforms(program: WebGLProgram) {\n const u_resolution = this.gl.getUniformLocation(program, 'u_resolution');\n if (!u_resolution) {\n throw new Error('[ladon-ts] - error finding \"u_resolution\" uniform');\n }\n this.gl.uniform2f(u_resolution, this.config.input.width, this.config.input.height);\n\n const u_image = this.gl.getUniformLocation(program, 'u_image');\n if (!u_image) {\n throw new Error('[ladon-ts] - error finding \"u_image\" uniform');\n }\n this.gl.activeTexture(this.gl.TEXTURE0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);\n this.gl.uniform1i(u_image, 0);\n\n const u_mask = this.gl.getUniformLocation(program, 'u_mask');\n if (u_mask) {\n this.gl.activeTexture(this.gl.TEXTURE1);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);\n this.gl.uniform1i(u_mask, 1);\n }\n }\n\n protected uploadVideoStream(input: FrameData) {\n this.gl.activeTexture(this.gl.TEXTURE0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);\n\n // Upload video frame or image data to the texture\n if (input instanceof HTMLVideoElement) {\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n input\n );\n } else {\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n this.config.input.width,\n this.config.input.height,\n 0,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n input\n );\n }\n }\n\n protected uploadMask(mask?: LadonOutput) {\n // The mask may not be included if it has not been generated (e.g., frame skipped).\n if (mask?.warm) {\n const maskData = bilinearUpsample(\n mask.data,\n this.config.mask.outputSize.width,\n this.config.mask.outputSize.height,\n this.config.mask.upscaleSize.width,\n this.config.mask.upscaleSize.height\n );\n\n this.gl.activeTexture(this.gl.TEXTURE1);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.R8,\n this.config.mask.upscaleSize.width,\n this.config.mask.upscaleSize.height,\n 0,\n this.gl.RED,\n this.gl.UNSIGNED_BYTE,\n maskData\n );\n }\n }\n\n protected postDraw() {\n if (this.output_canvas_2d && this.intermediate_canvas) {\n this.output_canvas_2d.drawImage(\n this.intermediate_canvas,\n 0,\n 0,\n this.config.input.width,\n this.config.input.height\n );\n }\n }\n}\n"],"names":["WebGLRenderer","output_canvas","config","gl","output_2d","gl_intermediate","vertex_array","buffer","internalFormat","width","height","initializeTexture","texture","program","u_resolution","u_image","u_mask","input","mask","maskData","bilinearUpsample"],"mappings":"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"}
|