Nordstern-3D: Auswahl-Highlight (orange Outline, immer sichtbar)
Ein selektiertes Bauteil wird jetzt im 3D-Viewport mit einer orangen Umrisslinie markiert, die dank No-Depth-Pipeline auch hinter Wänden durchscheint (klare Selektions-Rückmeldung). Zusammen mit Objekt-Info (numerisch) und Attribute-Panel ist die 3D-Auswahl damit vollständig. - Engine: set_highlight_lines(vertices) + highlight_pipeline (LineList, depth_compare Always, kein Depth-Write), als letzter Draw-Call obenauf. Reuse der Grid-Linien-Infrastruktur. - TS: selectionHighlightLines() baut die Quader-/Prisma-Kanten der Auswahl in Akzentfarbe; App berechnet sie per useMemo aus der Store-Auswahl und reicht sie durch.
This commit is contained in:
@@ -128,9 +128,13 @@ export function Viewport3D(
|
||||
/** Links-Klick-Auswahl im WASM-Viewport (TS-Raycast) — wirkt NUR im WASM-Pfad;
|
||||
* die three.js-Sicht nutzt weiter `onSelectWall`/`onSelectCeiling`. */
|
||||
onPick3d?: (hit: Pick3dHit, additive: boolean) => void;
|
||||
/** Umriss-Linien der aktuellen Auswahl — wirkt NUR im WASM-Pfad (s.
|
||||
* Wasm3DViewport); die three.js-Sicht hebt die Auswahl weiterhin über ihr
|
||||
* eigenes Material hervor (highlightMat in ThreeViewport3D). */
|
||||
highlightLines?: Float32Array | null;
|
||||
},
|
||||
) {
|
||||
const { gridVisible, onToggleGrid, onPick3d, ...threeProps } = props;
|
||||
const { gridVisible, onToggleGrid, onPick3d, highlightLines, ...threeProps } = props;
|
||||
if (WASM_ENGINE_ACTIVE) {
|
||||
return (
|
||||
<Wasm3DViewport
|
||||
@@ -141,6 +145,7 @@ export function Viewport3D(
|
||||
groundElevation={props.gridElevation}
|
||||
onToggleGrid={onToggleGrid}
|
||||
onPick3d={onPick3d}
|
||||
highlightLines={highlightLines}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -176,6 +176,7 @@ export function Wasm3DViewport({
|
||||
groundElevation = 0,
|
||||
onToggleGrid,
|
||||
onPick3d,
|
||||
highlightLines = null,
|
||||
}: {
|
||||
project: Project;
|
||||
/** Kanonischer Blickwinkel (Oberleiste) — s. Datei-Kommentar. */
|
||||
@@ -199,6 +200,13 @@ export function Wasm3DViewport({
|
||||
* Aufrufer (App) setzt daraus die Store-Selektion; ohne Angabe passiert nichts.
|
||||
*/
|
||||
onPick3d?: (hit: Pick3dHit, additive: boolean) => void;
|
||||
/**
|
||||
* Umriss-Linien der aktuellen Auswahl (LineList-Vertex-Array, s.
|
||||
* `selectionHighlightLines` in plan/toWalls3d.ts) — werden ohne Tiefentest
|
||||
* immer sichtbar obenauf gezeichnet (Akzentfarbe kommt vom Aufrufer/App).
|
||||
* `null`/leeres Array = kein Highlight (leere Auswahl).
|
||||
*/
|
||||
highlightLines?: Float32Array | null;
|
||||
}) {
|
||||
const canvasRef = useRef<HTMLCanvasElement | null>(null);
|
||||
// Pick-Callback in einem Ref spiegeln, damit der (einmal registrierte)
|
||||
@@ -212,6 +220,7 @@ export function Wasm3DViewport({
|
||||
setRenderStyle,
|
||||
applyViewPreset,
|
||||
setGroundGrid,
|
||||
setHighlightLines,
|
||||
ready,
|
||||
failed,
|
||||
} = useWasm3dRenderer(canvasRef, true);
|
||||
@@ -268,6 +277,17 @@ export function Wasm3DViewport({
|
||||
redrawRef.current();
|
||||
}, [ready, gridVisible, groundElevation, setGroundGrid]);
|
||||
|
||||
// Auswahl-Hervorhebung: bei Bereitschaft oder Änderung der Highlight-Linien
|
||||
// (Auswahl gewechselt/aufgehoben) neu setzen + zeichnen. Die Engine hält das
|
||||
// Highlight, bis es erneut gesetzt wird — Kamerabewegungen (Orbit/Pan/Zoom)
|
||||
// lösen hier KEINEN neuen `setHighlightLines`-Aufruf aus, das Highlight
|
||||
// bleibt einfach über den nächsten `render()`-Aufruf hinweg sichtbar.
|
||||
useEffect(() => {
|
||||
if (!ready) return;
|
||||
setHighlightLines(highlightLines ?? new Float32Array(0));
|
||||
redrawRef.current();
|
||||
}, [ready, highlightLines, setHighlightLines]);
|
||||
|
||||
// Canvas-Größe beobachten: bei Layout-Änderung mit aktueller Kamera neu
|
||||
// zeichnen (die Surface-Anpassung übernimmt der Hook im render()).
|
||||
useEffect(() => {
|
||||
|
||||
@@ -53,6 +53,13 @@ interface WebModelRendererLike {
|
||||
extent_m: number,
|
||||
spacing_m: number,
|
||||
): void;
|
||||
/**
|
||||
* Auswahl-Hervorhebung setzen: ein LineList-Vertex-Array (interleaved
|
||||
* `[px,py,pz, r,g,b, ...]`, world-Meter, je 2 Vertices = 1 Linie), das die
|
||||
* Engine OHNE Tiefentest zeichnet (immer sichtbar obenauf) — der Umriss des
|
||||
* aktuell gewählten Bauteils. Leeres Array löscht das Highlight. Wirkt erst
|
||||
* beim nächsten `render`. */
|
||||
set_highlight_lines(vertices: Float32Array): void;
|
||||
set_camera(
|
||||
eyeX: number,
|
||||
eyeY: number,
|
||||
@@ -180,6 +187,23 @@ export function useWasm3dRenderer(
|
||||
[],
|
||||
);
|
||||
|
||||
/**
|
||||
* Auswahl-Hervorhebung setzen (Umriss-Linien des gewählten Bauteils, immer
|
||||
* obenauf) — reicht das fertige LineList-Vertex-Array 1:1 an
|
||||
* `set_highlight_lines` durch (s. WebModelRendererLike). Der Aufrufer
|
||||
* (Wasm3DViewport) übergibt ein leeres Float32Array, um das Highlight zu
|
||||
* löschen (leere Auswahl). Wirkt erst beim nächsten `render`.
|
||||
*/
|
||||
const setHighlightLines = useCallback((vertices: Float32Array) => {
|
||||
const r = rendererRef.current;
|
||||
if (!r) return;
|
||||
try {
|
||||
r.set_highlight_lines(vertices);
|
||||
} catch (e) {
|
||||
console.warn("render3d set_highlight_lines fehlgeschlagen:", e);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* Kamera-Praeset anwenden (`front`/`top`/`side`/`iso`/`perspective`, wie
|
||||
* `View3d` in TopBar.tsx). Delegiert die formatfuellende Ziel-/Distanz-
|
||||
@@ -250,6 +274,7 @@ export function useWasm3dRenderer(
|
||||
setRenderStyle,
|
||||
applyViewPreset,
|
||||
setGroundGrid,
|
||||
setHighlightLines,
|
||||
ready,
|
||||
failed,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user