import * as THREE from 'three'; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'; import MyTexture from "./assets/input.png"; import MyDepth from "./assets/image (2).png"; import './App.css'; const renderer = new THREE.WebGLRenderer({ antialias: true }); function Render3D(isVisible) { let mesh; let material; let image_ar; const settings = { metalness: 0.0, roughness: 0.14, ambientIntensity: 0.85, displacementScale: 5, displacementBias: -0.5, emissive: 0xffffff, }; // init const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000); camera.position.z = 3.5; const scene = new THREE.Scene(); const ambientLight = new THREE.AmbientLight( 0xffffff, 4 ); scene.add( ambientLight ); const pointLight = new THREE.PointLight( 0xff0000, 1 ); pointLight.position.z = 2500; scene.add( pointLight ); // const renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( window.innerWidth/1.3, window.innerHeight/1.5 ); renderer.setAnimationLoop( animation ); //renderer.xr.enabled = true; renderer.toneMapping = THREE.ACESFilmicToneMapping; renderer.toneMappingExposure = 1; renderer.outputColorSpace = THREE.SRGBColorSpace; document.body.appendChild( renderer.domElement ) //console.log("isVisible ", isVisible) // animation function animation( time ) { //mesh.rotation.x = time / 2000; //mesh.rotation.y = time / 1000; renderer.render( scene, camera ); } function onWindowResize() { const aspect = window.innerWidth / window.innerHeight; camera.aspect = aspect; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth/1.3, window.innerHeight/1.5 ); } window.addEventListener( 'resize', onWindowResize ); // orbit controls const controls = new OrbitControls( camera, renderer.domElement ); controls.enableZoom = true; controls.enableDamping = true; const image = new Image(); const image2 = new Image(); (image.onload) = function() { if (mesh) { mesh.geometry.dispose(); mesh.material.dispose(); scene.remove( mesh ); } image_ar = image.width / image.height ; const ctx = document.createElement('canvas').getContext('2d'); ctx.canvas.width = image.width; ctx.canvas.height = image.height; ctx.drawImage(image, 0, 0); const myrgbmap = new THREE.CanvasTexture(ctx.canvas); const ctx2 = document.createElement('canvas').getContext('2d'); ctx2.canvas.width = image2.width; ctx2.canvas.height = image2.height; ctx2.drawImage(image2, 0, 0); const mydepthmap = new THREE.CanvasTexture(ctx2.canvas); // material material = new THREE.MeshStandardMaterial( { color: 0xaaaaaa, roughness: settings.roughness, metalness: settings.metalness, map: myrgbmap, displacementMap: mydepthmap, displacementScale: settings.displacementScale, displacementBias: settings.displacementBias, emissive: image, // Add this line for emissive color emissiveIntensity: 10, side: THREE.DoubleSide } ); // generating geometry and add mesh to scene const geometry = new THREE.PlaneGeometry( 10, 10, 512, 512 ); mesh = new THREE.Mesh( geometry, material ); mesh.scale.y = 1.0 / image_ar; mesh.scale.multiplyScalar( 0.23 ); scene.add( mesh ); } image.src = MyTexture; image2.src = MyDepth; // // setup gui // const gui = new GUI(); // gui.add( settings, 'metalness' ).min( 0 ).max( 1 ).onChange( function ( value ) { // material.metalness = value; // } ); // gui.add( settings, 'roughness' ).min( 0 ).max( 1 ).onChange( function ( value ) { // material.roughness = value; // } ); // gui.add( settings, 'ambientIntensity' ).min( 0 ).max( 1 ).onChange( function ( value ) { // ambientLight.intensity = value; // } ); // gui.add( settings, 'displacementScale' ).min( 0 ).max( 30.0 ).onChange( function ( value ) { // material.displacementScale = value; // } ); // gui.add( settings, 'displacementBias' ).min( -10 ).max( 10 ).onChange( function ( value ) { // material.displacementBias = value; // } ); // setup drop zone // var dropZone = document.getElementById('dropzone'); // function showDropZone() { // dropZone.style.display = "block"; // } // function hideDropZone() { // dropZone.style.display = "none"; // } // function allowDrag(e) { // if (true) { // Test that the item being dragged is a valid one // e.dataTransfer.dropEffect = 'copy'; // e.preventDefault(); // } // } // function handleDrop(e) { // e.preventDefault(); // hideDropZone(); // const fileList = event.dataTransfer.files; // if (fileList.length > 0) { // readImage(fileList[0]); // } // } // function readImage(file) { // const reader = new FileReader(); // reader.addEventListener('load', (event) => { // image.src = event.target.result; // }); // reader.readAsDataURL(file); // } // window.addEventListener('dragenter', function(e) { // showDropZone(); // }); // dropZone.addEventListener('dragenter', allowDrag); // dropZone.addEventListener('dragover', allowDrag); // dropZone.addEventListener('dragleave', function(e) { // console.log('dragleave'); // hideDropZone(); // }); // dropZone.addEventListener('drop', handleDrop); // // listen for messages // window.addEventListener('message', function(e) { // if (e.data?.imagedata) { // image.src = e.data.imagedata; // } // }); } function Viewer3D({ isVisible }) { // console.log("called ") renderer.clear(); renderer.setSize( 0, 0); return ( <> {isVisible ? (
) : null} ); } export default Viewer3D;