From 89c444451c47930c7fead9768e0dc605a150d239 Mon Sep 17 00:00:00 2001 From: Karim Date: Fri, 31 Jul 2026 17:00:03 +0200 Subject: [PATCH] =?UTF-8?q?3D-Schnitt:=20Kanten=20d=C3=BCnner=20Bauteile?= =?UTF-8?q?=20(Zwischenw=C3=A4nde,=20Giebel-Enden,=20einzelne=20Materialsc?= =?UTF-8?q?hichten)=20werden=20jetzt=20zus=C3=A4tzlich=20zum=20aktiven=20S?= =?UTF-8?q?til=20erzwungen=20gezeichnet,=20wenn=20ein=20Schnitt=20aktiv=20?= =?UTF-8?q?ist=20=E2=80=94=20sonst=20wirkten=20sie=20aus=20vielen=20Blickw?= =?UTF-8?q?inkeln=20wie=20ein=20abgel=C3=B6stes,=20schwebendes=20Element.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/render3d/src/gpu.rs | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src-tauri/render3d/src/gpu.rs b/src-tauri/render3d/src/gpu.rs index b7b4cee..07a28a1 100644 --- a/src-tauri/render3d/src/gpu.rs +++ b/src-tauri/render3d/src/gpu.rs @@ -1711,9 +1711,23 @@ impl Renderer { 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 // 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 == RenderStyle::Textured { // Texturierter Pfad: eigene Pipeline + zweiter Vertex-Puffer @@ -1730,7 +1744,9 @@ impl Renderer { pass.draw_indexed(0..t.index_count, 0, 0..1); } } 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 } else { &self.pipeline @@ -1798,11 +1814,11 @@ impl Renderer { pass.draw(0..cl.vertex_count, 0..1); } - // 2) Modell-Kanten (wireframe/hidden) — LineList-Pipeline (wie Grid). - // Im Hidden-Stil obenauf, tiefengetestet gegen die (gebiasten) - // Flaechen -> verdeckte Kanten fallen weg. Im Wireframe ohne - // Flaechen -> alle Kanten sichtbar. - if self.style.draws_edges() { + // 2) Modell-Kanten (wireframe/hidden, ODER erzwungen bei aktivem + // Schnitt, s.o.) — LineList-Pipeline (wie Grid). Tiefengetestet + // gegen die (gebiasten) Flaechen -> verdeckte Kanten fallen weg. + // Im Wireframe ohne Flaechen -> alle Kanten sichtbar. + if self.style.draws_edges() || force_edges_for_section { if let Some(e) = &self.edges { pass.set_pipeline(&self.grid_pipeline); pass.set_bind_group(0, &self.bind_group, &[]);