function* threeScene({
width,
height,
visibility = e => e,
update,
init,
cam = {},
addMeshes = defaultMesh,
addLights = defaultLights,
createControls = defaultControls,
backgroundColor = 0x8FBCD4
}) {
const scene = createScene(backgroundColor);
const renderer = createRenderer({ width, height });
console.log('cam setup', { ...cam, width, height });
const camera = cam.setup
? cam.setup({ width, height })
: defaultCamera({ ...cam, width, height });
const controls = createControls({ camera, element: renderer.domElement });
invalidation.then(() => (controls.dispose(), renderer.dispose()));
const lights = addLights(scene);
const meches = addMeshes(scene);
if (init) {
init({ scene, renderer, camera, controls, lights, meches });
}
if (update) {
while (true) {
update({ scene, renderer, camera, controls, lights, meches });
renderer.render(scene, camera);
yield visibility(renderer.domElement);
}
} else {
controls.addEventListener("change", () => renderer.render(scene, camera));
renderer.render(scene, camera);
yield visibility(renderer.domElement);
}
}