11import { Canvas , useFrame } from '@react-three/fiber'
2- import { useMemo , useRef } from 'react'
2+ import { useMemo , useRef , useState } from 'react'
33import * as THREE from 'three'
44
55const vertexShader = `
@@ -18,26 +18,38 @@ void main() {
1818
1919const fragmentShader = `
2020uniform float uTime;
21+ uniform vec3 uColor;
2122varying vec2 vUv;
2223
2324void main() {
24- vec3 color = 0.5 + 0.5 * cos(uTime + vUv.xyx + vec3(0.0, 2.0, 4.0));
25- gl_FragColor = vec4(color , 1.0);
25+ vec3 rainbow = 0.5 + 0.5 * cos(uTime + vUv.xyx + vec3(0.0, 2.0, 4.0));
26+ gl_FragColor = vec4(mix(rainbow, uColor, 0.6) , 1.0);
2627}
2728`
2829
2930function Plane ( ) {
3031 const material = useRef < THREE . ShaderMaterial > ( null ! )
31- const uniforms = useMemo ( ( ) => ( { uTime : { value : 0 } } ) , [ ] )
32+ const [ hovered , setHovered ] = useState ( false )
3233
3334 useFrame ( ( { clock } ) => {
3435 material . current . uniforms . uTime . value = clock . elapsedTime
3536 } )
3637
3738 return (
38- < mesh >
39+ < mesh onPointerOver = { ( ) => setHovered ( true ) } onPointerOut = { ( ) => setHovered ( false ) } >
3940 < planeGeometry args = { [ 2 , 2 , 64 , 64 ] } />
40- < shaderMaterial ref = { material } uniforms = { uniforms } vertexShader = { vertexShader } fragmentShader = { fragmentShader } />
41+ < shaderMaterial
42+ ref = { material }
43+ // The uniforms object has a stable reference so objects can be safely merged in
44+ uniforms = { {
45+ uTime : { value : 0 } ,
46+ uColor : { value : new THREE . Color ( 'hotpink' ) } ,
47+ } }
48+ // Individual uniforms can also be safely updated with pierce notation
49+ uniforms-uColor-value = { hovered ? 'royalblue' : 'hotpink' }
50+ vertexShader = { vertexShader }
51+ fragmentShader = { fragmentShader }
52+ />
4153 </ mesh >
4254 )
4355}
0 commit comments