{
const renderer = new THREE.WebGLRenderer({antialias: true});
invalidation.then(() => renderer.dispose());
renderer.setSize(width, height);
renderer.setPixelRatio(devicePixelRatio);
const controls = new THREE.OrbitControls(camera, renderer.domElement);
var tprev = 0;
var posX = initX;
while (true) {
mutable time = clock.getElapsedTime();
if (time !== tprev) {
posX = numeric.dopri(tprev, time, posX, freeMotion).at(time);
cube.position.x = posX[0];
tprev = time;
}
spring.position.x = (cube.position.x + base.position.x) / 2;
spring.scale.y = (cube.position.x - base.position.x) / 2;
damper.position.x = (cube.position.x + base.position.x) / 2;
damper.scale.y = (cube.position.x - base.position.x) / 2;
renderer.render(scene, camera);
yield renderer.domElement;
}
}