You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.8 KiB
55 lines
1.8 KiB
import gsap from "gsap"
|
|
import { forwardRef, useEffect, useImperativeHandle, useRef } from "react"
|
|
import { sendOsc } from "../util/osc";
|
|
|
|
const FADE_TIME=3;
|
|
|
|
export const Light=forwardRef((props, ref)=>{
|
|
|
|
const refVal=useRef({val: 0});
|
|
const refInput=useRef();
|
|
const refContainer=useRef();
|
|
|
|
function fade(from, to){
|
|
|
|
const time= parseFloat(refInput.current.value) || FADE_TIME;
|
|
gsap.fromTo(refVal.current,{val: from}, {
|
|
val: to,
|
|
duration: time,
|
|
onUpdate: () => {
|
|
// console.log(refVal.current.val);
|
|
sendOsc('/light', refVal.current.val.toString());
|
|
if(refContainer.current)
|
|
refContainer.current.style.background= `rgba(0, 255, 0, ${refVal.current.val})`; // Update background color based on value
|
|
},
|
|
});
|
|
}
|
|
useImperativeHandle(ref, () => ({
|
|
fadeIn: ()=>{
|
|
console.log('fadeIn');
|
|
fade(0, 1);
|
|
},
|
|
fadeOut: ()=>{
|
|
console.log('fadeOut');
|
|
fade(1, 0);
|
|
}
|
|
}));
|
|
useEffect(()=>{
|
|
|
|
refInput.current.value=FADE_TIME;
|
|
|
|
},[]);
|
|
|
|
return (
|
|
<div ref={refContainer} className="flex flex-row gap-4 !w-auto p-1 border">
|
|
<span className="flex flex-col justify-between">
|
|
<label className="text-center">Light</label>
|
|
<input ref={refInput} type="text" className="border w-[5vw]" defaultValue={5}/>
|
|
</span>
|
|
<span className="flex flex-col justify-between">
|
|
<button onClick={()=>fade(0,1)}>fadeIn</button>
|
|
<button onClick={()=>fade(1,0)}>fadeOut</button>
|
|
</span>
|
|
</div>
|
|
)
|
|
}); |