// import React, { useEffect, useRef } from 'react'; // import * as THREE from 'three'; // import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; // const ThreeJSComponent = () => { // const canvasRef = useRef(null); // const scenes = []; // useEffect(() => { // let canvas, renderer; // const init = () => { // canvas = canvasRef.current; // const content = document.getElementById('content'); // if (!canvas || !content) { // console.error('Canvas or content element not found'); // return; // } // const geometries = [ // new THREE.BoxGeometry( 1, 1, 1 ), // new THREE.SphereGeometry( 0.5, 12, 8 ), // new THREE.DodecahedronGeometry( 0.5 ), // new THREE.CylinderGeometry( 0.5, 0.5, 1, 12 ) // ]; // for ( let i = 0; i < 40; i ++ ) { // const scene = new THREE.Scene(); // // make a list item // const element = document.createElement( 'div' ); // element.className = 'list-item'; // const sceneElement = document.createElement( 'div' ); // element.appendChild( sceneElement ); // const descriptionElement = document.createElement( 'div' ); // descriptionElement.innerText = 'Scene ' + ( i + 1 ); // element.appendChild( descriptionElement ); // // the element that represents the area we want to render the scene // scene.userData.element = sceneElement; // content.appendChild( element ); // const camera = new THREE.PerspectiveCamera( 50, 1, 1, 10 ); // camera.position.z = 2; // scene.userData.camera = camera; // const controls = new OrbitControls( scene.userData.camera, scene.userData.element ); // controls.minDistance = 2; // controls.maxDistance = 5; // controls.enablePan = false; // controls.enableZoom = false; // scene.userData.controls = controls; // // add one random mesh to each scene // const geometry = geometries[ geometries.length * Math.random() | 0 ]; // const material = new THREE.MeshStandardMaterial( { // color: new THREE.Color().setHSL( Math.random(), 1, 0.75, THREE.SRGBColorSpace ), // roughness: 0.5, // metalness: 0, // flatShading: true // } ); // scene.add( new THREE.Mesh( geometry, material ) ); // scene.add( new THREE.HemisphereLight( 0xaaaaaa, 0x444444, 3 ) ); // const light = new THREE.DirectionalLight( 0xffffff, 1.5 ); // light.position.set( 1, 1, 1 ); // scene.add( light ); // scenes.push( scene ); // } // renderer = new THREE.WebGLRenderer({ canvas, antialias: true }); // renderer.setClearColor(0xffffff, 1); // renderer.setPixelRatio(window.devicePixelRatio); // }; // const updateSize = () => { // const width = canvas.clientWidth; // const height = canvas.clientHeight; // if (canvas.width !== width || canvas.height !== height) { // renderer.setSize(width, height, false); // } // }; // const animate = () => { // render(); // requestAnimationFrame(animate); // }; // const render = () => { // updateSize(); // canvas.style.transform = `translateY(${window.scrollY}px)`; // renderer.setClearColor( 0xffffff ); // renderer.setScissorTest( false ); // renderer.clear(); // renderer.setClearColor( 0xe0e0e0 ); // renderer.setScissorTest( true ); // // ... (rest of the render function) // scenes.forEach((scene) => { // // so something moves // scene.children[ 0 ].rotation.y = Date.now() * 0.001; // // get the element that is a place holder for where we want to // // draw the scene // const element = scene.userData.element; // // get its position relative to the page's viewport // const rect = element.getBoundingClientRect(); // // check if it's offscreen. If so skip it // if ( rect.bottom < 0 || rect.top > renderer.domElement.clientHeight || // rect.right < 0 || rect.left > renderer.domElement.clientWidth ) { // return; // it's off screen // } // // set the viewport // const width = rect.right - rect.left; // const height = rect.bottom - rect.top; // const left = rect.left; // const bottom = renderer.domElement.clientHeight - rect.bottom; // renderer.setViewport( left, bottom, width, height ); // renderer.setScissor( left, bottom, width, height ); // const camera = scene.userData.camera; // //camera.aspect = width / height; // not changing in this example // //camera.updateProjectionMatrix(); // //scene.userData.controls.update(); // renderer.render( scene, camera ); // }); // }; // init(); // animate(); // // Cleanup function // return () => { // // Perform cleanup here if needed // }; // }, []); // Run once on mount // return ( // <> // // {/* Additional React components or UI can be added here */} // // ); // }; // export default ThreeJSComponent;