// three.js' FBXLoader läuft auch in Node, braucht dafür aber Browser-Platzhalter: `self` und `window` für den // Loader-Code, `document.createElementNS` für die Bilder, die sein TextureLoader zu referenzierten Texturen anlegt. // Diese Bilder laden nie, das schadet nicht: tools/assets/weapons.mjs baut die Materialien selbst. // Nur die Umbau-Skripte importieren diese Datei, und zwar erst in main() — Tests sollen die Platzhalter nie sehen. import { readFile } from "node:fs/promises"; globalThis.self ??= globalThis; globalThis.window ??= globalThis; globalThis.document ??= { createElementNS: () => ({ style: {}, setAttribute() {}, addEventListener() {}, removeEventListener() {} }), }; const { FBXLoader } = await import("three/examples/jsm/loaders/FBXLoader.js"); /** Liest eine FBX-Datei. Die Warnung zu den orthografischen Producer-Kameras von MotionBuilder wird verschluckt. */ export async function loadFbx(path) { const bytes = await readFile(path); const warn = console.warn; console.warn = (...args) => { if (!String(args[0]).includes("Orthographic cameras")) warn(...args); }; try { return new FBXLoader().parse(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength), ""); } finally { console.warn = warn; } }