diff --git a/src/app/page.css b/src/app/page.css new file mode 100644 index 0000000..6fb47a5 --- /dev/null +++ b/src/app/page.css @@ -0,0 +1,4 @@ +.canvas { + width: 100vw !important; + height: 100vh !important; +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 44150c1..fbf7d1f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,45 +1,86 @@ 'use client'; -import { OrbitControls } from "@react-three/drei"; -import { Canvas, useFrame, useLoader } from "@react-three/fiber"; -import { useRef } from "react"; +import { OrbitControls } from '@react-three/drei'; +import { Canvas, useFrame, useLoader } from '@react-three/fiber'; +import { + Bloom, + EffectComposer, + GodRays, + Noise +} from '@react-three/postprocessing'; +import { forwardRef, useImperativeHandle, useRef, useState } from 'react'; -import * as THREE from 'three'; +import { Mesh, TextureLoader } from 'three'; -function SealCube() { - const meshRef = useRef(null); - const texture = useLoader(THREE.TextureLoader, '/img/niko.jpg'); +import './page.css'; - useFrame((state, delta) => { - if (meshRef.current) { - meshRef.current.rotation.x += delta * 0.5; - meshRef.current.rotation.y += delta * 0.5; - } - }); +const SealCube = forwardRef((props, ref) => { + const texture = useLoader(TextureLoader, '/img/niko.jpg'); + const meshRef = useRef(null); - return ( - - - - - ) -} + useImperativeHandle(ref, () => meshRef.current!, []); + useFrame((state, delta) => { + if (meshRef.current) { + meshRef.current.rotation.x += delta * 0.5; + meshRef.current.rotation.y += delta * 0.5; + } + }); + + return ( + + + + + ); +}); +SealCube.displayName = 'SealCube'; export default function Home() { - return ( - <> - + const [sunMesh, setSunMesh] = useState(null); + return ( + + { + if (mesh && !sunMesh) { + setSunMesh(mesh); + } + }} + /> + + + + { + sunMesh ? ( + + ) : ( + <> + ) + // it feels genuinely so cursed to have to do : <> just because EffectComposer can't handle null + } + - - - - - ); + + + ); }