Der 3D-Viewport kann das Modell jetzt live an einer vertikalen Ebene
aufschneiden (Overlay-Button 'Schnittebene', MVP: Ebene durch die
Modellmitte, Blick +Y):
- Globals um section_plane vec4 erweitert (xyz=Normale, w=-n*p; Enable
in mode.y); MESH_/GRID_WGSL discarden Fragmente vor der Ebene
(world_pos als neuer Varying) - Flaechen, Kanten, Grid, Highlight.
- section_fill.rs (neu): build_cut_caps ruft cut_section und trianguliert
jedes (u,v)-Rechteck zurueck in Weltkoordinaten ([x,y,z,u,v]).
- CAP_WGSL: prozedurale 45-Grad-Diagonalschraffur aus (u,v) in Modell-
Metern (fwidth-AA), Tinte auf Papier wie die 2D-Konvention; eigene
cap_pipeline (CullMode::None, Depth-Bias Richtung Kamera gegen
Z-Fighting), gezeichnet nach den Flaechen, nicht geclippt.
- web.rs cached walls/slabs; set_section_plane(active, p, n) aktualisiert
Uniform + Caps; set_model baut Caps bei aktivem Schnitt neu.
- useWasm3dRenderer.setSectionPlane + Toggle in Wasm3DViewport.
Bekannte Luecken (dokumentiert): Oeffnungen im 3D-Solid nicht ausgespart
(cut_section spart aus -> Mismatch bei Schnitt durchs Fenster; wird mit
dem Boolean-Loecher-Slice geloest), nur vertikale Ebenen, ein globales
Muster (per-Bauteil = Stufe 2). cargo 56 Tests + naga-WGSL-Validierung,
222 vitest gruen, WASM neu gebaut (pkg3d gitignored).
- 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.
- Boden-Grid-Fläche auf y = baseElevation des aktiven Geschosses,
ein-/ausschaltbar (Overlay-Button im Viewport, State in viewSlice
grid3dVisible). Eigene LineList-Pipeline in der Engine (grid.rs,
GRID_WGSL, geteilte View-Projection/Depth mit der Mesh-Pipeline),
neue set_ground_grid(visible, elevation, extent, spacing)-Methode.
Minor-Linien dezent, jede 5. als Major betont.
- Kamera-Steuerung überarbeitet (vorher nur Mitte=Orbit, Pan auf
Shift+Mitte versteckt): Links=Orbit, Mitte/Rechts=Pan (bewegen),
Rad=Zoom zum Cursor. Laptop-freundlich, konsistent mit der
2D-Plan-Navigation (dort Mitte=Pan).
Der Engine-3D-Viewport (render3d/wgpu) war reines Ansehen (Orbit/Zoom). Jetzt:
- Kamera-Presets als Overlay: Top/Unten/Vorne/Hinten/Links/Rechts/Iso.
Richtungen exakt wie der three.js-Pfad (applyView3d); framen die aktuelle
Modell-Bounding-Box (fitTargetDist) und springen auf den Preset-Winkel,
danach Orbit/Pan/Zoom weiter frei. Rein JS.
- Render-Modus Schattiert/Weiss: mode-Uniform in Globals (WGSL/Rust),
Weiss = beleuchtetes Clay-Grau; wasm-Binding set_render_mode_white,
durchgereicht via useWasm3dRenderer.
- Overlay-CSS self-contained (wasm3dOverlay.css), Theme-aware.
three.js unangetastet. Auswahl/Grips/Zeichnen + Wireframe/HLR bewusst noch
offen (naechste Scheibe).
Deckenplatten (SlabInput) werden im render3d aus dem Grundriss-Umriss per
Ear-Clipping trianguliert und über die Deckendicke extrudiert (Deckel/Boden/
Mantel mit robust nach außen orientierten Normalen). Payload erweitert auf
{ walls, slabs } — blanke Wand-Arrays bleiben kompatibel. Beleuchtung auf
hemisphärisches Ambient (Himmel/Boden) + Directional-Sonne umgestellt, dezente
Kantenbetonung, hellerer Hintergrund (#f5f5f5). Beispiel-Geschossdecke im EG.