HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.30
System: Linux iZj6c1151k3ad370bosnmsZ 3.10.0-1160.76.1.el7.x86_64 #1 SMP Wed Aug 10 16:21:17 UTC 2022 x86_64
User: root (0)
PHP: 7.4.30
Disabled: NONE
Upload Files
File: /var/www/html/www.winghung.com/demo/canvas.php.bak
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    require_once('../wp-load.php'); 
    session_start();
    date_default_timezone_set("Asia/Hong_Kong"); 
    global $wpdb, $sitepress;
    if(isset($_GET['hash']) && $_GET['hash']!=""){
        $result = $wpdb->get_results("SELECT * FROM `custom_upload_files` WHERE hash = '".$_GET['hash']."' LIMIT 1");
        $file = $result[0]->file;
    } else {
        $file = "test.jpg";
    }
   
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Canvas</title>
		<style>
			body { margin: 0; }
		</style>
	</head>
	<body>
        <script type="importmap">
        {
            "imports": {
            "three": "https://unpkg.com/three@0.130.0/build/three.module.js"
            }
        }
        </script>
        <script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>

        <script type="module">
            import * as THREE from 'https://cdn.skypack.dev/three@0.130.0';
            import { OrbitControls } from 'https://unpkg.com/three@0.130.0/examples/jsm/controls/OrbitControls.js';
            
            var setting = {
                'type':'<?php echo $_GET['type'];?>',
                'dimension': {
                    'length':<?php echo $_GET['length'];?>,
                    'width':<?php echo $_GET['width'];?>,
                    'height':0
                },
                'iphone': {
                    'length':7.2,
                    'width':0.7,
                    'height':14.7
                },                
                'position': {
                    'posX':15,
                    'posY':40,
                    'posZ':0
                },            
                'background':{
                    'color':0x000000,
                    'opacity':0.1
                },
                'camera':{
                    'posX':0,
                    'posY':0,
                    'posZ':100
                },
                'light':{
                    'color':0xffffff,
                    'posX':0,
                    'posY':10,
                    'posZ':-20
                },
                'material':[
                    {'color':0xe3fefe, 'opacity':'1.0', 'transparent':false},
                    {'color':0x000000, 'opacity':'1.0', 'transparent':false},
                ],
                'outline':{
                    'color':0xcccccc,
                    'opacity':1.0
                }
            }


            const scene = new THREE.Scene();
            //scene.background = new THREE.Color( 0xff0000 );
            const loader = new THREE.TextureLoader();
            //const bgTexture = loader.load('asset/spotlight-wall.jpg');
            const bgTexture = loader.load('asset/canvas-background.jpg');
            scene.background = bgTexture;

            const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
            camera.position.set(setting.camera.posX, setting.camera.posY, setting.camera.posZ); // 相機位置
            camera.lookAt(scene.position); // 相機焦點

            // 建立光源
            const pointLight = new THREE.PointLight(0xffffff);
            pointLight.position.set(setting.position.posX,setting.position.posY,<?php echo max($_GET['length'], $_GET['width']);?>);
            pointLight.castShadow = true;
            scene.add(pointLight);     
            
            /*
            pointLight.shadow.mapSize.width = 512; // default
            pointLight.shadow.mapSize.height = 512; // default
            pointLight.shadow.camera.near = 0.5; // default
            pointLight.shadow.camera.far = 500; // default

            const helper = new THREE.CameraHelper( pointLight.shadow.camera );
            scene.add( helper );
            */
        
            const spotLight = new THREE.SpotLight( 0xffffff );
            spotLight.position.set( 0,0,200 );
            //scene.add( spotLight );
          

            const ambientLight = new THREE.AmbientLight('#ffffff');
            //scene.add(ambientLight);            


            const renderer = new THREE.WebGLRenderer({ alpha: true });
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.setClearColor(setting.background.color, setting.background.opacity); //預設背景顏色
            renderer.shadowMap.enable = true; //陰影效果   
            renderer.shadowMap.type = THREE.PCFSoftShadowMap; // default THREE.PCFShadowMap

            document.body.appendChild(renderer.domElement);

            //const controls = new OrbitControls(camera, renderer.domElement);
            const textureLoader = new THREE.TextureLoader();
            const image = 'upload/<?php echo $file;?>';
            
            const group = new THREE.Group();
            const phoneGroup = new THREE.Group();
            const cardGroup = new THREE.Group();

            const cardGeometry = new THREE.PlaneGeometry( setting.dimension.length, setting.dimension.width );                        
            //const material = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
                       

            var frontCardPlaneMat = new THREE.MeshPhongMaterial({
                <?php if ($file!="") { ?>
                map: new THREE.TextureLoader().load(image, tex => {
                    
                }),
                <?php } ?>
                color: setting.material[0].color,
                opacity: setting.material[0].opacity, 
                transparent: setting.material[0].transparent, 
				side: THREE.FrontSide
            });             
            
            if(setting.type=="landscape" || setting.type=="portrait"){
                // front card
                const card = new THREE.Mesh(cardGeometry, frontCardPlaneMat);            
                card.position.set(setting.position.posX, setting.position.posY, setting.position.posZ);
                //card.receiveShadow = true;
                //card.castShadow = true;
                cardGroup.add(card);

                const card2 = new THREE.Mesh(
                    new THREE.PlaneGeometry( setting.dimension.length*1.1, setting.dimension.width*1.1 ), 
                    new THREE.MeshPhongMaterial({
                        map: new THREE.TextureLoader().load('asset/wood.jpg', tex => {
                    
                        }),
                        //color: setting.material[1].color, 
                        transparent: false, opacity:1
                    })
                );            
                card2.position.set(setting.position.posX, setting.position.posY, setting.position.posZ-0.1);
                //card2.receiveShadow = true;
                //card2.castShadow = true;
                cardGroup.add(card2);
            }

            group.add(cardGroup);
            
            // iphone object
            /*
            const phoneGeometry = new THREE.BoxGeometry(setting.iphone.length, setting.iphone.height, setting.iphone.width);
            const phoneTexture = textureLoader.load("asset/iphone.png");

            var phoneMaterial = [
                
                
                new THREE.MeshBasicMaterial({
                    color: setting.material[1].color,
                    opacity: setting.material[1].opacity, 
                    transparent: setting.material[1].transparent, 
                }),
                new THREE.MeshBasicMaterial({
                    color: setting.material[1].color,
                    opacity: setting.material[1].opacity, 
                    transparent: setting.material[1].transparent,
                }),
                new THREE.MeshBasicMaterial({
                    color: setting.material[1].color,
                    opacity: setting.material[1].opacity, 
                    transparent: setting.material[1].transparent,
                }),                
                new THREE.MeshBasicMaterial({
                    color: setting.material[1].color,
                    opacity: setting.material[1].opacity, 
                    transparent: setting.material[1].transparent, 
                }),                
                new THREE.MeshBasicMaterial({
                    color: setting.material[0].color,
                    opacity: setting.material[0].opacity, 
                    transparent: setting.material[0].transparent, 
                    map: phoneTexture,
                }),
                new THREE.MeshBasicMaterial({
                    color: setting.material[1].color,
                    opacity: setting.material[1].opacity, 
                    transparent: setting.material[1].transparent, 
                }),                
				
            ];

            //const phoneMaterial = new THREE.MeshBasicMaterial({map:phoneTexture});
            const phone = new THREE.Mesh(phoneGeometry, phoneMaterial);
            phone.position.set(setting.iphone.length/2+5/2, setting.position.posY, setting.position.posZ);
            phoneGroup.add(phone);
            group.add(phoneGroup);
            */

            scene.add(group);

            /* box helper */
            //const boxHelper = new THREE.BoxHelper( box, 0x000000 );
            //scene.add( boxHelper );            

            /* grid helper
            const size = 100;
            const divisions = 100;
            const gridHelper = new THREE.GridHelper( size, divisions );
            scene.add( gridHelper );
            */

            /* spotlight helper 
            const spotLightHelper = new THREE.SpotLightHelper( spotLight );
            scene.add( spotLightHelper );
            */

            /* pointlight helper 
            const sphereSize = 30;
            const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );
            scene.add( pointLightHelper );   
            */

            /* axes helper  
            const axesHelper = new THREE.AxesHelper( 100 );
            scene.add( axesHelper );
            */
            

            /* camera helper
            const camerhelper = new THREE.CameraHelper( camera );
            scene.add( camerhelper );    
            */


            //camera.position.z = 5;

            function animate(){
                //sphere.rotation.x += 0.01;
                //sphere.rotation.y += 0.01;

                //box.rotation.x += 0.01;
                //box.rotation.y += 0.01;

                requestAnimationFrame(animate);
                //controls.update();
                renderer.render(scene, camera);
            }

            // 監聽螢幕寬高來做簡單 RWD 設定
            window.addEventListener('resize', function() {
                console.log("run");
                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();
                renderer.setSize(window.innerWidth, window.innerHeight);
            })            

            animate();


        </script>
	</body>
</html>