/*
 * @Author: wuhao930406 1148547900@qq.com
 * @Date: 2023-08-03 11:31:00
 * @LastEditors: wuhao930406 1148547900@qq.com
 * @LastEditTime: 2023-08-24 14:27:24
 * @FilePath: /editor-plus/src/pages/components/GlftBlock/index.jsx
 * @Description:
 *
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
 */
import { Gltf, OrbitControls, Stage } from "@react-three/drei";
import { Canvas, useLoader } from "@react-three/fiber";
import { memo } from "react";
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader";
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader";
import "./index.less";

const ModelLoader = memo(({ url = "./glb/camera.obj" }) => {
  let loader,
    urlsplit = url.split(".");

  const modelType = urlsplit[urlsplit.length - 1];

  if (modelType === "gltf" || modelType === "glb") {
    return (
      <Gltf
        src={url}
        receiveShadow
        castShadow
        position={[0, 0, 0]}
        scale={20}
        inject={
          <meshPhysicalMaterial
            color="white"
            metalness={1} // 控制金属感,1 表示完全金属
            roughness={0} // 控制光滑度,0 表示非常光滑
          />
        }
      />
    );
  } else if (modelType === "obj") {
    loader = useLoader(OBJLoader, url);
    return (
      <mesh receiveShadow castShadow scale={20}>
        <primitive
          object={loader.clone()}
          receiveShadow
          castShadow
          position={[0, 0, 0]}
        />
        <meshPhysicalMaterial
          color="white"
          metalness={1} // 控制金属感,1 表示完全金属
          roughness={0} // 控制光滑度,0 表示非常光滑
        />
      </mesh>
    );
  } else if (modelType === "fbx") {
    loader = useLoader(FBXLoader, url);
    return (
      <mesh receiveShadow castShadow scale={20}>
        <primitive
          object={loader.scene.clone()}
          receiveShadow
          castShadow
          position={[0, 0, 0]}
        />
        <meshPhysicalMaterial
          color="white"
          metalness={1} // 控制金属感,1 表示完全金属
          roughness={0} // 控制光滑度,0 表示非常光滑
        />
      </mesh>
    );
  }
});

function ThreeViewer({ url }) {
  return (
    <div className="bar-block-component">
      <Canvas style={{ height: "600px", width: "100%" }} id={"sada"}>
        <color attach="background" args={["white"]} />
        <OrbitControls></OrbitControls>
        <Stage
          intensity={0.5}
          preset="rembrandt"
          shadows={"contact"}
          adjustCamera={1}
          environment={{
            path: "/",
            files: "env.hdr",
          }}
        >
          <ModelLoader url={url} />
        </Stage>
      </Canvas>
    </div>
  );
}

export default ThreeViewer;