Merge: Ansicht (Elevation) als echte 2D-Darstellung + Schatten-Toggle

toElevation.ts: Painter-Projektion des 3D-Modells auf die Ansichtsebene
(Fassaden-/Deckenflächen fern→nah, Rückseiten-Culling, Fenster/Türen als
Rahmen+Glas, Bodenlinie) + klassischer 45°-Schlagschatten auskragender
Bauteile (Sutherland–Hodgman auf die Empfängerfläche geclippt). Schatten-
Umschalter in der Ansichts-Leiste (DrawingLevel.shadows), App rendert
elevation-Ebenen über den neuen Generator (synchron, ohne WASM).
This commit is contained in:
2026-07-11 00:26:02 +02:00
7 changed files with 1007 additions and 7 deletions
+28
View File
@@ -1393,6 +1393,12 @@ export interface ViewRibbonTabProps {
renderModeEnabled: boolean;
planColorMode: PlanColorMode;
onPlanColorMode: (m: PlanColorMode) => void;
/** Ob die aktive Ebene eine Ansicht (kind "elevation") ist — nur dann ist der
* Schatten-Umschalter sichtbar/aktiv. */
shadowsAvailable: boolean;
/** Schlagschatten der aktiven Ansicht ein/aus (DrawingLevel.shadows). */
shadows: boolean;
onShadows: (v: boolean) => void;
combos: ComboMenuHandlers;
/** Text-/Font-Formatierung auf DERSELBEN Leiste (Raumstempel-Ziel; `null` =
* nur Defaults). Liegt bewusst im „Ansichten"-Tab (Nutzer-Wunsch). */
@@ -1428,6 +1434,9 @@ export function ViewRibbonTab({
renderModeEnabled,
planColorMode,
onPlanColorMode,
shadowsAvailable,
shadows,
onShadows,
combos,
textTarget,
}: ViewRibbonTabProps) {
@@ -1662,6 +1671,25 @@ export function ViewRibbonTab({
<Sep />
{/* Schatten ein/aus — NUR für eine aktive Ansicht (kind "elevation").
Schreibt DrawingLevel.shadows; der Ansichts-Generator (toElevation)
zeichnet dann den 45°-Schlagschatten auskragender Bauteile. */}
{shadowsAvailable && (
<>
<div className="tb-group" role="group" aria-label={t("elevation.shadows")}>
<button
className={`tb-toggle${shadows ? " active" : ""}`}
onClick={() => onShadows(!shadows)}
title={t("elevation.shadows.hint")}
aria-pressed={shadows}
>
{t("elevation.shadows")}
</button>
</div>
<Sep />
</>
)}
{/* Text-/Font-Formatierung auf DERSELBEN Leiste (Nutzer-Wunsch: Text und
Ansichten zusammen) — Stil/Schrift/Grösse + B/I/U · L/C/R + Zeilenhöhe,
formatiert das aktuelle Text-Ziel (Raumstempel) live. */}