diff --git a/src/components/site-map-v3/panels/buildprogress-panel.tsx b/src/components/site-map-v3/panels/buildprogress-panel.tsx index 83e32e0..b9c827b 100644 --- a/src/components/site-map-v3/panels/buildprogress-panel.tsx +++ b/src/components/site-map-v3/panels/buildprogress-panel.tsx @@ -4,6 +4,7 @@ import * as React from "react"; import type { SiteModelData } from "@/lib/site-map-v2/model-types"; import type { ProgressState } from "@/lib/site-map-v2/progress"; import { layerCatalog, layerTotals, sectionSummary } from "@/lib/site-map-v3/layer-progress"; +import { decodeGrid, sampleGrid } from "@/lib/site-map-v3/grid"; import type { Selection } from "../scene/types"; const css = (n: number) => `#${n.toString(16).padStart(6, "0")}`; @@ -13,6 +14,7 @@ export function BuildProgressPanel({ model, state, selected, setSelected, select select(sel: Selection): void; focus(e: number, n: number, z: number, dist: number): void; onOpen(sectionKey: string): void; canEdit: boolean; }) { const catalog = React.useMemo(() => layerCatalog(model), [model]); + const design = React.useMemo(() => decodeGrid(model.surface), [model.surface]); const rows = model.road.sections.map(s => ({ s, sum: sectionSummary(model, state, s.key, selected) })).filter(r => r.sum.layersTotal > 0); const full = rows.filter(r => r.sum.layersDone === r.sum.layersTotal).length, none = rows.filter(r => r.sum.fraction === 0).length; const toggle = (id: string) => { const n = new Set(selected); if (n.has(id)) n.delete(id); else n.add(id); setSelected(n); }; @@ -41,7 +43,7 @@ export function BuildProgressPanel({ model, state, selected, setSelected, select - {c && } + {c && } ; })}} {!rows.length &&
Tick at least one layer above to see the sections.
} diff --git a/src/components/site-map-v3/scene/engine.ts b/src/components/site-map-v3/scene/engine.ts index 318cfe8..8135735 100644 --- a/src/components/site-map-v3/scene/engine.ts +++ b/src/components/site-map-v3/scene/engine.ts @@ -142,7 +142,8 @@ export function createSiteMap(container: HTMLElement, model: SiteModelData, stat } /** Fly to a spot, tilted so it reads in 3D, and mark it with a beacon for a few seconds. */ function focus(e: number, n: number, z: number, dist: number) { - const t = ctx.W(e, n, z), off = camera.position.clone().sub(controls.target); off.y = 0; + const zz = Number.isFinite(z) && Math.abs(z - zRef) < 200 ? z : ctx.designZ(e, n); // a wrong height would fly the camera off the map + const t = ctx.W(e, n, zz), off = camera.position.clone().sub(controls.target); off.y = 0; if (off.lengthSq() < 1) off.set(-0.3, 0, 0.8); off.normalize().multiplyScalar(dist * 0.62); off.y = dist * 0.78; const p0 = camera.position.clone(), t0 = controls.target.clone(), p1 = t.clone().add(off);