3D-Schnitt: Kanten dünner Bauteile (Zwischenwände, Giebel-Enden, einzelne

Materialschichten) werden jetzt zusätzlich zum aktiven Stil erzwungen
gezeichnet, wenn ein Schnitt aktiv ist — sonst wirkten sie aus vielen
Blickwinkeln wie ein abgelöstes, schwebendes Element.
This commit is contained in:
2026-07-31 17:00:03 +02:00
parent d1de33bd6d
commit 799dacfaf5
+23 -7
View File
@@ -1711,9 +1711,23 @@ impl Renderer {
multiview_mask: None, multiview_mask: None,
}); });
// Live-Schnitt aktiv? Dann erzwingen wir die Modell-Kanten ZUSAETZLICH
// zum aktuellen Stil (unabhaengig von `draws_edges()`) — Nutzer-Report:
// duenne, schraeg angeschnittene Bauteile (Zwischenwaende, Giebel-Enden,
// einzelne Material-Schichten) haben aus vielen Blickwinkeln eine fast
// unsichtbare (kantige) Stirnflaeche, waehrend ihre (flache) Schnitt-
// kappe voll sichtbar bleibt — das wirkt wie ein abgeloestes,
// "schwebendes" Element. Die dunklen Kanten (bereits vorhanden fuer
// wireframe/hidden/shaded-edges, `edges::build_mesh_edges`, tiefen-
// getestet + von der Schnittebene gekappt wie das Mesh selbst) zeichnen
// jede Bauteilkante nach, auch wenn ihre Flaeche praktisch auf Null
// Bildschirmbreite zusammenfaellt — das verbindet Kappe und Bauteil
// sichtbar, ohne die Kamera zu bewegen oder Geometrie zu aendern.
let force_edges_for_section = self.globals.mode[1] > 0.5;
// 1) Gefuellte Flaechen — in allen Stilen ausser "wireframe". Im // 1) Gefuellte Flaechen — in allen Stilen ausser "wireframe". Im
// Hidden-Line-Stil die leicht nach hinten gebiaste Pipeline, damit // Hidden-Line-Stil die leicht nach hinten gebiaste Pipeline, damit
// die folgenden Kanten sauber obenauf liegen. // die folgenden Kanten sauber obenauf liegen. Bei aktivem Schnitt
// ebenso (die Kanten werden dann erzwungen, s.o.).
if self.style.draws_faces() { if self.style.draws_faces() {
if self.style == RenderStyle::Textured { if self.style == RenderStyle::Textured {
// Texturierter Pfad: eigene Pipeline + zweiter Vertex-Puffer // Texturierter Pfad: eigene Pipeline + zweiter Vertex-Puffer
@@ -1730,7 +1744,9 @@ impl Renderer {
pass.draw_indexed(0..t.index_count, 0, 0..1); pass.draw_indexed(0..t.index_count, 0, 0..1);
} }
} else if let Some(m) = &self.mesh { } else if let Some(m) = &self.mesh {
let face_pipeline = if self.style.needs_biased_face_pipeline() { let face_pipeline = if self.style.needs_biased_face_pipeline()
|| force_edges_for_section
{
&self.hidden_face_pipeline &self.hidden_face_pipeline
} else { } else {
&self.pipeline &self.pipeline
@@ -1798,11 +1814,11 @@ impl Renderer {
pass.draw(0..cl.vertex_count, 0..1); pass.draw(0..cl.vertex_count, 0..1);
} }
// 2) Modell-Kanten (wireframe/hidden) — LineList-Pipeline (wie Grid). // 2) Modell-Kanten (wireframe/hidden, ODER erzwungen bei aktivem
// Im Hidden-Stil obenauf, tiefengetestet gegen die (gebiasten) // Schnitt, s.o.) — LineList-Pipeline (wie Grid). Tiefengetestet
// Flaechen -> verdeckte Kanten fallen weg. Im Wireframe ohne // gegen die (gebiasten) Flaechen -> verdeckte Kanten fallen weg.
// Flaechen -> alle Kanten sichtbar. // Im Wireframe ohne Flaechen -> alle Kanten sichtbar.
if self.style.draws_edges() { if self.style.draws_edges() || force_edges_for_section {
if let Some(e) = &self.edges { if let Some(e) = &self.edges {
pass.set_pipeline(&self.grid_pipeline); pass.set_pipeline(&self.grid_pipeline);
pass.set_bind_group(0, &self.bind_group, &[]); pass.set_bind_group(0, &self.bind_group, &[]);