11"use client" ;
22
33import * as THREE from "three" ;
4- import { useRef } from "react" ;
5- import { useFrame , useThree } from "@react-three/fiber" ;
4+ import { useEffect , useRef } from "react" ;
5+ import { useFrame , useThree , extend } from "@react-three/fiber" ;
66import {
77 useNoise ,
88 useFluid ,
@@ -20,132 +20,35 @@ import {
2020} from "@/packages/use-shader-fx/src/hooks/useColorStrata" ;
2121import GUI from "lil-gui" ;
2222import { useGUI } from "@/utils/useGUI" ;
23+ import { FxMaterial , FxMaterialProps } from "./FxMaterial" ;
24+ import { useVideoTexture } from "@react-three/drei" ;
2325
24- const CONFIG = {
25- colorStrata : {
26- ...structuredClone ( COLORSTRATA_PARAMS ) ,
27- laminateLayer : 10 ,
28- laminateInterval : new THREE . Vector2 ( 0.1 , 0.1 ) ,
29- laminateDetail : new THREE . Vector2 ( 0.7 , 0.7 ) ,
30- distortion : new THREE . Vector2 ( 10.0 , 10.0 ) ,
31- colorFactor : new THREE . Vector3 ( 1 , 1 , 1 ) ,
32- timeStrength : new THREE . Vector2 ( 1 , 1 ) ,
33- noiseStrength : new THREE . Vector2 ( 1 , 1 ) ,
34- } as ColorStrataParams ,
35- color : {
36- color0 : new THREE . Color ( 0xff0000 ) ,
37- color1 : new THREE . Color ( 0x0000ff ) ,
38- color2 : new THREE . Color ( 0x00ff00 ) ,
39- color3 : new THREE . Color ( 0xffff00 ) ,
40- } ,
41- } ;
42-
43- const setGUI = ( gui : GUI ) => {
44- //color strata
45- const colorStrata = gui . addFolder ( "colorStrata" ) ;
46- colorStrata . add ( CONFIG . colorStrata , "laminateLayer" , 0 , 20 , 1 ) ;
47- colorStrata . add ( CONFIG . colorStrata , "scale" , 0 , 1 , 0.01 ) ;
48- const laminateInterval = colorStrata . addFolder ( "laminateInterval" ) ;
49- laminateInterval . add ( CONFIG . colorStrata . laminateInterval ! , "x" , 0 , 2 , 0.01 ) ;
50- laminateInterval . add ( CONFIG . colorStrata . laminateInterval ! , "y" , 0 , 2 , 0.01 ) ;
51- const laminateDetail = colorStrata . addFolder ( "laminateDetail" ) ;
52- laminateDetail . add ( CONFIG . colorStrata . laminateDetail ! , "x" , 0 , 10 , 0.1 ) ;
53- laminateDetail . add ( CONFIG . colorStrata . laminateDetail ! , "y" , 0 , 10 , 0.1 ) ;
54- const distortion = colorStrata . addFolder ( "distortion" ) ;
55- distortion . add ( CONFIG . colorStrata . distortion ! , "x" , 0 , 10 , 0.01 ) ;
56- distortion . add ( CONFIG . colorStrata . distortion ! , "y" , 0 , 10 , 0.01 ) ;
57- const colorFactor = colorStrata . addFolder ( "colorFactor" ) ;
58- colorFactor . add ( CONFIG . colorStrata . colorFactor ! , "x" , 0 , 10 , 0.01 ) ;
59- colorFactor . add ( CONFIG . colorStrata . colorFactor ! , "y" , 0 , 10 , 0.01 ) ;
60- colorFactor . add ( CONFIG . colorStrata . colorFactor ! , "z" , 0 , 10 , 0.01 ) ;
61- const timeStrength = colorStrata . addFolder ( "timeStrength" ) ;
62- timeStrength . add ( CONFIG . colorStrata . timeStrength ! , "x" , 0 , 2 , 0.01 ) ;
63- timeStrength . add ( CONFIG . colorStrata . timeStrength ! , "y" , 0 , 2 , 0.01 ) ;
64- const noiseStrength = colorStrata . addFolder ( "noiseStrength" ) ;
65- noiseStrength . add ( CONFIG . colorStrata . noiseStrength ! , "x" , 0 , 5 , 0.01 ) ;
66- noiseStrength . add ( CONFIG . colorStrata . noiseStrength ! , "y" , 0 , 5 , 0.01 ) ;
67- // color
68- const color = gui . addFolder ( "color" ) ;
69- color . addColor ( CONFIG . color , "color0" ) ;
70- color . addColor ( CONFIG . color , "color1" ) ;
71- color . addColor ( CONFIG . color , "color2" ) ;
72- color . addColor ( CONFIG . color , "color3" ) ;
73- } ;
74-
75- const setConfig = ( ) => {
76- return {
77- colorStrata : { ...CONFIG . colorStrata } ,
78- color : { ...CONFIG . color } ,
79- } ;
80- } ;
26+ extend ( { FxMaterial } ) ;
8127
8228export const Playground = ( ) => {
83- const updateGUI = useGUI ( setGUI ) ;
29+ const ref = useRef < FxMaterialProps > ( ) ;
8430
85- const ref = useRef < THREE . ShaderMaterial > ( null ) ;
86- const { size, dpr } = useThree ( ( state ) => {
87- return { size : state . size , dpr : state . viewport . dpr } ;
88- } ) ;
89-
90- const [ updateColorStrata ] = useColorStrata ( { size, dpr } ) ;
31+ const video = useVideoTexture ( "/gorilla.mov" ) ;
9132
9233 useFrame ( ( props ) => {
93- const colorStrata = updateColorStrata ( props , {
94- ...setConfig ( ) . colorStrata ,
95- texture : false ,
96- noise : false ,
97- } ) ;
98- ref . current ! . uniforms . u_fx . value = colorStrata ;
99- ref . current ! . uniforms . u_color0 . value = setConfig ( ) . color . color0 ;
100- ref . current ! . uniforms . u_color1 . value = setConfig ( ) . color . color1 ;
101- ref . current ! . uniforms . u_color2 . value = setConfig ( ) . color . color2 ;
102- ref . current ! . uniforms . u_color3 . value = setConfig ( ) . color . color3 ;
103- updateGUI ( ) ;
34+ ref . current ! . u_time = props . clock . getElapsedTime ( ) ;
10435 } ) ;
10536
37+ // set resolution
38+ const { size } = useThree ( ) ;
39+ useEffect ( ( ) => {
40+ ref . current ! . u_resolution = new THREE . Vector2 ( size . width , size . height ) ;
41+ } , [ size ] ) ;
42+
10643 return (
10744 < mesh >
10845 < planeGeometry args = { [ 2 , 2 ] } />
109- < shaderMaterial
46+ < fxMaterial
47+ key = { FxMaterial . key }
48+ u_texture = { video }
49+ u_keyColor = { new THREE . Color ( 0x7bf43a ) }
50+ u_textureResolution = { new THREE . Vector2 ( 1920 , 1080 ) }
11051 ref = { ref }
111- vertexShader = { `
112- varying vec2 vUv;
113- void main() {
114- vUv = uv;
115- gl_Position = vec4(position, 1.0);
116- }
117- ` }
118- fragmentShader = { `
119- precision highp float;
120- varying vec2 vUv;
121- uniform sampler2D u_fx;
122- uniform vec3 u_color0;
123- uniform vec3 u_color1;
124- uniform vec3 u_color2;
125- uniform vec3 u_color3;
126-
127- void main() {
128- vec2 uv = vUv;
129-
130- vec2 map = texture2D(u_fx, uv).rg;
131- vec2 normalizedMap = map * 2.0 - 1.0;
132-
133- uv = uv * 2.0 - 1.0;
134- uv *= mix(vec2(1.0), abs(normalizedMap), 3.0);
135- uv = (uv + 1.0) / 2.0;
136-
137- vec3 col = mix(mix(u_color0, u_color1, uv.x), mix(u_color2, u_color3, uv.x), uv.y);
138-
139- gl_FragColor = vec4(col, 1.0);
140- }
141- ` }
142- uniforms = { {
143- u_fx : { value : null } ,
144- u_color0 : { value : null } ,
145- u_color1 : { value : null } ,
146- u_color2 : { value : null } ,
147- u_color3 : { value : null } ,
148- } }
14952 />
15053 </ mesh >
15154 ) ;
0 commit comments