feat(world): Geometrie-Baustein für Land, Straßen, Brücken und Gebäude
Normalisiert Ringe vor der Triangulierung: ShapeUtils.triangulateShape
verlangt echte Vector2 (nicht {x,y}-Objekte) wegen des internen
Vector2#equals-Aufrufs, und jeder extrahierte Ring schließt sich selbst
(letzter Punkt == erster). Ohne vorheriges Entfernen dieses Schlusspunkts
verschieben sich ab dem ersten Loch alle Dreiecksindizes um eins gegenüber
der von ShapeUtils intern neu vergebenen Nummerierung — Häuser und Straßen
mit Innenhof bekämen an genau der Stelle falsch verdrahtete Dreiecke, ohne
dass die Dreieckszahl sich ändert. Beide Fehler traten mit den Testquadraten
aus dem Task-Brief nicht auf, weil deren Ringe offen sind; die echten
Chunk-Dateien schließen aber ausnahmslos jeden Ring.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
70c35faf86
commit
dce90a2263
3 files changed
+265
No files matched your search
@@ -0,0 +1,16 @@
|
||||
import { readdirSync, readFileSync } from "node:fs";
|
||||
import { buildChunkGeometry } from "../src/world/geometry.js";
|
||||
|
||||
const dir = "public/data/vice-a";
|
||||
let tris = 0;
|
||||
for (const file of readdirSync(dir).filter((f) => f.startsWith("chunk_"))) {
|
||||
const chunk = JSON.parse(readFileSync(`${dir}/${file}`, "utf8"));
|
||||
for (const geo of Object.values(buildChunkGeometry(chunk))) {
|
||||
if (!geo) continue;
|
||||
const pos = geo.getAttribute("position").array;
|
||||
if (pos.some((v) => !Number.isFinite(v))) throw new Error(`NaN in ${file}`);
|
||||
tris += geo.getIndex().count / 3;
|
||||
}
|
||||
}
|
||||
console.log("Dreiecke gesamt:", tris);
|
||||
if (tris > 1_500_000) throw new Error("Budget überschritten");
|
||||
Reference in new issue
Block a user