'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, float, Fn, max, mod, oneMinus, select, ShaderNodeObject, smoothstep, sub, texture, uniform, uv, vec2, 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-3.jpg'; import DEPTHMAP from '@/assets/depth-3.png'; const tomorrow = Tomorrow({ weight: '600', subsets: ['latin'], }); const WIDTH = 1226; const HEIGHT = 650; const sdCross = Fn( ([p_immutable, b_immutable, r_immutable]: ShaderNodeObject[]) => { const r = float(r_immutable).toVar(); const b = vec2(b_immutable).toVar(); const p = vec2(p_immutable).toVar(); p.assign(abs(p)); p.assign(select(p.y.greaterThan(p.x), p.yx, p.xy)); const q = vec2(p.sub(b)).toVar(); const k = float(max(q.y, q.x)).toVar(); const w = vec2( select(k.greaterThan(0.0), q, vec2(b.y.sub(p.x), k.negate())) ).toVar(); const d = float(max(w, 0.0).length()).toVar(); return select(k.greaterThan(0.0), d, d.negate()).add(r); } ); const Scene = () => { const { setIsLoading } = useContext(GlobalContext); const [rawMap, depthMap] = useTexture([TEXTUREMAP.src, DEPTHMAP.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 tMap = texture( rawMap, uv().add(tDepthMap.r.mul(uPointer).mul(strength)) ).mul(0.5); const aspect = float(WIDTH).div(HEIGHT); const tUv = vec2(uv().x.mul(aspect), uv().y); const tiling = vec2(50.0); const tiledUv = mod(tUv.mul(tiling), 2.0).sub(1.0); const dist = sdCross(tiledUv, vec2(0.3, 0.02), 0.0); const cross = vec3(smoothstep(0.0, 0.02, dist)); const depth = oneMinus(tDepthMap); const flow = sub(1, smoothstep(0, 0.02, abs(depth.sub(uProgress)))); const mask = oneMinus(cross).mul(flow).mul(vec3(10, 10, 10)); const final = blendScreen(tMap, mask); const material = new THREE.MeshBasicNodeMaterial({ colorNode: final, }); return { material, uniforms: { uPointer, uProgress, }, }; }, [rawMap, depthMap]); const [w, h] = useAspect(WIDTH, HEIGHT); useGSAP(() => { gsap.to(uniforms.uProgress, { value: 0.9, 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 (
{'Embrace Nature’s Rhythm'.split(' ').map((word, index) => { return (
{word}
); })}
where one endless road leads to an uncertain future.
); }; export default function Page() { return ( ); }