27 lines
1.3 KiB
JavaScript
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;
|
|
}
|
|
}
|