pcbjam/tests/apps/3d-webgl/3d_webgl_test.html

36 lines
1.3 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>3D Renderer WebGL Test</title>
<style>
body { margin: 0; background: #202020; }
#canvas { display: block; width: 800px; height: 600px; }
</style>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
<script>
let ready = false;
let wasmModule = null;
window._threeDTestReady = () => { ready = true; };
window.threeDTest = {
isReady: () => ready,
runScenario: (i) => wasmModule.ccall('runScenario', 'number', ['number'], [i]),
getTotalScenarios: () => wasmModule.ccall('getTotalScenarios', 'number', [], []),
getScenarioName: (i) => wasmModule.ccall('getScenarioName', 'string', ['number'], [i]),
getCanvasWidth: () => wasmModule.ccall('getCanvasWidth', 'number', [], []),
getCanvasHeight: () => wasmModule.ccall('getCanvasHeight', 'number', [], []),
fix(3d): blank render + lost position after 3D viewer close/reopen (gl1 context guard) Closing the viewer destroys its wxGLCanvas's WebGL context; reopening mints a new one. The gl1 shim cached GL names (FFP program, stream/scratch VBOs) in never-reset statics behind `if (!handle)` guards — in the new context every draw died with INVALID_OPERATION and the viewer showed only the clear color ("Reload time 0.031 s" is benign: warm model caches make the rebuild fast). contextSync() (gl1_state.cpp) now detects the context change in programSync() — the one choke point every shim draw crosses, and a path the 2D GAL never reaches (a first attempt checking in the glBindTexture wrap saw the GAL's context and thrash-rebuilt the program 23x per run) — and drops the cached names for lazy rebuild in the new context. Context identity is a monotonic id stamped on Emscripten's per-context record: the numeric EMSCRIPTEN_WEBGL_CONTEXT_HANDLE is recycled, so a destroy-then-create can return the same number and a handle comparison detects nothing. The lost-position half is a wxwidgets wasm fix (pointer bump: GetFromWindow reports display 0; saved geometry used to carry display=(unsigned)-1, which LoadWindowState treats as "display not found" and re-centres the frame). TDD (red observed before each fix, green after): - tests/kicad/3d-viewer-reopen.spec.ts (new, own worker like the deadlock spec): load board, open viewer, render-gate, drag by the titlebar, close via the x, reopen; asserts the board re-renders (was: 1 distinct colour for 90 s) and the window position is restored (was: re-centred to 0,0 after closing at 40,90). Green run logs exactly one [gl1] context-change line. - 3d-regression harness: recreateContext() destroys the context AND swaps in a fresh canvas element (a browser canvas keeps its context for life, so same-element recreation hands back the live old context and hides the bug); the new 3d-webgl spec test renders redraw-mini-board-navigator before and after recreation and requires pixel-identical output. Parity: 47/47, zero drift. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 15:55:31 +02:00
recreateContext: () => wasmModule.ccall('recreateContext', 'number', [], []),
};
</script>
<script src="3d_webgl_test.js"></script>
<script>
create3DTest({ canvas: document.getElementById('canvas') })
.then((mod) => { wasmModule = mod; })
.catch((err) => { console.error('[3d-webgl] module init failed:', err); });
</script>
</body>
</html>