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(); }); });