'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 (