Fix Regression: 3D-Wandschichten auf linke Normale (Schnitt = Grundriss)

de7a26b versetzte die per-Schicht-Boxen entlang (uy,-ux) = RECHTE Normale,
waehrend Grundriss/clippedBand die LINKE Normale leftNormal(u)=(-uy,ux)
nutzt -> Schichten im 3D UND im davon abgeleiteten 2D-Schnitt gespiegelt
(Backstein aussen statt innen). pushSegment nutzt jetzt die linke Normale.
Wandlage unveraendert (Stack bleibt symmetrisch um die Achse), nur die
Schichtseiten stimmen wieder mit dem Grundriss. raycast3d unberuehrt
(symmetrische Box). 216 Tests gruen, kein WASM-Rebuild.
This commit is contained in:
2026-07-04 14:22:12 +02:00
parent c79d15dda4
commit 65d6e843fb
+13 -6
View File
@@ -237,12 +237,19 @@ function pushSegment(
if (len < 1e-9) return; if (len < 1e-9) return;
const ux = dx / len; const ux = dx / len;
const uy = dy / len; const uy = dy / len;
// Grundriss-Normale (identisch zur Dicken-Achse in raycast3d / // LINKE Grundriss-Normale (identisch zu `leftNormal(u)` = (uy, ux) in
// selectionHighlightLines: n = (uy, ux)). Der Schicht-Versatz verschiebt // generatePlan.ts/clippedBand — dieselbe Konvention, die addWallPoche für
// Start/Ende der Box quer zur Wand, sodass render3d/raycast die Box um ihre // den Schichtstapel im 2D-Grundriss benutzt). Der Schicht-Versatz verschiebt
// eigene (versetzte) Achse zentriert aufbaut. // Start/Ende der Box quer zur Wand, sodass render3d die Box um ihre eigene
const ox = uy * normalOffset; // (versetzte) Achse zentriert aufbaut — mit dieser Normale liegt Schicht 0
const oy = -ux * normalOffset; // (Aussenseite, kleinster `offset`) auf derselben Weltseite wie im Grundriss.
// Bewusst NICHT identisch zur Normale, die raycast3d/selectionHighlightLines
// für den Box-Rebuild nutzen (n = (uy, ux), rechte Normale) — das ist
// unschädlich, weil jene Boxen symmetrisch um die (hier bereits versetzte)
// Achse jedes einzelnen Layer-Records aufgebaut werden und daher unabhängig
// von der Vorzeichen-Konvention des Versatzes sind.
const ox = -uy * normalOffset;
const oy = ux * normalOffset;
const p1: RVec2 = [wall.start.x + ux * from + ox, wall.start.y + uy * from + oy]; const p1: RVec2 = [wall.start.x + ux * from + ox, wall.start.y + uy * from + oy];
const p2: RVec2 = [wall.start.x + ux * to + ox, wall.start.y + uy * to + oy]; const p2: RVec2 = [wall.start.x + ux * to + ox, wall.start.y + uy * to + oy];
out.push({ out.push({