Nordstern-3D: View-Styles wireframe + hidden-line + schönere Schattierung

- Neue set_render_style(style)-Methode: shaded/white/wireframe/hidden
  (textured fällt vorerst auf shaded zurück, bis die Textur-Pipeline
  steht). Voll durchverdrahtet vom TopBar-Darstellungs-Dropdown zum
  Nordstern-Viewport (setRenderStyle statt nur setWhiteMode).
- Feature-Edge-Extraktion (edges.rs): Kanten aus dem Mesh, dedupliziert
  + Crease-Erkennung (nur Silhouette/Knickkanten, keine Triangulierungs-
  Diagonalen) → sauberes Architektur-Drahtgitter. Reuse der Grid-
  LineList-Pipeline.
- wireframe = nur Kanten; hidden = flach-weisse Flächen (Depth-Bias) +
  sichtbare Kanten obenauf (klassischer Hidden-Line-Look).
- Grundschattierung: dezentes Gegenlicht (Fill-Light), damit abgewandte
  Flächen nicht mehr in Schwarz absaufen.
This commit is contained in:
2026-07-04 06:05:11 +02:00
parent d4065c5a41
commit 8f4fac633f
7 changed files with 540 additions and 87 deletions
+15 -15
View File
@@ -6,12 +6,13 @@
// INTEGRATIONS-SPIKE (Umfang bewusst schmal): Massenmodell (Wände mit Öffnungs-
// Teilquadern + Deckenplatten, alle Geschosse gestapelt) + Orbit-Navigation +
// Kamera-Presets (`view3d`, von der Oberleiste getrieben — s. u.) + Darstellungs-
// art (shaded/white, `renderMode`, ebenfalls Oberleiste) + ein-/ausblendbares
// Boden-Referenzraster (`gridVisible`/`groundElevation`, Overlay-Umschalter im
// Viewport selbst). Auswahl/Raycast, Griffe/Zeichnen sowie die übrigen
// Darstellungsarten der three.js-Sicht (texturiert/Drahtgitter/Kanten, HLR)
// folgen später — bis dahin gilt: RECHTS unterdrückt weiterhin nur das
// Browser-Menü (kein Kontextmenü im Engine-Pfad).
// art (volle `renderMode`-Union der Oberleiste — shaded/white/textured/
// wireframe/hidden — via `set_render_style` in Rust; "textured" faellt dort
// vorerst auf "shaded" zurueck) + ein-/ausblendbares Boden-Referenzraster
// (`gridVisible`/`groundElevation`, Overlay-Umschalter im Viewport selbst).
// Auswahl/Raycast sowie Griffe/Zeichnen der three.js-Sicht folgen später —
// bis dahin gilt: RECHTS unterdrückt weiterhin nur das Browser-Menü (kein
// Kontextmenü im Engine-Pfad).
//
// KAMERA-PRESETS: `view3d`/`renderMode` kommen als Props von der Oberleiste
// (TopBar → App.tsx → Viewport3D-Umschalter, dieselbe Quelle wie die three.js-
@@ -170,9 +171,8 @@ export function Wasm3DViewport({
project: Project;
/** Kanonischer Blickwinkel (Oberleiste) — s. Datei-Kommentar. */
view3d?: View3d;
/** Darstellungsart (Oberleiste): nur `shaded`/`white` wirken hier (die
* übrigen Modi der three.js-Sicht sind im Engine-Pfad noch nicht gebaut,
* s. Datei-Kommentar) — alles ausser `white` fällt auf shaded zurück. */
/** Darstellungsart (Oberleiste) — alle fünf Werte wirken hier, s.
* Datei-Kommentar. */
renderMode?: RenderMode;
/** Boden-Referenzraster sichtbar? Umgeschaltet über den Overlay-Button unten
* rechts im Viewport (`onToggleGrid`) — Single Source of Truth ist der
@@ -188,7 +188,7 @@ export function Wasm3DViewport({
const {
render,
updateModel,
setWhiteMode,
setRenderStyle,
applyViewPreset,
setGroundGrid,
ready,
@@ -229,14 +229,14 @@ export function Wasm3DViewport({
redrawRef.current();
}, [ready, view3d, applyViewPreset, render]);
// Darstellungsart (shaded/weiss) an den Renderer weiterreichen, sobald sie
// wechselt oder der Renderer bereit wird — dann mit der aktuell aktiven
// Kamera (Praeset ODER Orbit) neu zeichnen.
// Darstellungsart (volle RenderMode-Union) an den Renderer weiterreichen,
// sobald sie wechselt oder der Renderer bereit wird — dann mit der aktuell
// aktiven Kamera (Praeset ODER Orbit) neu zeichnen.
useEffect(() => {
if (!ready) return;
setWhiteMode(renderMode === "white");
setRenderStyle(renderMode);
redrawRef.current();
}, [ready, renderMode, setWhiteMode]);
}, [ready, renderMode, setRenderStyle]);
// Boden-Referenzraster: bei Bereitschaft oder Wechsel von Sichtbarkeit/
// Geschoss-Hoehe neu setzen + zeichnen. Fixe Ausdehnung/Abstand (40 m /
+13 -8
View File
@@ -37,7 +37,10 @@ export interface Camera3d {
/** Minimal-Typ des WASM-Exports (das echte .d.ts entsteht erst mit `build:engine3d`). */
interface WebModelRendererLike {
set_model(json: string): void;
set_render_mode_white(white: boolean): void;
/** Darstellungsart setzen — `style` ∈ "shaded"|"white"|"wireframe"|"hidden"|
* "textured" (deckt die volle `RenderMode`-Union der Oberleiste ab;
* "textured" faellt engine-seitig vorerst auf "shaded" zurueck). */
set_render_style(style: string): void;
set_view_preset(preset: string): void;
/** Boden-Referenzraster in der Welt-XZ-Ebene ein-/ausblenden (Rust-seitig,
* `web::set_ground_grid`). `visible=false` zeichnet kein Raster; sonst ein
@@ -142,17 +145,19 @@ export function useWasm3dRenderer(
}, []);
/**
* Darstellungsart umschalten: `true` = weisses Clay-Material (beleuchtet,
* ohne Bauteil-Farben), `false` = normale Material-/Vertexfarbe (shaded,
* Default). Wirkt erst beim nächsten `render`.
* Darstellungsart umschalten — reicht die volle `RenderMode`-Union der
* Oberleiste ("shaded"/"white"/"textured"/"wireframe"/"hidden") an Rust
* durch (`web::set_render_style`); die Engine entscheidet je Stil, wie
* gezeichnet wird ("textured" faellt dort vorerst auf "shaded" zurueck).
* Wirkt erst beim nächsten `render`.
*/
const setWhiteMode = useCallback((white: boolean) => {
const setRenderStyle = useCallback((style: string) => {
const r = rendererRef.current;
if (!r) return;
try {
r.set_render_mode_white(white);
r.set_render_style(style);
} catch (e) {
console.warn("render3d set_render_mode_white fehlgeschlagen:", e);
console.warn("render3d set_render_style fehlgeschlagen:", e);
}
}, []);
@@ -242,7 +247,7 @@ export function useWasm3dRenderer(
return {
render,
updateModel,
setWhiteMode,
setRenderStyle,
applyViewPreset,
setGroundGrid,
ready,