function setup(invalidation) {
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, 1, 1, 200);
const renderer = new THREE.WebGLRenderer({ antialias: true });
const controls = new THREE.OrbitControls(camera, renderer.domElement);
renderer.setSize(width, height);
camera.position.set(0, 0, 20);
camera.lookAt(0, 0, 0);
controls.addEventListener("change", () => renderer.render(scene, camera));
invalidation.then(() => renderer.dispose());
return { scene, camera, renderer };
}