You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.1 KiB
77 lines
2.1 KiB
/*
|
|
Auto-generated by: https://github.com/pmndrs/gltfjsx
|
|
*/
|
|
|
|
import * as THREE from 'three'
|
|
import React, { useMemo, useRef, useState } from 'react'
|
|
import { useGLTF } from '@react-three/drei/useGLTF'
|
|
|
|
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader'
|
|
import { Color, FrontSide, MeshLambertMaterial } from 'three'
|
|
import useStore from '../../store'
|
|
|
|
type GLTFResult = GLTF & {
|
|
nodes: {
|
|
computer_mesh: THREE.Mesh
|
|
computer_mesh_1: THREE.Mesh
|
|
computer_mesh_2: THREE.Mesh
|
|
}
|
|
materials: {
|
|
keyboard: THREE.MeshStandardMaterial
|
|
marble: THREE.MeshStandardMaterial
|
|
computer_screen: THREE.MeshStandardMaterial
|
|
}
|
|
}
|
|
|
|
type ComputerProps = {
|
|
obraId: number
|
|
}
|
|
|
|
export default function Model(props: ComputerProps & JSX.IntrinsicElements['group']) {
|
|
const pointerLockControls = useStore((state) => state.pointerLockControls)
|
|
const setModalObra = useStore((state) => state.setModalObra)
|
|
|
|
const group = useRef<THREE.Group>()
|
|
const [currentMaterial, setCurrentMaterial] = useState(false)
|
|
const { nodes, materials } = useGLTF('/model/computer.glb') as GLTFResult
|
|
|
|
const onMaterial = useMemo(() => {
|
|
const m = new MeshLambertMaterial({
|
|
color: new Color('#57bc78'),
|
|
emissive: new Color('#97ffbd'),
|
|
side: FrontSide,
|
|
flatShading: false,
|
|
})
|
|
|
|
return m
|
|
}, [])
|
|
|
|
const mat = currentMaterial ? onMaterial : materials.computer_screen
|
|
|
|
return (
|
|
<group
|
|
ref={group}
|
|
{...props}
|
|
dispose={null}
|
|
onPointerOver={() => {
|
|
setCurrentMaterial(true)
|
|
}}
|
|
onPointerOut={() => setCurrentMaterial(false)}
|
|
onClick={() => {
|
|
if (pointerLockControls) {
|
|
setModalObra(props.obraId)
|
|
setTimeout(() => {
|
|
pointerLockControls.unlock?.()
|
|
}, 500)
|
|
}
|
|
}}
|
|
>
|
|
<mesh material={materials.keyboard} geometry={nodes.computer_mesh.geometry} />
|
|
<mesh material={materials.marble} geometry={nodes.computer_mesh_1.geometry} />
|
|
<mesh material={mat} geometry={nodes.computer_mesh_2.geometry} />
|
|
</group>
|
|
)
|
|
}
|
|
|
|
useGLTF.preload('/model/computer.glb')
|