From 5a70824dd537d9082d9a2e05b3d44d2bb1efbb81 Mon Sep 17 00:00:00 2001 From: slyphax Date: Sun, 25 Oct 2026 00:55:18 +0200 Subject: [PATCH] =?UTF-8?q?Malen=20mit=20Symmetrie:=20=C3=9Cberlappung=20b?= =?UTF-8?q?eider=20Seiten=20nimmt=20den=20st=C3=A4rkeren=20Anteil=20(steti?= =?UTF-8?q?g=20statt=20Mittelsenkrechten-Kante)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- src/editor/terrain_tool.gd | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/editor/terrain_tool.gd b/src/editor/terrain_tool.gd index ad195a0..e68db05 100644 --- a/src/editor/terrain_tool.gd +++ b/src/editor/terrain_tool.gd @@ -158,6 +158,14 @@ func _punkt(idx: int) -> int: return int(_mats[idx]) | (int(_mix_b[idx]) << 8) | (int(_mix_w[idx]) << 16) +## Anteil (0–255) des Materials m an einem gepackten Punkt. +static func _anteil(v: int, m: int) -> int: + var a := v & 0xFF + var b := (v >> 8) & 0xFF + var w := (v >> 16) & 0xFF + return (255 - w if a == m else 0) + (w if b == m else 0) + + func _setze_punkt(idx: int, v: int) -> void: _mats[idx] = v & 0xFF _mix_b[idx] = (v >> 8) & 0xFF @@ -566,9 +574,12 @@ func _mirror_mats(snap: Dictionary, g: Vector2) -> void: var midx: int = mirror.y * _mres + mirror.x var value: int = _punkt(idx) if snap.has(mirror) and _punkt(midx) != int(snap[mirror]): - # Beide Seiten bemalt (Pinsel überlappt die Achse): der näher am - # Strichpunkt liegende Wert gewinnt, beide bekommen ihn. - if _cell_dist(mirror, g, cell_x, cell_z) < _cell_dist(pos, g, cell_x, cell_z): + # Beide Seiten bemalt (Pinsel überlappt sein Spiegelbild, z. B. nahe + # der Kartenmitte): der Wert mit dem GRÖSSEREN Anteil des Mal- + # Materials gewinnt. Vorher „näher am Strichpunkt“ — das zog entlang + # der Mittelsenkrechte eine harte gerade Kante durch weiche Verläufe + # (Sly 25.10.). Max ist stetig und symmetrisch. + if _anteil(_punkt(midx), _stroke_material) > _anteil(value, _stroke_material): value = _punkt(midx) _setze_punkt(idx, value) done[mirror] = true