ShopGenV2 / viteGradio /src /3Dviewer.jsx
ClaireOzzz's picture
frontend
a6439b7
raw
history blame
No virus
6.62 kB
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 ? (
<div style={{ position: 'static', display: 'inline-block' }}>
<Render3D isVisible={isVisible} />
</div>
) : null}
</>
);
}
export default Viewer3D;