Files
gta6/tools/assets/fbx.mjs
T

27 lines
1.3 KiB
JavaScript

// 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;
}
}