'use client'; import { WebGPUCanvas } from '@/components/canvas'; import { useAspect, useTexture } from '@react-three/drei'; import { useFrame } from '@react-three/fiber'; import { useContext, useMemo } from 'react'; import { Tomorrow } from 'next/font/google'; import gsap from 'gsap'; import { abs, blendScreen, oneMinus, smoothstep, sub, texture, uniform, uv, vec3, } from 'three/tsl'; import * as THREE from 'three/webgpu'; import { useGSAP } from '@gsap/react'; import { PostProcessing } from '@/components/post-processing'; import { ContextProvider, GlobalContext } from '@/context'; import TEXTUREMAP from '@/assets/raw-2.png'; import DEPTHMAP from '@/assets/depth-2.png'; import EDGEMAP from '@/assets/edge-2.png'; const tomorrow = Tomorrow({ weight: '600', subsets: ['latin'], }); const WIDTH = 1600; const HEIGHT = 900; const Scene = () => { const { setIsLoading } = useContext(GlobalContext); const [rawMap, depthMap, edgeMap] = useTexture( [TEXTUREMAP.src, DEPTHMAP.src, EDGEMAP.src], () => { setIsLoading(false); rawMap.colorSpace = THREE.SRGBColorSpace; } ); const { material, uniforms } = useMemo(() => { const uPointer = uniform(new THREE.Vector2(0)); const uProgress = uniform(0); const strength = 0.01; const tDepthMap = texture(depthMap); const tEdgeMap = texture(edgeMap); const tMap = texture( rawMap, uv().add(tDepthMap.r.mul(uPointer).mul(strength)) ).mul(0.5); const depth = tDepthMap; const flow = sub(1, smoothstep(0, 0.02, abs(depth.sub(uProgress)))); const mask = oneMinus(tEdgeMap).mul(flow).mul(vec3(10, 0.4, 10)); const final = blendScreen(tMap, mask); const material = new THREE.MeshBasicNodeMaterial({ colorNode: final, }); return { material, uniforms: { uPointer, uProgress, }, }; }, [rawMap, depthMap, edgeMap]); const [w, h] = useAspect(WIDTH, HEIGHT); useGSAP(() => { gsap.to(uniforms.uProgress, { value: 1, repeat: -1, duration: 3, ease: 'power1.out', }); }, [uniforms.uProgress]); useFrame(({ pointer }) => { uniforms.uPointer.value = pointer; }); return ( ); }; const Html = () => { const { isLoading } = useContext(GlobalContext); useGSAP(() => { if (!isLoading) { gsap .timeline() .to('[data-loader]', { opacity: 0, }) .from('[data-title]', { yPercent: -100, stagger: { each: 0.15, }, ease: 'power1.out', }) .from('[data-desc]', { opacity: 0, yPercent: 100, }); } }, [isLoading]); return (
{'Neon Horizon'.split(' ').map((word, index) => { return (
{word}
); })}
A city consumed by light and shadow,
where one endless road leads to an uncertain future.
); }; export default function Page() { return ( ); }