File size: 2,811 Bytes
b6ec289
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import React, { Suspense } from 'react'
import { Canvas, useFrame } from '@react-three/fiber'
import { OrbitControls, Stage, useFBX, PerspectiveCamera, useGLTF } from '@react-three/drei';
import { MeshStandardMaterial } from 'three/src/materials/MeshStandardMaterial';
// import * as THREE from 'three';
import _ from 'lodash';
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
import { useLoader } from '@react-three/fiber';
import { sRGBEncoding, LinearEncoding } from 'three/src/constants';


function Avatar({ fbx_url }) {
  let fbx = useGLTF(fbx_url);
  // console.log(fbx.scene);

  // let fbx = useLoader(GLTFLoader, fbx_url, loader => {
  //   const dracoLoader = new DRACOLoader();
  //   dracoLoader.setDecoderPath('/draco-gltf/');
  //   loader.setDRACOLoader(dracoLoader);
  // });

  fbx.scene.traverse(node => {
    
    if(node.type === 'Mesh' || node.type == 'SkinnedMesh') {
      
        node.frustumCulled = false;
      
        // let prevMaterial = node.material;
        // node.material = new MeshStandardMaterial();
        // node.material.copy(prevMaterial);
        // node.material.roughness = 0.9;
        
        // node.material.color.setHex(0xFFFFFF);

        // node.material.environmentIntensity = 0.2;
        // node.material.envMapIntensity = 0.2;

      

        if (node.name.toLowerCase().includes("hair")) {
          node.material.transparent = true;
          node.material.depthWrite = false;
          node.material.side = 2;
          node.material.color.setHex(0x222222);
        }

    }

  });

  // let posesFbx = useFBX("/avatar.fbx");
    
  // const clips = posesFbx.animations;
  // const mixer = new THREE.AnimationMixer(fbx);
  

  // setTimeout(() => {
  //   // mixer.clipAction(clips[2]).play();
  // }, 2000);
        
  // useFrame((state, delta) => {
  //   mixer.update(delta);
  // });


  // console.log("FBX to render", fbx);


  return (<group>
    <primitive object={fbx.scene} dispose={null} />

  </group>);
}

function App() {

  let avatarUrl = (new URLSearchParams(window.location.search)).get("avatar");

  
  return (
    <div className="full">
    <Canvas dpr={2}>
    
      <PerspectiveCamera 
        position={[0, 1.6, 2.5]}
        makeDefault={true}/>

      <OrbitControls
        target={[0, 1, 0]}
      />
      
      <Suspense fallback={null}>

        <Stage 
          contactShadow 
          shadows 
          adjustCamera={false}
          intensity={0.2} 
          environment="forest" 
          preset="upfront">
      
        

          {/* <Avatar fbx_url={"/avatar.fbx"} /> */}
          <Avatar fbx_url={avatarUrl} />


      
        </Stage>
      </Suspense>
  

  </Canvas>
  </div>
  )
}

export default App;