diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-21 20:31:37 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-21 20:31:37 +0800 |
| commit | 374afdcd7172402a0be0371964fd6d4040610d5a (patch) | |
| tree | 6d9ada436948a7d1b5dd8185a3ff9a5af648e3b9 /public/App.js | |
| parent | 8d594b6a541c5ee2ab3ddf9fe870df790d0bb357 (diff) | |
| download | somhairles-dream-fsharp-374afdcd7172402a0be0371964fd6d4040610d5a.tar.gz | |
feat(ui): loading overlay with instant mesh swap, no-store GLB, full-width viewport, ground grid, drop masthead title
Diffstat (limited to 'public/App.js')
| -rw-r--r-- | public/App.js | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/public/App.js b/public/App.js index eb47dbc..7aac7f0 100644 --- a/public/App.js +++ b/public/App.js @@ -330,6 +330,9 @@ export function initializeView() { scene.add(rimLight); const bounceLight = new THREE.HemisphereLight("#3d4a56", "#141a1e", 0.9); scene.add(bounceLight); + const grid = new THREE.GridHelper(24, 48, "#5a4a2a", "#2a2f33"); + grid.position.y = -1.35; + scene.add(grid); const controls = new OrbitControls(camera, canvas); controls.target.copy({ x: 0, y: 0, z: 0 }); controls.enableDamping = true; @@ -430,12 +433,17 @@ export function startStepLoad(view, owner, historical) { viewMode(new ViewMode(1, [])); failedLoad(undefined); setNoteRetryable(false); + clearGroup(view.Group); + displayedNode(undefined); + loadedStep(undefined); + document.getElementById("viewport-loading").classList.toggle('is-hidden', false); const loader = new GLTFLoader(); const projectId = encodeURIComponent(owner.ProjectId); const runId = encodeURIComponent(owner.RunId); + const stamp = ~~(Date.now() % 100000000) | 0; let url; const arg_2 = encodeURIComponent(owner.Path); - url = toText(printf("/api/artifacts/steps?projectId=%s&runId=%s&path=%s"))(projectId)(runId)(arg_2); + url = toText(printf("/api/artifacts/steps?projectId=%s&runId=%s&path=%s&ts=%d"))(projectId)(runId)(arg_2)(stamp); if (historical) { setText("viewport-note", toText(printf("历史几何加载中 · %s"))(owner.Path)); } @@ -450,6 +458,7 @@ export function startStepLoad(view, owner, historical) { displayedNode(gltf.scene); loadedStep(owner); frameObject(view, gltf.scene); + document.getElementById("viewport-loading").classList.toggle('is-hidden', true); view.Renderer.render(view.Scene, view.Camera); if (historical) { setText("viewport-note", toText(printf("历史几何 · %s"))(owner.Path)); @@ -466,6 +475,7 @@ export function startStepLoad(view, owner, historical) { pendingLoad(undefined); loadedStep(undefined); failedLoad([owner, historical]); + document.getElementById("viewport-loading").classList.toggle('is-hidden', true); setNoteRetryable(true); if (historical) { setText("viewport-note", toText(printf("历史几何加载失败 · %s"))(owner.Path)); @@ -965,10 +975,14 @@ export function loadHistoryFor(selection) { } } else { + document.getElementById("viewport-loading").classList.toggle('is-hidden', true); + setText("viewport-note", "该运行尚无可用历史几何"); return singleton.Zero(); } }) : singleton.Zero(); })), (_arg_2) => { + document.getElementById("viewport-loading").classList.toggle('is-hidden', true); + setText("viewport-note", "历史几何加载失败 · 清单不可用"); return singleton.Zero(); }))); } @@ -1032,6 +1046,15 @@ export function selectModel(card) { activeModel(selection); highlightActiveCard(selection); setText("run-message", "载入模型历史"); + if (viewState() == null) { + } + else { + clearGroup(viewState().Group); + displayedNode(undefined); + loadedStep(undefined); + } + document.getElementById("viewport-loading").classList.toggle('is-hidden', false); + setText("viewport-note", "历史几何加载中"); loadHistoryFor(selection); } |
