{
replay;
const [[innerRadius, radiusTube]] = values;
const uniforms = {
u_texture: {
type: 't',
value: dataTexture
},
u_size: {
type: 'v2',
value: new THREE.Vector2(width, height)
}
};
let target1 = new THREE.WebGLRenderTarget(width, height, targetOptions);
let target2 = new THREE.WebGLRenderTarget(width, height, targetOptions);
const shaderGeometry = new THREE.PlaneBufferGeometry(20, 20);
const shaderScene = new THREE.Scene();
const screenScene = new THREE.Scene();
screenScene.background = new THREE.Color(0xffffff);
screenScene.add(plane);
screenScene.add(spotLight);
const controls = new THREE.OrbitControls(camera, renderer.domElement);
invalidation.then(() => (controls.dispose(), renderer.dispose()));
controls.addEventListener("change", () =>
renderer.render(screenScene, camera)
);
const d = 10;
const shaderCamera = new THREE.OrthographicCamera(-d, d, d, -d, 0, 1);
const shaderMaterial = new THREE.ShaderMaterial({
uniforms,
vertexShader,
fragmentShader
});
const shaderMesh = new THREE.Mesh(shaderGeometry, shaderMaterial);
shaderScene.add(shaderMesh);
const torusGeometry = new THREE.TorusBufferGeometry(
innerRadius,
radiusTube,
16,
50
);
torusGeometry.rotateX(Math.PI / 1.2);
const torusMaterial = new THREE.MeshBasicMaterial();
const torusMesh = new THREE.Mesh(torusGeometry, torusMaterial);
torusMesh.position.y = 3;
torusMesh.castShadow = true;
screenScene.add(torusMesh);
while (true) {
await Promises.delay(10);
renderer.render(shaderScene, shaderCamera, target1);
uniforms.u_texture.value = target1.texture;
renderer.render(shaderScene, shaderCamera, target2);
torusMaterial.map = target2.texture;
torusMaterial.needsUpdate = true;
renderer.render(screenScene, camera);
[target1, target2] = [target2, target1];
yield renderer.domElement;
}
}