feat(world): Materialien, Kollision und Laternen für die neuen Straßen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ca4f7161af
commit
25248b3929
8 files changed
+205
-110
No files matched your search
+41
-10
@@ -15,9 +15,9 @@ describe("materials", () => {
|
||||
|
||||
it("gibt Feldern das Gras des Parks, dem Parkplatz den Asphalt der Straßen und Wegen Betonplatten", () => {
|
||||
expect(TEXTURES.field).toBe(TEXTURES.park);
|
||||
expect(TEXTURES.parking).toBe(TEXTURES.roads);
|
||||
expect(TEXTURES.parking).toBe(TEXTURES.carriageway);
|
||||
expect(TEXTURES.paths).toBe("concrete_pavement");
|
||||
expect(Object.keys(SURFACE_COLORS).sort()).toEqual(["court", "pool"]);
|
||||
expect(Object.keys(SURFACE_COLORS).sort()).toEqual(["court", "markings", "pool"]);
|
||||
});
|
||||
|
||||
it("deckt Strand und Park mit eigenen Materialien ab", () => {
|
||||
@@ -26,9 +26,8 @@ describe("materials", () => {
|
||||
});
|
||||
|
||||
it("gibt Brücken dieselbe Textur wie Straßen, damit an der Übergangsnaht kein Farbsprung entsteht (Ruling 56)", () => {
|
||||
// Brücken sind in den Daten dasselbe Straßenstück, nur über Wasser
|
||||
// (geometry.js trennt sie einzig über roads.filter(r => r.bridge)).
|
||||
expect(TEXTURES.bridges).toBe(TEXTURES.roads);
|
||||
// Brücken sind in den Daten dasselbe Straßenstück, nur über Wasser.
|
||||
expect(TEXTURES.bridges).toBe(TEXTURES.carriageway);
|
||||
});
|
||||
|
||||
it("erzeugt eine Wellen-Normalmap mit neutraler Grundfarbe", () => {
|
||||
@@ -47,8 +46,9 @@ describe("materials", () => {
|
||||
// Datenstruktur, applyPolygonOffsets() eine reine Funktion auf Platzhalterobjekten — beide
|
||||
// brauchen weder createMaterials() noch echtes Texturladen.
|
||||
describe("Tiefenpuffer-Versatz je Schicht (gegen Flackern zwischen Boden/Stadt/Park/Strand/Straße)", () => {
|
||||
it("ordnet die Schichten Boden < Stadtfläche < Park < Strand < Feld < Platz < Pool < Parkplatz < Weg < Straße", () => {
|
||||
expect(POLYGON_OFFSET_ORDER).toEqual(["ground", "urban", "park", "sand", "field", "court", "pool", "parking", "paths", "roads"]);
|
||||
it("ordnet die Schichten Boden < Stadtfläche < Park < Strand < Feld < Platz < Pool < Parkplatz < Restfläche < Gehweg < Weg", () => {
|
||||
expect(POLYGON_OFFSET_ORDER).toEqual(["ground", "urban", "park", "sand", "field", "court", "pool",
|
||||
"parking", "lots", "sidewalk", "paths"]);
|
||||
});
|
||||
|
||||
it("aktiviert polygonOffset für jede der fünf Schichten", () => {
|
||||
@@ -79,16 +79,47 @@ describe("Tiefenpuffer-Versatz je Schicht (gegen Flackern zwischen Boden/Stadt/P
|
||||
it("trägt den Versatz nur in Boden/Stadtfläche/Park/Strand/Straße ein — Brücken, Gebäude, "
|
||||
+ "Wasser und Meeresboden bleiben unberührt (eigene Materialobjekte, s. Auftrag)", () => {
|
||||
const fake = Object.fromEntries(
|
||||
["ground", "urban", "park", "sand", "field", "court", "pool", "parking", "paths", "roads",
|
||||
"bridges", "buildings", "water", "seafloor"]
|
||||
["ground", "urban", "park", "sand", "field", "court", "pool", "parking", "lots", "sidewalk",
|
||||
"paths", "markings", "carriageway", "curb", "bridges", "buildings", "water", "seafloor"]
|
||||
.map((k) => [k, {}]),
|
||||
);
|
||||
applyPolygonOffsets(fake);
|
||||
for (const key of POLYGON_OFFSET_ORDER) {
|
||||
expect(fake[key]).toMatchObject(POLYGON_OFFSETS[key]);
|
||||
}
|
||||
for (const key of ["bridges", "buildings", "water", "seafloor"]) {
|
||||
for (const key of ["carriageway", "curb", "bridges", "buildings", "water", "seafloor"]) {
|
||||
expect(fake[key]).toEqual({});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("Schichten aus Teil 2", () => {
|
||||
it("hat für jede neue Schicht ein Material", () => {
|
||||
for (const key of ["carriageway", "curb", "sidewalk", "markings", "lots"]) {
|
||||
expect(MATERIAL_KEYS).toContain(key);
|
||||
}
|
||||
expect(MATERIAL_KEYS).not.toContain("roads");
|
||||
});
|
||||
|
||||
it("nimmt Bordstein und Gehweg aus dem Kit", () => {
|
||||
expect(TEXTURES.curb).toBe("curb");
|
||||
expect(TEXTURES.sidewalk).toBe("sidewalk");
|
||||
expect(TEXTURES.carriageway).toBe("asphalt_02");
|
||||
expect(TEXTURES.lots).toBe("asphalt_02");
|
||||
});
|
||||
|
||||
it("gibt der Markierung eine Farbe statt einer Textur", () => {
|
||||
expect(SURFACE_COLORS.markings).toBeDefined();
|
||||
expect(TEXTURES.markings).toBeUndefined();
|
||||
});
|
||||
|
||||
it("gibt der Markierung einen eigenen kleinen Versatz statt der obersten Stufe der Beläge", () => {
|
||||
// Ihr einziger Nachbar ist die Fahrbahn 1 cm darunter, und die hat keinen Versatz. Die oberste
|
||||
// Stufe zöge sie beim streifenden Blick am weitesten nach vorn, ohne dass es etwas nützte.
|
||||
expect(POLYGON_OFFSET_ORDER).not.toContain("markings");
|
||||
expect(POLYGON_OFFSETS.markings).toEqual({ polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: -1 });
|
||||
// Fahrbahn und Bordstein liegen 15 cm tiefer und sind echte Geometrie — kein Versatz nötig.
|
||||
expect(POLYGON_OFFSETS.carriageway).toBeUndefined();
|
||||
expect(POLYGON_OFFSETS.curb).toBeUndefined();
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user