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>
17 lines
700 B
JavaScript
17 lines
700 B
JavaScript
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");
|