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:
2026-07-04 06:26:29 +02:00
parent ac0d9efc84
commit fabf97a402
8 changed files with 358 additions and 35 deletions
+25
View File
@@ -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,
};