xbintsc 0.5.31 → 0.5.32
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/README.md +16 -10
- package/dist/src/binder/references.js +14 -1
- package/dist/src/binder/references.js.map +1 -1
- package/dist/src/cli/help.d.ts +1 -1
- package/dist/src/codegen/generator/module.d.ts +1 -0
- package/dist/src/codegen/generator/module.js +54 -0
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/statements/variables.js +6 -4
- package/dist/src/codegen/generator/statements/variables.js.map +1 -1
- package/dist/src/driver/version.d.ts +1 -1
- package/dist/src/driver/version.js +1 -1
- package/dist/src/extensions/gui/css.d.ts +26 -0
- package/dist/src/extensions/gui/css.js +100 -0
- package/dist/src/extensions/gui/css.js.map +1 -0
- package/dist/src/extensions/gui/html.js +9 -2
- package/dist/src/extensions/gui/html.js.map +1 -1
- package/dist/src/extensions/gui/index.js +16 -2
- package/dist/src/extensions/gui/index.js.map +1 -1
- package/dist/src/extensions/gui/three.d.ts +16 -0
- package/dist/src/extensions/gui/three.js +22 -0
- package/dist/src/extensions/gui/three.js.map +1 -0
- package/dist/src/extensions/media/index.d.ts +6 -5
- package/dist/src/extensions/media/index.js +12 -14
- package/dist/src/extensions/media/index.js.map +1 -1
- package/dist/tests/e2e/compile-builtins.test.js +24 -0
- package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
- package/dist/tests/e2e/compile-objects-classes.test.js +23 -0
- package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
- package/dist/tests/e2e/gui-browser.test.js +1 -1
- package/dist/tests/e2e/gui-browser.test.js.map +1 -1
- package/dist/tests/e2e/gui-effects.test.d.ts +6 -0
- package/dist/tests/e2e/gui-effects.test.js +262 -0
- package/dist/tests/e2e/gui-effects.test.js.map +1 -0
- package/dist/tests/e2e/gui-example-webgl.test.d.ts +10 -0
- package/dist/tests/e2e/gui-example-webgl.test.js +75 -0
- package/dist/tests/e2e/gui-example-webgl.test.js.map +1 -0
- package/dist/tests/e2e/gui-example-webgl2.test.d.ts +8 -0
- package/dist/tests/e2e/gui-example-webgl2.test.js +72 -0
- package/dist/tests/e2e/gui-example-webgl2.test.js.map +1 -0
- package/dist/tests/e2e/gui-layout.test.js +48 -0
- package/dist/tests/e2e/gui-layout.test.js.map +1 -1
- package/dist/tests/e2e/gui-media.test.js +5 -4
- package/dist/tests/e2e/gui-media.test.js.map +1 -1
- package/dist/tests/e2e/gui-webgl.test.d.ts +11 -0
- package/dist/tests/e2e/gui-webgl.test.js +179 -0
- package/dist/tests/e2e/gui-webgl.test.js.map +1 -0
- package/dist/tests/e2e/gui-webgl2.test.d.ts +10 -0
- package/dist/tests/e2e/gui-webgl2.test.js +238 -0
- package/dist/tests/e2e/gui-webgl2.test.js.map +1 -0
- package/dist/tests/extensions/gui.test.js +41 -0
- package/dist/tests/extensions/gui.test.js.map +1 -1
- package/dist/tests/extensions/media.test.js +7 -3
- package/dist/tests/extensions/media.test.js.map +1 -1
- package/doc/ai/extensions.md +29 -9
- package/doc/ai/troubleshooting.md +12 -8
- package/doc/ai/zh-CN/extensions.md +26 -8
- package/doc/ai/zh-CN/troubleshooting.md +10 -6
- package/doc/gui/api.md +3 -2
- package/doc/gui/build.md +72 -16
- package/doc/gui/canvas.md +11 -3
- package/doc/gui/dom.md +33 -18
- package/doc/gui/known-issues.md +57 -24
- package/doc/gui/layout.md +18 -0
- package/doc/gui/media.md +17 -13
- package/doc/gui/rendering.md +50 -3
- package/doc/gui/webgl.md +256 -0
- package/doc/gui.md +108 -17
- package/doc/npm-package.md +6 -4
- package/doc/requirements.md +18 -9
- package/doc/zh-CN/gui/api.md +3 -2
- package/doc/zh-CN/gui/build.md +64 -15
- package/doc/zh-CN/gui/canvas.md +9 -2
- package/doc/zh-CN/gui/dom.md +20 -7
- package/doc/zh-CN/gui/known-issues.md +45 -19
- package/doc/zh-CN/gui/layout.md +14 -0
- package/doc/zh-CN/gui/media.md +15 -11
- package/doc/zh-CN/gui/rendering.md +41 -4
- package/doc/zh-CN/gui/webgl.md +115 -0
- package/doc/zh-CN/gui.md +89 -14
- package/doc/zh-CN/npm-package.md +9 -6
- package/doc/zh-CN/requirements.md +12 -6
- package/llms.txt +2 -0
- package/package.json +1 -1
- package/runtime/ext_gui/browser.cpp +39 -13
- package/runtime/ext_gui/canvas.cpp +3 -18
- package/runtime/ext_gui/canvas_internal.h +10 -0
- package/runtime/ext_gui/canvas_raster.cpp +60 -0
- package/runtime/ext_gui/clip_values.cpp +246 -0
- package/runtime/ext_gui/css.cpp +94 -0
- package/runtime/ext_gui/css.h +22 -1
- package/runtime/ext_gui/css_match.cpp +3 -0
- package/runtime/ext_gui/css_selector.cpp +9 -0
- package/runtime/ext_gui/css_sheet.cpp +89 -45
- package/runtime/ext_gui/document.cpp +4 -1
- package/runtime/ext_gui/document.h +2 -0
- package/runtime/ext_gui/dom.h +16 -0
- package/runtime/ext_gui/dom_api.cpp +1 -0
- package/runtime/ext_gui/dom_api_canvas.cpp +17 -80
- package/runtime/ext_gui/dom_api_canvas_extra.cpp +130 -1
- package/runtime/ext_gui/dom_api_canvas_pending.cpp +41 -0
- package/runtime/ext_gui/dom_api_internal.h +259 -0
- package/runtime/ext_gui/dom_api_webgl.cpp +376 -0
- package/runtime/ext_gui/dom_api_webgl2.cpp +434 -0
- package/runtime/ext_gui/dom_api_webgl2_draw.cpp +269 -0
- package/runtime/ext_gui/dom_api_webgl_buffer.cpp +212 -0
- package/runtime/ext_gui/dom_api_webgl_rt.h +30 -0
- package/runtime/ext_gui/dom_api_webgl_shader.cpp +443 -0
- package/runtime/ext_gui/dom_api_webgl_state.cpp +444 -0
- package/runtime/ext_gui/dom_api_webgl_texture.cpp +445 -0
- package/runtime/ext_gui/effect_values.cpp +312 -0
- package/runtime/ext_gui/gradient_values.cpp +476 -0
- package/runtime/ext_gui/grid_values.cpp +230 -0
- package/runtime/ext_gui/gui_canvas.cpp +50 -2
- package/runtime/ext_gui/gui_engine.h +27 -0
- package/runtime/ext_gui/gui_events.cpp +4 -1
- package/runtime/ext_gui/gui_media.cpp +1 -1
- package/runtime/ext_gui/gui_webgl.cpp +83 -0
- package/runtime/ext_gui/layout.cpp +21 -0
- package/runtime/ext_gui/layout_flow.cpp +81 -4
- package/runtime/ext_gui/layout_flow_internal.h +31 -0
- package/runtime/ext_gui/layout_grid.cpp +374 -0
- package/runtime/ext_gui/media.h +1 -1
- package/runtime/ext_gui/media_api.h +2 -2
- package/runtime/ext_gui/media_query.cpp +211 -0
- package/runtime/ext_gui/paint.cpp +111 -77
- package/runtime/ext_gui/paint.h +33 -3
- package/runtime/ext_gui/paint_background.cpp +229 -0
- package/runtime/ext_gui/paint_clip.cpp +268 -0
- package/runtime/ext_gui/paint_effects.cpp +324 -0
- package/runtime/ext_gui/paint_internal.h +85 -0
- package/runtime/ext_gui/renderer.cpp +8 -31
- package/runtime/ext_gui/renderer_clip.cpp +196 -0
- package/runtime/ext_gui/renderer_image.cpp +13 -8
- package/runtime/ext_gui/renderer_internal.h +15 -8
- package/runtime/ext_gui/renderer_text.cpp +6 -31
- package/runtime/ext_gui/style.cpp +343 -20
- package/runtime/ext_gui/style.h +144 -3
- package/runtime/ext_gui/style_print.cpp +134 -1
- package/runtime/ext_gui/style_values.cpp +152 -126
- package/runtime/ext_gui/style_values_internal.h +35 -0
- package/runtime/ext_gui/webgl.h +466 -0
- package/runtime/ext_gui/webgl2_constants.h +274 -0
- package/runtime/ext_gui/webgl_buffer.cpp +565 -0
- package/runtime/ext_gui/webgl_constants.h +317 -0
- package/runtime/ext_gui/webgl_context.cpp +466 -0
- package/runtime/ext_gui/webgl_draw.cpp +495 -0
- package/runtime/ext_gui/webgl_glsl.h +125 -0
- package/runtime/ext_gui/webgl_glsl_compile.cpp +431 -0
- package/runtime/ext_gui/webgl_glsl_rewrite.cpp +349 -0
- package/runtime/ext_gui/webgl_glsl_scan.cpp +581 -0
- package/runtime/ext_gui/webgl_msl.cpp +62 -0
- package/runtime/ext_gui/webgl_msl.h +33 -0
- package/runtime/ext_gui/webgl_pipeline.cpp +274 -0
- package/runtime/ext_gui/webgl_program_internal.h +18 -0
- package/runtime/ext_gui/webgl_shader.cpp +582 -0
- package/runtime/ext_gui/webgl_texture.cpp +293 -0
- package/runtime/ext_gui/webgl_uniform.cpp +167 -0
- package/runtime/ext_gui/webgl_webgl2.cpp +224 -0
- package/runtime/ext_media/media.cpp +1 -1
- package/runtime/ext_media/media_bridge.c +9 -3
- package/runtime/rt_internal.h +1 -0
- package/runtime/xt_containers/access.inc +8 -0
- package/runtime/xt_regex/api.inc +2 -0
- package/runtime/xt_regex/matcher.inc +16 -3
- package/runtime/xt_regex/parser.inc +8 -2
- package/runtime/xt_regex/types.inc +3 -0
- package/runtime/xt_stdlib2/regexp-match.inc +60 -21
- package/runtime/xt_stdlib2/regexp.inc +1 -0
- package/runtime/xt_typed_array.c +1 -1
- package/scripts/build-gui.ts +90 -3
- package/scripts/build-media.ts +323 -58
- package/scripts/setup-vs-toolchain.ps1 +152 -0
- package/src/binder/references.ts +13 -1
- package/src/codegen/generator/module.ts +50 -0
- package/src/codegen/generator/statements/variables.ts +6 -3
- package/src/driver/version.ts +1 -1
- package/src/extensions/gui/css.ts +113 -0
- package/src/extensions/gui/html.ts +9 -2
- package/src/extensions/gui/index.ts +16 -2
- package/src/extensions/gui/three.ts +25 -0
- package/src/extensions/media/index.ts +13 -16
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end test for the `gui` extension's WebGL 2 context.
|
|
3
|
+
*
|
|
4
|
+
* Exercises the parts that are genuinely new over WebGL 1: the `#version 300
|
|
5
|
+
* es` shader dialect, vertex-array objects, instanced draws with a per-instance
|
|
6
|
+
* attribute divisor, `texStorage2D`, `clearBufferfv`, buffer copies and sampler
|
|
7
|
+
* objects. As in the WebGL 1 test, `readPixels` proves the GPU produced the
|
|
8
|
+
* picture.
|
|
9
|
+
*/
|
|
10
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
11
|
+
import { createGuiHarness, guiAvailable } from "./gui-helpers.js";
|
|
12
|
+
const harness = createGuiHarness();
|
|
13
|
+
const PAGE = `
|
|
14
|
+
<html><head><title>webgl2</title></head>
|
|
15
|
+
<body style="margin:0">
|
|
16
|
+
<canvas id="c" width="64" height="64"></canvas>
|
|
17
|
+
</body></html>`;
|
|
18
|
+
describe.skipIf(!guiAvailable)("gui extension — WebGL 2", () => {
|
|
19
|
+
beforeAll(() => harness.setup());
|
|
20
|
+
afterAll(() => harness.cleanup());
|
|
21
|
+
it("runs #version 300 es shaders, VAOs and instanced draws", () => {
|
|
22
|
+
const { value, stderr } = harness.compileAndRun("webgl2", `
|
|
23
|
+
import { createWindow } from "gui";
|
|
24
|
+
import page from "./page.html";
|
|
25
|
+
|
|
26
|
+
const win = createWindow({ title: "webgl2", width: 320, height: 240 });
|
|
27
|
+
const label = (name: string, value: any): void => console.log(name + "=" + value);
|
|
28
|
+
const rgba = (p: any): string => p[0] + "," + p[1] + "," + p[2] + "," + p[3];
|
|
29
|
+
|
|
30
|
+
win.on("ready", () => {
|
|
31
|
+
const canvas: any = document.getElementById("c");
|
|
32
|
+
const gl: any = canvas.getContext("webgl2");
|
|
33
|
+
label("webgl2", gl != null);
|
|
34
|
+
if (gl == null) {
|
|
35
|
+
win.close();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
label("webgl1-after", canvas.getContext("webgl") == null);
|
|
39
|
+
label("version", gl.getParameter(gl.VERSION));
|
|
40
|
+
label("draw-buffers", gl.getParameter(gl.MAX_DRAW_BUFFERS));
|
|
41
|
+
|
|
42
|
+
canvas.width = 64;
|
|
43
|
+
canvas.height = 64;
|
|
44
|
+
gl.viewport(0, 0, 64, 64);
|
|
45
|
+
const pixels = new Uint8Array(4);
|
|
46
|
+
const probe = (x: number, y: number): string => {
|
|
47
|
+
gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
|
|
48
|
+
return rgba(pixels);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
gl.clearColor(1, 0, 0, 1);
|
|
52
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
53
|
+
label("clear-red", probe(32, 32));
|
|
54
|
+
gl.clearBufferfv(gl.COLOR, 0, new Float32Array([0, 1, 0, 1]));
|
|
55
|
+
label("clear-buffer", probe(32, 32));
|
|
56
|
+
|
|
57
|
+
const vs: any = gl.createShader(gl.VERTEX_SHADER);
|
|
58
|
+
gl.shaderSource(vs, "#version 300 es\\n" +
|
|
59
|
+
"in vec2 a_pos; in vec2 a_offset; out vec2 v_uv;\\n" +
|
|
60
|
+
"void main() { v_uv = a_pos * 0.5 + 0.5;\\n" +
|
|
61
|
+
" gl_Position = vec4(a_pos * 0.35 + a_offset, 0.0, 1.0); }");
|
|
62
|
+
gl.compileShader(vs);
|
|
63
|
+
const vs_ok = gl.getShaderParameter(vs, gl.COMPILE_STATUS);
|
|
64
|
+
label("vs", vs_ok === true ? "true" : "false:" + gl.getShaderInfoLog(vs));
|
|
65
|
+
const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
|
|
66
|
+
gl.shaderSource(fs, "#version 300 es\\n" +
|
|
67
|
+
"precision highp float; in vec2 v_uv; uniform vec4 u_color;\\n" +
|
|
68
|
+
"out vec4 fragColor; void main() { fragColor = u_color; }");
|
|
69
|
+
gl.compileShader(fs);
|
|
70
|
+
const fs_ok = gl.getShaderParameter(fs, gl.COMPILE_STATUS);
|
|
71
|
+
label("fs", fs_ok === true ? "true" : "false:" + gl.getShaderInfoLog(fs));
|
|
72
|
+
const program: any = gl.createProgram();
|
|
73
|
+
gl.attachShader(program, vs);
|
|
74
|
+
gl.attachShader(program, fs);
|
|
75
|
+
gl.linkProgram(program);
|
|
76
|
+
const link_ok = gl.getProgramParameter(program, gl.LINK_STATUS);
|
|
77
|
+
label("link", link_ok === true ? "true" : "false:" + gl.getProgramInfoLog(program));
|
|
78
|
+
gl.useProgram(program);
|
|
79
|
+
label("ubo", gl.getUniformBlockIndex(program, "Nope"));
|
|
80
|
+
|
|
81
|
+
const vao: any = gl.createVertexArray();
|
|
82
|
+
label("vao", vao != null);
|
|
83
|
+
gl.bindVertexArray(vao);
|
|
84
|
+
const quad = gl.createBuffer();
|
|
85
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, quad);
|
|
86
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
|
87
|
+
-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1,
|
|
88
|
+
]), gl.STATIC_DRAW);
|
|
89
|
+
const pos: any = gl.getAttribLocation(program, "a_pos");
|
|
90
|
+
gl.enableVertexAttribArray(pos);
|
|
91
|
+
gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);
|
|
92
|
+
const offsets = gl.createBuffer();
|
|
93
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, offsets);
|
|
94
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-0.5, 0, 0, 0, 0.5, 0]), gl.STATIC_DRAW);
|
|
95
|
+
const offset_loc: any = gl.getAttribLocation(program, "a_offset");
|
|
96
|
+
gl.enableVertexAttribArray(offset_loc);
|
|
97
|
+
gl.vertexAttribPointer(offset_loc, 2, gl.FLOAT, false, 0, 0);
|
|
98
|
+
gl.vertexAttribDivisor(offset_loc, 1);
|
|
99
|
+
// Round-trip the VAO through the default state to prove it restores.
|
|
100
|
+
gl.bindVertexArray(null);
|
|
101
|
+
gl.bindVertexArray(vao);
|
|
102
|
+
|
|
103
|
+
gl.uniform4f(gl.getUniformLocation(program, "u_color"), 0, 0, 1, 1);
|
|
104
|
+
gl.clearColor(1, 0, 0, 1);
|
|
105
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
106
|
+
gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, 3);
|
|
107
|
+
label("inst-0", probe(16, 32));
|
|
108
|
+
label("inst-1", probe(32, 32));
|
|
109
|
+
label("inst-2", probe(48, 32));
|
|
110
|
+
label("inst-background", probe(4, 32));
|
|
111
|
+
|
|
112
|
+
// Sampler objects and immutable texture storage.
|
|
113
|
+
const sampler: any = gl.createSampler();
|
|
114
|
+
gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
115
|
+
gl.bindSampler(0, sampler);
|
|
116
|
+
label("sampler", gl.getSamplerParameter(sampler, gl.TEXTURE_MIN_FILTER) === gl.NEAREST);
|
|
117
|
+
const texture: any = gl.createTexture();
|
|
118
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
119
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, 2, 2);
|
|
120
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE,
|
|
121
|
+
new Uint8Array([255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 0, 255]));
|
|
122
|
+
label("tex-storage", gl.getError());
|
|
123
|
+
|
|
124
|
+
// copyBufferSubData / getBufferSubData.
|
|
125
|
+
const source = gl.createBuffer();
|
|
126
|
+
gl.bindBuffer(gl.COPY_READ_BUFFER, source);
|
|
127
|
+
gl.bufferData(gl.COPY_READ_BUFFER, new Uint8Array([1, 2, 3, 4]), gl.STATIC_DRAW);
|
|
128
|
+
const destination = gl.createBuffer();
|
|
129
|
+
gl.bindBuffer(gl.COPY_WRITE_BUFFER, destination);
|
|
130
|
+
gl.bufferData(gl.COPY_WRITE_BUFFER, new Uint8Array([9, 9, 9, 9]), gl.STATIC_DRAW);
|
|
131
|
+
gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 4);
|
|
132
|
+
const out = new Uint8Array(4);
|
|
133
|
+
gl.getBufferSubData(gl.COPY_WRITE_BUFFER, 0, out, 0, 4);
|
|
134
|
+
label("copy", out[0] + "," + out[1] + "," + out[2] + "," + out[3]);
|
|
135
|
+
label("error", gl.getError());
|
|
136
|
+
win.close();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
win.loadHTML(page);
|
|
140
|
+
console.log("loaded");
|
|
141
|
+
`, { files: { "page.html": PAGE }, autocloseMs: 10000 });
|
|
142
|
+
expect(value("webgl2")).toBe("true");
|
|
143
|
+
expect(value("webgl1-after")).toBe("true");
|
|
144
|
+
expect(value("version")).toContain("WebGL 2.0");
|
|
145
|
+
expect(value("draw-buffers")).toBe("1");
|
|
146
|
+
expect(value("clear-red")).toBe("255,0,0,255");
|
|
147
|
+
expect(value("clear-buffer")).toBe("0,255,0,255");
|
|
148
|
+
expect(value("vs")).toBe("true");
|
|
149
|
+
expect(value("fs")).toBe("true");
|
|
150
|
+
expect(value("link")).toBe("true");
|
|
151
|
+
expect(value("ubo")).toBe("4294967295");
|
|
152
|
+
expect(value("vao")).toBe("true");
|
|
153
|
+
expect(value("inst-0")).toBe("0,0,255,255");
|
|
154
|
+
expect(value("inst-1")).toBe("0,0,255,255");
|
|
155
|
+
expect(value("inst-2")).toBe("0,0,255,255");
|
|
156
|
+
expect(value("inst-background")).toBe("255,0,0,255");
|
|
157
|
+
expect(value("sampler")).toBe("true");
|
|
158
|
+
expect(value("tex-storage")).toBe("0");
|
|
159
|
+
expect(value("copy")).toBe("1,2,3,4");
|
|
160
|
+
expect(value("error")).toBe("0");
|
|
161
|
+
expect(stderr).not.toContain("pipeline creation failed");
|
|
162
|
+
});
|
|
163
|
+
it("flattens struct uniforms into addressable fields", () => {
|
|
164
|
+
const { value } = harness.compileAndRun("webgl2-struct", `
|
|
165
|
+
import { createWindow } from "gui";
|
|
166
|
+
import page from "./page.html";
|
|
167
|
+
|
|
168
|
+
const win = createWindow({ title: "struct", width: 320, height: 240 });
|
|
169
|
+
const label = (name: string, value: any): void => console.log(name + "=" + value);
|
|
170
|
+
|
|
171
|
+
win.on("ready", () => {
|
|
172
|
+
const canvas: any = document.getElementById("c");
|
|
173
|
+
const gl: any = canvas.getContext("webgl2");
|
|
174
|
+
label("webgl2", gl != null);
|
|
175
|
+
if (gl == null) {
|
|
176
|
+
win.close();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const vs: any = gl.createShader(gl.VERTEX_SHADER);
|
|
180
|
+
gl.shaderSource(vs, "#version 300 es\\n" +
|
|
181
|
+
"in vec2 a_pos; void main() { gl_Position = vec4(a_pos, 0.0, 1.0); }");
|
|
182
|
+
gl.compileShader(vs);
|
|
183
|
+
const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
|
|
184
|
+
gl.shaderSource(fs, "#version 300 es\\n" +
|
|
185
|
+
"precision highp float;\\n" +
|
|
186
|
+
"struct Light { vec3 color; float power; };\\n" +
|
|
187
|
+
"uniform Light lights[2];\\n" +
|
|
188
|
+
"out vec4 fragColor;\\n" +
|
|
189
|
+
"void main() { fragColor = vec4(max(lights[0].color, lights[1].color), 1.0); }");
|
|
190
|
+
gl.compileShader(fs);
|
|
191
|
+
label("compile", gl.getShaderParameter(vs, gl.COMPILE_STATUS) === true &&
|
|
192
|
+
gl.getShaderParameter(fs, gl.COMPILE_STATUS) === true);
|
|
193
|
+
const program: any = gl.createProgram();
|
|
194
|
+
gl.attachShader(program, vs);
|
|
195
|
+
gl.attachShader(program, fs);
|
|
196
|
+
gl.linkProgram(program);
|
|
197
|
+
label("link", gl.getProgramParameter(program, gl.LINK_STATUS) === true);
|
|
198
|
+
gl.useProgram(program);
|
|
199
|
+
const c0: any = gl.getUniformLocation(program, "lights[0].color");
|
|
200
|
+
const c1: any = gl.getUniformLocation(program, "lights[1].color");
|
|
201
|
+
const p0: any = gl.getUniformLocation(program, "lights[0].power");
|
|
202
|
+
const p1: any = gl.getUniformLocation(program, "lights[1].power");
|
|
203
|
+
label("locations", (c0 != null) + "," + (c1 != null) + "," + (p0 != null) + "," + (p1 != null));
|
|
204
|
+
gl.uniform3f(c0, 1, 0, 0);
|
|
205
|
+
gl.uniform3f(c1, 0, 1, 0);
|
|
206
|
+
gl.uniform1f(p0, 1);
|
|
207
|
+
gl.uniform1f(p1, 1);
|
|
208
|
+
const buffer: any = gl.createBuffer();
|
|
209
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
210
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
|
211
|
+
-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1,
|
|
212
|
+
]), gl.STATIC_DRAW);
|
|
213
|
+
const pos: any = gl.getAttribLocation(program, "a_pos");
|
|
214
|
+
gl.enableVertexAttribArray(pos);
|
|
215
|
+
gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);
|
|
216
|
+
gl.viewport(0, 0, 64, 64);
|
|
217
|
+
gl.clearColor(0, 0, 0, 1);
|
|
218
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
219
|
+
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
|
220
|
+
const px = new Uint8Array(4);
|
|
221
|
+
gl.readPixels(32, 32, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);
|
|
222
|
+
label("pixel", px[0] + "," + px[1] + "," + px[2] + "," + px[3]);
|
|
223
|
+
label("error", gl.getError());
|
|
224
|
+
win.close();
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
win.loadHTML(page);
|
|
228
|
+
console.log("loaded");
|
|
229
|
+
`, { files: { "page.html": PAGE }, autocloseMs: 10000 });
|
|
230
|
+
expect(value("webgl2")).toBe("true");
|
|
231
|
+
expect(value("compile")).toBe("true");
|
|
232
|
+
expect(value("link")).toBe("true");
|
|
233
|
+
expect(value("locations")).toBe("true,true,true,true");
|
|
234
|
+
expect(value("pixel")).toBe("255,255,0,255");
|
|
235
|
+
expect(value("error")).toBe("0");
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
//# sourceMappingURL=gui-webgl2.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gui-webgl2.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-webgl2.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { tmpdir } from "node:os";
|
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { afterEach, describe, expect, it } from "vitest";
|
|
5
5
|
import { loadHtmlAsset } from "../../src/extensions/gui/html.js";
|
|
6
|
+
import { loadScriptAsset } from "../../src/extensions/gui/three.js";
|
|
6
7
|
import { guiExtension } from "../../src/extensions/gui/index.js";
|
|
7
8
|
import { DiagnosticBag } from "../../src/diagnostics/diagnostic.js";
|
|
8
9
|
import { SourceFile } from "../../src/diagnostics/source.js";
|
|
@@ -173,5 +174,45 @@ describe("gui .html asset loader", () => {
|
|
|
173
174
|
expect(parseDiagnostics(moduleSource), src).toBe(0);
|
|
174
175
|
}
|
|
175
176
|
});
|
|
177
|
+
it("inlines linked stylesheets and their @imports into the HTML", () => {
|
|
178
|
+
const directory = writeFiles({
|
|
179
|
+
"styles/main.css": '@import "./base.css";\n.a { color: red; }',
|
|
180
|
+
"styles/base.css": "body { background: #000; }",
|
|
181
|
+
"page.html": "",
|
|
182
|
+
});
|
|
183
|
+
const htmlPath = join(directory, "page.html");
|
|
184
|
+
const html = '<link rel="stylesheet" href="styles/main.css"><div class="a">x</div>';
|
|
185
|
+
const { moduleSource, dependencies } = loadHtmlAsset(htmlPath, html);
|
|
186
|
+
expect(htmlOf(moduleSource)).toContain("body { background: #000; }");
|
|
187
|
+
expect(htmlOf(moduleSource)).toContain(".a { color: red; }");
|
|
188
|
+
expect(htmlOf(moduleSource)).not.toContain("<link");
|
|
189
|
+
expect(moduleSource).not.toContain("@import");
|
|
190
|
+
expect(dependencies).toContain(join(directory, "styles/main.css"));
|
|
191
|
+
expect(dependencies).toContain(join(directory, "styles/base.css"));
|
|
192
|
+
expect(parseDiagnostics(moduleSource)).toBe(0);
|
|
193
|
+
});
|
|
194
|
+
it("does not inline remote stylesheet links", () => {
|
|
195
|
+
const { moduleSource } = loadHtmlAsset("page.html", '<link rel="stylesheet" href="https://example.com/x.css">');
|
|
196
|
+
expect(htmlOf(moduleSource)).toContain('href="https://example.com/x.css"');
|
|
197
|
+
});
|
|
198
|
+
it("disables three.js's regex unroller but keeps the renderer untouched", () => {
|
|
199
|
+
const source = "const unrollLoopPattern = /#pragma unroll_loop_start/g;\n" +
|
|
200
|
+
"class WebGLRenderer {\n constructor() {}\n}\n" +
|
|
201
|
+
"class WebGL1Renderer extends WebGLRenderer {}\n" +
|
|
202
|
+
"export { WebGL1Renderer, WebGLRenderer };\n";
|
|
203
|
+
const { moduleSource, dependencies } = loadScriptAsset("three.module.js", source);
|
|
204
|
+
expect(moduleSource).toContain("const unrollLoopPattern = /__xt_never_match__/;");
|
|
205
|
+
expect(moduleSource).toContain("class WebGLRenderer {");
|
|
206
|
+
expect(moduleSource).toContain("class WebGL1Renderer extends WebGLRenderer {}");
|
|
207
|
+
expect(moduleSource).not.toContain("WebGLRendererWebGL");
|
|
208
|
+
expect(moduleSource).not.toContain("__XtCanvas2DRenderer");
|
|
209
|
+
expect(dependencies).toBeUndefined();
|
|
210
|
+
});
|
|
211
|
+
it("leaves non-three JavaScript assets untouched", () => {
|
|
212
|
+
const source = "export const answer = 42;\n";
|
|
213
|
+
const result = loadScriptAsset("app.js", source);
|
|
214
|
+
expect(result.moduleSource).toBe(source);
|
|
215
|
+
expect(result.dependencies).toBeUndefined();
|
|
216
|
+
});
|
|
176
217
|
});
|
|
177
218
|
//# sourceMappingURL=gui.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/extensions/gui.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/extensions/gui.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,WAAW,GAAa,EAAE,CAAC;AAEjC,gEAAgE;AAChE,SAAS,UAAU,CAAC,KAA6B;IAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACrE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,2DAA2D;AAC3D,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC;IAC1E,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED,oEAAoE;AACpE,SAAS,MAAM,CAAC,YAAoB;IAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAW,CAAC;AAC9E,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG,+BAA+B,CAAC;QAC7C,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CACpC,WAAW,EACX,6BAA6B,IAAI,WAAW,CAC7C,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,wBAAwB,EAAE,sCAAsC,CAAC,CAAC;QACjG,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC9F,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;QAC5E,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,2CAA2C,CAAC,CAAC;QACpF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,kDAAkD,CAAC,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,oDAAoD,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,QAAQ,EAAE,mEAAmE;SAC9E,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,mEAAmE,CAAC;QACjF,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,wBAAwB,EAAE,sCAAsC,CAAC,CAAC;QACjG,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;QAC/E,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,gBAAgB,EAAE,yDAAyD;YAC3E,aAAa,EAAE,wBAAwB;SACxC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;QAC7F,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,QAAQ,EAAE,wDAAwD;SACnE,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,sCAAsC,CAAC,CAAC,CAAC,OAAO,CACvG,WAAW,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,MAAM,EAAE,2CAA2C;YACnD,MAAM,EAAE,2CAA2C;YACnD,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,CACV,aAAa,CAAC,QAAQ,EAAE,8DAA8D,CAAC,CACxF,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC3D,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAY,CAAC;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CACpC,WAAW,EACX,WAAW,KAAK,oBAAoB,MAAM,WAAW,CACtD,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,QAAQ,EAAE;gBACR,iCAAiC;gBACjC,yBAAyB;gBACzB,iDAAiD;gBACjD,cAAc;gBACd,eAAe;gBACf,0BAA0B;gBAC1B,sBAAsB;gBACtB,oBAAoB;gBACpB,mDAAmD;gBACnD,0CAA0C;aAC3C,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACjF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC1D,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtD,oEAAoE;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACvD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAC3E,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,gCAAgC,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;QACrF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,qBAAqB,CAAC,EAAE,CAAC;YACpE,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,CAAC,CAAC;YACjF,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACxD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG,UAAU,CAAC;YAC3B,iBAAiB,EAAE,2CAA2C;YAC9D,iBAAiB,EAAE,4BAA4B;YAC/C,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,sEAAsE,CAAC;QACpF,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CACpC,WAAW,EACX,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GACV,2DAA2D;YAC3D,gDAAgD;YAChD,iDAAiD;YACjD,6CAA6C,CAAC;QAChD,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAClF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;QAClF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;QAChF,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,6BAA6B,CAAC;QAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -13,7 +13,7 @@ afterEach(() => {
|
|
|
13
13
|
vi.restoreAllMocks();
|
|
14
14
|
mocks.findRuntimeLibrary.mockReset();
|
|
15
15
|
});
|
|
16
|
-
/** Pretend to be a POSIX host so the
|
|
16
|
+
/** Pretend to be a POSIX host, so the archive name in messages is `media.a`. */
|
|
17
17
|
function posixHost() {
|
|
18
18
|
vi.spyOn(process, "platform", "get").mockReturnValue("darwin");
|
|
19
19
|
}
|
|
@@ -41,9 +41,13 @@ describe("media extension object", () => {
|
|
|
41
41
|
expect(() => mediaExtension.nativeObjects?.()).toThrow(/media native library not found/);
|
|
42
42
|
expect(() => mediaExtension.nativeObjects?.()).toThrow(/npm run media/);
|
|
43
43
|
});
|
|
44
|
-
it("
|
|
44
|
+
it("links media.lib and the Win32 system libraries on Windows", () => {
|
|
45
45
|
vi.spyOn(process, "platform", "get").mockReturnValue("win32");
|
|
46
|
-
|
|
46
|
+
mocks.findRuntimeLibrary.mockReturnValue("C:/repo/runtime/lib/win32-x64/media.lib");
|
|
47
|
+
expect(mediaExtension.nativeObjects?.()).toEqual(["C:/repo/runtime/lib/win32-x64/media.lib"]);
|
|
48
|
+
/* FFmpeg's avutil/avcodec reference bcrypt, ole32 and user32; the GUI
|
|
49
|
+
* extension already contributes the rest. */
|
|
50
|
+
expect(mediaExtension.linkerFlags?.()).toEqual(["-lbcrypt", "-lole32", "-luser32"]);
|
|
47
51
|
});
|
|
48
52
|
it("rejects a build that enables media without gui", () => {
|
|
49
53
|
const registry = createDefaultRegistry().register(mediaExtension);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.test.js","sourceRoot":"","sources":["../../../tests/extensions/media.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAElE;mEACmE;AACnE,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;CAC7C,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,
|
|
1
|
+
{"version":3,"file":"media.test.js","sourceRoot":"","sources":["../../../tests/extensions/media.test.ts"],"names":[],"mappings":"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"}
|
package/doc/ai/extensions.md
CHANGED
|
@@ -68,8 +68,12 @@ import { createWindow, run } from "gui";
|
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
It is a self-contained GPU-accelerated renderer (own HTML parser, CSS cascade,
|
|
71
|
-
layout and compositor) — not a system WebView.
|
|
72
|
-
|
|
71
|
+
layout and compositor) — not a system WebView. The compiler side also inlines
|
|
72
|
+
local `<link rel="stylesheet">` files (and their `@import`s) into `<style>`
|
|
73
|
+
blocks, because the runtime parser only reads inline `<style>`; and it rewrites
|
|
74
|
+
a bundled three.js module's `WebGLRenderer` to use the real WebGL 2 backend:
|
|
75
|
+
only its shader unroller is patched, and no Canvas2D fallback is bundled. It
|
|
76
|
+
ships as a per-platform prebuilt `gui.a`/`gui.lib` because it is C++. `<img>` decodes through the engine
|
|
73
77
|
itself; `<video>`/`<audio>` do **not** work with `gui` alone — they need the
|
|
74
78
|
separate [`media`](#media--videoaudio-decoding) extension. `<canvas>` is
|
|
75
79
|
supported too: `getContext("2d")` returns a context whose fills, paths,
|
|
@@ -79,7 +83,11 @@ handles expose `canvas` drawing plus `width`/`height`. CSS
|
|
|
79
83
|
`transform`/`transform-origin` work as paint-time effects, so a box (and the
|
|
80
84
|
text, images and children in it) can be translated, scaled and rotated without
|
|
81
85
|
reflowing anything — animate it per frame from `requestAnimationFrame` or with
|
|
82
|
-
`transition: transform` (see `examples/gui/pelican-svg`).
|
|
86
|
+
`transition: transform` (see `examples/gui/pelican-svg`). The CSS subset also
|
|
87
|
+
covers `@media`, `::before`/`::after` generated content, multi-layer linear/radial
|
|
88
|
+
backgrounds, `text-shadow`, `clip-path` and `filter` colour/shadow effects;
|
|
89
|
+
`backdrop-filter` and true group blur are documented approximations or
|
|
90
|
+
unsupported. If the archive is
|
|
83
91
|
missing for your platform, the build fails with an actionable message; design
|
|
84
92
|
and roadmap live in [../gui.md](../gui.md) (overview; the engine is documented by
|
|
85
93
|
function under [`doc/gui/`](../gui/)), and the scripting surface in
|
|
@@ -92,8 +100,14 @@ Pages written for the browser also get the browser globals they reach for —
|
|
|
92
100
|
`escape`, the `Event` family and a Web Audio *surface* (`AudioContext` with
|
|
93
101
|
nodes, params and buffers, but no mixer) — plus a frame pump that starts at
|
|
94
102
|
`loadHTML` and re-arms only while animation-frame callbacks remain, so a page
|
|
95
|
-
that never calls `run()` still paints and then exits. WebGL
|
|
96
|
-
|
|
103
|
+
that never calls `run()` still paints and then exits. **WebGL 1.0 and 2.0 are implemented**: `canvas.getContext("webgl")` /
|
|
104
|
+
`"webgl2"` return a GPU context whose GLSL ES shaders are compiled to SPIR-V by
|
|
105
|
+
a bundled glslang — consumed by Vulkan, or cross-compiled to MSL by bundled
|
|
106
|
+
SPIRV-Cross on Metal — and drawn through SDL_GPU; the page composites the colour
|
|
107
|
+
texture without a CPU readback, and WebGL 2 adds VAOs, instancing, integer
|
|
108
|
+
attributes, sampler objects, `texStorage2D` and buffer copies (see
|
|
109
|
+
[../gui/webgl.md](../gui/webgl.md)). WebXR, `<video>`/`<audio>` without
|
|
110
|
+
`media`, `fetch` and streaming are **not** implemented:
|
|
97
111
|
`typeof` answers `"undefined"` so a page takes its own fallback branch. See
|
|
98
112
|
[../gui/api.md](../gui/api.md#browser-globals).
|
|
99
113
|
|
|
@@ -101,8 +115,8 @@ that never calls `run()` still paints and then exits. WebGL, WebXR, `<video>`/
|
|
|
101
115
|
|
|
102
116
|
Enable with `--ext media` **together with** `gui` (`--ext gui,media`; the
|
|
103
117
|
registry rejects `media` on its own). It links a separate FFmpeg-backed
|
|
104
|
-
`media.a`, so adding `<video>`/`<audio>` playback does not make a
|
|
105
|
-
binary any larger.
|
|
118
|
+
`media.a`/`media.lib`, so adding `<video>`/`<audio>` playback does not make a
|
|
119
|
+
GUI-only binary any larger.
|
|
106
120
|
|
|
107
121
|
The DOM API is the same as for any HTML media element: `play()` / `pause()` /
|
|
108
122
|
`load()`, the `paused` / `ended` / `duration` / `currentTime` / `volume` /
|
|
@@ -112,8 +126,14 @@ The DOM API is the same as for any HTML media element: `play()` / `pause()` /
|
|
|
112
126
|
elements and CSS (see `examples/gui/media.ts`). Video frames and audio PCM are
|
|
113
127
|
decoded on the main thread; video goes through the image texture path. Without
|
|
114
128
|
the extension, opening a media source fails and fires `error` (the element and
|
|
115
|
-
its API still exist). The archive is
|
|
116
|
-
|
|
129
|
+
its API still exist). The archive is built for every host: POSIX produces
|
|
130
|
+
`media.a`, while Windows produces `media.lib` from FFmpeg compiled with the
|
|
131
|
+
MSVC-targeting `clang-cl`, so it links with `gui.lib`. Building it on Windows
|
|
132
|
+
needs a POSIX shell (Git for Windows' bundled bash) and a native GNU make
|
|
133
|
+
(Chocolatey `make`, or `xbintsc_MAKE`). See
|
|
134
|
+
[../gui/build.md](../gui/build.md). Without the archive, or on a host where
|
|
135
|
+
`npm run media` has not run, media elements report `error`; see
|
|
136
|
+
[../gui/known-issues.md](../gui/known-issues.md).
|
|
117
137
|
|
|
118
138
|
## Third-party npm packages
|
|
119
139
|
|
|
@@ -102,11 +102,13 @@ stderr — read the stderr, not just the first line. Frequent causes:
|
|
|
102
102
|
`xbintsc doctor` shows the compiler and its target; prefer the LLVM bundled
|
|
103
103
|
with Visual Studio, which locates the SDK itself. If your installation still
|
|
104
104
|
needs the environment imported, run from an **x64 Native Tools Command Prompt
|
|
105
|
-
for VS 2022** (or **ARM64 Native Tools** on Windows on ARM), or import
|
|
106
|
-
|
|
105
|
+
for VS 2022** (or **ARM64 Native Tools** on Windows on ARM), or import the
|
|
106
|
+
same Visual Studio setup CI uses:
|
|
107
107
|
```powershell
|
|
108
|
-
|
|
108
|
+
pwsh -File scripts/setup-vs-toolchain.ps1
|
|
109
109
|
```
|
|
110
|
+
That imports `vcvarsall` and pins `xbintsc_CLANG` to the LLVM bundled with
|
|
111
|
+
Visual Studio. Invoking `vcvarsall.bat x64` directly also works.
|
|
110
112
|
- the linker is wrong on Linux — set `xbintsc_CLANG` and/or pass
|
|
111
113
|
`xbintsc_LINKER_ARGS=-fuse-ld=lld`;
|
|
112
114
|
- `No C compiler found. Set xbintsc_CLANG to a clang binary.` — no clang on
|
|
@@ -120,11 +122,13 @@ described in [../gui.md](../gui.md).
|
|
|
120
122
|
|
|
121
123
|
### `media native library not found at …`
|
|
122
124
|
|
|
123
|
-
`<video>`/`<audio>` playback needs the optional `media` archive (`media.a
|
|
124
|
-
built separately with `npm run media`. Build it, or
|
|
125
|
-
GUI-only build still links and media elements simply fire
|
|
126
|
-
extension also requires `gui`,
|
|
127
|
-
|
|
125
|
+
`<video>`/`<audio>` playback needs the optional `media` archive (`media.a`, or
|
|
126
|
+
`media.lib` on Windows), built separately with `npm run media`. Build it, or
|
|
127
|
+
drop `--ext media`; a GUI-only build still links and media elements simply fire
|
|
128
|
+
`error`. The `media` extension also requires `gui`, and `--ext media` alone is
|
|
129
|
+
rejected with the flags to pass. On Windows the FFmpeg build additionally needs
|
|
130
|
+
a POSIX shell (Git for Windows' bash) and a native GNU make (Chocolatey `make`,
|
|
131
|
+
or `xbintsc_MAKE`). The script names whichever is missing. See
|
|
128
132
|
[../gui/build.md](../gui/build.md).
|
|
129
133
|
|
|
130
134
|
### `Icon file not found` / icon tools missing
|
|
@@ -66,7 +66,11 @@ import { createWindow, run } from "gui";
|
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
它是自带渲染引擎的 GPU 加速实现(自己的 HTML 解析器、CSS 级联、布局与合成器),不是
|
|
69
|
-
系统 WebView
|
|
69
|
+
系统 WebView。编译器一侧还会把本地 `<link rel="stylesheet">` 及其 `@import` 内联为
|
|
70
|
+
`<style>` 块(运行时解析器只读取内联 `<style>`);并让随包引入的 Three.js 的
|
|
71
|
+
`WebGLRenderer` 先探测 WebGL 上下文:引擎有上下文时使用 Three.js 自己的渲染器,
|
|
72
|
+
直接使用真实的 WebGL 2 后端(只修补其着色器循环展开,不再打包 Canvas2D 回退)。
|
|
73
|
+
`<img>` 由引擎自身解码;而 `<video>`/`<audio>` 在只启用 `gui` 时**不可用**
|
|
70
74
|
——它们需要单独的 [`media`](#media--视频音频解码) 扩展。也支持 `<canvas>`:
|
|
71
75
|
`getContext("2d")` 返回的上下文,其填充、路径、
|
|
72
76
|
渐变、文本与 `drawImage` 由自研 CPU 光栅器处理(另有线段端点/连接、虚线描边、
|
|
@@ -74,7 +78,10 @@ import { createWindow, run } from "gui";
|
|
|
74
78
|
`transform`/`transform-origin` 作为绘制期效果可用,因此一个盒子(以及其中的文本、
|
|
75
79
|
图像与子元素)可以被平移、缩放与旋转而不触发任何重排——可以用
|
|
76
80
|
`requestAnimationFrame` 逐帧驱动,或写成 `transition: transform`(见
|
|
77
|
-
`examples/gui/pelican-svg
|
|
81
|
+
`examples/gui/pelican-svg`)。CSS 子集还覆盖 `@media`、`::before`/`::after`
|
|
82
|
+
生成内容、线性/径向多层背景、`text-shadow`、`clip-path` 与 `filter`
|
|
83
|
+
颜色/阴影效果;`backdrop-filter` 与真正的组模糊是有文档说明的近似或未支持。
|
|
84
|
+
因为主体是 C++,它以各平台预编译的 `gui.a`/`gui.lib` 形式分发。如果该
|
|
78
85
|
平台的归档不存在,构建会以明确的提示失败;设计与路线图见 [../../zh-CN/gui.md](../../zh-CN/gui.md)(总览;引擎按功能拆分在 [`doc/zh-CN/gui/`](../../zh-CN/gui/) 下),
|
|
79
86
|
脚本接口见 [../../zh-CN/gui-scripts.md](../../zh-CN/gui-scripts.md)。Canvas API
|
|
80
87
|
及其限制见 [../../zh-CN/gui/canvas.md](../../zh-CN/gui/canvas.md)。
|
|
@@ -84,15 +91,21 @@ import { createWindow, run } from "gui";
|
|
|
84
91
|
`getComputedStyle`、`alert`/`prompt`、`escape`、`Event` 家族,以及一层 Web Audio
|
|
85
92
|
**接口**(`AudioContext` 及其节点、参数与缓冲区,但没有混音后端)—— 另外还有帧泵:
|
|
86
93
|
它在 `loadHTML` 时启动,仅在仍有动画帧回调时重新排程,因此从不调用 `run()` 的页面
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
也能绘制并最终退出。**WebGL 1.0 与 2.0 已实现**:`canvas.getContext("webgl")` /
|
|
95
|
+
`"webgl2"` 返回 GPU 上下文,其 GLSL ES 着色器由内置 glslang 编译为 SPIR-V
|
|
96
|
+
(Vulkan 直接消费,Metal 上由内置 SPIRV-Cross 转成 MSL),
|
|
97
|
+
并通过 SDL_GPU 绘制;页面直接合成颜色纹理而无须 CPU 读回,WebGL 2 还增加
|
|
98
|
+
VAO、实例化、整数属性、采样器对象、`texStorage2D` 与缓冲拷贝(见
|
|
99
|
+
[../../zh-CN/gui/webgl.md](../../zh-CN/gui/webgl.md))。WebXR、未启用
|
|
100
|
+
`media` 时的 `<video>`/`<audio>`、`fetch` 与流式接口**尚未实现**:`typeof` 会回答
|
|
101
|
+
`"undefined"`,让页面走自己的降级分支。
|
|
89
102
|
见 [../../zh-CN/gui/api.md](../../zh-CN/gui/api.md)。
|
|
90
103
|
|
|
91
104
|
### `media` —— 视频/音频解码
|
|
92
105
|
|
|
93
106
|
用 `--ext media` **与 `gui` 一起**开启(`--ext gui,media`;注册表会拒绝单独启用
|
|
94
|
-
`media`)。它链接单独的 FFmpeg 后端 `media.a`,因此加入
|
|
95
|
-
|
|
107
|
+
`media`)。它链接单独的 FFmpeg 后端 `media.a`/`media.lib`,因此加入
|
|
108
|
+
`<video>`/`<audio>` 播放不会让只做界面的二进制变大。
|
|
96
109
|
|
|
97
110
|
DOM API 与普通 HTML 媒体元素一致:`play()` / `pause()` / `load()`,以及
|
|
98
111
|
`paused` / `ended` / `duration` / `currentTime` / `volume` / `muted` / `loop` /
|
|
@@ -100,8 +113,13 @@ DOM API 与普通 HTML 媒体元素一致:`play()` / `pause()` / `load()`,
|
|
|
100
113
|
`loadedmetadata`/`play`/`pause`/`ended`/`timeupdate`/`error` 事件。没有内置
|
|
101
114
|
控件——用元素和 CSS 自绘控件(见 `examples/gui/media.ts`)。视频帧与音频 PCM
|
|
102
115
|
都在主线程解码;视频走图像纹理路径。没有该扩展时,打开媒体源会失败并触发
|
|
103
|
-
`error`(元素与 API
|
|
104
|
-
|
|
116
|
+
`error`(元素与 API 仍然存在)。归档会为每个宿主平台构建:POSIX 产出
|
|
117
|
+
`media.a`,Windows 则用面向 MSVC 的 `clang-cl` 编译 FFmpeg 并产出 `media.lib`,
|
|
118
|
+
因此可与 `gui.lib` 链接。Windows 上构建它需要 POSIX shell(Git for Windows
|
|
119
|
+
自带的 bash)与原生 GNU make(Chocolatey `make`,或 `xbintsc_MAKE`)。见
|
|
120
|
+
[../../zh-CN/gui/build.md](../../zh-CN/gui/build.md)。
|
|
121
|
+
没有归档、或宿主上还没运行 `npm run media` 时,媒体元素会触发 `error`;见
|
|
122
|
+
[../../zh-CN/gui/known-issues.md](../../zh-CN/gui/known-issues.md)。
|
|
105
123
|
|
|
106
124
|
## 第三方 npm 包
|
|
107
125
|
|
|
@@ -94,10 +94,12 @@ clang 自身失败。抛出的消息包含完整的 clang 命令与 stderr——
|
|
|
94
94
|
- Windows 上解析到的 clang 找不到 MSVC/SDK 头文件或库。`xbintsc doctor` 会显示
|
|
95
95
|
编译器及其目标;优先使用 Visual Studio 自带的 LLVM,它会自行定位 SDK。如果你的
|
|
96
96
|
安装仍需要显式导入环境,请在 **x64 Native Tools Command Prompt for VS 2022**
|
|
97
|
-
(ARM64 机器上是 **ARM64 Native Tools
|
|
97
|
+
(ARM64 机器上是 **ARM64 Native Tools**)里运行,或直接使用 CI 同一套设置:
|
|
98
98
|
```powershell
|
|
99
|
-
|
|
99
|
+
pwsh -File scripts/setup-vs-toolchain.ps1
|
|
100
100
|
```
|
|
101
|
+
该脚本会导入 `vcvarsall`,并把 `xbintsc_CLANG` 指向 Visual Studio 自带的
|
|
102
|
+
LLVM。直接执行 `vcvarsall.bat x64` 也仍然可行。
|
|
101
103
|
- Linux 上链接器不对——设置 `xbintsc_CLANG`,并/或传
|
|
102
104
|
`xbintsc_LINKER_ARGS=-fuse-ld=lld`;
|
|
103
105
|
- `No C compiler found. Set xbintsc_CLANG to a clang binary.` —— `PATH` 里完全没有
|
|
@@ -110,10 +112,12 @@ clang 自身失败。抛出的消息包含完整的 clang 命令与 stderr——
|
|
|
110
112
|
|
|
111
113
|
### `media native library not found at …`
|
|
112
114
|
|
|
113
|
-
`<video>`/`<audio>` 播放需要可选的 `media` 归档(`media.a
|
|
114
|
-
`npm run media` 单独构建。构建它,或去掉 `--ext media
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
`<video>`/`<audio>` 播放需要可选的 `media` 归档(`media.a`,Windows 上是
|
|
116
|
+
`media.lib`),用 `npm run media` 单独构建。构建它,或去掉 `--ext media`;
|
|
117
|
+
仅启用 `gui` 的构建仍可链接,媒体元素只会触发 `error`。`media` 扩展还依赖
|
|
118
|
+
`gui`,单独 `--ext media` 会被拒绝并提示应传的 flag。Windows 上 FFmpeg 的
|
|
119
|
+
构建还需要 POSIX shell(Git for Windows 的 bash)与原生 GNU make
|
|
120
|
+
(Chocolatey `make`,或 `xbintsc_MAKE`)。脚本会指出缺失的是哪一个。见
|
|
117
121
|
[../../zh-CN/gui/build.md](../../zh-CN/gui/build.md)。
|
|
118
122
|
|
|
119
123
|
### `Icon file not found` / 图标工具缺失
|
package/doc/gui/api.md
CHANGED
|
@@ -56,7 +56,8 @@ requestAnimationFrame(frame);
|
|
|
56
56
|
| `localStorage` | an in-memory `getItem` / `setItem` / `removeItem` / `clear` / `key` / `length` store |
|
|
57
57
|
| `AudioContext`, `webkitAudioContext` | a Web Audio graph builder (see below) |
|
|
58
58
|
| `Event`, `CustomEvent`, `ProgressEvent`, … | event constructors |
|
|
59
|
-
| `HTMLCanvasElement`, `HTMLImageElement`, `
|
|
59
|
+
| `HTMLCanvasElement`, `HTMLImageElement`, `WebGLRenderingContext`, `WebGL2RenderingContext`, `WebGLBuffer`/`WebGLTexture`/`WebGLShader`/`WebGLProgram`/`WebGLFramebuffer`/`WebGLRenderbuffer`/`WebGLUniformLocation`/`WebGLActiveInfo`/`WebGLVertexArrayObject`/`WebGLSampler`/`WebGLQuery`/`WebGLSync`/`WebGLTransformFeedback` | real constructor values. `canvas.getContext("webgl")` and `getContext("webgl2")` return GPU contexts (see [WebGL](./webgl.md)). |
|
|
60
|
+
| `ImageBitmap`, `ImageData`, `OffscreenCanvas`, `XRWebGL*`, `Request`, `Headers`, `Response`, `ReadableStream`, `DOMParser` | `typeof` probes answer `"undefined"` (no XR/fetch/streaming backend), which lets a page take its "unsupported" branch instead of calling a no-op stub. Three.js pages use its real renderer on this backend (see [Known issues](./known-issues.md)). |
|
|
60
61
|
| `requestAnimationFrame` / `cancelAnimationFrame` | queued on the window's frame list; see [Runtime integration](./runtime.md) |
|
|
61
62
|
| `alert` / `confirm` / `prompt`, `matchMedia`, `getComputedStyle`, `escape` | host implementations (Annex B `escape` encodes per UTF-16 code unit, matching `decodeURIComponent(escape(bytes))`) |
|
|
62
63
|
|
|
@@ -142,4 +143,4 @@ afterwards for debugging.
|
|
|
142
143
|
Multiple windows fall out of the object model: `createWindow` returns a native
|
|
143
144
|
object handle; each handle owns its own `SDL_Window`/GPU surface and its own DOM
|
|
144
145
|
tree. `run()` drives one shared main loop that ticks every window and exits when
|
|
145
|
-
the last one closes.
|
|
146
|
+
the last one closes.
|