feat(web): finish RE 5000PBR lesson video and fix non-ASCII GLB import
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

- Add 11:07 Chinese-narrated lesson video, VTT, poster and 13 chapter screenshots.
- Regenerate 20-render WebGL2 matrix and 15 operation captures on RTX 4060.
- Fix WASM staging for non-ASCII import filenames (猴头.glb); rebuild web_engine.
- Harden lesson video recording pipeline; fix stale lesson-link E2E selector.
- Add RE PBR derived libraries, lesson page, evidence and status report.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
mes123456
2026-11-12 21:49:24 +08:00
parent a078648297
commit d5dd647881
276 changed files with 9632 additions and 314 deletions

View File

@@ -41,6 +41,8 @@ const fixtures = new Map([
["/engine-manifest.json", write("engine-manifest.json", "{\"schemaVersion\":2}\n")],
["/media/frame.png", write("media/frame.png", Buffer.from([0x89, 0x50, 0x4e, 0x47]))],
["/media/silence.wav", write("media/silence.wav", Buffer.from("RIFF0000WAVE"))],
["/media/lesson.mp4", write("media/lesson.mp4", deterministicBytes(4096, 17))],
["/media/lesson.vtt", write("media/lesson.vtt", "WEBVTT\n\n00:00.000 --> 00:02.000\nHello\n")],
["/fixtures/basic.blend", write("fixtures/basic.blend", deterministicBytes(4096, 11))],
["/volumes/smoke.nvdb", write("volumes/smoke.nvdb", deterministicBytes(1024 * 1024, 19))],
]);
@@ -111,6 +113,8 @@ try {
["/engine-manifest.json", ".json"],
["/media/frame.png", ".png"],
["/media/silence.wav", ".wav"],
["/media/lesson.mp4", ".mp4"],
["/media/lesson.vtt", ".vtt"],
["/fixtures/basic.blend", ".blend"],
["/volumes/smoke.nvdb", ".nvdb"],
];
@@ -134,6 +138,7 @@ try {
await expectRange("/vendor/blender/single/web_engine.wasm", "bytes=100-199", 100, 199);
await expectRange("/fixtures/basic.blend", "bytes=200-399", 200, 399);
await expectRange("/volumes/smoke.nvdb", "bytes=300-599", 300, 599);
await expectRange("/media/lesson.mp4", "bytes=100-199", 100, 199);
await expectRange("/fixtures/basic.blend", "bytes=400-", 400, fixtures.get("/fixtures/basic.blend").length - 1);
await expectRange("/fixtures/basic.blend", "bytes=-128", fixtures.get("/fixtures/basic.blend").length - 128, fixtures.get("/fixtures/basic.blend").length - 1);
@@ -189,7 +194,7 @@ try {
assert.equal((await fetch(`${privateOrigin}/api/server-operator-job`, { method: "POST", headers: { ...privateHeaders, Origin: "https://untrusted.invalid" } })).status, 403);
await assert.rejects(listenDeploymentHttpServer(createDeploymentHttpServer({ root, contract, accessPassword: "" }), { host: "0.0.0.0" }), /WEB_BLENDER_PASSWORD/);
} finally { await new Promise((resolve) => privateServer.close(resolve)); }
process.stdout.write("deployment-http-ok mime=10 head=4 ranges=5 invalidRanges=6 resumeSha256=verified\n");
process.stdout.write("deployment-http-ok mime=12 head=4 ranges=6 invalidRanges=6 resumeSha256=verified\n");
}
finally {
if (server.listening) await new Promise((resolve) => server.close(resolve));