diff --git a/.claude/skills/placing-editor-models/scripts/render-site.py b/.claude/skills/placing-editor-models/scripts/render-site.py index e7db5c1..4f55bf6 100644 --- a/.claude/skills/placing-editor-models/scripts/render-site.py +++ b/.claude/skills/placing-editor-models/scripts/render-site.py @@ -103,11 +103,16 @@ def game_panel(): for c in site["chunks"]: for s in c["surfaces"]: d.polygon([uv(*p) for p in s["rings"][0]], fill=colors.get(s["kind"], (150, 150, 150))) - for c in site["chunks"]: - for r in c["roads"]: - d.polygon([uv(*p) for p in r["rings"][0]], fill=(80, 80, 85)) - for hole in r["rings"][1:]: - d.polygon([uv(*p) for p in hole], fill=(170, 185, 130)) + # Der Straßenkorridor in seinen drei Schichten (site-data.mjs): Gehweg und Restflächen heller, + # die 15 cm tiefer liegende Fahrbahn im alten Straßengrau. Zusammen decken sie genau die Fläche + # ab, die vor dem Formatwechsel der eine Schlüssel "roads" hatte. + for key, farbe in (("sidewalk", (150, 148, 142)), ("lots", (110, 110, 112)), + ("bridges", (80, 80, 85)), ("carriageway", (80, 80, 85))): + for c in site["chunks"]: + for r in c.get(key, []): + d.polygon([uv(*p) for p in r["rings"][0]], fill=farbe) + for hole in r["rings"][1:]: + d.polygon([uv(*p) for p in hole], fill=(170, 185, 130)) for c in site["chunks"]: for b in c["buildings"]: d.polygon([uv(*p) for p in b["rings"][0]], fill=(150, 110, 90), outline=(0, 0, 0)) diff --git a/.claude/skills/placing-editor-models/scripts/site-data.mjs b/.claude/skills/placing-editor-models/scripts/site-data.mjs index 966877c..ff74e3d 100644 --- a/.claude/skills/placing-editor-models/scripts/site-data.mjs +++ b/.claude/skills/placing-editor-models/scripts/site-data.mjs @@ -2,13 +2,20 @@ // // node .claude/skills/placing-editor-models/scripts/site-data.mjs // -// Enthält Land, Flächen (park/sand/urban), Straßen, Gebäude, Palmen und die Laternen, wie PropLayer sie -// setzt (vergeLampPoints(lampPoints(...)) je Chunk — Laternen stehen bis 16 m neben ihrer Mittellinie, -// deshalb werden auch die Nachbarchunks des Ausschnitts gelesen). render-site.py zeichnet daraus das -// Vergleichsbild; die Grenzen für Straßenrand, Felder usw. lassen sich direkt aus dem JSON ablesen. +// Enthält Land, Flächen (park/sand/urban), den Straßenkorridor, Gebäude, Palmen und die Laternen, +// wie PropLayer sie setzt (chunkLampPoints() je Chunk — Laternen stehen bis 16 m neben ihrer +// Mittellinie, deshalb werden auch die Nachbarchunks des Ausschnitts gelesen). render-site.py +// zeichnet daraus das Vergleichsbild; die Grenzen für Straßenrand, Felder usw. lassen sich direkt +// aus dem JSON ablesen. +// +// Der Straßenkorridor — bis Teil 2 ein einziger Schlüssel `roads` — steht seit dem Formatwechsel in +// drei Schichten: `carriageway` (Fahrbahn, 15 cm tiefer), `sidewalk` (Gehweg) und `lots` +// (Restflächen wie Parkplätze und Vorplätze). Zusammen sind sie genau die Fläche, die früher +// `roads` war; sie bleiben hier getrennt, weil ein Ort neben einem Gehweg anders liegt als neben +// einer Fahrbahn. import { readFileSync, writeFileSync } from "node:fs"; import { CHUNKS_PER_SIDE, CHUNK_SIZE, SLICE, chunkName } from "../../../../src/world/coords.js"; -import { lampPoints, vergeLampPoints } from "../../../../src/world/props.js"; +import { chunkLampPoints } from "../../../../src/world/props.js"; const [x0, x1, y0, y1] = process.argv.slice(2, 6).map(Number); const out = process.argv[6]; @@ -35,11 +42,14 @@ for (let i = clamp(iOf(x0) - 1); i <= clamp(iOf(x1) + 1); i++) { key: `${i}_${j}`, name: chunkName(i, j), land: c.land.map(rings), surfaces: (c.surfaces ?? []).map((s) => ({ kind: s.kind, rings: rings(s.poly) })), - roads: c.roads.map((r) => ({ bridge: r.bridge, rings: rings(r.poly) })), + carriageway: (c.carriageway ?? []).map((r) => ({ rings: rings(r.poly) })), + sidewalk: (c.sidewalk ?? []).map((s) => ({ rings: rings(s.poly) })), + lots: (c.lots ?? []).map((l) => ({ rings: rings(l.poly) })), + bridges: (c.bridges ?? []).map((b) => ({ rings: rings(b.poly) })), buildings: c.buildings.map((b) => ({ height: b.height, rings: rings(b.poly) })), }); for (const [u, v] of c.palms ?? []) palms.push(world(u, v)); - for (const p of vergeLampPoints(lampPoints(c.centerlines ?? []), c.roads ?? [])) lamps.push(world(p.x, p.z)); + for (const p of chunkLampPoints(c)) lamps.push(world(p.x, p.z)); } }