diff --git a/packages/client/public/computer.glb b/packages/client/public/computer.glb deleted file mode 100644 index e7a9061..0000000 Binary files a/packages/client/public/computer.glb and /dev/null differ diff --git a/packages/client/public/model/obras/mateo.glb b/packages/client/public/model/obras/mateo.glb index fc1c1b6..e7a7cd8 100644 --- a/packages/client/public/model/obras/mateo.glb +++ b/packages/client/public/model/obras/mateo.glb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47635a6d30461b7ef245ec44efc20459cc59bc1e3f8e1f7ba90d052447818c04 -size 229188 +oid sha256:9990aeab66eba66fac7e96d1a2d2afaba0e21cfdee10164a622e147dc2a6868a +size 229100 diff --git a/packages/client/public/model/obras/proyector.glb b/packages/client/public/model/obras/proyector.glb index e16d0f7..e5cd77e 100644 --- a/packages/client/public/model/obras/proyector.glb +++ b/packages/client/public/model/obras/proyector.glb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d716abf308a3e043d96439973569f40032fff313c181f6f4f33bfc66cd8c1105 -size 9748 +oid sha256:23aef1c280b3c385d3f22ee9d5b19dcaa85ea8d94d4c91fb0cb88d90328f0838 +size 7116 diff --git a/packages/client/public/model/obras/proyector_wide.glb b/packages/client/public/model/obras/proyector_wide.glb new file mode 100644 index 0000000..8ae12e1 --- /dev/null +++ b/packages/client/public/model/obras/proyector_wide.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c4c809d011db55de058bf7d96624ce485ace4224a32a944fde455935f87a7f5 +size 7124 diff --git a/packages/client/src/3d/ArtworkCollection.tsx b/packages/client/src/3d/ArtworkCollection.tsx index dd12489..4c3dbd3 100644 --- a/packages/client/src/3d/ArtworkCollection.tsx +++ b/packages/client/src/3d/ArtworkCollection.tsx @@ -9,25 +9,25 @@ import Carolina from './models/obras/Carolina' import Julian from './models/obras/Julian' import Mateo from './models/obras/Mateo' import Gaston from './models/obras/Gaston' -// import Daniela from './models/obras/Daniela' -// import Pedro from './models/obras/Pedro' -// import DiegoGuido from './models/obras/DiegoGuido' +import Daniela from './models/obras/Daniela' +import Pedro from './models/obras/Pedro' +import DiegoGuido from './models/obras/DiegoGuido' const models: (JSX.Element | null)[] = [ - null, // , + , // , null, // Juan cruz null, // Lucia cordoba null, // Camila - , + , null, // Lucia Novello - , - , + , + , null, // Edu - , - , - , - null, //, - null, //, + , + , + , + , + , ] function ArtworkCollection(props: JSX.IntrinsicElements['group']) { diff --git a/packages/client/src/3d/Collisions.tsx b/packages/client/src/3d/Collisions.tsx index 791b477..fdd24f2 100644 --- a/packages/client/src/3d/Collisions.tsx +++ b/packages/client/src/3d/Collisions.tsx @@ -6,14 +6,14 @@ import ParkCollisions from './models/Park_collisions' import StreetCollisions from './models/Street_collisions' import MuseumCollisions from './models/Museum_collisions' import EntranceCollsions from './models/Entrance_collisions' -import { Mesh, MeshBasicMaterial } from 'three' +import { Mesh } from 'three' const Model = forwardRef( (props: JSX.IntrinsicElements['group'], ref: ForwardedRef) => { - const material = new MeshBasicMaterial({ - wireframe: true, - color: 0xffff00, - }) + // const material = new MeshBasicMaterial({ + // wireframe: true, + // color: 0xffff00, + // }) return ( @@ -26,4 +26,6 @@ const Model = forwardRef( }, ) +Model.displayName = 'collisions' + export default Model diff --git a/packages/client/src/3d/Controls.tsx b/packages/client/src/3d/Controls.tsx index 54c454c..8b7a306 100644 --- a/packages/client/src/3d/Controls.tsx +++ b/packages/client/src/3d/Controls.tsx @@ -14,7 +14,6 @@ const Controls: React.FC = () => { const onLock = () => setPointerLockStatus(true) const onUnlock = () => { setPointerLockStatus(false) - console.log('unlock') } ref.current.addEventListener?.('lock', onLock) diff --git a/packages/client/src/3d/ObraAudio.tsx b/packages/client/src/3d/ObraAudio.tsx new file mode 100644 index 0000000..1613a66 --- /dev/null +++ b/packages/client/src/3d/ObraAudio.tsx @@ -0,0 +1,36 @@ +import React, { useEffect, useRef } from 'react' +import { PositionalAudio, Box } from '@react-three/drei' +import { PositionalAudio as PositionalAudioImpl } from 'three' +import useStore from '../store' + +type Props = JSX.IntrinsicElements['positionalAudio'] & { + url: string + distance?: number + loop?: boolean +} + +const ObraAudio: React.FC = ({ position, url, loop = true, ...props }) => { + const pointerLocked = useStore((state) => state.pointerLocked) + const audioRef = useRef() + + useEffect(() => { + if (audioRef.current) { + if (!pointerLocked && audioRef.current.isPlaying) { + audioRef.current.pause() + } else if (pointerLocked && !audioRef.current.isPlaying) { + audioRef.current.play() + } + + audioRef.current.setDirectionalCone(35, 60, 0.1) + audioRef.current.setRefDistance(0.5) + } + }, [audioRef.current, pointerLocked]) + + return ( + + + + ) +} + +export default ObraAudio diff --git a/packages/client/src/3d/Phantom.tsx b/packages/client/src/3d/Phantom.tsx index 7413e0d..4e2ee59 100644 --- a/packages/client/src/3d/Phantom.tsx +++ b/packages/client/src/3d/Phantom.tsx @@ -1,6 +1,5 @@ // @ts-nocheck import React, { useEffect, useRef } from 'react' -import { Vector3, Euler } from 'three' import Human from './models/Human' import api, { Transform } from '../store' diff --git a/packages/client/src/3d/Player.tsx b/packages/client/src/3d/Player.tsx index 721af78..47bfe0f 100644 --- a/packages/client/src/3d/Player.tsx +++ b/packages/client/src/3d/Player.tsx @@ -144,7 +144,7 @@ const Player = () => { const socketEmitTransformInterval = setInterval(() => { if (socket && groupRef.current && camera) { const cameraRotation = camera.quaternion.toArray() - const [x, y, z] = direction.current.toArray() + const [x, , z] = direction.current.toArray() let anim = animations.idle diff --git a/packages/client/src/3d/models/Computer.tsx b/packages/client/src/3d/models/Computer.tsx index 7fa8e9f..fdb379f 100644 --- a/packages/client/src/3d/models/Computer.tsx +++ b/packages/client/src/3d/models/Computer.tsx @@ -29,7 +29,6 @@ type ComputerProps = { export default function Model(props: ComputerProps & JSX.IntrinsicElements['group']) { const pointerLockControls = useStore((state) => state.pointerLockControls) - const setPointerLockStatus = useStore((state) => state.setPointerLockStatus) const setModalObra = useStore((state) => state.setModalObra) const group = useRef() @@ -54,15 +53,17 @@ export default function Model(props: ComputerProps & JSX.IntrinsicElements['grou ref={group} {...props} dispose={null} - onPointerOver={(e) => { + onPointerOver={() => { setCurrentMaterial(true) }} onPointerOut={() => setCurrentMaterial(false)} onClick={() => { - setModalObra(props.obraId) - setTimeout(() => { - pointerLockControls.unlock() - }, 500) + if (pointerLockControls) { + setModalObra(props.obraId) + setTimeout(() => { + pointerLockControls.unlock?.() + }, 500) + } }} > diff --git a/packages/client/src/3d/models/Entrance.tsx b/packages/client/src/3d/models/Entrance.tsx index 4ef93e3..bf631fd 100644 --- a/packages/client/src/3d/models/Entrance.tsx +++ b/packages/client/src/3d/models/Entrance.tsx @@ -27,7 +27,7 @@ type GLTFResult = GLTF & { export default function Model(props: JSX.IntrinsicElements['group']) { const group = useRef() - const { scene, materials } = useGLTF('/model/entrance.glb') as GLTFResult + const { scene } = useGLTF('/model/entrance.glb') as GLTFResult return ( diff --git a/packages/client/src/3d/models/Human.tsx b/packages/client/src/3d/models/Human.tsx index 4010191..3e0b2f0 100644 --- a/packages/client/src/3d/models/Human.tsx +++ b/packages/client/src/3d/models/Human.tsx @@ -14,8 +14,7 @@ import { FrontSide } from 'three/src/constants' import { HEIGHT } from '../Player' -import api, { State, Transform } from '../../store' -import { Color } from 'three/src/math/Color' +import api, { Transform } from '../../store' import { MeshNormalMaterial } from 'three/src/materials/MeshNormalMaterial' import { Object3D } from 'three/src/core/Object3D' import { SkinnedMesh } from 'three/src/objects/SkinnedMesh' diff --git a/packages/client/src/3d/models/obras/Daniela.tsx b/packages/client/src/3d/models/obras/Daniela.tsx new file mode 100644 index 0000000..fc4d0ca --- /dev/null +++ b/packages/client/src/3d/models/obras/Daniela.tsx @@ -0,0 +1,14 @@ +import * as THREE from 'three' +import Proyector from './Proyector' +import React, { useRef } from 'react' +import ObraAudio from '../../ObraAudio' + +export default function Model(props: JSX.IntrinsicElements['group']) { + const group = useRef() + return ( + + + + + ) +} diff --git a/packages/client/src/3d/models/obras/DiegoGuido.tsx b/packages/client/src/3d/models/obras/DiegoGuido.tsx new file mode 100644 index 0000000..6a427d7 --- /dev/null +++ b/packages/client/src/3d/models/obras/DiegoGuido.tsx @@ -0,0 +1,14 @@ +import * as THREE from 'three' +import Proyector from './Proyector' +import React, { useRef } from 'react' +import ObraAudio from '../../ObraAudio' + +export default function Model(props: JSX.IntrinsicElements['group']) { + const group = useRef() + return ( + + + + + ) +} diff --git a/packages/client/src/3d/models/obras/Gaston.tsx b/packages/client/src/3d/models/obras/Gaston.tsx index 81c8a16..1758280 100644 --- a/packages/client/src/3d/models/obras/Gaston.tsx +++ b/packages/client/src/3d/models/obras/Gaston.tsx @@ -5,6 +5,7 @@ Auto-generated by: https://github.com/pmndrs/gltfjsx import * as THREE from 'three' import React, { useRef } from 'react' import { useGLTF } from '@react-three/drei/useGLTF' +import ObraAudio from '../../ObraAudio' import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' @@ -23,6 +24,13 @@ export default function Model(props: JSX.IntrinsicElements['group']) { return ( + + ) } diff --git a/packages/client/src/3d/models/obras/Pedro.tsx b/packages/client/src/3d/models/obras/Pedro.tsx new file mode 100644 index 0000000..42d666a --- /dev/null +++ b/packages/client/src/3d/models/obras/Pedro.tsx @@ -0,0 +1,14 @@ +import * as THREE from 'three' +import Proyector from './Proyector' +import React, { useRef } from 'react' +import ObraAudio from '../../ObraAudio' + +export default function Model(props: JSX.IntrinsicElements['group']) { + const group = useRef() + return ( + + + + + ) +} diff --git a/packages/client/src/3d/models/obras/Proyector.tsx b/packages/client/src/3d/models/obras/Proyector.tsx index 0974ab6..bc73e20 100644 --- a/packages/client/src/3d/models/obras/Proyector.tsx +++ b/packages/client/src/3d/models/obras/Proyector.tsx @@ -3,40 +3,89 @@ Auto-generated by: https://github.com/pmndrs/gltfjsx */ import * as THREE from 'three' -import React, { useRef } from 'react' +import React, { useRef, useEffect } from 'react' import { useGLTF } from '@react-three/drei/useGLTF' - +import { + Mesh, + Color, + MeshBasicMaterial, + MeshStandardMaterial, + VideoTexture, + DoubleSide, +} from 'three' import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' type GLTFResult = GLTF & { nodes: { - Cube013: THREE.Mesh - ['Cube.013_1']: THREE.Mesh - ['Cube.013_2']: THREE.Mesh + Cube013: Mesh + ['Cube.013_1']: Mesh + ['Cube.013_2']: Mesh + Cube001: THREE.Mesh + ['Cube.001_1']: THREE.Mesh + ['Cube.001_2']: THREE.Mesh } materials: { - ['VrHeadset cuerpo.002']: THREE.MeshStandardMaterial - ['light.001']: THREE.MeshStandardMaterial - ['projection.001']: THREE.MeshStandardMaterial + plastic: MeshStandardMaterial + projection_light: MeshStandardMaterial + projection: MeshStandardMaterial } } -export default function Model(props: JSX.IntrinsicElements['group']) { +export default function Model( + props: JSX.IntrinsicElements['group'] & { videoSrc: string; wide?: boolean }, +) { + const { nodes, materials } = useGLTF( + `/model/obras/proyector${props.wide ? '_wide' : ''}.glb`, + ) as GLTFResult const group = useRef() - const { nodes, materials } = useGLTF('/model/obras/proyector.glb') as GLTFResult + const videoRef = useRef(document.createElement('video')) + const projectionMaterial = useRef( + new MeshBasicMaterial({ color: new Color('white') }), + ) + const videoTexture = useRef() + + useEffect(() => { + if (videoRef.current && projectionMaterial) { + videoRef.current.src = props.videoSrc + videoRef.current.load() + videoRef.current.loop = true + videoRef.current.muted = true + videoRef.current.autoplay = true + videoRef.current.play() + + videoTexture.current = new VideoTexture(videoRef.current) + projectionMaterial.current.map = videoTexture.current + projectionMaterial.current.needsUpdate = true + } + }, [videoRef.current, projectionMaterial.current]) + return ( - - - - - + {!props.wide ? ( + <> + + + + + ) : ( + <> + + + + + )} ) } diff --git a/packages/client/src/3d/models/obras/Proyector_wide.tsx b/packages/client/src/3d/models/obras/Proyector_wide.tsx new file mode 100644 index 0000000..a2b8531 --- /dev/null +++ b/packages/client/src/3d/models/obras/Proyector_wide.tsx @@ -0,0 +1,36 @@ +/* +Auto-generated by: https://github.com/pmndrs/gltfjsx +*/ + +import * as THREE from 'three' +import React, { useRef } from 'react' +import { useGLTF } from '@react-three/drei/useGLTF' + +import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' + +type GLTFResult = GLTF & { + nodes: { + Cube001: THREE.Mesh + ['Cube.001_1']: THREE.Mesh + ['Cube.001_2']: THREE.Mesh + } + materials: { + plastic: THREE.MeshStandardMaterial + projection_light: THREE.MeshStandardMaterial + projection: THREE.MeshStandardMaterial + } +} + +export default function Model(props: JSX.IntrinsicElements['group']) { + const group = useRef() + const { nodes, materials } = useGLTF('/proyector_wide.glb') as GLTFResult + return ( + + + + + + ) +} + +useGLTF.preload('/proyector_wide.glb') diff --git a/packages/client/src/components/MenuOverlay.tsx b/packages/client/src/components/MenuOverlay.tsx index a5007f3..09e28c7 100644 --- a/packages/client/src/components/MenuOverlay.tsx +++ b/packages/client/src/components/MenuOverlay.tsx @@ -46,7 +46,6 @@ const MenuOverlay: React.FC = () => { pointerLockControls.lock?.() } } - console.log(modalObra) return ( <>