This example mirrors the integration flow used in vulfram-engine demos: load GLB bytes, instantiate the entity graph, and dispose resources safely.
bun add @vulfram/engine @vulfram/transport-bun @vulfram/gltf-loaderimport { Mount, World3D, createWindow, initEngine, tick } from '@vulfram/engine';
import { loadGltfAsset } from '@vulfram/gltf-loader';
import { transportBunFfi } from '@vulfram/transport-bun';
import { readFileSync } from 'node:fs';
initEngine({ transport: transportBunFfi });
const { windowId } = createWindow({ title: 'GLTF Loader Demo', size: [1280, 720] });
const worldId = World3D.create3DWorld();
Mount.mountWorld(worldId, { target: { kind: 'window', windowId } });
const data = readFileSync('./assets/treehouse_concept.glb');
const asset = await loadGltfAsset({ worldId, data, materialMode: 'standard' });
const instance = asset.instantiate({
rootTransform: { position: [0, -1.5, 0], rotation: [0, 0, 0, 1], scale: [1, 1, 1] }
});
let last = performance.now();
function frame(now: number) {
const dt = now - last;
last = now;
tick(now, dt);
requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
// Later cleanup:
// instance.disposeEntities();
// asset.disposeAll();
// Install:
// bun add @vulfram/engine @vulfram/transport-bun @vulfram/gltf-loader