|
1 | 1 | "use client"; |
2 | 2 |
|
3 | 3 | import * as THREE from "three"; |
4 | | -import { useEffect, useRef, useState } from "react"; |
5 | | -import { useFrame, useThree, extend, createPortal } from "@react-three/fiber"; |
6 | 4 | import { |
7 | | - createFxMaterialImpl, |
8 | | - createBasicFxMaterialImpl, |
9 | | - FxMaterialImplValues, |
10 | | - BasicFxMaterialImplValues, |
11 | | -} from "@/packages/use-shader-fx/src"; |
12 | | -import { Float, OrbitControls, useTexture } from "@react-three/drei"; |
13 | | -import { useGaussianBlur } from "@/packages/use-shader-fx/src/hooks/blur/useGaussianBlur"; |
| 5 | + Environment, |
| 6 | + MeshTransmissionMaterial, |
| 7 | + OrbitControls, |
| 8 | + useGLTF, |
| 9 | +} from "@react-three/drei"; |
14 | 10 |
|
15 | | -const FxMaterialImpl = createFxMaterialImpl({ |
16 | | - fragmentShader: ` |
17 | | - uniform sampler2D src; |
18 | | - void main() { |
19 | | - vec2 vel = texture2D(src, vUv).xy; |
20 | | - float len = length(vel); |
21 | | - vel = vel * 0.5 + 0.5; |
22 | | - |
23 | | - vec3 color = vec3(vel.x, vel.y, 1.0); |
24 | | - color = mix(vec3(1.0), color, len); |
| 11 | +import { useFluid, useNoise } from "@/packages/use-shader-fx/src"; |
25 | 12 |
|
26 | | - gl_FragColor = vec4(color, 1.0); |
27 | | - } |
28 | | -`, |
29 | | -}); |
30 | | -const BasicFxMaterialImpl = createBasicFxMaterialImpl(); |
| 13 | +import { useCallback, useRef } from "react"; |
| 14 | +import { useFrame, useThree } from "@react-three/fiber"; |
31 | 15 |
|
32 | | -extend({ FxMaterialImpl, BasicFxMaterialImpl }); |
33 | | - |
34 | | -export const Playground = () => { |
35 | | - const { size, viewport, camera } = useThree(); |
| 16 | +const Model = ({ children }: { children?: React.ReactNode }) => { |
| 17 | + const ref = useRef<THREE.Mesh>(null); |
| 18 | + const { nodes, materials } = useGLTF("/ANRI_LOGO_WEB_EXPORT_V01.gltf"); |
| 19 | + return ( |
| 20 | + <mesh |
| 21 | + ref={ref} |
| 22 | + castShadow |
| 23 | + receiveShadow |
| 24 | + scale={10} |
| 25 | + geometry={nodes["OBJECTS"].children[0].geometry}> |
| 26 | + {children} |
| 27 | + </mesh> |
| 28 | + ); |
| 29 | +}; |
36 | 30 |
|
37 | | - const [app] = useTexture(["/app-head.jpg"]); |
| 31 | +const Light = () => { |
| 32 | + return ( |
| 33 | + <Environment |
| 34 | + // resolution={256} |
| 35 | + files={"/snowpark.exr"} |
| 36 | + background |
| 37 | + // preset="park" |
| 38 | + backgroundIntensity={1} |
| 39 | + backgroundBlurriness={0}></Environment> |
| 40 | + ); |
| 41 | +}; |
38 | 42 |
|
39 | | - const blur = useGaussianBlur({ |
| 43 | +export const Playground = () => { |
| 44 | + const { size } = useThree(); |
| 45 | + const fluid = useFluid({ |
40 | 46 | size, |
41 | | - dpr: 1, |
42 | | - radius: 21, |
43 | | - // blurIteration: 1, |
44 | | - // src: app, |
45 | | - texture: { |
46 | | - src: app, |
| 47 | + dpr: 0.3, |
| 48 | + scale: new THREE.Vector2(10, 10), |
| 49 | + colorBalance: { |
| 50 | + factor: new THREE.Vector3(1, 0, 0), |
| 51 | + }, |
| 52 | + hsv: { |
| 53 | + saturation: 5, |
47 | 54 | }, |
48 | 55 | }); |
49 | | - |
50 | | - blur.setValues({ |
51 | | - radius: 41, |
52 | | - // blurIteration: 20, |
53 | | - }); |
54 | | - |
| 56 | + const materialRef = useRef<any>(null); |
55 | 57 | useFrame((state) => { |
56 | | - blur.render(state); |
| 58 | + fluid.render(state); |
| 59 | + materialRef.current.userData.time.value = state.clock.getElapsedTime(); |
| 60 | + state.camera.position.lerp( |
| 61 | + { x: state.pointer.x * 0.8, y: state.pointer.y * 0.8, z: 6 }, |
| 62 | + 0.05 |
| 63 | + ); |
57 | 64 | }); |
58 | | - |
59 | 65 | return ( |
60 | 66 | <mesh> |
61 | | - <planeGeometry args={[2, 2]} /> |
62 | | - <fxMaterialImpl key={FxMaterialImpl.key} src={blur.texture} /> |
| 67 | + <Model> |
| 68 | + <MeshTransmissionMaterial |
| 69 | + ref={materialRef} |
| 70 | + map={fluid.texture} |
| 71 | + clearcoat={0.3} |
| 72 | + metalness={0.6} |
| 73 | + roughness={0.2} |
| 74 | + userData={{ |
| 75 | + time: { value: 0 }, |
| 76 | + }} |
| 77 | + onBeforeCompile={useCallback((shader: any) => { |
| 78 | + Object.assign(shader.uniforms, materialRef.current.userData); |
| 79 | + shader.vertexShader = shader.vertexShader.replace( |
| 80 | + "#include <beginnormal_vertex>", |
| 81 | + ` |
| 82 | + vec3 objectNormal = custom_Normal; |
| 83 | + #ifdef USE_TANGENT |
| 84 | + vec3 objectTangent = vec3( tangent.xyz ); |
| 85 | + #endif |
| 86 | + ` |
| 87 | + ); |
| 88 | + |
| 89 | + shader.vertexShader = shader.vertexShader.replace( |
| 90 | + "#include <begin_vertex>", |
| 91 | + ` |
| 92 | + vec3 transformed = custom_Position; |
| 93 | + #ifdef USE_ALPHAHASH |
| 94 | + vPosition = vec3( position ); |
| 95 | + #endif |
| 96 | + ` |
| 97 | + ); |
| 98 | + |
| 99 | + shader.vertexShader = shader.vertexShader.replace( |
| 100 | + "void main() {", |
| 101 | + ` |
| 102 | + uniform float time; |
| 103 | + |
| 104 | + void main() { |
| 105 | + |
| 106 | + vec3 custom_Position = position; |
| 107 | + vec3 custom_Normal = normal; |
| 108 | + |
| 109 | + custom_Position += custom_Normal * (sin(time) * .5 + .5) * 0.05; |
| 110 | + |
| 111 | + ` |
| 112 | + ); |
| 113 | + }, [])} |
| 114 | + /> |
| 115 | + </Model> |
| 116 | + <OrbitControls /> |
| 117 | + <Light /> |
63 | 118 | </mesh> |
64 | 119 | ); |
65 | 120 | }; |
0 commit comments