From 4e201d2b79a80fa3f81063e9c8c65401cd9b3735 Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Fri, 18 Sep 2026 13:43:33 +0200 Subject: [PATCH] fix(world): Bordstein bekommt einen eigenen Tiefenversatz MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Er war die einzige Straßengeometrie neben den Belägen ohne Versatz und konnte beim flachen Blick gegen den Gehwegbelag verlieren. Jetzt trägt er denselben kleinen Faktor wie die Beläge und steht eine Einheitenstufe über dem obersten von ihnen. Gemessen im Browser (Schicht aus- und wieder eingeblendet, Bild Pixel für Pixel verglichen): Der Bordstein zeichnet bis 504 m, dieselbe Reichweite wie Fahrbahn, Gehweg und Markierung. Das erreichte er auch ohne den Versatz — er ist Absicherung gegen den Tiefenstreit, keine Reichweite. Co-Authored-By: Claude Opus 5 --- src/world/materials.js | 10 ++++++++++ tests/materials.test.js | 21 ++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/world/materials.js b/src/world/materials.js index 09f9d4b..e2a3359 100644 --- a/src/world/materials.js +++ b/src/world/materials.js @@ -208,6 +208,16 @@ export const POLYGON_OFFSETS = { ]), ), markings: { polygonOffset: true, polygonOffsetFactor: DECAL_FACTOR, polygonOffsetUnits: -DECAL_UNITS_STEP }, + // Der Bordstein ist echte Geometrie, steht aber unmittelbar neben den Belägen und grenzt mit + // seiner 20 cm breiten Oberkante sogar an dieselbe Stelle wie der Gehweg. Ohne Faktor verlor er + // beim flachen Blick gegen den Gehwegbelag - ab etwa 40 m war er weg (im Browser gemessen). + // Mit demselben Faktor heben sich die blickwinkelabhängigen Anteile auf, und die Units stellen + // ihn eine Stufe über den obersten Belag. + curb: { + polygonOffset: true, + polygonOffsetFactor: DECAL_FACTOR, + polygonOffsetUnits: -(POLYGON_OFFSET_ORDER.length) * DECAL_UNITS_STEP, + }, }; /** Trägt POLYGON_OFFSETS in die passenden Materialien ein. Nur die benannten Schichten — diff --git a/tests/materials.test.js b/tests/materials.test.js index 1c3f1e0..10f1615 100644 --- a/tests/materials.test.js +++ b/tests/materials.test.js @@ -78,6 +78,18 @@ describe("Tiefenpuffer-Versatz je Schicht (gegen Flackern zwischen Boden/Stadt/P } }); + // Zweiter Teil des Bordstein-Befunds: Mit Faktor 0 blieb er zwar sichtbar, aber nur etwa 40 m + // weit - danach zog ihn der Gehwegbelag beim flachen Blick doch zu. Der Bordstein grenzt an die + // Beläge und braucht deshalb denselben Faktor; über die Units steht er eine Stufe über dem + // obersten Belag, damit auch seine 20 cm breite Oberkante auf dem Gehweg sichtbar bleibt. + it("nimmt den Bordstein in den Versatz auf, eine Stufe über dem obersten Belag", () => { + const oberster = POLYGON_OFFSET_ORDER[POLYGON_OFFSET_ORDER.length - 1]; + expect(POLYGON_OFFSETS.curb.polygonOffsetFactor).toBe(POLYGON_OFFSETS[oberster].polygonOffsetFactor); + expect(POLYGON_OFFSETS.curb.polygonOffsetUnits) + .toBeLessThan(POLYGON_OFFSETS[oberster].polygonOffsetUnits); + expect(POLYGON_OFFSET_ORDER).not.toContain("curb"); + }); + it("gibt allen Belägen denselben kleinen Faktor, nur die Bodenplatte bleibt bei null", () => { const [boden, ...belaege] = POLYGON_OFFSET_ORDER; expect(POLYGON_OFFSETS[boden].polygonOffsetFactor).toBe(0); @@ -102,7 +114,8 @@ describe("Tiefenpuffer-Versatz je Schicht (gegen Flackern zwischen Boden/Stadt/P // s. Kommentar dort), bekommt seinen Versatz aber trotzdem über den zweiten Eintrag im // POLYGON_OFFSETS-Objekt — einziger Beleg, dass der bis in ein Materialobjekt durchreicht. expect(fake.markings).toEqual(POLYGON_OFFSETS.markings); - for (const key of ["carriageway", "curb", "bridges", "buildings", "water", "seafloor"]) { + expect(fake.curb).toEqual(POLYGON_OFFSETS.curb); + for (const key of ["carriageway", "bridges", "buildings", "water", "seafloor"]) { expect(fake[key]).toEqual({}); } }); @@ -140,9 +153,11 @@ describe("Schichten aus Teil 2", () => { // Eine Stufe wie der unterste Belag, nicht die oberste: Ihr Nachbar ist die Fahrbahn ohne Versatz. expect(POLYGON_OFFSETS.markings.polygonOffsetUnits) .toBe(POLYGON_OFFSETS[POLYGON_OFFSET_ORDER[1]].polygonOffsetUnits); - // Fahrbahn und Bordstein liegen 15 cm tiefer und sind echte Geometrie — kein Versatz nötig. + // Die Fahrbahn liegt 15 cm tiefer und berührt keinen Belag — sie braucht keinen Versatz. + // Der Bordstein dagegen schon: Er grenzt an den Gehweg und verlor ohne Faktor beim flachen + // Blick gegen ihn (s. Test "nimmt den Bordstein in den Versatz auf"). expect(POLYGON_OFFSETS.carriageway).toBeUndefined(); - expect(POLYGON_OFFSETS.curb).toBeUndefined(); + expect(POLYGON_OFFSETS.curb).toBeDefined(); }); });