diff --git a/README.md b/README.md index 695c8109..4c631641 100644 --- a/README.md +++ b/README.md @@ -368,7 +368,8 @@ The second argument contains the dependency array that updates the DOM. For exam ```tsx const [updateDomSyncer, setDomSyncer, domSyncerObj] = useDomSyncer( { size, dpr }, - [state] + [state], + state ); useLayoutEffect(() => { @@ -378,6 +379,8 @@ useLayoutEffect(() => { domArr.current = [...document.querySelectorAll(".item2")!]; } setDomSyncer({ + // Since DOM rendering and React updates are asynchronous, the DOM may not be retrieved correctly when the state is updated. In that case, use another logic to get the DOM perfectly before updating updateKey. + updateKey: state, dom: domArr.current, boderRadius: [...Array(domArr.current.length)].map((_, i) => i * 50.0), onIntersect: [...Array(domArr.current.length)].map((_, i) => (entry) => { @@ -419,6 +422,7 @@ type DomSyncerObject = { scene: THREE.Scene; camera: THREE.Camera; renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; /** * A function that returns a determination whether the DOM intersects or not. * The boolean will be updated after executing the onIntersect function. @@ -426,8 +430,12 @@ type DomSyncerObject = { * @param once - If set to true, it will continue to return true once crossed. */ isIntersecting: IsIntersecting; - /** Returns the target's DOMRect[] */ + /** target's DOMRect[] */ DOMRects: DOMRect[]; + /** target's intersetions boolean[] */ + intersections: boolean[]; + /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */ + useDomView: UseDomView; }; ``` @@ -443,7 +451,13 @@ type DomSyncerParams = { resolution?: THREE.Vector2[]; /** default:0.0[] */ boderRadius?: number[]; + /** the angle you want to rotate */ + rotation?: THREE.Euler[]; /** Array of callback functions when crossed */ onIntersect?: ((entry: IntersectionObserverEntry) => void)[]; + /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */ + updateKey?: Key; }; ``` + +`updateKey` : Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. diff --git a/app/domSyncer/DomSyncer.tsx b/app/domSyncer/DomSyncer.tsx index 9ef8d9a5..147504b9 100644 --- a/app/domSyncer/DomSyncer.tsx +++ b/app/domSyncer/DomSyncer.tsx @@ -47,7 +47,8 @@ export const DomSyncer = ({ state }: { state: number }) => { const [updateDomSyncer, setDomSyncer, domSyncerObj] = useDomSyncer( { size, dpr }, - [state] + [state], + state ); const { setFrameloop } = useThree(); @@ -85,6 +86,7 @@ export const DomSyncer = ({ state }: { state: number }) => { setDomSyncer({ dom: domArr.current, + updateKey: state, boderRadius: [...Array(domArr.current.length)].map((_, i) => i * 50.0), rotation: [...Array(domArr.current.length)].map( (_, i) => new THREE.Euler(0.0, 0.0, i * 0.1) diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js index b2a0e118..f993fe90 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js +++ b/packages/use-shader-fx/build/use-shader-fx.js @@ -1,5 +1,5 @@ import * as t from "three"; -import { useMemo as p, useEffect as C, useRef as w, useCallback as y, useLayoutEffect as X, useState as ue } from "react"; +import { useMemo as p, useEffect as R, useRef as y, useCallback as w, useLayoutEffect as q, useState as ue } from "react"; var se = `varying vec2 vUv; void main() { @@ -108,33 +108,33 @@ void main() { gl_FragColor = vec4(bufferColor.rgb,1.0); }`; -const I = (r, u = !1) => { - const o = u ? r.width * u : r.width, a = u ? r.height * u : r.height; +const O = (n, s = !1) => { + const o = s ? n.width * s : n.width, a = s ? n.height * s : n.height; return p( () => new t.Vector2(o, a), [o, a] ); -}, F = (r, u, o) => { +}, A = (n, s, o) => { const a = p( - () => new t.Mesh(u, o), - [u, o] + () => new t.Mesh(s, o), + [s, o] ); - return C(() => { - r.add(a); - }, [r, a]), C(() => () => { - r.remove(a), u.dispose(), o.dispose(); - }, [r, u, o, a]), a; -}, i = (r, u, o) => { - r.uniforms && r.uniforms[u] && o !== void 0 && o !== null ? r.uniforms[u].value = o : console.error( + return R(() => { + n.add(a); + }, [n, a]), R(() => () => { + n.remove(a), s.dispose(), o.dispose(); + }, [n, s, o, a]), a; +}, i = (n, s, o) => { + n.uniforms && n.uniforms[s] && o !== void 0 && o !== null ? n.uniforms[s].value = o : console.error( `Uniform key "${String( - u + s )}" does not exist in the material. or "${String( - u + s )}" is null | undefined` ); }, ce = ({ - scene: r, - size: u, + scene: n, + size: s, dpr: o }) => { const a = p(() => new t.PlaneGeometry(2, 2), []), e = p( @@ -158,17 +158,17 @@ const I = (r, u = !1) => { fragmentShader: le }), [] - ), s = I(u, o); - return C(() => { - i(e, "uAspect", s.width / s.height), i(e, "uResolution", s.clone()); - }, [s, e]), F(r, a, e), e; -}, ve = (r, u) => { - const o = u, a = r / u, [e, s] = [o * a / 2, o / 2]; - return { width: e, height: s, near: -1e3, far: 1e3 }; -}, P = (r) => { - const u = I(r), { width: o, height: a, near: e, far: s } = ve( - u.x, - u.y + ), u = O(s, o); + return R(() => { + i(e, "uAspect", u.width / u.height), i(e, "uResolution", u.clone()); + }, [u, e]), A(n, a, e), e; +}, ve = (n, s) => { + const o = s, a = n / s, [e, u] = [o * a / 2, o / 2]; + return { width: e, height: u, near: -1e3, far: 1e3 }; +}, U = (n) => { + const s = O(n), { width: o, height: a, near: e, far: u } = ve( + s.x, + s.y ); return p( () => new t.OrthographicCamera( @@ -177,32 +177,32 @@ const I = (r, u = !1) => { a, -a, e, - s + u ), - [o, a, e, s] + [o, a, e, u] ); -}, Y = () => { - const r = w(new t.Vector2(0, 0)), u = w(new t.Vector2(0, 0)), o = w(0), a = w(new t.Vector2(0, 0)), e = w(!1); - return y((c) => { - const v = performance.now(), n = c.clone(); - o.current === 0 && (o.current = v, r.current = n); +}, H = () => { + const n = y(new t.Vector2(0, 0)), s = y(new t.Vector2(0, 0)), o = y(0), a = y(new t.Vector2(0, 0)), e = y(!1); + return w((c) => { + const v = performance.now(), r = c.clone(); + o.current === 0 && (o.current = v, n.current = r); const l = Math.max(1, v - o.current); - o.current = v, a.current.copy(n).sub(r.current).divideScalar(l); - const m = a.current.length() > 0, f = e.current ? r.current.clone() : n; - return !e.current && m && (e.current = !0), r.current = n, { - currentPointer: n, - prevPointer: f, - diffPointer: u.current.subVectors(n, f), + o.current = v, a.current.copy(r).sub(n.current).divideScalar(l); + const f = a.current.length() > 0, m = e.current ? n.current.clone() : r; + return !e.current && f && (e.current = !0), n.current = r, { + currentPointer: r, + prevPointer: m, + diffPointer: s.current.subVectors(r, m), velocity: a.current, - isVelocityUpdate: m + isVelocityUpdate: f }; }, []); -}, U = (r) => { - const o = w( - ((e) => Object.values(e).some((s) => typeof s == "function"))(r) ? r : structuredClone(r) - ), a = y((e) => { - for (const s in e) { - const c = s; +}, F = (n) => { + const o = y( + ((e) => Object.values(e).some((u) => typeof u == "function"))(n) ? n : structuredClone(n) + ), a = w((e) => { + for (const u in e) { + const c = u; c in o.current && e[c] !== void 0 && e[c] !== null ? o.current[c] = e[c] : console.error( `"${String( c @@ -213,98 +213,98 @@ const I = (r, u = !1) => { } }, []); return [o.current, a]; -}, N = { +}, j = { minFilter: t.LinearFilter, magFilter: t.LinearFilter, type: t.HalfFloatType, stencilBuffer: !1 -}, q = ({ - gl: r, - fbo: u, +}, k = ({ + gl: n, + fbo: s, scene: o, camera: a, onBeforeRender: e, - onSwap: s + onSwap: u }) => { - r.setRenderTarget(u), e(), r.clear(), r.render(o, a), s && s(), r.setRenderTarget(null), r.clear(); -}, V = ({ - scene: r, - camera: u, + n.setRenderTarget(s), e(), n.clear(), n.render(o, a), u && u(), n.setRenderTarget(null), n.clear(); +}, P = ({ + scene: n, + camera: s, size: o, dpr: a = !1, isSizeUpdate: e = !1, - samples: s = 0, + samples: u = 0, depthBuffer: c = !1, depthTexture: v = !1 }) => { - const n = w(), l = I(o, a); - n.current = p( + const r = y(), l = O(o, a); + r.current = p( () => { - const f = new t.WebGLRenderTarget( + const m = new t.WebGLRenderTarget( l.x, l.y, { - ...N, - samples: s, + ...j, + samples: u, depthBuffer: c } ); - return v && (f.depthTexture = new t.DepthTexture( + return v && (m.depthTexture = new t.DepthTexture( l.x, l.y, t.FloatType - )), f; + )), m; }, // eslint-disable-next-line react-hooks/exhaustive-deps [] - ), X(() => { - var f; - e && ((f = n.current) == null || f.setSize(l.x, l.y)); - }, [l, e]), C(() => { - const f = n.current; + ), q(() => { + var m; + e && ((m = r.current) == null || m.setSize(l.x, l.y)); + }, [l, e]), R(() => { + const m = r.current; return () => { - f == null || f.dispose(); + m == null || m.dispose(); }; }, []); - const m = y( - (f, d) => { - const g = n.current; - return q({ - gl: f, + const f = w( + (m, d) => { + const g = r.current; + return k({ + gl: m, fbo: g, - scene: r, - camera: u, + scene: n, + camera: s, onBeforeRender: () => d && d({ read: g.texture }) }), g.texture; }, - [r, u] + [n, s] ); - return [n.current, m]; + return [r.current, f]; }, $ = ({ - scene: r, - camera: u, + scene: n, + camera: s, size: o, dpr: a = !1, isSizeUpdate: e = !1, - samples: s = 0, + samples: u = 0, depthBuffer: c = !1, depthTexture: v = !1 }) => { - const n = w({ + const r = y({ read: null, write: null, swap: function() { let d = this.read; this.read = this.write, this.write = d; } - }), l = I(o, a), m = p(() => { + }), l = O(o, a), f = p(() => { const d = new t.WebGLRenderTarget(l.x, l.y, { - ...N, - samples: s, + ...j, + samples: u, depthBuffer: c }), g = new t.WebGLRenderTarget(l.x, l.y, { - ...N, - samples: s, + ...j, + samples: u, depthBuffer: c }); return v && (d.depthTexture = new t.DepthTexture( @@ -317,24 +317,24 @@ const I = (r, u = !1) => { t.FloatType )), { read: d, write: g }; }, []); - n.current.read = m.read, n.current.write = m.write, X(() => { + r.current.read = f.read, r.current.write = f.write, q(() => { var d, g; - e && ((d = n.current.read) == null || d.setSize(l.x, l.y), (g = n.current.write) == null || g.setSize(l.x, l.y)); - }, [l, e]), C(() => { - const d = n.current; + e && ((d = r.current.read) == null || d.setSize(l.x, l.y), (g = r.current.write) == null || g.setSize(l.x, l.y)); + }, [l, e]), R(() => { + const d = r.current; return () => { var g, x; (g = d.read) == null || g.dispose(), (x = d.write) == null || x.dispose(); }; }, []); - const f = y( + const m = w( (d, g) => { var h; - const x = n.current; - return q({ + const x = r.current; + return k({ gl: d, - scene: r, - camera: u, + scene: n, + camera: s, fbo: x.write, onBeforeRender: () => g && g({ read: x.read.texture, @@ -343,11 +343,11 @@ const I = (r, u = !1) => { onSwap: () => x.swap() }), (h = x.read) == null ? void 0 : h.texture; }, - [r, u] + [n, s] ); return [ - { read: n.current.read, write: n.current.write }, - f + { read: r.current.read, write: r.current.write }, + m ]; }, de = { texture: new t.Texture(), @@ -358,34 +358,34 @@ const I = (r, u = !1) => { motionSample: 5, color: new t.Color(16777215) }, Ct = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = ce({ scene: a, size: r, dpr: u }), s = P(r), c = Y(), [v, n] = $({ + const a = p(() => new t.Scene(), []), e = ce({ scene: a, size: n, dpr: s }), u = U(n), c = H(), [v, r] = $({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [l, m] = U(de); + }), [l, f] = F(de); return [ - y( + w( (d, g) => { const { gl: x, pointer: h } = d; - g && m(g), i(e, "uTexture", l.texture), i(e, "uRadius", l.radius), i(e, "uSmudge", l.smudge), i(e, "uDissipation", l.dissipation), i(e, "uMotionBlur", l.motionBlur), i(e, "uMotionSample", l.motionSample), i(e, "uColor", l.color); - const { currentPointer: S, prevPointer: _, velocity: M } = c(h); - return i(e, "uMouse", S), i(e, "uPrevMouse", _), i(e, "uVelocity", M), n(x, ({ read: R }) => { - i(e, "uMap", R); + g && f(g), i(e, "uTexture", l.texture), i(e, "uRadius", l.radius), i(e, "uSmudge", l.smudge), i(e, "uDissipation", l.dissipation), i(e, "uMotionBlur", l.motionBlur), i(e, "uMotionSample", l.motionSample), i(e, "uColor", l.color); + const { currentPointer: T, prevPointer: b, velocity: _ } = c(h); + return i(e, "uMouse", T), i(e, "uPrevMouse", b), i(e, "uVelocity", _), r(x, ({ read: C }) => { + i(e, "uMap", C); }); }, - [e, c, n, l, m] + [e, c, r, l, f] ), - m, + f, { scene: a, material: e, - camera: s, + camera: u, renderTarget: v, output: v.read.texture } @@ -411,8 +411,8 @@ void main() { vec3 duotone = mix(uColor0, uColor1, grayscale); gl_FragColor = vec4(duotone, texColor.a); }`; -const pe = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const pe = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -424,36 +424,36 @@ const pe = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, ge = { texture: new t.Texture(), color0: new t.Color(16777215), color1: new t.Color(0) }, Rt = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = pe(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = pe(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [n, l] = U(ge); + }), [r, l] = F(ge); return [ - y( - (f, d) => { - const { gl: g } = f; - return d && l(d), i(e, "uTexture", n.texture), i(e, "uColor0", n.color0), i(e, "uColor1", n.color1), v(g); + w( + (m, d) => { + const { gl: g } = m; + return d && l(d), i(e, "uTexture", r.texture), i(e, "uColor0", r.color0), i(e, "uColor1", r.color1), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } @@ -505,8 +505,8 @@ void main() { gl_FragColor = vec4(alphColor, alpha); }`; -const ye = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const ye = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -525,7 +525,7 @@ const ye = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, we = { texture: new t.Texture(), map: new t.Texture(), @@ -536,36 +536,36 @@ const ye = (r) => { max: 1, dodgeColor: !1 }, Vt = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = ye(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = ye(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [n, l] = U(we); + }), [r, l] = F(we); return [ - y( - (f, d) => { - const { gl: g } = f; - return d && l(d), i(e, "u_texture", n.texture), i(e, "u_map", n.map), i(e, "u_mapIntensity", n.mapIntensity), n.alphaMap ? (i(e, "u_alphaMap", n.alphaMap), i(e, "u_isAlphaMap", !0)) : i(e, "u_isAlphaMap", !1), i(e, "u_brightness", n.brightness), i(e, "u_min", n.min), i(e, "u_max", n.max), n.dodgeColor ? (i(e, "u_dodgeColor", n.dodgeColor), i(e, "u_isDodgeColor", !0)) : i(e, "u_isDodgeColor", !1), v(g); + w( + (m, d) => { + const { gl: g } = m; + return d && l(d), i(e, "u_texture", r.texture), i(e, "u_map", r.map), i(e, "u_mapIntensity", r.mapIntensity), r.alphaMap ? (i(e, "u_alphaMap", r.alphaMap), i(e, "u_isAlphaMap", !0)) : i(e, "u_isAlphaMap", !1), i(e, "u_brightness", r.brightness), i(e, "u_min", r.min), i(e, "u_max", r.max), r.dodgeColor ? (i(e, "u_dodgeColor", r.dodgeColor), i(e, "u_isDodgeColor", !0)) : i(e, "u_isDodgeColor", !1), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } ]; }; -var B = `varying vec2 vUv; +var I = `varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -586,7 +586,7 @@ void main(){ }`; const Se = () => p( () => new t.ShaderMaterial({ - vertexShader: B, + vertexShader: I, fragmentShader: Te, depthTest: !1, depthWrite: !1 @@ -616,7 +616,7 @@ const Me = () => p( dt: { value: 0 }, dissipation: { value: 0 } }, - vertexShader: B, + vertexShader: I, fragmentShader: _e }), [] @@ -653,7 +653,7 @@ const be = () => p( uVelocity: { value: null }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: De }), [] @@ -690,7 +690,7 @@ const Re = () => p( uDivergence: { value: null }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: Ce }), [] @@ -718,7 +718,7 @@ const Pe = () => p( uVelocity: { value: null }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: Ve }), [] @@ -751,7 +751,7 @@ const Fe = () => p( dt: { value: 0 }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: Ue }), [] @@ -772,7 +772,7 @@ const Be = () => p( value: { value: 0 }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: Ae }), [] @@ -808,7 +808,7 @@ const Oe = () => p( uVelocity: { value: new t.Texture() }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: Ie }), [] @@ -840,64 +840,64 @@ const ze = () => p( radius: { value: 0 }, texelSize: { value: new t.Vector2() } }, - vertexShader: B, + vertexShader: I, fragmentShader: Le }), [] ), Ee = ({ - scene: r, - size: u, + scene: n, + size: s, dpr: o }) => { - const a = p(() => new t.PlaneGeometry(2, 2), []), e = Se(), s = e.clone(), c = Pe(), v = Fe(), n = Me(), l = be(), m = Re(), f = Be(), d = Oe(), g = ze(), x = p( + const a = p(() => new t.PlaneGeometry(2, 2), []), e = Se(), u = e.clone(), c = Pe(), v = Fe(), r = Me(), l = be(), f = Re(), m = Be(), d = Oe(), g = ze(), x = p( () => ({ vorticityMaterial: v, curlMaterial: c, - advectionMaterial: n, + advectionMaterial: r, divergenceMaterial: l, - pressureMaterial: m, - clearMaterial: f, + pressureMaterial: f, + clearMaterial: m, gradientSubtractMaterial: d, splatMaterial: g }), [ v, c, - n, + r, l, - m, f, + m, d, g ] - ), h = I(u, o); - C(() => { + ), h = O(s, o); + R(() => { i( x.splatMaterial, "aspectRatio", h.x / h.y ); - for (const M of Object.values(x)) + for (const _ of Object.values(x)) i( - M, + _, "texelSize", new t.Vector2(1 / h.x, 1 / h.y) ); }, [h, x]); - const S = F(r, a, e); - C(() => { - e.dispose(), S.material = s; - }, [e, S, s]), C(() => () => { - for (const M of Object.values(x)) - M.dispose(); + const T = A(n, a, e); + R(() => { + e.dispose(), T.material = u; + }, [e, T, u]), R(() => () => { + for (const _ of Object.values(x)) + _.dispose(); }, [x]); - const _ = y( - (M) => { - S.material = M, S.material.needsUpdate = !0; + const b = w( + (_) => { + T.material = _, T.material.needsUpdate = !0; }, - [S] + [T] ); - return [x, _]; + return [x, b]; }, $e = { density_dissipation: 0.98, velocity_dissipation: 0.99, @@ -908,126 +908,126 @@ const ze = () => p( splat_radius: 2e-3, fluid_color: new t.Vector3(1, 1, 1) }, Pt = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), [e, s] = Ee({ scene: a, size: r, dpr: u }), c = P(r), v = Y(), n = p( + const a = p(() => new t.Scene(), []), [e, u] = Ee({ scene: a, size: n, dpr: s }), c = U(n), v = H(), r = p( () => ({ scene: a, camera: c, - size: r, + size: n, samples: o }), - [a, c, r, o] - ), [l, m] = $(n), [f, d] = $(n), [g, x] = V(n), [h, S] = V(n), [_, M] = $(n), R = w(0), E = w(new t.Vector2(0, 0)), O = w(new t.Vector3(0, 0, 0)), [b, T] = U($e); + [a, c, n, o] + ), [l, f] = $(r), [m, d] = $(r), [g, x] = P(r), [h, T] = P(r), [b, _] = $(r), C = y(0), B = y(new t.Vector2(0, 0)), L = y(new t.Vector3(0, 0, 0)), [D, S] = F($e); return [ - y( - (J, H) => { - const { gl: A, pointer: Q, clock: G, size: k } = J; - H && T(H), R.current === 0 && (R.current = G.getElapsedTime()); - const K = Math.min( - (G.getElapsedTime() - R.current) / 3, + w( + (N, G) => { + const { gl: V, pointer: Q, clock: W, size: K } = N; + G && S(G), C.current === 0 && (C.current = W.getElapsedTime()); + const Z = Math.min( + (W.getElapsedTime() - C.current) / 3, 0.02 ); - R.current = G.getElapsedTime(); - const j = m(A, ({ read: D }) => { - s(e.advectionMaterial), i(e.advectionMaterial, "uVelocity", D), i(e.advectionMaterial, "uSource", D), i(e.advectionMaterial, "dt", K), i( + C.current = W.getElapsedTime(); + const X = f(V, ({ read: M }) => { + u(e.advectionMaterial), i(e.advectionMaterial, "uVelocity", M), i(e.advectionMaterial, "uSource", M), i(e.advectionMaterial, "dt", Z), i( e.advectionMaterial, "dissipation", - b.velocity_dissipation + D.velocity_dissipation ); - }), ee = d(A, ({ read: D }) => { - s(e.advectionMaterial), i(e.advectionMaterial, "uVelocity", j), i(e.advectionMaterial, "uSource", D), i( + }), ee = d(V, ({ read: M }) => { + u(e.advectionMaterial), i(e.advectionMaterial, "uVelocity", X), i(e.advectionMaterial, "uSource", M), i( e.advectionMaterial, "dissipation", - b.density_dissipation + D.density_dissipation ); }), { currentPointer: te, diffPointer: ne, isVelocityUpdate: re, velocity: oe } = v(Q); - re && (m(A, ({ read: D }) => { - s(e.splatMaterial), i(e.splatMaterial, "uTarget", D), i(e.splatMaterial, "point", te); + re && (f(V, ({ read: M }) => { + u(e.splatMaterial), i(e.splatMaterial, "uTarget", M), i(e.splatMaterial, "point", te); const z = ne.multiply( - E.current.set(k.width, k.height).multiplyScalar(b.velocity_acceleration) + B.current.set(K.width, K.height).multiplyScalar(D.velocity_acceleration) ); i( e.splatMaterial, "color", - O.current.set(z.x, z.y, 1) + L.current.set(z.x, z.y, 1) ), i( e.splatMaterial, "radius", - b.splat_radius + D.splat_radius ); - }), d(A, ({ read: D }) => { - s(e.splatMaterial), i(e.splatMaterial, "uTarget", D); - const z = typeof b.fluid_color == "function" ? b.fluid_color(oe) : b.fluid_color; + }), d(V, ({ read: M }) => { + u(e.splatMaterial), i(e.splatMaterial, "uTarget", M); + const z = typeof D.fluid_color == "function" ? D.fluid_color(oe) : D.fluid_color; i(e.splatMaterial, "color", z); })); - const ae = x(A, () => { - s(e.curlMaterial), i(e.curlMaterial, "uVelocity", j); + const ae = x(V, () => { + u(e.curlMaterial), i(e.curlMaterial, "uVelocity", X); }); - m(A, ({ read: D }) => { - s(e.vorticityMaterial), i(e.vorticityMaterial, "uVelocity", D), i(e.vorticityMaterial, "uCurl", ae), i( + f(V, ({ read: M }) => { + u(e.vorticityMaterial), i(e.vorticityMaterial, "uVelocity", M), i(e.vorticityMaterial, "uCurl", ae), i( e.vorticityMaterial, "curl", - b.curl_strength - ), i(e.vorticityMaterial, "dt", K); + D.curl_strength + ), i(e.vorticityMaterial, "dt", Z); }); - const ie = S(A, () => { - s(e.divergenceMaterial), i(e.divergenceMaterial, "uVelocity", j); + const ie = T(V, () => { + u(e.divergenceMaterial), i(e.divergenceMaterial, "uVelocity", X); }); - M(A, ({ read: D }) => { - s(e.clearMaterial), i(e.clearMaterial, "uTexture", D), i( + _(V, ({ read: M }) => { + u(e.clearMaterial), i(e.clearMaterial, "uTexture", M), i( e.clearMaterial, "value", - b.pressure_dissipation + D.pressure_dissipation ); - }), s(e.pressureMaterial), i(e.pressureMaterial, "uDivergence", ie); - let Z; - for (let D = 0; D < b.pressure_iterations; D++) - Z = M(A, ({ read: z }) => { + }), u(e.pressureMaterial), i(e.pressureMaterial, "uDivergence", ie); + let J; + for (let M = 0; M < D.pressure_iterations; M++) + J = _(V, ({ read: z }) => { i(e.pressureMaterial, "uPressure", z); }); - return m(A, ({ read: D }) => { - s(e.gradientSubtractMaterial), i( + return f(V, ({ read: M }) => { + u(e.gradientSubtractMaterial), i( e.gradientSubtractMaterial, "uPressure", - Z - ), i(e.gradientSubtractMaterial, "uVelocity", D); + J + ), i(e.gradientSubtractMaterial, "uVelocity", M); }), ee; }, [ e, - s, + u, x, d, - S, - v, - M, - m, T, - b + v, + _, + f, + S, + D ] ), - T, + S, { scene: a, materials: e, camera: c, renderTarget: { velocity: l, - density: f, + density: m, curl: g, divergence: h, - pressure: _ + pressure: b }, - output: f.read.texture + output: m.read.texture } ]; -}, Ne = ({ scale: r, max: u, texture: o, scene: a }) => { - const e = w([]), s = p( - () => new t.PlaneGeometry(r, r), - [r] +}, Ne = ({ scale: n, max: s, texture: o, scene: a }) => { + const e = y([]), u = p( + () => new t.PlaneGeometry(n, n), + [n] ), c = p( () => new t.MeshBasicMaterial({ map: o ?? null, @@ -1038,14 +1038,14 @@ const ze = () => p( }), [o] ); - return C(() => { - for (let v = 0; v < u; v++) { - const n = new t.Mesh(s.clone(), c.clone()); - n.rotateZ(2 * Math.PI * Math.random()), n.visible = !1, a.add(n), e.current.push(n); + return R(() => { + for (let v = 0; v < s; v++) { + const r = new t.Mesh(u.clone(), c.clone()); + r.rotateZ(2 * Math.PI * Math.random()), r.visible = !1, a.add(r), e.current.push(r); } - }, [s, c, a, u]), C(() => () => { + }, [u, c, a, s]), R(() => () => { e.current.forEach((v) => { - v.geometry.dispose(), Array.isArray(v.material) ? v.material.forEach((n) => n.dispose()) : v.material.dispose(), a.remove(v); + v.geometry.dispose(), Array.isArray(v.material) ? v.material.forEach((r) => r.dispose()) : v.material.dispose(), a.remove(v); }), e.current = []; }, [a]), e.current; }, Ge = { @@ -1055,55 +1055,55 @@ const ze = () => p( scale: 0.3, alpha: 0.6 }, Ut = ({ - texture: r, - scale: u = 64, + texture: n, + scale: s = 64, max: o = 100, size: a, dpr: e, - samples: s = 0 + samples: u = 0 }) => { const c = p(() => new t.Scene(), []), v = Ne({ - scale: u, + scale: s, max: o, - texture: r, + texture: n, scene: c - }), n = P(a), l = Y(), [m, f] = V({ + }), r = U(a), l = H(), [f, m] = P({ scene: c, - camera: n, + camera: r, size: a, dpr: e, - samples: s - }), [d, g] = U(Ge), x = w(0); + samples: u + }), [d, g] = F(Ge), x = y(0); return [ - y( - (S, _) => { - const { gl: M, pointer: R, size: E } = S; - _ && g(_); - const { currentPointer: O, diffPointer: b } = l(R); - if (d.frequency < b.length()) { - const T = v[x.current]; - T.visible = !0, T.position.set( - O.x * (E.width / 2), - O.y * (E.height / 2), + w( + (T, b) => { + const { gl: _, pointer: C, size: B } = T; + b && g(b); + const { currentPointer: L, diffPointer: D } = l(C); + if (d.frequency < D.length()) { + const S = v[x.current]; + S.visible = !0, S.position.set( + L.x * (B.width / 2), + L.y * (B.height / 2), 0 - ), T.scale.x = T.scale.y = 0, T.material.opacity = d.alpha, x.current = (x.current + 1) % o; + ), S.scale.x = S.scale.y = 0, S.material.opacity = d.alpha, x.current = (x.current + 1) % o; } - return v.forEach((T) => { - if (T.visible) { - const L = T.material; - T.rotation.z += d.rotation, L.opacity *= d.fadeout_speed, T.scale.x = d.fadeout_speed * T.scale.x + d.scale, T.scale.y = T.scale.x, L.opacity < 2e-3 && (T.visible = !1); + return v.forEach((S) => { + if (S.visible) { + const E = S.material; + S.rotation.z += d.rotation, E.opacity *= d.fadeout_speed, S.scale.x = d.fadeout_speed * S.scale.x + d.scale, S.scale.y = S.scale.x, E.opacity < 2e-3 && (S.visible = !1); } - }), f(M); + }), m(_); }, - [f, v, l, o, d, g] + [m, v, l, o, d, g] ), g, { scene: c, - camera: n, + camera: r, meshArr: v, - renderTarget: m, - output: m.texture + renderTarget: f, + output: f.texture } ]; }; @@ -1180,8 +1180,8 @@ void main() { }`; const Xe = ({ - scene: r, - size: u, + scene: n, + size: s, dpr: o }) => { const a = p(() => new t.PlaneGeometry(2, 2), []), e = p( @@ -1204,10 +1204,10 @@ const Xe = ({ fragmentShader: We }), [] - ), s = I(u, o); - return C(() => { - e.uniforms.uResolution.value = s.clone(); - }, [s, e]), F(r, a, e), e; + ), u = O(s, o); + return R(() => { + e.uniforms.uResolution.value = u.clone(); + }, [u, e]), A(n, a, e), e; }, Ye = { texture0: new t.Texture(), texture1: new t.Texture(), @@ -1220,31 +1220,31 @@ const Xe = ({ progress: 0, dir: new t.Vector2(0, 0) }, Ft = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = Xe({ scene: a, size: r, dpr: u }), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = Xe({ scene: a, size: n, dpr: s }), u = U(n), [c, v] = P({ scene: a, - camera: s, - dpr: u, - size: r, + camera: u, + dpr: s, + size: n, samples: o, isSizeUpdate: !0 - }), [n, l] = U(Ye); + }), [r, l] = F(Ye); return [ - y( - (f, d) => { - const { gl: g } = f; - return d && l(d), i(e, "uTexture0", n.texture0), i(e, "uTexture1", n.texture1), i(e, "uTextureResolution", n.textureResolution), i(e, "padding", n.padding), i(e, "uMap", n.map), i(e, "mapIntensity", n.mapIntensity), i(e, "edgeIntensity", n.edgeIntensity), i(e, "epicenter", n.epicenter), i(e, "progress", n.progress), i(e, "dirX", n.dir.x), i(e, "dirY", n.dir.y), v(g); + w( + (m, d) => { + const { gl: g } = m; + return d && l(d), i(e, "uTexture0", r.texture0), i(e, "uTexture1", r.texture1), i(e, "uTextureResolution", r.textureResolution), i(e, "padding", r.padding), i(e, "uMap", r.map), i(e, "mapIntensity", r.mapIntensity), i(e, "edgeIntensity", r.edgeIntensity), i(e, "epicenter", r.epicenter), i(e, "progress", r.progress), i(e, "dirX", r.dir.x), i(e, "dirY", r.dir.y), v(g); }, - [v, e, n, l] + [v, e, r, l] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } @@ -1329,8 +1329,8 @@ void main() { float noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength); gl_FragColor = vec4(vec3(noise),1.0); }`; -const ke = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const ke = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { uTime: { value: 0 }, @@ -1347,7 +1347,7 @@ const ke = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, Ke = { scale: 4e-3, timeStrength: 0.3, @@ -1357,38 +1357,38 @@ const ke = (r) => { warpDirection: new t.Vector2(2, 2), warpStrength: 8 }, At = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = ke(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = ke(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [n, l] = U(Ke); + }), [r, l] = F(Ke); return [ - y( - (f, d) => { - const { gl: g, clock: x } = f; - return d && l(d), i(e, "scale", n.scale), i(e, "timeStrength", n.timeStrength), i(e, "noiseOctaves", n.noiseOctaves), i(e, "fbmOctaves", n.fbmOctaves), i(e, "warpOctaves", n.warpOctaves), i(e, "warpDirection", n.warpDirection), i(e, "warpStrength", n.warpStrength), i(e, "uTime", x.getElapsedTime()), v(g); + w( + (m, d) => { + const { gl: g, clock: x } = m; + return d && l(d), i(e, "scale", r.scale), i(e, "timeStrength", r.timeStrength), i(e, "noiseOctaves", r.noiseOctaves), i(e, "fbmOctaves", r.fbmOctaves), i(e, "warpOctaves", r.warpOctaves), i(e, "warpDirection", r.warpDirection), i(e, "warpStrength", r.warpStrength), i(e, "uTime", x.getElapsedTime()), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } ]; -}, W = process.env.NODE_ENV === "development", Ze = (r) => { - var e, s, c; - const u = (e = r.dom) == null ? void 0 : e.length, o = (s = r.texture) == null ? void 0 : s.length, a = (c = r.resolution) == null ? void 0 : c.length; - return !u || !o || !a ? (W && console.warn("No dom or texture or resolution is set"), !1) : u !== o || u !== a ? (W && console.warn("not Match dom , texture and resolution length"), !1) : !0; +}, Y = process.env.NODE_ENV === "development", Ze = (n) => { + var e, u, c; + const s = (e = n.dom) == null ? void 0 : e.length, o = (u = n.texture) == null ? void 0 : u.length, a = (c = n.resolution) == null ? void 0 : c.length; + return !s || !o || !a ? (Y && console.warn("No dom or texture or resolution is set"), !1) : s !== o || s !== a ? (Y && console.warn("not Match dom , texture and resolution length"), !1) : !0; }; var Je = `varying vec2 vUv; @@ -1440,14 +1440,14 @@ void main() { gl_FragColor = vec4(textureColor, alpha); }`; const et = ({ - params: r, - size: u, + params: n, + size: s, scene: o }) => { o.children.length > 0 && (o.children.forEach((a) => { a instanceof t.Mesh && (a.geometry.dispose(), a.material.dispose()); - }), o.remove(...o.children)), r.texture.forEach((a, e) => { - const s = new t.Mesh( + }), o.remove(...o.children)), n.texture.forEach((a, e) => { + const u = new t.Mesh( new t.PlaneGeometry(1, 1), new t.ShaderMaterial({ vertexShader: Je, @@ -1458,96 +1458,96 @@ const et = ({ u_textureResolution: { value: new t.Vector2(0, 0) }, u_resolution: { value: new t.Vector2(0, 0) }, u_borderRadius: { - value: r.boderRadius[e] ? r.boderRadius[e] : 0 + value: n.boderRadius[e] ? n.boderRadius[e] : 0 } } }) ); - o.add(s); + o.add(u); }); }, tt = () => { - const r = w([]), u = w([]); - return y( + const n = y([]), s = y([]); + return w( ({ isIntersectingRef: a, isIntersectingOnceRef: e, - params: s + params: u }) => { - r.current.length > 0 && r.current.forEach((v, n) => { - v.unobserve(u.current[n]); - }), u.current = [], r.current = []; - const c = new Array(s.dom.length).fill(!1); - a.current = [...c], e.current = [...c], s.dom.forEach((v, n) => { - const l = (f) => { - f.forEach((d) => { - s.onIntersect[n] && s.onIntersect[n](d), a.current[n] = d.isIntersecting; + n.current.length > 0 && n.current.forEach((v, r) => { + v.unobserve(s.current[r]); + }), s.current = [], n.current = []; + const c = new Array(u.dom.length).fill(!1); + a.current = [...c], e.current = [...c], u.dom.forEach((v, r) => { + const l = (m) => { + m.forEach((d) => { + u.onIntersect[r] && u.onIntersect[r](d), a.current[r] = d.isIntersecting; }); - }, m = new IntersectionObserver(l, { + }, f = new IntersectionObserver(l, { rootMargin: "0px", threshold: 0 }); - m.observe(v), r.current.push(m), u.current.push(v); + f.observe(v), n.current.push(f), s.current.push(v); }); }, [] ); }, nt = () => { - const r = w([]), u = y( - ({ params: o, size: a, resolutionRef: e, scene: s, isIntersectingRef: c }) => { - s.children.length !== r.current.length && (r.current = new Array(s.children.length)), s.children.forEach((v, n) => { - const l = o.dom[n]; + const n = y([]), s = w( + ({ params: o, size: a, resolutionRef: e, scene: u, isIntersectingRef: c }) => { + u.children.length !== n.current.length && (n.current = new Array(u.children.length)), u.children.forEach((v, r) => { + const l = o.dom[r]; if (!l) { - W && console.warn("DOM is null."); + Y && console.warn("DOM is null."); return; } - const m = l.getBoundingClientRect(); - if (r.current[n] = m, v.scale.set(m.width, m.height, 1), v.position.set( - m.left + m.width * 0.5 - a.width * 0.5, - -m.top - m.height * 0.5 + a.height * 0.5, + const f = l.getBoundingClientRect(); + if (n.current[r] = f, v.scale.set(f.width, f.height, 1), v.position.set( + f.left + f.width * 0.5 - a.width * 0.5, + -f.top - f.height * 0.5 + a.height * 0.5, 0 - ), c.current[n] && (o.rotation[n] && v.rotation.copy(o.rotation[n]), v instanceof t.Mesh)) { - const f = v.material; - i(f, "u_texture", o.texture[n]), i( - f, + ), c.current[r] && (o.rotation[r] && v.rotation.copy(o.rotation[r]), v instanceof t.Mesh)) { + const m = v.material; + i(m, "u_texture", o.texture[r]), i( + m, "u_textureResolution", - o.resolution[n] + o.resolution[r] ), i( - f, + m, "u_resolution", - e.current.set(m.width, m.height) + e.current.set(f.width, f.height) ), i( - f, + m, "u_borderRadius", - o.boderRadius[n] ? o.boderRadius[n] : 0 + o.boderRadius[r] ? o.boderRadius[r] : 0 ); } }); }, [] ); - return [r.current, u]; + return [n.current, s]; }, rt = () => { - const r = w([]), u = w([]), o = y((a, e = !1) => { - r.current.forEach((c, v) => { - c && (u.current[v] = !0); + const n = y([]), s = y([]), o = w((a, e = !1) => { + n.current.forEach((c, v) => { + c && (s.current[v] = !0); }); - const s = e ? [...u.current] : [...r.current]; - return a < 0 ? s : s[a]; + const u = e ? [...s.current] : [...n.current]; + return a < 0 ? u : u[a]; }, []); return { - isIntersectingRef: r, - isIntersectingOnceRef: u, + isIntersectingRef: n, + isIntersectingOnceRef: s, isIntersecting: o }; -}, ot = (r) => ({ onView: o, onHidden: a }) => { - const e = w(!1); - C(() => { - let s; +}, ot = (n) => ({ onView: o, onHidden: a }) => { + const e = y(!1); + R(() => { + let u; const c = () => { - r.current.some((v) => v) ? e.current || (o && o(), e.current = !0) : e.current && (a && a(), e.current = !1), s = requestAnimationFrame(c); + n.current.some((v) => v) ? e.current || (o && o(), e.current = !0) : e.current && (a && a(), e.current = !1), u = requestAnimationFrame(c); }; - return s = requestAnimationFrame(c), () => { - cancelAnimationFrame(s); + return u = requestAnimationFrame(c), () => { + cancelAnimationFrame(u); }; }, [o, a]); }, at = { @@ -1557,61 +1557,70 @@ const et = ({ boderRadius: [], rotation: [], onIntersect: [] -}, Bt = ({ size: r, dpr: u, samples: o = 0 }, a = []) => { - const e = p(() => new t.Scene(), []), s = P(r), [c, v] = V({ - scene: e, - camera: s, - size: r, - dpr: u, +}, Bt = ({ size: n, dpr: s, samples: o = 0 }, a = [], e) => { + const u = p(() => new t.Scene(), []), c = U(n), [v, r] = P({ + scene: u, + camera: c, + size: n, + dpr: s, samples: o, isSizeUpdate: !0 - }), [n, l] = U(at), [m, f] = nt(), d = w(new t.Vector2(0, 0)), [g, x] = ue(!0); - C(() => { - x(!0); + }), [l, f] = F({ + ...at, + updateKey: e + }), [m, d] = nt(), g = y(new t.Vector2(0, 0)), [x, h] = ue(!0); + R(() => { + h(!0); }, a); - const h = tt(), { isIntersectingOnceRef: S, isIntersectingRef: _, isIntersecting: M } = rt(), R = ot(_); + const T = y(null), b = p(() => new t.Texture(), []), _ = tt(), { isIntersectingOnceRef: C, isIntersectingRef: B, isIntersecting: L } = rt(), D = ot(B); return [ - y( - (O, b) => { - const { gl: T, size: L } = O; - return b && l(b), Ze(n) && (g && (et({ - params: n, - size: L, - scene: e - }), h({ - isIntersectingRef: _, - isIntersectingOnceRef: S, - params: n - }), x(!1)), f({ - params: n, - size: L, - resolutionRef: d, - scene: e, - isIntersectingRef: _ - })), v(T); + w( + (E, N) => { + const { gl: G, size: V } = E; + if (N && f(N), x) { + if (T.current === l.updateKey) + return b; + T.current = l.updateKey; + } + return Ze(l) && (x && (et({ + params: l, + size: V, + scene: u + }), _({ + isIntersectingRef: B, + isIntersectingOnceRef: C, + params: l + }), h(!1)), d({ + params: l, + size: V, + resolutionRef: g, + scene: u, + isIntersectingRef: B + })), r(G); }, [ - v, - l, - h, + r, f, - g, - e, - n, - S, - _ + _, + d, + x, + u, + l, + C, + B, + b ] ), - l, + f, { - scene: e, - camera: s, - renderTarget: c, - output: c.texture, - isIntersecting: M, + scene: u, + camera: c, + renderTarget: v, + output: v.texture, + isIntersecting: L, DOMRects: m, - intersections: _.current, - useDomView: R + intersections: B.current, + useDomView: D } ]; }; @@ -1648,8 +1657,8 @@ void main() { gl_FragColor = outColor; }`; -const st = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const st = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1661,47 +1670,47 @@ const st = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, lt = { texture: new t.Texture(), blurSize: 3, blurPower: 5 }, It = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = st(a), s = P(r), c = p( + const a = p(() => new t.Scene(), []), e = st(a), u = U(n), c = p( () => ({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o }), - [a, s, r, u, o] - ), [v, n] = V(c), [l, m] = $(c), [f, d] = U(lt); + [a, u, n, s, o] + ), [v, r] = P(c), [l, f] = $(c), [m, d] = F(lt); return [ - y( + w( (x, h) => { - const { gl: S } = x; - h && d(h), i(e, "uTexture", f.texture), i(e, "uResolution", [ - f.texture.source.data.width, - f.texture.source.data.height - ]), i(e, "uBlurSize", f.blurSize); - let _ = m(S); - const M = f.blurPower; - for (let R = 0; R < M; R++) - i(e, "uTexture", _), _ = m(S); - return n(S); + const { gl: T } = x; + h && d(h), i(e, "uTexture", m.texture), i(e, "uResolution", [ + m.texture.source.data.width, + m.texture.source.data.height + ]), i(e, "uBlurSize", m.blurSize); + let b = f(T); + const _ = m.blurPower; + for (let C = 0; C < _; C++) + i(e, "uTexture", b), b = f(T); + return r(T); }, - [n, m, e, d, f] + [r, f, e, d, m] ), d, { scene: a, material: e, - camera: s, + camera: u, renderTarget: v, output: v.texture } @@ -1762,8 +1771,8 @@ void main() { gl_FragColor = vec4(color, 1.0); }`; -const dt = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const dt = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { uEpicenter: { value: new t.Vector2(0, 0) }, @@ -1777,7 +1786,7 @@ const dt = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, ft = { epicenter: new t.Vector2(0, 0), progress: 0, @@ -1785,35 +1794,35 @@ const dt = (r) => { strength: 0, mode: "center" }, Ot = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = dt(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = dt(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o, isSizeUpdate: !0 - }), [n, l] = U(ft); + }), [r, l] = F(ft); return [ - y( - (f, d) => { - const { gl: g } = f; - return d && l(d), i(e, "uEpicenter", n.epicenter), i(e, "uProgress", n.progress), i(e, "uWidth", n.width), i(e, "uStrength", n.strength), i( + w( + (m, d) => { + const { gl: g } = m; + return d && l(d), i(e, "uEpicenter", r.epicenter), i(e, "uProgress", r.progress), i(e, "uWidth", r.width), i(e, "uStrength", r.strength), i( e, "uMode", - n.mode === "center" ? 0 : n.mode === "horizontal" ? 1 : 2 + r.mode === "center" ? 0 : r.mode === "horizontal" ? 1 : 2 ), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } @@ -1839,8 +1848,8 @@ void main() { float alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0); gl_FragColor = vec4(color, alpha); }`; -const gt = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const gt = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -1853,39 +1862,39 @@ const gt = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, xt = { texture: new t.Texture(), brightness: new t.Vector3(0.5, 0.5, 0.5), min: 0, max: 1 }, Lt = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = gt(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = gt(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [n, l] = U( + }), [r, l] = F( xt ); return [ - y( - (f, d) => { - const { gl: g } = f; - return d && l(d), i(e, "u_texture", n.texture), i(e, "u_brightness", n.brightness), i(e, "u_min", n.min), i(e, "u_max", n.max), v(g); + w( + (m, d) => { + const { gl: g } = m; + return d && l(d), i(e, "u_texture", r.texture), i(e, "u_brightness", r.brightness), i(e, "u_min", r.min), i(e, "u_max", r.max), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } @@ -1939,8 +1948,8 @@ void main() { gl_FragColor = vec4(col, alpha); }`; -const wt = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const wt = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1962,7 +1971,7 @@ const wt = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, Tt = { texture: !1, scale: 1, @@ -1975,30 +1984,30 @@ const wt = (r) => { noise: !1, noiseStrength: new t.Vector2(0, 0) }, zt = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = wt(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = wt(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [n, l] = U(Tt); + }), [r, l] = F(Tt); return [ - y( - (f, d) => { - const { gl: g, clock: x } = f; - return d && l(d), n.texture ? (i(e, "uTexture", n.texture), i(e, "isTexture", !0)) : (i(e, "isTexture", !1), i(e, "scale", n.scale)), n.noise ? (i(e, "noise", n.noise), i(e, "isNoise", !0), i(e, "noiseStrength", n.noiseStrength)) : i(e, "isNoise", !1), i(e, "uTime", x.getElapsedTime()), i(e, "laminateLayer", n.laminateLayer), i(e, "laminateInterval", n.laminateInterval), i(e, "laminateDetail", n.laminateDetail), i(e, "distortion", n.distortion), i(e, "colorFactor", n.colorFactor), i(e, "timeStrength", n.timeStrength), v(g); + w( + (m, d) => { + const { gl: g, clock: x } = m; + return d && l(d), r.texture ? (i(e, "uTexture", r.texture), i(e, "isTexture", !0)) : (i(e, "isTexture", !1), i(e, "scale", r.scale)), r.noise ? (i(e, "noise", r.noise), i(e, "isNoise", !0), i(e, "noiseStrength", r.noiseStrength)) : i(e, "isNoise", !1), i(e, "uTime", x.getElapsedTime()), i(e, "laminateLayer", r.laminateLayer), i(e, "laminateInterval", r.laminateInterval), i(e, "laminateDetail", r.laminateDetail), i(e, "distortion", r.distortion), i(e, "colorFactor", r.colorFactor), i(e, "timeStrength", r.timeStrength), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } @@ -2028,8 +2037,8 @@ void main() { gl_FragColor = texture2D(u_texture, uv); }`; -const Mt = (r) => { - const u = p(() => new t.PlaneGeometry(2, 2), []), o = p( +const Mt = (n) => { + const s = p(() => new t.PlaneGeometry(2, 2), []), o = p( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -2041,90 +2050,90 @@ const Mt = (r) => { }), [] ); - return F(r, u, o), o; + return A(n, s, o), o; }, Dt = { texture: new t.Texture(), map: new t.Texture(), mapIntensity: 0.3 }, Et = ({ - size: r, - dpr: u, + size: n, + dpr: s, samples: o = 0 }) => { - const a = p(() => new t.Scene(), []), e = Mt(a), s = P(r), [c, v] = V({ + const a = p(() => new t.Scene(), []), e = Mt(a), u = U(n), [c, v] = P({ scene: a, - camera: s, - size: r, - dpr: u, + camera: u, + size: n, + dpr: s, samples: o - }), [n, l] = U(Dt); + }), [r, l] = F(Dt); return [ - y( - (f, d) => { - const { gl: g } = f; - return d && l(d), i(e, "u_texture", n.texture), i(e, "u_map", n.map), i(e, "u_mapIntensity", n.mapIntensity), v(g); + w( + (m, d) => { + const { gl: g } = m; + return d && l(d), i(e, "u_texture", r.texture), i(e, "u_map", r.map), i(e, "u_mapIntensity", r.mapIntensity), v(g); }, - [v, e, l, n] + [v, e, l, r] ), l, { scene: a, material: e, - camera: s, + camera: u, renderTarget: c, output: c.texture } ]; }, $t = ({ - scene: r, - camera: u, + scene: n, + camera: s, size: o, dpr: a = !1, isSizeUpdate: e = !1, - samples: s = 0, + samples: u = 0, depthBuffer: c = !1, depthTexture: v = !1 -}, n) => { - const l = w([]), m = I(o, a); - l.current = p(() => Array.from({ length: n }, () => { +}, r) => { + const l = y([]), f = O(o, a); + l.current = p(() => Array.from({ length: r }, () => { const d = new t.WebGLRenderTarget( - m.x, - m.y, + f.x, + f.y, { - ...N, - samples: s, + ...j, + samples: u, depthBuffer: c } ); return v && (d.depthTexture = new t.DepthTexture( - m.x, - m.y, + f.x, + f.y, t.FloatType )), d; - }), [n]), X(() => { + }), [r]), q(() => { e && l.current.forEach( - (d) => d.setSize(m.x, m.y) + (d) => d.setSize(f.x, f.y) ); - }, [m, e]), C(() => { + }, [f, e]), R(() => { const d = l.current; return () => { d.forEach((g) => g.dispose()); }; - }, [n]); - const f = y( + }, [r]); + const m = w( (d, g, x) => { const h = l.current[g]; - return q({ + return k({ gl: d, - scene: r, - camera: u, + scene: n, + camera: s, fbo: h, onBeforeRender: () => x && x({ read: h.texture }) }), h.texture; }, - [r, u] + [n, s] ); - return [l.current, f]; + return [l.current, m]; }; export { we as BLENDING_PARAMS, @@ -2141,11 +2150,11 @@ export { lt as SIMPLEBLUR_PARAMS, ft as WAVE_PARAMS, i as setUniform, - F as useAddMesh, + A as useAddMesh, Vt as useBlending, Lt as useBrightnessPicker, Ct as useBrush, - P as useCamera, + U as useCamera, zt as useColorStrata, $t as useCopyTexture, Bt as useDomSyncer, @@ -2155,12 +2164,12 @@ export { Et as useFxBlending, Ft as useFxTexture, At as useNoise, - U as useParams, - Y as usePointer, - I as useResolution, + F as useParams, + H as usePointer, + O as useResolution, Ut as useRipple, It as useSimpleBlur, - V as useSingleFBO, + P as useSingleFBO, Ot as useWave }; //# sourceMappingURL=use-shader-fx.js.map diff --git a/packages/use-shader-fx/build/use-shader-fx.js.map b/packages/use-shader-fx/build/use-shader-fx.js.map index bc68bd51..baf5cae6 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js.map +++ b/packages/use-shader-fx/build/use-shader-fx.js.map @@ -1 +1 @@ -{"version":3,"file":"use-shader-fx.js","sources":["../src/hooks/useBrush/shader/main.vert","../src/hooks/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/hooks/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/utils/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/hooks/useBrush/index.ts","../src/hooks/useDuoTone/shader/main.vert","../src/hooks/useDuoTone/shader/main.frag","../src/hooks/useDuoTone/useMesh.ts","../src/hooks/useDuoTone/index.ts","../src/hooks/useBlending/shader/main.vert","../src/hooks/useBlending/shader/main.frag","../src/hooks/useBlending/useMesh.ts","../src/hooks/useBlending/index.ts","../src/hooks/useFluid/shaders/main.vert","../src/hooks/useFluid/shaders/init.frag","../src/hooks/useFluid/materials/useInitialMaterial.ts","../src/hooks/useFluid/shaders/advection.frag","../src/hooks/useFluid/materials/useAdvectionMaterial.ts","../src/hooks/useFluid/shaders/divergence.frag","../src/hooks/useFluid/materials/useDivergenceMaterial.ts","../src/hooks/useFluid/shaders/pressure.frag","../src/hooks/useFluid/materials/usePressureMaterial.ts","../src/hooks/useFluid/shaders/curl.frag","../src/hooks/useFluid/materials/useCurlMaterial.ts","../src/hooks/useFluid/shaders/vorticity.frag","../src/hooks/useFluid/materials/useVorticityMaterial.ts","../src/hooks/useFluid/shaders/clear.frag","../src/hooks/useFluid/materials/useClearMaterial.ts","../src/hooks/useFluid/shaders/gradientSubtract.frag","../src/hooks/useFluid/materials/useGradientSubtractMaterial.ts","../src/hooks/useFluid/shaders/splat.frag","../src/hooks/useFluid/materials/useSplatMaterial.ts","../src/hooks/useFluid/useMesh.ts","../src/hooks/useFluid/index.ts","../src/hooks/useRipple/useMesh.ts","../src/hooks/useRipple/index.ts","../src/hooks/useFxTexture/shader/main.vert","../src/hooks/useFxTexture/shader/main.frag","../src/hooks/useFxTexture/useMesh.ts","../src/hooks/useFxTexture/index.ts","../src/hooks/useNoise/shader/main.vert","../src/hooks/useNoise/shader/main.frag","../src/hooks/useNoise/useMesh.ts","../src/hooks/useNoise/index.ts","../src/libs/constants.ts","../src/hooks/useDomSyncer/utils/errorHandler.ts","../src/hooks/useDomSyncer/shader/main.vert","../src/hooks/useDomSyncer/shader/main.frag","../src/hooks/useDomSyncer/utils/createMesh.ts","../src/hooks/useDomSyncer/utils/useIntersectionHandler.ts","../src/hooks/useDomSyncer/utils/useUpdateDomRect.ts","../src/hooks/useDomSyncer/utils/useIsIntersecting.ts","../src/hooks/useDomSyncer/utils/createUseDomView.ts","../src/hooks/useDomSyncer/index.ts","../src/hooks/useSimpleBlur/shader/main.vert","../src/hooks/useSimpleBlur/shader/main.frag","../src/hooks/useSimpleBlur/useMesh.ts","../src/hooks/useSimpleBlur/index.ts","../src/hooks/useWave/shader/main.vert","../src/hooks/useWave/shader/main.frag","../src/hooks/useWave/useMesh.ts","../src/hooks/useWave/index.ts","../src/hooks/useBrightnessPicker/shader/main.vert","../src/hooks/useBrightnessPicker/shader/main.frag","../src/hooks/useBrightnessPicker/useMesh.ts","../src/hooks/useBrightnessPicker/index.ts","../src/hooks/useColorStrata/shader/main.vert","../src/hooks/useColorStrata/shader/main.frag","../src/hooks/useColorStrata/useMesh.ts","../src/hooks/useColorStrata/index.ts","../src/hooks/useFxBlending/shader/main.vert","../src/hooks/useFxBlending/shader/main.frag","../src/hooks/useFxBlending/useMesh.ts","../src/hooks/useFxBlending/index.ts","../src/utils/useCopyTexture.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uMap;\nuniform sampler2D uTexture;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform float uAspect;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float width, float aspect) {\n\t// make circle\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\t// unit vector in direction\n\tvec2 dir = normalize(end - start);\n\t\n\t// unit vector perpendicular to the line segment\n\tvec2 n = vec2(dir.y, -dir.x);\n\n\tvec2 p0 = point - start;\n\t\n\t// calculate distance on a line\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\t// Include the radius of the circle at the start and end points in the range\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < width && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < width || distFromEnd < width;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\t// Scale offset to texture size\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.0);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uMap, vUv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec4 baseColor, vec2 velocity, float motion, int samples) {\n\tvec4 motionBlurredColor = baseColor;\n\tvec2 scaledVelocity = velocity * motion;\n\tfor(int i = 1; i < samples; i++) {\n\t\tfloat t = float(i) / float(samples - 1);\n\t\tvec2 offset = t * scaledVelocity / uResolution;\n\t\tmotionBlurredColor += texture2D(uMap, vUv + offset);\n\t}\n\treturn motionBlurredColor / float(samples);\n}\n\n\nvoid main() {\n\t// Convert UV coordinates to range [-1, 1]\n\tvec2 st = vUv * 2.0 - 1.0;\n\t\n\t// velocity vector\n\tvec2 velocity = uVelocity * uResolution;\n\n\t// add smudge\n\tvec4 smudgedColor = createSmudge();\n\t\n\t// add motion blur\n\tvec4 motionBlurredColor = createMotionBlur(smudgedColor, velocity, uMotionBlur,uMotionSample);\n\n\tvec4 bufferColor = motionBlurredColor * uDissipation;\n\n\t// radius\n\tfloat modifiedRadius = max(0.0,uRadius);\n\n\t//\tcolor \n\tvec3 color = uColor;\n\n\t// map texture to color\n\tvec4 textureColor = texture2D(uTexture, vUv);\n\tvec3 finalColor = mix(color, textureColor.rgb, textureColor.a);\n\n\tfloat onLine = isOnLine(st, uPrevMouse, uMouse, modifiedRadius, uAspect);\n\tbufferColor.rgb = mix(bufferColor.rgb, finalColor, onLine);\n\t\n\tgl_FragColor = vec4(bufferColor.rgb,1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uMap: { value: THREE.Texture };\n uResolution: { value: THREE.Texture };\n uAspect: { value: number };\n uTexture: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uMap: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uAspect: { value: 0.0 },\n uTexture: { value: new THREE.Texture() },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(0, 0) },\n uPrevMouse: { value: new THREE.Vector2(0, 0) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Color(0xffffff) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uAspect\", resolution.width / resolution.height);\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as BrushMaterial;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\n/** When given the pointer vector2 from r3f's RootState, it generates an update function that returns {currentPointer, prevPointer, diffPointer, isVelocityUpdate, velocity}. */\nexport const usePointer = (): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback((currentPointer: THREE.Vector2) => {\n const now = performance.now();\n const current = currentPointer.clone();\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current ? prevPointer.current.clone() : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n }, []);\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush.Mixed with the value of a , default:THREE.Texture() */\n texture?: THREE.Texture;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , default:THREE.Color(0xffffff) */\n color?: THREE.Color;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: new THREE.Texture(),\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Color(0xffffff),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n setUniform(material, \"uColor\", params.color!);\n\n const { currentPointer, prevPointer, velocity } =\n updatePointer(pointer);\n setUniform(material, \"uMouse\", currentPointer);\n setUniform(material, \"uPrevMouse\", prevPointer);\n setUniform(material, \"uVelocity\", velocity);\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uMap\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as DuoToneMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { UseFboProps } from \"../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const { currentPointer, diffPointer, isVelocityUpdate, velocity } =\n updatePointer(pointer);\n if (isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(materials.splatMaterial, \"point\", currentPointer);\n const scaledDiff = diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture ?? null,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const { currentPointer, diffPointer } = updatePointer(pointer);\n if (params.frequency! < diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n currentPointer.x * (size.width / 2),\n currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class TransitionBgMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n material.uniforms.uResolution.value = resolution.clone();\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as TransitionBgMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** background texture resolution , default:THREE.Vector2(0, 0) */\n textureResolution?: THREE.Vector2;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n textureResolution: new THREE.Vector2(0, 0),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n setUniform(material, \"uTextureResolution\", params.textureResolution!);\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"progress\", params.progress!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import { DomSyncerParams } from \"..\";\nimport { ISDEV } from \"../../../libs/constants\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n const resolutionLength = params.resolution?.length;\n\n if (!domLength || !textureLength || !resolutionLength) {\n ISDEV && console.warn(\"No dom or texture or resolution is set\");\n return false;\n }\n\n if (domLength !== textureLength || domLength !== resolutionLength) {\n ISDEV && console.warn(\"not Match dom , texture and resolution length\");\n return false;\n }\n\n return true;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: { value: new THREE.Vector2(0, 0) },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\nimport { ISDEV } from \"../../../libs/constants\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n ISDEV && console.warn(\"DOM is null.\");\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(\n material,\n \"u_textureResolution\",\n params.resolution![i]\n );\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** Texture resolution array to pass */\n resolution?: THREE.Vector2[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n resolution: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams(DOMSYNCER_PARAMS);\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (errorHandler(params)) {\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: { \n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0,0) },\n uBlurSize: { value: 1, }\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture: THREE.Texture;\n /** blurSize, default:3 */\n blurSize: number;\n /** blurPower, affects performance default:5 */\n blurPower: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"uResolution\", [\n params.texture.source.data.width,\n params.texture.source.data.height,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BrightnessPickerMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n return material as ColorStrataMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:null */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","prevPointer","useRef","diffPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","props","pointer","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","isVelocityUpdate","scaledDiff","color","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","FXTEXTURE_PARAMS","useFxTexture","NOISE_PARAMS","useNoise","ISDEV","errorHandler","domLength","textureLength","resolutionLength","_c","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","index","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","intersectionHandler","useDomView","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","COLORSTRATA_PARAMS","useColorStrata","FXBLENDING_PARAMS","useFxBlending","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"use-shader-fx.js","sources":["../src/hooks/useBrush/shader/main.vert","../src/hooks/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/hooks/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/utils/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/hooks/useBrush/index.ts","../src/hooks/useDuoTone/shader/main.vert","../src/hooks/useDuoTone/shader/main.frag","../src/hooks/useDuoTone/useMesh.ts","../src/hooks/useDuoTone/index.ts","../src/hooks/useBlending/shader/main.vert","../src/hooks/useBlending/shader/main.frag","../src/hooks/useBlending/useMesh.ts","../src/hooks/useBlending/index.ts","../src/hooks/useFluid/shaders/main.vert","../src/hooks/useFluid/shaders/init.frag","../src/hooks/useFluid/materials/useInitialMaterial.ts","../src/hooks/useFluid/shaders/advection.frag","../src/hooks/useFluid/materials/useAdvectionMaterial.ts","../src/hooks/useFluid/shaders/divergence.frag","../src/hooks/useFluid/materials/useDivergenceMaterial.ts","../src/hooks/useFluid/shaders/pressure.frag","../src/hooks/useFluid/materials/usePressureMaterial.ts","../src/hooks/useFluid/shaders/curl.frag","../src/hooks/useFluid/materials/useCurlMaterial.ts","../src/hooks/useFluid/shaders/vorticity.frag","../src/hooks/useFluid/materials/useVorticityMaterial.ts","../src/hooks/useFluid/shaders/clear.frag","../src/hooks/useFluid/materials/useClearMaterial.ts","../src/hooks/useFluid/shaders/gradientSubtract.frag","../src/hooks/useFluid/materials/useGradientSubtractMaterial.ts","../src/hooks/useFluid/shaders/splat.frag","../src/hooks/useFluid/materials/useSplatMaterial.ts","../src/hooks/useFluid/useMesh.ts","../src/hooks/useFluid/index.ts","../src/hooks/useRipple/useMesh.ts","../src/hooks/useRipple/index.ts","../src/hooks/useFxTexture/shader/main.vert","../src/hooks/useFxTexture/shader/main.frag","../src/hooks/useFxTexture/useMesh.ts","../src/hooks/useFxTexture/index.ts","../src/hooks/useNoise/shader/main.vert","../src/hooks/useNoise/shader/main.frag","../src/hooks/useNoise/useMesh.ts","../src/hooks/useNoise/index.ts","../src/libs/constants.ts","../src/hooks/useDomSyncer/utils/errorHandler.ts","../src/hooks/useDomSyncer/shader/main.vert","../src/hooks/useDomSyncer/shader/main.frag","../src/hooks/useDomSyncer/utils/createMesh.ts","../src/hooks/useDomSyncer/utils/useIntersectionHandler.ts","../src/hooks/useDomSyncer/utils/useUpdateDomRect.ts","../src/hooks/useDomSyncer/utils/useIsIntersecting.ts","../src/hooks/useDomSyncer/utils/createUseDomView.ts","../src/hooks/useDomSyncer/index.ts","../src/hooks/useSimpleBlur/shader/main.vert","../src/hooks/useSimpleBlur/shader/main.frag","../src/hooks/useSimpleBlur/useMesh.ts","../src/hooks/useSimpleBlur/index.ts","../src/hooks/useWave/shader/main.vert","../src/hooks/useWave/shader/main.frag","../src/hooks/useWave/useMesh.ts","../src/hooks/useWave/index.ts","../src/hooks/useBrightnessPicker/shader/main.vert","../src/hooks/useBrightnessPicker/shader/main.frag","../src/hooks/useBrightnessPicker/useMesh.ts","../src/hooks/useBrightnessPicker/index.ts","../src/hooks/useColorStrata/shader/main.vert","../src/hooks/useColorStrata/shader/main.frag","../src/hooks/useColorStrata/useMesh.ts","../src/hooks/useColorStrata/index.ts","../src/hooks/useFxBlending/shader/main.vert","../src/hooks/useFxBlending/shader/main.frag","../src/hooks/useFxBlending/useMesh.ts","../src/hooks/useFxBlending/index.ts","../src/utils/useCopyTexture.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uMap;\nuniform sampler2D uTexture;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform float uAspect;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float width, float aspect) {\n\t// make circle\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\t// unit vector in direction\n\tvec2 dir = normalize(end - start);\n\t\n\t// unit vector perpendicular to the line segment\n\tvec2 n = vec2(dir.y, -dir.x);\n\n\tvec2 p0 = point - start;\n\t\n\t// calculate distance on a line\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\t// Include the radius of the circle at the start and end points in the range\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < width && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < width || distFromEnd < width;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\t// Scale offset to texture size\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.0);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uMap, vUv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec4 baseColor, vec2 velocity, float motion, int samples) {\n\tvec4 motionBlurredColor = baseColor;\n\tvec2 scaledVelocity = velocity * motion;\n\tfor(int i = 1; i < samples; i++) {\n\t\tfloat t = float(i) / float(samples - 1);\n\t\tvec2 offset = t * scaledVelocity / uResolution;\n\t\tmotionBlurredColor += texture2D(uMap, vUv + offset);\n\t}\n\treturn motionBlurredColor / float(samples);\n}\n\n\nvoid main() {\n\t// Convert UV coordinates to range [-1, 1]\n\tvec2 st = vUv * 2.0 - 1.0;\n\t\n\t// velocity vector\n\tvec2 velocity = uVelocity * uResolution;\n\n\t// add smudge\n\tvec4 smudgedColor = createSmudge();\n\t\n\t// add motion blur\n\tvec4 motionBlurredColor = createMotionBlur(smudgedColor, velocity, uMotionBlur,uMotionSample);\n\n\tvec4 bufferColor = motionBlurredColor * uDissipation;\n\n\t// radius\n\tfloat modifiedRadius = max(0.0,uRadius);\n\n\t//\tcolor \n\tvec3 color = uColor;\n\n\t// map texture to color\n\tvec4 textureColor = texture2D(uTexture, vUv);\n\tvec3 finalColor = mix(color, textureColor.rgb, textureColor.a);\n\n\tfloat onLine = isOnLine(st, uPrevMouse, uMouse, modifiedRadius, uAspect);\n\tbufferColor.rgb = mix(bufferColor.rgb, finalColor, onLine);\n\t\n\tgl_FragColor = vec4(bufferColor.rgb,1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uMap: { value: THREE.Texture };\n uResolution: { value: THREE.Texture };\n uAspect: { value: number };\n uTexture: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uMap: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uAspect: { value: 0.0 },\n uTexture: { value: new THREE.Texture() },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(0, 0) },\n uPrevMouse: { value: new THREE.Vector2(0, 0) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Color(0xffffff) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uAspect\", resolution.width / resolution.height);\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as BrushMaterial;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\n/** When given the pointer vector2 from r3f's RootState, it generates an update function that returns {currentPointer, prevPointer, diffPointer, isVelocityUpdate, velocity}. */\nexport const usePointer = (): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback((currentPointer: THREE.Vector2) => {\n const now = performance.now();\n const current = currentPointer.clone();\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current ? prevPointer.current.clone() : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n }, []);\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush.Mixed with the value of a , default:THREE.Texture() */\n texture?: THREE.Texture;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , default:THREE.Color(0xffffff) */\n color?: THREE.Color;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: new THREE.Texture(),\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Color(0xffffff),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n setUniform(material, \"uColor\", params.color!);\n\n const { currentPointer, prevPointer, velocity } =\n updatePointer(pointer);\n setUniform(material, \"uMouse\", currentPointer);\n setUniform(material, \"uPrevMouse\", prevPointer);\n setUniform(material, \"uVelocity\", velocity);\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uMap\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as DuoToneMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { UseFboProps } from \"../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const { currentPointer, diffPointer, isVelocityUpdate, velocity } =\n updatePointer(pointer);\n if (isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(materials.splatMaterial, \"point\", currentPointer);\n const scaledDiff = diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture ?? null,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const { currentPointer, diffPointer } = updatePointer(pointer);\n if (params.frequency! < diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n currentPointer.x * (size.width / 2),\n currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class TransitionBgMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n material.uniforms.uResolution.value = resolution.clone();\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as TransitionBgMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** background texture resolution , default:THREE.Vector2(0, 0) */\n textureResolution?: THREE.Vector2;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n textureResolution: new THREE.Vector2(0, 0),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n setUniform(material, \"uTextureResolution\", params.textureResolution!);\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"progress\", params.progress!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import { DomSyncerParams } from \"..\";\nimport { ISDEV } from \"../../../libs/constants\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n const resolutionLength = params.resolution?.length;\n\n if (!domLength || !textureLength || !resolutionLength) {\n ISDEV && console.warn(\"No dom or texture or resolution is set\");\n return false;\n }\n\n if (domLength !== textureLength || domLength !== resolutionLength) {\n ISDEV && console.warn(\"not Match dom , texture and resolution length\");\n return false;\n }\n\n return true;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: { value: new THREE.Vector2(0, 0) },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\nimport { ISDEV } from \"../../../libs/constants\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n ISDEV && console.warn(\"DOM is null.\");\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(\n material,\n \"u_textureResolution\",\n params.resolution![i]\n );\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** Texture resolution array to pass */\n resolution?: THREE.Vector2[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */\n updateKey?: Key;\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n resolution: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n * @param defaultKey - Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = [],\n defaultKey: Key\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: defaultKey,\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (refreshTrigger) {\n if (updateKey.current === params.updateKey) {\n return emptyTexture;\n } else {\n updateKey.current = params.updateKey!;\n }\n }\n\n if (errorHandler(params)) {\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: { \n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0,0) },\n uBlurSize: { value: 1, }\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture: THREE.Texture;\n /** blurSize, default:3 */\n blurSize: number;\n /** blurPower, affects performance default:5 */\n blurPower: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"uResolution\", [\n params.texture.source.data.width,\n params.texture.source.data.height,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BrightnessPickerMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n return material as ColorStrataMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:null */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","prevPointer","useRef","diffPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","props","pointer","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","isVelocityUpdate","scaledDiff","color","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","FXTEXTURE_PARAMS","useFxTexture","NOISE_PARAMS","useNoise","ISDEV","errorHandler","domLength","textureLength","resolutionLength","_c","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","index","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","defaultKey","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","COLORSTRATA_PARAMS","useColorStrata","FXBLENDING_PARAMS","useFxBlending","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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"} \ No newline at end of file diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs b/packages/use-shader-fx/build/use-shader-fx.umd.cjs index a48d72dc..cccf49a4 100644 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs @@ -1,9 +1,9 @@ -(function(x,L){typeof exports=="object"&&typeof module<"u"?L(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],L):(x=typeof globalThis<"u"?globalThis:x||self,L(x["use-shader-fx"]={},x.THREE,x.React))})(this,function(x,L,a){"use strict";function le(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const u=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(s,o,u.get?u:{enumerable:!0,get:()=>t[o]})}}return s.default=t,Object.freeze(s)}const n=le(L);var ce=`varying vec2 vUv; +(function(x,L){typeof exports=="object"&&typeof module<"u"?L(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],L):(x=typeof globalThis<"u"?globalThis:x||self,L(x["use-shader-fx"]={},x.THREE,x.React))})(this,function(x,L,u){"use strict";function ce(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const a=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(s,o,a.get?a:{enumerable:!0,get:()=>t[o]})}}return s.default=t,Object.freeze(s)}const n=ce(L);var ve=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,ve=`precision highp float; +}`,fe=`precision highp float; uniform sampler2D uMap; uniform sampler2D uTexture; @@ -105,12 +105,12 @@ void main() { bufferColor.rgb = mix(bufferColor.rgb, finalColor, onLine); gl_FragColor = vec4(bufferColor.rgb,1.0); -}`;const F=(t,s=!1)=>{const o=s?t.width*s:t.width,u=s?t.height*s:t.height;return a.useMemo(()=>new n.Vector2(o,u),[o,u])},V=(t,s,o)=>{const u=a.useMemo(()=>new n.Mesh(s,o),[s,o]);return a.useEffect(()=>{t.add(u)},[t,u]),a.useEffect(()=>()=>{t.remove(u),s.dispose(),o.dispose()},[t,s,o,u]),u},i=(t,s,o)=>{t.uniforms&&t.uniforms[s]&&o!==void 0&&o!==null?t.uniforms[s].value=o:console.error(`Uniform key "${String(s)}" does not exist in the material. or "${String(s)}" is null | undefined`)},fe=({scene:t,size:s,dpr:o})=>{const u=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),e=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uMap:{value:new n.Texture},uResolution:{value:new n.Vector2(0,0)},uAspect:{value:0},uTexture:{value:new n.Texture},uRadius:{value:0},uSmudge:{value:0},uDissipation:{value:0},uMotionBlur:{value:0},uMotionSample:{value:0},uMouse:{value:new n.Vector2(0,0)},uPrevMouse:{value:new n.Vector2(0,0)},uVelocity:{value:new n.Vector2(0,0)},uColor:{value:new n.Color(16777215)}},vertexShader:ce,fragmentShader:ve}),[]),l=F(s,o);return a.useEffect(()=>{i(e,"uAspect",l.width/l.height),i(e,"uResolution",l.clone())},[l,e]),V(t,u,e),e},de=(t,s)=>{const o=s,u=t/s,[e,l]=[o*u/2,o/2];return{width:e,height:l,near:-1e3,far:1e3}},b=t=>{const s=F(t),{width:o,height:u,near:e,far:l}=de(s.x,s.y);return a.useMemo(()=>new n.OrthographicCamera(-o,o,u,-u,e,l),[o,u,e,l])},$=()=>{const t=a.useRef(new n.Vector2(0,0)),s=a.useRef(new n.Vector2(0,0)),o=a.useRef(0),u=a.useRef(new n.Vector2(0,0)),e=a.useRef(!1);return a.useCallback(v=>{const f=performance.now(),r=v.clone();o.current===0&&(o.current=f,t.current=r);const c=Math.max(1,f-o.current);o.current=f,u.current.copy(r).sub(t.current).divideScalar(c);const p=u.current.length()>0,m=e.current?t.current.clone():r;return!e.current&&p&&(e.current=!0),t.current=r,{currentPointer:r,prevPointer:m,diffPointer:s.current.subVectors(r,m),velocity:u.current,isVelocityUpdate:p}},[])},D=t=>{const s=e=>Object.values(e).some(l=>typeof l=="function"),o=a.useRef(s(t)?t:structuredClone(t)),u=a.useCallback(e=>{for(const l in e){const v=l;v in o.current&&e[v]!==void 0&&e[v]!==null?o.current[v]=e[v]:console.error(`"${String(v)}" does not exist in the params. or "${String(v)}" is null | undefined`)}},[]);return[o.current,u]},N={minFilter:n.LinearFilter,magFilter:n.LinearFilter,type:n.HalfFloatType,stencilBuffer:!1},k=({gl:t,fbo:s,scene:o,camera:u,onBeforeRender:e,onSwap:l})=>{t.setRenderTarget(s),e(),t.clear(),t.render(o,u),l&&l(),t.setRenderTarget(null),t.clear()},C=({scene:t,camera:s,size:o,dpr:u=!1,isSizeUpdate:e=!1,samples:l=0,depthBuffer:v=!1,depthTexture:f=!1})=>{const r=a.useRef(),c=F(o,u);r.current=a.useMemo(()=>{const m=new n.WebGLRenderTarget(c.x,c.y,{...N,samples:l,depthBuffer:v});return f&&(m.depthTexture=new n.DepthTexture(c.x,c.y,n.FloatType)),m},[]),a.useLayoutEffect(()=>{var m;e&&((m=r.current)==null||m.setSize(c.x,c.y))},[c,e]),a.useEffect(()=>{const m=r.current;return()=>{m==null||m.dispose()}},[]);const p=a.useCallback((m,d)=>{const g=r.current;return k({gl:m,fbo:g,scene:t,camera:s,onBeforeRender:()=>d&&d({read:g.texture})}),g.texture},[t,s]);return[r.current,p]},B=({scene:t,camera:s,size:o,dpr:u=!1,isSizeUpdate:e=!1,samples:l=0,depthBuffer:v=!1,depthTexture:f=!1})=>{const r=a.useRef({read:null,write:null,swap:function(){let d=this.read;this.read=this.write,this.write=d}}),c=F(o,u),p=a.useMemo(()=>{const d=new n.WebGLRenderTarget(c.x,c.y,{...N,samples:l,depthBuffer:v}),g=new n.WebGLRenderTarget(c.x,c.y,{...N,samples:l,depthBuffer:v});return f&&(d.depthTexture=new n.DepthTexture(c.x,c.y,n.FloatType),g.depthTexture=new n.DepthTexture(c.x,c.y,n.FloatType)),{read:d,write:g}},[]);r.current.read=p.read,r.current.write=p.write,a.useLayoutEffect(()=>{var d,g;e&&((d=r.current.read)==null||d.setSize(c.x,c.y),(g=r.current.write)==null||g.setSize(c.x,c.y))},[c,e]),a.useEffect(()=>{const d=r.current;return()=>{var g,h;(g=d.read)==null||g.dispose(),(h=d.write)==null||h.dispose()}},[]);const m=a.useCallback((d,g)=>{var y;const h=r.current;return k({gl:d,scene:t,camera:s,fbo:h.write,onBeforeRender:()=>g&&g({read:h.read.texture,write:h.write.texture}),onSwap:()=>h.swap()}),(y=h.read)==null?void 0:y.texture},[t,s]);return[{read:r.current.read,write:r.current.write},m]},X={texture:new n.Texture,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new n.Color(16777215)},me=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=fe({scene:u,size:t,dpr:s}),l=b(t),v=$(),[f,r]=B({scene:u,camera:l,size:t,dpr:s,samples:o}),[c,p]=D(X);return[a.useCallback((d,g)=>{const{gl:h,pointer:y}=d;g&&p(g),i(e,"uTexture",c.texture),i(e,"uRadius",c.radius),i(e,"uSmudge",c.smudge),i(e,"uDissipation",c.dissipation),i(e,"uMotionBlur",c.motionBlur),i(e,"uMotionSample",c.motionSample),i(e,"uColor",c.color);const{currentPointer:S,prevPointer:w,velocity:T}=v(y);return i(e,"uMouse",S),i(e,"uPrevMouse",w),i(e,"uVelocity",T),r(h,({read:P})=>{i(e,"uMap",P)})},[e,v,r,c,p]),p,{scene:u,material:e,camera:l,renderTarget:f,output:f.read.texture}]};var pe=`varying vec2 vUv; +}`;const B=(t,s=!1)=>{const o=s?t.width*s:t.width,a=s?t.height*s:t.height;return u.useMemo(()=>new n.Vector2(o,a),[o,a])},U=(t,s,o)=>{const a=u.useMemo(()=>new n.Mesh(s,o),[s,o]);return u.useEffect(()=>{t.add(a)},[t,a]),u.useEffect(()=>()=>{t.remove(a),s.dispose(),o.dispose()},[t,s,o,a]),a},i=(t,s,o)=>{t.uniforms&&t.uniforms[s]&&o!==void 0&&o!==null?t.uniforms[s].value=o:console.error(`Uniform key "${String(s)}" does not exist in the material. or "${String(s)}" is null | undefined`)},de=({scene:t,size:s,dpr:o})=>{const a=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),e=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uMap:{value:new n.Texture},uResolution:{value:new n.Vector2(0,0)},uAspect:{value:0},uTexture:{value:new n.Texture},uRadius:{value:0},uSmudge:{value:0},uDissipation:{value:0},uMotionBlur:{value:0},uMotionSample:{value:0},uMouse:{value:new n.Vector2(0,0)},uPrevMouse:{value:new n.Vector2(0,0)},uVelocity:{value:new n.Vector2(0,0)},uColor:{value:new n.Color(16777215)}},vertexShader:ve,fragmentShader:fe}),[]),l=B(s,o);return u.useEffect(()=>{i(e,"uAspect",l.width/l.height),i(e,"uResolution",l.clone())},[l,e]),U(t,a,e),e},me=(t,s)=>{const o=s,a=t/s,[e,l]=[o*a/2,o/2];return{width:e,height:l,near:-1e3,far:1e3}},R=t=>{const s=B(t),{width:o,height:a,near:e,far:l}=me(s.x,s.y);return u.useMemo(()=>new n.OrthographicCamera(-o,o,a,-a,e,l),[o,a,e,l])},$=()=>{const t=u.useRef(new n.Vector2(0,0)),s=u.useRef(new n.Vector2(0,0)),o=u.useRef(0),a=u.useRef(new n.Vector2(0,0)),e=u.useRef(!1);return u.useCallback(v=>{const f=performance.now(),r=v.clone();o.current===0&&(o.current=f,t.current=r);const c=Math.max(1,f-o.current);o.current=f,a.current.copy(r).sub(t.current).divideScalar(c);const m=a.current.length()>0,p=e.current?t.current.clone():r;return!e.current&&m&&(e.current=!0),t.current=r,{currentPointer:r,prevPointer:p,diffPointer:s.current.subVectors(r,p),velocity:a.current,isVelocityUpdate:m}},[])},b=t=>{const s=e=>Object.values(e).some(l=>typeof l=="function"),o=u.useRef(s(t)?t:structuredClone(t)),a=u.useCallback(e=>{for(const l in e){const v=l;v in o.current&&e[v]!==void 0&&e[v]!==null?o.current[v]=e[v]:console.error(`"${String(v)}" does not exist in the params. or "${String(v)}" is null | undefined`)}},[]);return[o.current,a]},N={minFilter:n.LinearFilter,magFilter:n.LinearFilter,type:n.HalfFloatType,stencilBuffer:!1},G=({gl:t,fbo:s,scene:o,camera:a,onBeforeRender:e,onSwap:l})=>{t.setRenderTarget(s),e(),t.clear(),t.render(o,a),l&&l(),t.setRenderTarget(null),t.clear()},D=({scene:t,camera:s,size:o,dpr:a=!1,isSizeUpdate:e=!1,samples:l=0,depthBuffer:v=!1,depthTexture:f=!1})=>{const r=u.useRef(),c=B(o,a);r.current=u.useMemo(()=>{const p=new n.WebGLRenderTarget(c.x,c.y,{...N,samples:l,depthBuffer:v});return f&&(p.depthTexture=new n.DepthTexture(c.x,c.y,n.FloatType)),p},[]),u.useLayoutEffect(()=>{var p;e&&((p=r.current)==null||p.setSize(c.x,c.y))},[c,e]),u.useEffect(()=>{const p=r.current;return()=>{p==null||p.dispose()}},[]);const m=u.useCallback((p,d)=>{const g=r.current;return G({gl:p,fbo:g,scene:t,camera:s,onBeforeRender:()=>d&&d({read:g.texture})}),g.texture},[t,s]);return[r.current,m]},O=({scene:t,camera:s,size:o,dpr:a=!1,isSizeUpdate:e=!1,samples:l=0,depthBuffer:v=!1,depthTexture:f=!1})=>{const r=u.useRef({read:null,write:null,swap:function(){let d=this.read;this.read=this.write,this.write=d}}),c=B(o,a),m=u.useMemo(()=>{const d=new n.WebGLRenderTarget(c.x,c.y,{...N,samples:l,depthBuffer:v}),g=new n.WebGLRenderTarget(c.x,c.y,{...N,samples:l,depthBuffer:v});return f&&(d.depthTexture=new n.DepthTexture(c.x,c.y,n.FloatType),g.depthTexture=new n.DepthTexture(c.x,c.y,n.FloatType)),{read:d,write:g}},[]);r.current.read=m.read,r.current.write=m.write,u.useLayoutEffect(()=>{var d,g;e&&((d=r.current.read)==null||d.setSize(c.x,c.y),(g=r.current.write)==null||g.setSize(c.x,c.y))},[c,e]),u.useEffect(()=>{const d=r.current;return()=>{var g,h;(g=d.read)==null||g.dispose(),(h=d.write)==null||h.dispose()}},[]);const p=u.useCallback((d,g)=>{var y;const h=r.current;return G({gl:d,scene:t,camera:s,fbo:h.write,onBeforeRender:()=>g&&g({read:h.read.texture,write:h.write.texture}),onSwap:()=>h.swap()}),(y=h.read)==null?void 0:y.texture},[t,s]);return[{read:r.current.read,write:r.current.write},p]},Y={texture:new n.Texture,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new n.Color(16777215)},pe=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=de({scene:a,size:t,dpr:s}),l=R(t),v=$(),[f,r]=O({scene:a,camera:l,size:t,dpr:s,samples:o}),[c,m]=b(Y);return[u.useCallback((d,g)=>{const{gl:h,pointer:y}=d;g&&m(g),i(e,"uTexture",c.texture),i(e,"uRadius",c.radius),i(e,"uSmudge",c.smudge),i(e,"uDissipation",c.dissipation),i(e,"uMotionBlur",c.motionBlur),i(e,"uMotionSample",c.motionSample),i(e,"uColor",c.color);const{currentPointer:M,prevPointer:C,velocity:T}=v(y);return i(e,"uMouse",M),i(e,"uPrevMouse",C),i(e,"uVelocity",T),r(h,({read:P})=>{i(e,"uMap",P)})},[e,v,r,c,m]),m,{scene:a,material:e,camera:l,renderTarget:f,output:f.read.texture}]};var ge=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,ge=`precision highp float; +}`,xe=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -124,12 +124,12 @@ void main() { float grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114)); vec3 duotone = mix(uColor0, uColor1, grayscale); gl_FragColor = vec4(duotone, texColor.a); -}`;const xe=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uColor0:{value:new n.Color(16777215)},uColor1:{value:new n.Color(0)}},vertexShader:pe,fragmentShader:ge}),[]);return V(t,s,o),o},H={texture:new n.Texture,color0:new n.Color(16777215),color1:new n.Color(0)},he=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=xe(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o}),[r,c]=D(H);return[a.useCallback((m,d)=>{const{gl:g}=m;return d&&c(d),i(e,"uTexture",r.texture),i(e,"uColor0",r.color0),i(e,"uColor1",r.color1),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]};var ye=`varying vec2 vUv; +}`;const he=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uColor0:{value:new n.Color(16777215)},uColor1:{value:new n.Color(0)}},vertexShader:ge,fragmentShader:xe}),[]);return U(t,s,o),o},q={texture:new n.Texture,color0:new n.Color(16777215),color1:new n.Color(0)},ye=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=he(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o}),[r,c]=b(q);return[u.useCallback((p,d)=>{const{gl:g}=p;return d&&c(d),i(e,"uTexture",r.texture),i(e,"uColor0",r.color0),i(e,"uColor1",r.color1),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]};var Me=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Me=`precision highp float; +}`,Se=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -169,7 +169,7 @@ void main() { vec3 alphColor = mix(outputColor,mapColor,mixValue); gl_FragColor = vec4(alphColor, alpha); -}`;const Se=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_map:{value:new n.Texture},u_alphaMap:{value:new n.Texture},u_isAlphaMap:{value:!1},u_mapIntensity:{value:0},u_brightness:{value:new n.Vector3},u_min:{value:0},u_max:{value:.9},u_dodgeColor:{value:new n.Color(16777215)},u_isDodgeColor:{value:!1}},vertexShader:ye,fragmentShader:Me}),[]);return V(t,s,o),o},Y={texture:new n.Texture,map:new n.Texture,alphaMap:!1,mapIntensity:.3,brightness:new n.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1},we=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=Se(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o}),[r,c]=D(Y);return[a.useCallback((m,d)=>{const{gl:g}=m;return d&&c(d),i(e,"u_texture",r.texture),i(e,"u_map",r.map),i(e,"u_mapIntensity",r.mapIntensity),r.alphaMap?(i(e,"u_alphaMap",r.alphaMap),i(e,"u_isAlphaMap",!0)):i(e,"u_isAlphaMap",!1),i(e,"u_brightness",r.brightness),i(e,"u_min",r.min),i(e,"u_max",r.max),r.dodgeColor?(i(e,"u_dodgeColor",r.dodgeColor),i(e,"u_isDodgeColor",!0)):i(e,"u_isDodgeColor",!1),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]};var A=`varying vec2 vUv; +}`;const Te=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_map:{value:new n.Texture},u_alphaMap:{value:new n.Texture},u_isAlphaMap:{value:!1},u_mapIntensity:{value:0},u_brightness:{value:new n.Vector3},u_min:{value:0},u_max:{value:.9},u_dodgeColor:{value:new n.Color(16777215)},u_isDodgeColor:{value:!1}},vertexShader:Me,fragmentShader:Se}),[]);return U(t,s,o),o},K={texture:new n.Texture,map:new n.Texture,alphaMap:!1,mapIntensity:.3,brightness:new n.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1},we=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=Te(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o}),[r,c]=b(K);return[u.useCallback((p,d)=>{const{gl:g}=p;return d&&c(d),i(e,"u_texture",r.texture),i(e,"u_map",r.map),i(e,"u_mapIntensity",r.mapIntensity),r.alphaMap?(i(e,"u_alphaMap",r.alphaMap),i(e,"u_isAlphaMap",!0)):i(e,"u_isAlphaMap",!1),i(e,"u_brightness",r.brightness),i(e,"u_min",r.min),i(e,"u_max",r.max),r.dodgeColor?(i(e,"u_dodgeColor",r.dodgeColor),i(e,"u_isDodgeColor",!0)):i(e,"u_isDodgeColor",!1),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]};var F=`varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -183,11 +183,11 @@ void main () { vT = vUv + vec2(0.0, texelSize.y); vB = vUv - vec2(0.0, texelSize.y); gl_Position = vec4(position, 1.0); -}`,Te=`precision highp float; +}`,_e=`precision highp float; void main(){ gl_FragColor = vec4(0.0); -}`;const _e=()=>a.useMemo(()=>new n.ShaderMaterial({vertexShader:A,fragmentShader:Te,depthTest:!1,depthWrite:!1}),[]);var Re=`precision highp float; +}`;const Re=()=>u.useMemo(()=>new n.ShaderMaterial({vertexShader:F,fragmentShader:_e,depthTest:!1,depthWrite:!1}),[]);var be=`precision highp float; varying vec2 vUv; uniform sampler2D uVelocity; @@ -200,7 +200,7 @@ void main () { vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; gl_FragColor = dissipation * texture2D(uSource, coord); gl_FragColor.a = 1.0; -}`;const be=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:new n.Texture},uSource:{value:new n.Texture},texelSize:{value:new n.Vector2},dt:{value:0},dissipation:{value:0}},vertexShader:A,fragmentShader:Re}),[]);var De=`precision highp float; +}`;const De=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:new n.Texture},uSource:{value:new n.Texture},texelSize:{value:new n.Vector2},dt:{value:0},dissipation:{value:0}},vertexShader:F,fragmentShader:be}),[]);var Ce=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -225,7 +225,7 @@ void main () { float B = sampleVelocity(vB).y; float div = 0.5 * (R - L + T - B); gl_FragColor = vec4(div, 0.0, 0.0, 1.0); -}`;const Ce=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:De}),[]);var Pe=`precision highp float; +}`;const Pe=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:Ce}),[]);var Ve=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -249,7 +249,7 @@ void main () { float divergence = texture2D(uDivergence, vUv).x; float pressure = (L + R + B + T - divergence) * 0.25; gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); -}`;const Ve=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:Pe}),[]);var Ue=`precision highp float; +}`;const Ue=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:Ve}),[]);var Ae=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -265,7 +265,7 @@ void main () { float B = texture2D(uVelocity, vB).x; float vorticity = R - L - T + B; gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); -}`;const Ae=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:Ue}),[]);var Fe=`precision highp float; +}`;const Fe=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:Ae}),[]);var Be=`precision highp float; varying vec2 vUv; varying vec2 vT; @@ -283,7 +283,7 @@ void main () { force *= 1.0 / length(force + 0.00001) * curl * C; vec2 vel = texture2D(uVelocity, vUv).xy; gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); -}`;const Be=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:0},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:Fe}),[]);var Oe=`precision highp float; +}`;const Oe=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:0},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:Be}),[]);var Ee=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -291,7 +291,7 @@ uniform float value; void main () { gl_FragColor = value * texture2D(uTexture, vUv); -}`;const Ee=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},value:{value:0},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:Oe}),[]);var Ie=`precision highp float; +}`;const Ie=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},value:{value:0},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:Ee}),[]);var Le=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -314,7 +314,7 @@ void main () { vec2 velocity = texture2D(uVelocity, vUv).xy; velocity.xy -= vec2(R - L, T - B); gl_FragColor = vec4(velocity, 0.0, 1.0); -}`;const Le=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uPressure:{value:new n.Texture},uVelocity:{value:new n.Texture},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:Ie}),[]);var ze=`precision highp float; +}`;const ze=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uPressure:{value:new n.Texture},uVelocity:{value:new n.Texture},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:Le}),[]);var $e=`precision highp float; varying vec2 vUv; uniform sampler2D uTarget; @@ -330,12 +330,12 @@ void main () { vec3 splat = exp(-dot(p, p) / radius) * color; vec3 base = texture2D(uTarget, vUv).xyz; gl_FragColor = vec4(base + splat, 1.0); -}`;const $e=()=>a.useMemo(()=>new n.ShaderMaterial({uniforms:{uTarget:{value:new n.Texture},aspectRatio:{value:0},color:{value:new n.Vector3},point:{value:new n.Vector2},radius:{value:0},texelSize:{value:new n.Vector2}},vertexShader:A,fragmentShader:ze}),[]),Ne=({scene:t,size:s,dpr:o})=>{const u=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),e=_e(),l=e.clone(),v=Ae(),f=Be(),r=be(),c=Ce(),p=Ve(),m=Ee(),d=Le(),g=$e(),h=a.useMemo(()=>({vorticityMaterial:f,curlMaterial:v,advectionMaterial:r,divergenceMaterial:c,pressureMaterial:p,clearMaterial:m,gradientSubtractMaterial:d,splatMaterial:g}),[f,v,r,c,p,m,d,g]),y=F(s,o);a.useEffect(()=>{i(h.splatMaterial,"aspectRatio",y.x/y.y);for(const T of Object.values(h))i(T,"texelSize",new n.Vector2(1/y.x,1/y.y))},[y,h]);const S=V(t,u,e);a.useEffect(()=>{e.dispose(),S.material=l},[e,S,l]),a.useEffect(()=>()=>{for(const T of Object.values(h))T.dispose()},[h]);const w=a.useCallback(T=>{S.material=T,S.material.needsUpdate=!0},[S]);return[h,w]},q={density_dissipation:.98,velocity_dissipation:.99,velocity_acceleration:10,pressure_dissipation:.9,pressure_iterations:20,curl_strength:35,splat_radius:.002,fluid_color:new n.Vector3(1,1,1)},ke=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),[e,l]=Ne({scene:u,size:t,dpr:s}),v=b(t),f=$(),r=a.useMemo(()=>({scene:u,camera:v,size:t,samples:o}),[u,v,t,o]),[c,p]=B(r),[m,d]=B(r),[g,h]=C(r),[y,S]=C(r),[w,T]=B(r),P=a.useRef(0),z=a.useRef(new n.Vector2(0,0)),O=a.useRef(new n.Vector3(0,0,0)),[R,M]=D(q);return[a.useCallback((Vn,ae)=>{const{gl:U,pointer:Un,clock:G,size:ue}=Vn;ae&&M(ae),P.current===0&&(P.current=G.getElapsedTime());const ie=Math.min((G.getElapsedTime()-P.current)/3,.02);P.current=G.getElapsedTime();const W=p(U,({read:_})=>{l(e.advectionMaterial),i(e.advectionMaterial,"uVelocity",_),i(e.advectionMaterial,"uSource",_),i(e.advectionMaterial,"dt",ie),i(e.advectionMaterial,"dissipation",R.velocity_dissipation)}),An=d(U,({read:_})=>{l(e.advectionMaterial),i(e.advectionMaterial,"uVelocity",W),i(e.advectionMaterial,"uSource",_),i(e.advectionMaterial,"dissipation",R.density_dissipation)}),{currentPointer:Fn,diffPointer:Bn,isVelocityUpdate:On,velocity:En}=f(Un);On&&(p(U,({read:_})=>{l(e.splatMaterial),i(e.splatMaterial,"uTarget",_),i(e.splatMaterial,"point",Fn);const I=Bn.multiply(z.current.set(ue.width,ue.height).multiplyScalar(R.velocity_acceleration));i(e.splatMaterial,"color",O.current.set(I.x,I.y,1)),i(e.splatMaterial,"radius",R.splat_radius)}),d(U,({read:_})=>{l(e.splatMaterial),i(e.splatMaterial,"uTarget",_);const I=typeof R.fluid_color=="function"?R.fluid_color(En):R.fluid_color;i(e.splatMaterial,"color",I)}));const In=h(U,()=>{l(e.curlMaterial),i(e.curlMaterial,"uVelocity",W)});p(U,({read:_})=>{l(e.vorticityMaterial),i(e.vorticityMaterial,"uVelocity",_),i(e.vorticityMaterial,"uCurl",In),i(e.vorticityMaterial,"curl",R.curl_strength),i(e.vorticityMaterial,"dt",ie)});const Ln=S(U,()=>{l(e.divergenceMaterial),i(e.divergenceMaterial,"uVelocity",W)});T(U,({read:_})=>{l(e.clearMaterial),i(e.clearMaterial,"uTexture",_),i(e.clearMaterial,"value",R.pressure_dissipation)}),l(e.pressureMaterial),i(e.pressureMaterial,"uDivergence",Ln);let se;for(let _=0;_{i(e.pressureMaterial,"uPressure",I)});return p(U,({read:_})=>{l(e.gradientSubtractMaterial),i(e.gradientSubtractMaterial,"uPressure",se),i(e.gradientSubtractMaterial,"uVelocity",_)}),An},[e,l,h,d,S,f,T,p,M,R]),M,{scene:u,materials:e,camera:v,renderTarget:{velocity:c,density:m,curl:g,divergence:y,pressure:w},output:m.read.texture}]},je=({scale:t,max:s,texture:o,scene:u})=>{const e=a.useRef([]),l=a.useMemo(()=>new n.PlaneGeometry(t,t),[t]),v=a.useMemo(()=>new n.MeshBasicMaterial({map:o??null,transparent:!0,blending:n.AdditiveBlending,depthTest:!1,depthWrite:!1}),[o]);return a.useEffect(()=>{for(let f=0;f()=>{e.current.forEach(f=>{f.geometry.dispose(),Array.isArray(f.material)?f.material.forEach(r=>r.dispose()):f.material.dispose(),u.remove(f)}),e.current=[]},[u]),e.current},K={frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6},Ge=({texture:t,scale:s=64,max:o=100,size:u,dpr:e,samples:l=0})=>{const v=a.useMemo(()=>new n.Scene,[]),f=je({scale:s,max:o,texture:t,scene:v}),r=b(u),c=$(),[p,m]=C({scene:v,camera:r,size:u,dpr:e,samples:l}),[d,g]=D(K),h=a.useRef(0);return[a.useCallback((S,w)=>{const{gl:T,pointer:P,size:z}=S;w&&g(w);const{currentPointer:O,diffPointer:R}=c(P);if(d.frequency{if(M.visible){const E=M.material;M.rotation.z+=d.rotation,E.opacity*=d.fadeout_speed,M.scale.x=d.fadeout_speed*M.scale.x+d.scale,M.scale.y=M.scale.x,E.opacity<.002&&(M.visible=!1)}}),m(T)},[m,f,c,o,d,g]),g,{scene:v,camera:r,meshArr:f,renderTarget:p,output:p.texture}]};var We=`varying vec2 vUv; +}`;const Ne=()=>u.useMemo(()=>new n.ShaderMaterial({uniforms:{uTarget:{value:new n.Texture},aspectRatio:{value:0},color:{value:new n.Vector3},point:{value:new n.Vector2},radius:{value:0},texelSize:{value:new n.Vector2}},vertexShader:F,fragmentShader:$e}),[]),ke=({scene:t,size:s,dpr:o})=>{const a=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),e=Re(),l=e.clone(),v=Fe(),f=Oe(),r=De(),c=Pe(),m=Ue(),p=Ie(),d=ze(),g=Ne(),h=u.useMemo(()=>({vorticityMaterial:f,curlMaterial:v,advectionMaterial:r,divergenceMaterial:c,pressureMaterial:m,clearMaterial:p,gradientSubtractMaterial:d,splatMaterial:g}),[f,v,r,c,m,p,d,g]),y=B(s,o);u.useEffect(()=>{i(h.splatMaterial,"aspectRatio",y.x/y.y);for(const T of Object.values(h))i(T,"texelSize",new n.Vector2(1/y.x,1/y.y))},[y,h]);const M=U(t,a,e);u.useEffect(()=>{e.dispose(),M.material=l},[e,M,l]),u.useEffect(()=>()=>{for(const T of Object.values(h))T.dispose()},[h]);const C=u.useCallback(T=>{M.material=T,M.material.needsUpdate=!0},[M]);return[h,C]},Z={density_dissipation:.98,velocity_dissipation:.99,velocity_acceleration:10,pressure_dissipation:.9,pressure_iterations:20,curl_strength:35,splat_radius:.002,fluid_color:new n.Vector3(1,1,1)},je=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),[e,l]=ke({scene:a,size:t,dpr:s}),v=R(t),f=$(),r=u.useMemo(()=>({scene:a,camera:v,size:t,samples:o}),[a,v,t,o]),[c,m]=O(r),[p,d]=O(r),[g,h]=D(r),[y,M]=D(r),[C,T]=O(r),P=u.useRef(0),A=u.useRef(new n.Vector2(0,0)),E=u.useRef(new n.Vector3(0,0,0)),[_,S]=b(Z);return[u.useCallback((k,j)=>{const{gl:V,pointer:Un,clock:X,size:ie}=k;j&&S(j),P.current===0&&(P.current=X.getElapsedTime());const se=Math.min((X.getElapsedTime()-P.current)/3,.02);P.current=X.getElapsedTime();const H=m(V,({read:w})=>{l(e.advectionMaterial),i(e.advectionMaterial,"uVelocity",w),i(e.advectionMaterial,"uSource",w),i(e.advectionMaterial,"dt",se),i(e.advectionMaterial,"dissipation",_.velocity_dissipation)}),An=d(V,({read:w})=>{l(e.advectionMaterial),i(e.advectionMaterial,"uVelocity",H),i(e.advectionMaterial,"uSource",w),i(e.advectionMaterial,"dissipation",_.density_dissipation)}),{currentPointer:Fn,diffPointer:Bn,isVelocityUpdate:On,velocity:En}=f(Un);On&&(m(V,({read:w})=>{l(e.splatMaterial),i(e.splatMaterial,"uTarget",w),i(e.splatMaterial,"point",Fn);const I=Bn.multiply(A.current.set(ie.width,ie.height).multiplyScalar(_.velocity_acceleration));i(e.splatMaterial,"color",E.current.set(I.x,I.y,1)),i(e.splatMaterial,"radius",_.splat_radius)}),d(V,({read:w})=>{l(e.splatMaterial),i(e.splatMaterial,"uTarget",w);const I=typeof _.fluid_color=="function"?_.fluid_color(En):_.fluid_color;i(e.splatMaterial,"color",I)}));const In=h(V,()=>{l(e.curlMaterial),i(e.curlMaterial,"uVelocity",H)});m(V,({read:w})=>{l(e.vorticityMaterial),i(e.vorticityMaterial,"uVelocity",w),i(e.vorticityMaterial,"uCurl",In),i(e.vorticityMaterial,"curl",_.curl_strength),i(e.vorticityMaterial,"dt",se)});const Ln=M(V,()=>{l(e.divergenceMaterial),i(e.divergenceMaterial,"uVelocity",H)});T(V,({read:w})=>{l(e.clearMaterial),i(e.clearMaterial,"uTexture",w),i(e.clearMaterial,"value",_.pressure_dissipation)}),l(e.pressureMaterial),i(e.pressureMaterial,"uDivergence",Ln);let le;for(let w=0;w<_.pressure_iterations;w++)le=T(V,({read:I})=>{i(e.pressureMaterial,"uPressure",I)});return m(V,({read:w})=>{l(e.gradientSubtractMaterial),i(e.gradientSubtractMaterial,"uPressure",le),i(e.gradientSubtractMaterial,"uVelocity",w)}),An},[e,l,h,d,M,f,T,m,S,_]),S,{scene:a,materials:e,camera:v,renderTarget:{velocity:c,density:p,curl:g,divergence:y,pressure:C},output:p.read.texture}]},Ge=({scale:t,max:s,texture:o,scene:a})=>{const e=u.useRef([]),l=u.useMemo(()=>new n.PlaneGeometry(t,t),[t]),v=u.useMemo(()=>new n.MeshBasicMaterial({map:o??null,transparent:!0,blending:n.AdditiveBlending,depthTest:!1,depthWrite:!1}),[o]);return u.useEffect(()=>{for(let f=0;f()=>{e.current.forEach(f=>{f.geometry.dispose(),Array.isArray(f.material)?f.material.forEach(r=>r.dispose()):f.material.dispose(),a.remove(f)}),e.current=[]},[a]),e.current},J={frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6},We=({texture:t,scale:s=64,max:o=100,size:a,dpr:e,samples:l=0})=>{const v=u.useMemo(()=>new n.Scene,[]),f=Ge({scale:s,max:o,texture:t,scene:v}),r=R(a),c=$(),[m,p]=D({scene:v,camera:r,size:a,dpr:e,samples:l}),[d,g]=b(J),h=u.useRef(0);return[u.useCallback((M,C)=>{const{gl:T,pointer:P,size:A}=M;C&&g(C);const{currentPointer:E,diffPointer:_}=c(P);if(d.frequency<_.length()){const S=f[h.current];S.visible=!0,S.position.set(E.x*(A.width/2),E.y*(A.height/2),0),S.scale.x=S.scale.y=0,S.material.opacity=d.alpha,h.current=(h.current+1)%o}return f.forEach(S=>{if(S.visible){const z=S.material;S.rotation.z+=d.rotation,z.opacity*=d.fadeout_speed,S.scale.x=d.fadeout_speed*S.scale.x+d.scale,S.scale.y=S.scale.x,z.opacity<.002&&(S.visible=!1)}}),p(T)},[p,f,c,o,d,g]),g,{scene:v,camera:r,meshArr:f,renderTarget:m,output:m.texture}]};var Xe=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Xe=`precision highp float; +}`,He=`precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -401,12 +401,12 @@ void main() { gl_FragColor = mix(color0, color1, progress); -}`;const He=({scene:t,size:s,dpr:o})=>{const u=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),e=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uResolution:{value:new n.Vector2},uTextureResolution:{value:new n.Vector2},uTexture0:{value:new n.Texture},uTexture1:{value:new n.Texture},padding:{value:0},uMap:{value:new n.Texture},edgeIntensity:{value:0},mapIntensity:{value:0},epicenter:{value:new n.Vector2(0,0)},progress:{value:0},dirX:{value:0},dirY:{value:0}},vertexShader:We,fragmentShader:Xe}),[]),l=F(s,o);return a.useEffect(()=>{e.uniforms.uResolution.value=l.clone()},[l,e]),V(t,u,e),e},Z={texture0:new n.Texture,texture1:new n.Texture,textureResolution:new n.Vector2(0,0),padding:0,map:new n.Texture,mapIntensity:0,edgeIntensity:0,epicenter:new n.Vector2(0,0),progress:0,dir:new n.Vector2(0,0)},Ye=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=He({scene:u,size:t,dpr:s}),l=b(t),[v,f]=C({scene:u,camera:l,dpr:s,size:t,samples:o,isSizeUpdate:!0}),[r,c]=D(Z);return[a.useCallback((m,d)=>{const{gl:g}=m;return d&&c(d),i(e,"uTexture0",r.texture0),i(e,"uTexture1",r.texture1),i(e,"uTextureResolution",r.textureResolution),i(e,"padding",r.padding),i(e,"uMap",r.map),i(e,"mapIntensity",r.mapIntensity),i(e,"edgeIntensity",r.edgeIntensity),i(e,"epicenter",r.epicenter),i(e,"progress",r.progress),i(e,"dirX",r.dir.x),i(e,"dirY",r.dir.y),f(g)},[f,e,r,c]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]};var qe=`varying vec2 vUv; +}`;const Ye=({scene:t,size:s,dpr:o})=>{const a=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),e=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uResolution:{value:new n.Vector2},uTextureResolution:{value:new n.Vector2},uTexture0:{value:new n.Texture},uTexture1:{value:new n.Texture},padding:{value:0},uMap:{value:new n.Texture},edgeIntensity:{value:0},mapIntensity:{value:0},epicenter:{value:new n.Vector2(0,0)},progress:{value:0},dirX:{value:0},dirY:{value:0}},vertexShader:Xe,fragmentShader:He}),[]),l=B(s,o);return u.useEffect(()=>{e.uniforms.uResolution.value=l.clone()},[l,e]),U(t,a,e),e},Q={texture0:new n.Texture,texture1:new n.Texture,textureResolution:new n.Vector2(0,0),padding:0,map:new n.Texture,mapIntensity:0,edgeIntensity:0,epicenter:new n.Vector2(0,0),progress:0,dir:new n.Vector2(0,0)},qe=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=Ye({scene:a,size:t,dpr:s}),l=R(t),[v,f]=D({scene:a,camera:l,dpr:s,size:t,samples:o,isSizeUpdate:!0}),[r,c]=b(Q);return[u.useCallback((p,d)=>{const{gl:g}=p;return d&&c(d),i(e,"uTexture0",r.texture0),i(e,"uTexture1",r.texture1),i(e,"uTextureResolution",r.textureResolution),i(e,"padding",r.padding),i(e,"uMap",r.map),i(e,"mapIntensity",r.mapIntensity),i(e,"edgeIntensity",r.edgeIntensity),i(e,"epicenter",r.epicenter),i(e,"progress",r.progress),i(e,"dirX",r.dir.x),i(e,"dirY",r.dir.y),f(g)},[f,e,r,c]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]};var Ke=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Ke=`precision highp float; +}`,Ze=`precision highp float; precision highp int; varying vec2 vUv; @@ -479,12 +479,12 @@ float warp(vec2 x, float g,float time){ void main() { float noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength); gl_FragColor = vec4(vec3(noise),1.0); -}`;const Ze=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uTime:{value:0},scale:{value:0},timeStrength:{value:0},noiseOctaves:{value:0},fbmOctaves:{value:0},warpOctaves:{value:0},warpDirection:{value:new n.Vector2},warpStrength:{value:0}},vertexShader:qe,fragmentShader:Ke}),[]);return V(t,s,o),o},J={scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new n.Vector2(2,2),warpStrength:8},Je=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=Ze(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o}),[r,c]=D(J);return[a.useCallback((m,d)=>{const{gl:g,clock:h}=m;return d&&c(d),i(e,"scale",r.scale),i(e,"timeStrength",r.timeStrength),i(e,"noiseOctaves",r.noiseOctaves),i(e,"fbmOctaves",r.fbmOctaves),i(e,"warpOctaves",r.warpOctaves),i(e,"warpDirection",r.warpDirection),i(e,"warpStrength",r.warpStrength),i(e,"uTime",h.getElapsedTime()),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]},j=process.env.NODE_ENV==="development",Qe=t=>{var e,l,v;const s=(e=t.dom)==null?void 0:e.length,o=(l=t.texture)==null?void 0:l.length,u=(v=t.resolution)==null?void 0:v.length;return!s||!o||!u?(j&&console.warn("No dom or texture or resolution is set"),!1):s!==o||s!==u?(j&&console.warn("not Match dom , texture and resolution length"),!1):!0};var en=`varying vec2 vUv; +}`;const Je=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uTime:{value:0},scale:{value:0},timeStrength:{value:0},noiseOctaves:{value:0},fbmOctaves:{value:0},warpOctaves:{value:0},warpDirection:{value:new n.Vector2},warpStrength:{value:0}},vertexShader:Ke,fragmentShader:Ze}),[]);return U(t,s,o),o},ee={scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new n.Vector2(2,2),warpStrength:8},Qe=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=Je(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o}),[r,c]=b(ee);return[u.useCallback((p,d)=>{const{gl:g,clock:h}=p;return d&&c(d),i(e,"scale",r.scale),i(e,"timeStrength",r.timeStrength),i(e,"noiseOctaves",r.noiseOctaves),i(e,"fbmOctaves",r.fbmOctaves),i(e,"warpOctaves",r.warpOctaves),i(e,"warpDirection",r.warpDirection),i(e,"warpStrength",r.warpStrength),i(e,"uTime",h.getElapsedTime()),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]},W=process.env.NODE_ENV==="development",en=t=>{var e,l,v;const s=(e=t.dom)==null?void 0:e.length,o=(l=t.texture)==null?void 0:l.length,a=(v=t.resolution)==null?void 0:v.length;return!s||!o||!a?(W&&console.warn("No dom or texture or resolution is set"),!1):s!==o||s!==a?(W&&console.warn("not Match dom , texture and resolution length"),!1):!0};var nn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`,nn=`precision highp float; +}`,tn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -527,14 +527,14 @@ void main() { alpha *= textureAlpha; gl_FragColor = vec4(textureColor, alpha); -}`;const tn=({params:t,size:s,scene:o})=>{o.children.length>0&&(o.children.forEach(u=>{u instanceof n.Mesh&&(u.geometry.dispose(),u.material.dispose())}),o.remove(...o.children)),t.texture.forEach((u,e)=>{const l=new n.Mesh(new n.PlaneGeometry(1,1),new n.ShaderMaterial({vertexShader:en,fragmentShader:nn,transparent:!0,uniforms:{u_texture:{value:u},u_textureResolution:{value:new n.Vector2(0,0)},u_resolution:{value:new n.Vector2(0,0)},u_borderRadius:{value:t.boderRadius[e]?t.boderRadius[e]:0}}}));o.add(l)})},rn=()=>{const t=a.useRef([]),s=a.useRef([]);return a.useCallback(({isIntersectingRef:u,isIntersectingOnceRef:e,params:l})=>{t.current.length>0&&t.current.forEach((f,r)=>{f.unobserve(s.current[r])}),s.current=[],t.current=[];const v=new Array(l.dom.length).fill(!1);u.current=[...v],e.current=[...v],l.dom.forEach((f,r)=>{const c=m=>{m.forEach(d=>{l.onIntersect[r]&&l.onIntersect[r](d),u.current[r]=d.isIntersecting})},p=new IntersectionObserver(c,{rootMargin:"0px",threshold:0});p.observe(f),t.current.push(p),s.current.push(f)})},[])},on=()=>{const t=a.useRef([]),s=a.useCallback(({params:o,size:u,resolutionRef:e,scene:l,isIntersectingRef:v})=>{l.children.length!==t.current.length&&(t.current=new Array(l.children.length)),l.children.forEach((f,r)=>{const c=o.dom[r];if(!c){j&&console.warn("DOM is null.");return}const p=c.getBoundingClientRect();if(t.current[r]=p,f.scale.set(p.width,p.height,1),f.position.set(p.left+p.width*.5-u.width*.5,-p.top-p.height*.5+u.height*.5,0),v.current[r]&&(o.rotation[r]&&f.rotation.copy(o.rotation[r]),f instanceof n.Mesh)){const m=f.material;i(m,"u_texture",o.texture[r]),i(m,"u_textureResolution",o.resolution[r]),i(m,"u_resolution",e.current.set(p.width,p.height)),i(m,"u_borderRadius",o.boderRadius[r]?o.boderRadius[r]:0)}})},[]);return[t.current,s]},an=()=>{const t=a.useRef([]),s=a.useRef([]),o=a.useCallback((u,e=!1)=>{t.current.forEach((v,f)=>{v&&(s.current[f]=!0)});const l=e?[...s.current]:[...t.current];return u<0?l:l[u]},[]);return{isIntersectingRef:t,isIntersectingOnceRef:s,isIntersecting:o}},un=t=>({onView:o,onHidden:u})=>{const e=a.useRef(!1);a.useEffect(()=>{let l;const v=()=>{t.current.some(f=>f)?e.current||(o&&o(),e.current=!0):e.current&&(u&&u(),e.current=!1),l=requestAnimationFrame(v)};return l=requestAnimationFrame(v),()=>{cancelAnimationFrame(l)}},[o,u])},Q={texture:[],dom:[],resolution:[],boderRadius:[],rotation:[],onIntersect:[]},sn=({size:t,dpr:s,samples:o=0},u=[])=>{const e=a.useMemo(()=>new n.Scene,[]),l=b(t),[v,f]=C({scene:e,camera:l,size:t,dpr:s,samples:o,isSizeUpdate:!0}),[r,c]=D(Q),[p,m]=on(),d=a.useRef(new n.Vector2(0,0)),[g,h]=a.useState(!0);a.useEffect(()=>{h(!0)},u);const y=rn(),{isIntersectingOnceRef:S,isIntersectingRef:w,isIntersecting:T}=an(),P=un(w);return[a.useCallback((O,R)=>{const{gl:M,size:E}=O;return R&&c(R),Qe(r)&&(g&&(tn({params:r,size:E,scene:e}),y({isIntersectingRef:w,isIntersectingOnceRef:S,params:r}),h(!1)),m({params:r,size:E,resolutionRef:d,scene:e,isIntersectingRef:w})),f(M)},[f,c,y,m,g,e,r,S,w]),c,{scene:e,camera:l,renderTarget:v,output:v.texture,isIntersecting:T,DOMRects:p,intersections:w.current,useDomView:P}]};var ln=`precision mediump float; +}`;const rn=({params:t,size:s,scene:o})=>{o.children.length>0&&(o.children.forEach(a=>{a instanceof n.Mesh&&(a.geometry.dispose(),a.material.dispose())}),o.remove(...o.children)),t.texture.forEach((a,e)=>{const l=new n.Mesh(new n.PlaneGeometry(1,1),new n.ShaderMaterial({vertexShader:nn,fragmentShader:tn,transparent:!0,uniforms:{u_texture:{value:a},u_textureResolution:{value:new n.Vector2(0,0)},u_resolution:{value:new n.Vector2(0,0)},u_borderRadius:{value:t.boderRadius[e]?t.boderRadius[e]:0}}}));o.add(l)})},on=()=>{const t=u.useRef([]),s=u.useRef([]);return u.useCallback(({isIntersectingRef:a,isIntersectingOnceRef:e,params:l})=>{t.current.length>0&&t.current.forEach((f,r)=>{f.unobserve(s.current[r])}),s.current=[],t.current=[];const v=new Array(l.dom.length).fill(!1);a.current=[...v],e.current=[...v],l.dom.forEach((f,r)=>{const c=p=>{p.forEach(d=>{l.onIntersect[r]&&l.onIntersect[r](d),a.current[r]=d.isIntersecting})},m=new IntersectionObserver(c,{rootMargin:"0px",threshold:0});m.observe(f),t.current.push(m),s.current.push(f)})},[])},un=()=>{const t=u.useRef([]),s=u.useCallback(({params:o,size:a,resolutionRef:e,scene:l,isIntersectingRef:v})=>{l.children.length!==t.current.length&&(t.current=new Array(l.children.length)),l.children.forEach((f,r)=>{const c=o.dom[r];if(!c){W&&console.warn("DOM is null.");return}const m=c.getBoundingClientRect();if(t.current[r]=m,f.scale.set(m.width,m.height,1),f.position.set(m.left+m.width*.5-a.width*.5,-m.top-m.height*.5+a.height*.5,0),v.current[r]&&(o.rotation[r]&&f.rotation.copy(o.rotation[r]),f instanceof n.Mesh)){const p=f.material;i(p,"u_texture",o.texture[r]),i(p,"u_textureResolution",o.resolution[r]),i(p,"u_resolution",e.current.set(m.width,m.height)),i(p,"u_borderRadius",o.boderRadius[r]?o.boderRadius[r]:0)}})},[]);return[t.current,s]},an=()=>{const t=u.useRef([]),s=u.useRef([]),o=u.useCallback((a,e=!1)=>{t.current.forEach((v,f)=>{v&&(s.current[f]=!0)});const l=e?[...s.current]:[...t.current];return a<0?l:l[a]},[]);return{isIntersectingRef:t,isIntersectingOnceRef:s,isIntersecting:o}},sn=t=>({onView:o,onHidden:a})=>{const e=u.useRef(!1);u.useEffect(()=>{let l;const v=()=>{t.current.some(f=>f)?e.current||(o&&o(),e.current=!0):e.current&&(a&&a(),e.current=!1),l=requestAnimationFrame(v)};return l=requestAnimationFrame(v),()=>{cancelAnimationFrame(l)}},[o,a])},ne={texture:[],dom:[],resolution:[],boderRadius:[],rotation:[],onIntersect:[]},ln=({size:t,dpr:s,samples:o=0},a=[],e)=>{const l=u.useMemo(()=>new n.Scene,[]),v=R(t),[f,r]=D({scene:l,camera:v,size:t,dpr:s,samples:o,isSizeUpdate:!0}),[c,m]=b({...ne,updateKey:e}),[p,d]=un(),g=u.useRef(new n.Vector2(0,0)),[h,y]=u.useState(!0);u.useEffect(()=>{y(!0)},a);const M=u.useRef(null),C=u.useMemo(()=>new n.Texture,[]),T=on(),{isIntersectingOnceRef:P,isIntersectingRef:A,isIntersecting:E}=an(),_=sn(A);return[u.useCallback((z,k)=>{const{gl:j,size:V}=z;if(k&&m(k),h){if(M.current===c.updateKey)return C;M.current=c.updateKey}return en(c)&&(h&&(rn({params:c,size:V,scene:l}),T({isIntersectingRef:A,isIntersectingOnceRef:P,params:c}),y(!1)),d({params:c,size:V,resolutionRef:g,scene:l,isIntersectingRef:A})),r(j)},[r,m,T,d,h,l,c,P,A,C]),m,{scene:l,camera:v,renderTarget:f,output:f.texture,isIntersecting:E,DOMRects:p,intersections:A.current,useDomView:_}]};var cn=`precision mediump float; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,cn=`precision mediump float; +}`,vn=`precision mediump float; varying vec2 vUv; uniform sampler2D uTexture; @@ -559,12 +559,12 @@ void main() { ) / 9.0; gl_FragColor = outColor; -}`;const vn=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uResolution:{value:new n.Vector2(0,0)},uBlurSize:{value:1}},vertexShader:ln,fragmentShader:cn}),[]);return V(t,s,o),o},ee={texture:new n.Texture,blurSize:3,blurPower:5},fn=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=vn(u),l=b(t),v=a.useMemo(()=>({scene:u,camera:l,size:t,dpr:s,samples:o}),[u,l,t,s,o]),[f,r]=C(v),[c,p]=B(v),[m,d]=D(ee);return[a.useCallback((h,y)=>{const{gl:S}=h;y&&d(y),i(e,"uTexture",m.texture),i(e,"uResolution",[m.texture.source.data.width,m.texture.source.data.height]),i(e,"uBlurSize",m.blurSize);let w=p(S);const T=m.blurPower;for(let P=0;P{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uResolution:{value:new n.Vector2(0,0)},uBlurSize:{value:1}},vertexShader:cn,fragmentShader:vn}),[]);return U(t,s,o),o},te={texture:new n.Texture,blurSize:3,blurPower:5},dn=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=fn(a),l=R(t),v=u.useMemo(()=>({scene:a,camera:l,size:t,dpr:s,samples:o}),[a,l,t,s,o]),[f,r]=D(v),[c,m]=O(v),[p,d]=b(te);return[u.useCallback((h,y)=>{const{gl:M}=h;y&&d(y),i(e,"uTexture",p.texture),i(e,"uResolution",[p.texture.source.data.width,p.texture.source.data.height]),i(e,"uBlurSize",p.blurSize);let C=m(M);const T=p.blurPower;for(let P=0;P{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uEpicenter:{value:new n.Vector2(0,0)},uProgress:{value:0},uStrength:{value:0},uWidth:{value:0},uMode:{value:0}},vertexShader:dn,fragmentShader:mn}),[]);return V(t,s,o),o},ne={epicenter:new n.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"},gn=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=pn(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o,isSizeUpdate:!0}),[r,c]=D(ne);return[a.useCallback((m,d)=>{const{gl:g}=m;return d&&c(d),i(e,"uEpicenter",r.epicenter),i(e,"uProgress",r.progress),i(e,"uWidth",r.width),i(e,"uStrength",r.strength),i(e,"uMode",r.mode==="center"?0:r.mode==="horizontal"?1:2),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]};var xn=`varying vec2 vUv; +}`;const gn=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uEpicenter:{value:new n.Vector2(0,0)},uProgress:{value:0},uStrength:{value:0},uWidth:{value:0},uMode:{value:0}},vertexShader:mn,fragmentShader:pn}),[]);return U(t,s,o),o},re={epicenter:new n.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"},xn=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=gn(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o,isSizeUpdate:!0}),[r,c]=b(re);return[u.useCallback((p,d)=>{const{gl:g}=p;return d&&c(d),i(e,"uEpicenter",r.epicenter),i(e,"uProgress",r.progress),i(e,"uWidth",r.width),i(e,"uStrength",r.strength),i(e,"uMode",r.mode==="center"?0:r.mode==="horizontal"?1:2),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]};var hn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,hn=`precision highp float; +}`,yn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -632,7 +632,7 @@ void main() { float brightness = dot(color,u_brightness); float alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0); gl_FragColor = vec4(color, alpha); -}`;const yn=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_brightness:{value:new n.Vector3},u_min:{value:0},u_max:{value:1}},vertexShader:xn,fragmentShader:hn}),[]);return V(t,s,o),o},te={texture:new n.Texture,brightness:new n.Vector3(.5,.5,.5),min:0,max:1},Mn=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=yn(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o}),[r,c]=D(te);return[a.useCallback((m,d)=>{const{gl:g}=m;return d&&c(d),i(e,"u_texture",r.texture),i(e,"u_brightness",r.brightness),i(e,"u_min",r.min),i(e,"u_max",r.max),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]};var Sn=`varying vec2 vUv; +}`;const Mn=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_brightness:{value:new n.Vector3},u_min:{value:0},u_max:{value:1}},vertexShader:hn,fragmentShader:yn}),[]);return U(t,s,o),o},oe={texture:new n.Texture,brightness:new n.Vector3(.5,.5,.5),min:0,max:1},Sn=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=Mn(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o}),[r,c]=b(oe);return[u.useCallback((p,d)=>{const{gl:g}=p;return d&&c(d),i(e,"u_texture",r.texture),i(e,"u_brightness",r.brightness),i(e,"u_min",r.min),i(e,"u_max",r.max),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]};var Tn=`varying vec2 vUv; void main() { vUv = uv; @@ -679,12 +679,12 @@ void main() { col = clamp(col, 0.0, 1.0); gl_FragColor = vec4(col, alpha); -}`;const Tn=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},isTexture:{value:!1},scale:{value:1},noise:{value:new n.Texture},noiseStrength:{value:new n.Vector2(0,0)},isNoise:{value:!1},laminateLayer:{value:1},laminateInterval:{value:new n.Vector2(.1,.1)},laminateDetail:{value:new n.Vector2(1,1)},distortion:{value:new n.Vector2(0,0)},colorFactor:{value:new n.Vector3(1,1,1)},uTime:{value:0},timeStrength:{value:new n.Vector2(0,0)}},vertexShader:Sn,fragmentShader:wn}),[]);return V(t,s,o),o},re={texture:!1,scale:1,laminateLayer:1,laminateInterval:new n.Vector2(.1,.1),laminateDetail:new n.Vector2(1,1),distortion:new n.Vector2(0,0),colorFactor:new n.Vector3(1,1,1),timeStrength:new n.Vector2(0,0),noise:!1,noiseStrength:new n.Vector2(0,0)},_n=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=Tn(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o}),[r,c]=D(re);return[a.useCallback((m,d)=>{const{gl:g,clock:h}=m;return d&&c(d),r.texture?(i(e,"uTexture",r.texture),i(e,"isTexture",!0)):(i(e,"isTexture",!1),i(e,"scale",r.scale)),r.noise?(i(e,"noise",r.noise),i(e,"isNoise",!0),i(e,"noiseStrength",r.noiseStrength)):i(e,"isNoise",!1),i(e,"uTime",h.getElapsedTime()),i(e,"laminateLayer",r.laminateLayer),i(e,"laminateInterval",r.laminateInterval),i(e,"laminateDetail",r.laminateDetail),i(e,"distortion",r.distortion),i(e,"colorFactor",r.colorFactor),i(e,"timeStrength",r.timeStrength),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]};var Rn=`varying vec2 vUv; +}`;const _n=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},isTexture:{value:!1},scale:{value:1},noise:{value:new n.Texture},noiseStrength:{value:new n.Vector2(0,0)},isNoise:{value:!1},laminateLayer:{value:1},laminateInterval:{value:new n.Vector2(.1,.1)},laminateDetail:{value:new n.Vector2(1,1)},distortion:{value:new n.Vector2(0,0)},colorFactor:{value:new n.Vector3(1,1,1)},uTime:{value:0},timeStrength:{value:new n.Vector2(0,0)}},vertexShader:Tn,fragmentShader:wn}),[]);return U(t,s,o),o},ue={texture:!1,scale:1,laminateLayer:1,laminateInterval:new n.Vector2(.1,.1),laminateDetail:new n.Vector2(1,1),distortion:new n.Vector2(0,0),colorFactor:new n.Vector3(1,1,1),timeStrength:new n.Vector2(0,0),noise:!1,noiseStrength:new n.Vector2(0,0)},Rn=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=_n(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o}),[r,c]=b(ue);return[u.useCallback((p,d)=>{const{gl:g,clock:h}=p;return d&&c(d),r.texture?(i(e,"uTexture",r.texture),i(e,"isTexture",!0)):(i(e,"isTexture",!1),i(e,"scale",r.scale)),r.noise?(i(e,"noise",r.noise),i(e,"isNoise",!0),i(e,"noiseStrength",r.noiseStrength)):i(e,"isNoise",!1),i(e,"uTime",h.getElapsedTime()),i(e,"laminateLayer",r.laminateLayer),i(e,"laminateInterval",r.laminateInterval),i(e,"laminateDetail",r.laminateDetail),i(e,"distortion",r.distortion),i(e,"colorFactor",r.colorFactor),i(e,"timeStrength",r.timeStrength),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]};var bn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,bn=`precision highp float; +}`,Dn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -702,5 +702,5 @@ void main() { uv = (uv + 1.0) / 2.0; gl_FragColor = texture2D(u_texture, uv); -}`;const Dn=t=>{const s=a.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=a.useMemo(()=>new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_map:{value:new n.Texture},u_mapIntensity:{value:0}},vertexShader:Rn,fragmentShader:bn}),[]);return V(t,s,o),o},oe={texture:new n.Texture,map:new n.Texture,mapIntensity:.3},Cn=({size:t,dpr:s,samples:o=0})=>{const u=a.useMemo(()=>new n.Scene,[]),e=Dn(u),l=b(t),[v,f]=C({scene:u,camera:l,size:t,dpr:s,samples:o}),[r,c]=D(oe);return[a.useCallback((m,d)=>{const{gl:g}=m;return d&&c(d),i(e,"u_texture",r.texture),i(e,"u_map",r.map),i(e,"u_mapIntensity",r.mapIntensity),f(g)},[f,e,c,r]),c,{scene:u,material:e,camera:l,renderTarget:v,output:v.texture}]},Pn=({scene:t,camera:s,size:o,dpr:u=!1,isSizeUpdate:e=!1,samples:l=0,depthBuffer:v=!1,depthTexture:f=!1},r)=>{const c=a.useRef([]),p=F(o,u);c.current=a.useMemo(()=>Array.from({length:r},()=>{const d=new n.WebGLRenderTarget(p.x,p.y,{...N,samples:l,depthBuffer:v});return f&&(d.depthTexture=new n.DepthTexture(p.x,p.y,n.FloatType)),d}),[r]),a.useLayoutEffect(()=>{e&&c.current.forEach(d=>d.setSize(p.x,p.y))},[p,e]),a.useEffect(()=>{const d=c.current;return()=>{d.forEach(g=>g.dispose())}},[r]);const m=a.useCallback((d,g,h)=>{const y=c.current[g];return k({gl:d,scene:t,camera:s,fbo:y,onBeforeRender:()=>h&&h({read:y.texture})}),y.texture},[t,s]);return[c.current,m]};x.BLENDING_PARAMS=Y,x.BRIGHTNESSPICKER_PARAMS=te,x.BRUSH_PARAMS=X,x.COLORSTRATA_PARAMS=re,x.DOMSYNCER_PARAMS=Q,x.DUOTONE_PARAMS=H,x.FLUID_PARAMS=q,x.FXBLENDING_PARAMS=oe,x.FXTEXTURE_PARAMS=Z,x.NOISE_PARAMS=J,x.RIPPLE_PARAMS=K,x.SIMPLEBLUR_PARAMS=ee,x.WAVE_PARAMS=ne,x.setUniform=i,x.useAddMesh=V,x.useBlending=we,x.useBrightnessPicker=Mn,x.useBrush=me,x.useCamera=b,x.useColorStrata=_n,x.useCopyTexture=Pn,x.useDomSyncer=sn,x.useDoubleFBO=B,x.useDuoTone=he,x.useFluid=ke,x.useFxBlending=Cn,x.useFxTexture=Ye,x.useNoise=Je,x.useParams=D,x.usePointer=$,x.useResolution=F,x.useRipple=Ge,x.useSimpleBlur=fn,x.useSingleFBO=C,x.useWave=gn,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})}); +}`;const Cn=t=>{const s=u.useMemo(()=>new n.PlaneGeometry(2,2),[]),o=u.useMemo(()=>new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_map:{value:new n.Texture},u_mapIntensity:{value:0}},vertexShader:bn,fragmentShader:Dn}),[]);return U(t,s,o),o},ae={texture:new n.Texture,map:new n.Texture,mapIntensity:.3},Pn=({size:t,dpr:s,samples:o=0})=>{const a=u.useMemo(()=>new n.Scene,[]),e=Cn(a),l=R(t),[v,f]=D({scene:a,camera:l,size:t,dpr:s,samples:o}),[r,c]=b(ae);return[u.useCallback((p,d)=>{const{gl:g}=p;return d&&c(d),i(e,"u_texture",r.texture),i(e,"u_map",r.map),i(e,"u_mapIntensity",r.mapIntensity),f(g)},[f,e,c,r]),c,{scene:a,material:e,camera:l,renderTarget:v,output:v.texture}]},Vn=({scene:t,camera:s,size:o,dpr:a=!1,isSizeUpdate:e=!1,samples:l=0,depthBuffer:v=!1,depthTexture:f=!1},r)=>{const c=u.useRef([]),m=B(o,a);c.current=u.useMemo(()=>Array.from({length:r},()=>{const d=new n.WebGLRenderTarget(m.x,m.y,{...N,samples:l,depthBuffer:v});return f&&(d.depthTexture=new n.DepthTexture(m.x,m.y,n.FloatType)),d}),[r]),u.useLayoutEffect(()=>{e&&c.current.forEach(d=>d.setSize(m.x,m.y))},[m,e]),u.useEffect(()=>{const d=c.current;return()=>{d.forEach(g=>g.dispose())}},[r]);const p=u.useCallback((d,g,h)=>{const y=c.current[g];return G({gl:d,scene:t,camera:s,fbo:y,onBeforeRender:()=>h&&h({read:y.texture})}),y.texture},[t,s]);return[c.current,p]};x.BLENDING_PARAMS=K,x.BRIGHTNESSPICKER_PARAMS=oe,x.BRUSH_PARAMS=Y,x.COLORSTRATA_PARAMS=ue,x.DOMSYNCER_PARAMS=ne,x.DUOTONE_PARAMS=q,x.FLUID_PARAMS=Z,x.FXBLENDING_PARAMS=ae,x.FXTEXTURE_PARAMS=Q,x.NOISE_PARAMS=ee,x.RIPPLE_PARAMS=J,x.SIMPLEBLUR_PARAMS=te,x.WAVE_PARAMS=re,x.setUniform=i,x.useAddMesh=U,x.useBlending=we,x.useBrightnessPicker=Sn,x.useBrush=pe,x.useCamera=R,x.useColorStrata=Rn,x.useCopyTexture=Vn,x.useDomSyncer=ln,x.useDoubleFBO=O,x.useDuoTone=ye,x.useFluid=je,x.useFxBlending=Pn,x.useFxTexture=qe,x.useNoise=Qe,x.useParams=b,x.usePointer=$,x.useResolution=B,x.useRipple=We,x.useSimpleBlur=dn,x.useSingleFBO=D,x.useWave=xn,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})}); //# sourceMappingURL=use-shader-fx.umd.cjs.map diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map index 51b22d15..df7e0f98 100644 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map @@ -1 +1 @@ -{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/hooks/useBrush/shader/main.vert","../src/hooks/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/hooks/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/utils/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/hooks/useBrush/index.ts","../src/hooks/useDuoTone/shader/main.vert","../src/hooks/useDuoTone/shader/main.frag","../src/hooks/useDuoTone/useMesh.ts","../src/hooks/useDuoTone/index.ts","../src/hooks/useBlending/shader/main.vert","../src/hooks/useBlending/shader/main.frag","../src/hooks/useBlending/useMesh.ts","../src/hooks/useBlending/index.ts","../src/hooks/useFluid/shaders/main.vert","../src/hooks/useFluid/shaders/init.frag","../src/hooks/useFluid/materials/useInitialMaterial.ts","../src/hooks/useFluid/shaders/advection.frag","../src/hooks/useFluid/materials/useAdvectionMaterial.ts","../src/hooks/useFluid/shaders/divergence.frag","../src/hooks/useFluid/materials/useDivergenceMaterial.ts","../src/hooks/useFluid/shaders/pressure.frag","../src/hooks/useFluid/materials/usePressureMaterial.ts","../src/hooks/useFluid/shaders/curl.frag","../src/hooks/useFluid/materials/useCurlMaterial.ts","../src/hooks/useFluid/shaders/vorticity.frag","../src/hooks/useFluid/materials/useVorticityMaterial.ts","../src/hooks/useFluid/shaders/clear.frag","../src/hooks/useFluid/materials/useClearMaterial.ts","../src/hooks/useFluid/shaders/gradientSubtract.frag","../src/hooks/useFluid/materials/useGradientSubtractMaterial.ts","../src/hooks/useFluid/shaders/splat.frag","../src/hooks/useFluid/materials/useSplatMaterial.ts","../src/hooks/useFluid/useMesh.ts","../src/hooks/useFluid/index.ts","../src/hooks/useRipple/useMesh.ts","../src/hooks/useRipple/index.ts","../src/hooks/useFxTexture/shader/main.vert","../src/hooks/useFxTexture/shader/main.frag","../src/hooks/useFxTexture/useMesh.ts","../src/hooks/useFxTexture/index.ts","../src/hooks/useNoise/shader/main.vert","../src/hooks/useNoise/shader/main.frag","../src/hooks/useNoise/useMesh.ts","../src/hooks/useNoise/index.ts","../src/libs/constants.ts","../src/hooks/useDomSyncer/utils/errorHandler.ts","../src/hooks/useDomSyncer/shader/main.vert","../src/hooks/useDomSyncer/shader/main.frag","../src/hooks/useDomSyncer/utils/createMesh.ts","../src/hooks/useDomSyncer/utils/useIntersectionHandler.ts","../src/hooks/useDomSyncer/utils/useUpdateDomRect.ts","../src/hooks/useDomSyncer/utils/useIsIntersecting.ts","../src/hooks/useDomSyncer/utils/createUseDomView.ts","../src/hooks/useDomSyncer/index.ts","../src/hooks/useSimpleBlur/shader/main.vert","../src/hooks/useSimpleBlur/shader/main.frag","../src/hooks/useSimpleBlur/useMesh.ts","../src/hooks/useSimpleBlur/index.ts","../src/hooks/useWave/shader/main.vert","../src/hooks/useWave/shader/main.frag","../src/hooks/useWave/useMesh.ts","../src/hooks/useWave/index.ts","../src/hooks/useBrightnessPicker/shader/main.vert","../src/hooks/useBrightnessPicker/shader/main.frag","../src/hooks/useBrightnessPicker/useMesh.ts","../src/hooks/useBrightnessPicker/index.ts","../src/hooks/useColorStrata/shader/main.vert","../src/hooks/useColorStrata/shader/main.frag","../src/hooks/useColorStrata/useMesh.ts","../src/hooks/useColorStrata/index.ts","../src/hooks/useFxBlending/shader/main.vert","../src/hooks/useFxBlending/shader/main.frag","../src/hooks/useFxBlending/useMesh.ts","../src/hooks/useFxBlending/index.ts","../src/utils/useCopyTexture.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uMap;\nuniform sampler2D uTexture;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform float uAspect;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float width, float aspect) {\n\t// make circle\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\t// unit vector in direction\n\tvec2 dir = normalize(end - start);\n\t\n\t// unit vector perpendicular to the line segment\n\tvec2 n = vec2(dir.y, -dir.x);\n\n\tvec2 p0 = point - start;\n\t\n\t// calculate distance on a line\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\t// Include the radius of the circle at the start and end points in the range\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < width && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < width || distFromEnd < width;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\t// Scale offset to texture size\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.0);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uMap, vUv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec4 baseColor, vec2 velocity, float motion, int samples) {\n\tvec4 motionBlurredColor = baseColor;\n\tvec2 scaledVelocity = velocity * motion;\n\tfor(int i = 1; i < samples; i++) {\n\t\tfloat t = float(i) / float(samples - 1);\n\t\tvec2 offset = t * scaledVelocity / uResolution;\n\t\tmotionBlurredColor += texture2D(uMap, vUv + offset);\n\t}\n\treturn motionBlurredColor / float(samples);\n}\n\n\nvoid main() {\n\t// Convert UV coordinates to range [-1, 1]\n\tvec2 st = vUv * 2.0 - 1.0;\n\t\n\t// velocity vector\n\tvec2 velocity = uVelocity * uResolution;\n\n\t// add smudge\n\tvec4 smudgedColor = createSmudge();\n\t\n\t// add motion blur\n\tvec4 motionBlurredColor = createMotionBlur(smudgedColor, velocity, uMotionBlur,uMotionSample);\n\n\tvec4 bufferColor = motionBlurredColor * uDissipation;\n\n\t// radius\n\tfloat modifiedRadius = max(0.0,uRadius);\n\n\t//\tcolor \n\tvec3 color = uColor;\n\n\t// map texture to color\n\tvec4 textureColor = texture2D(uTexture, vUv);\n\tvec3 finalColor = mix(color, textureColor.rgb, textureColor.a);\n\n\tfloat onLine = isOnLine(st, uPrevMouse, uMouse, modifiedRadius, uAspect);\n\tbufferColor.rgb = mix(bufferColor.rgb, finalColor, onLine);\n\t\n\tgl_FragColor = vec4(bufferColor.rgb,1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uMap: { value: THREE.Texture };\n uResolution: { value: THREE.Texture };\n uAspect: { value: number };\n uTexture: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uMap: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uAspect: { value: 0.0 },\n uTexture: { value: new THREE.Texture() },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(0, 0) },\n uPrevMouse: { value: new THREE.Vector2(0, 0) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Color(0xffffff) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uAspect\", resolution.width / resolution.height);\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as BrushMaterial;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\n/** When given the pointer vector2 from r3f's RootState, it generates an update function that returns {currentPointer, prevPointer, diffPointer, isVelocityUpdate, velocity}. */\nexport const usePointer = (): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback((currentPointer: THREE.Vector2) => {\n const now = performance.now();\n const current = currentPointer.clone();\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current ? prevPointer.current.clone() : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n }, []);\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush.Mixed with the value of a , default:THREE.Texture() */\n texture?: THREE.Texture;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , default:THREE.Color(0xffffff) */\n color?: THREE.Color;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: new THREE.Texture(),\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Color(0xffffff),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n setUniform(material, \"uColor\", params.color!);\n\n const { currentPointer, prevPointer, velocity } =\n updatePointer(pointer);\n setUniform(material, \"uMouse\", currentPointer);\n setUniform(material, \"uPrevMouse\", prevPointer);\n setUniform(material, \"uVelocity\", velocity);\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uMap\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as DuoToneMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { UseFboProps } from \"../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const { currentPointer, diffPointer, isVelocityUpdate, velocity } =\n updatePointer(pointer);\n if (isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(materials.splatMaterial, \"point\", currentPointer);\n const scaledDiff = diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture ?? null,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const { currentPointer, diffPointer } = updatePointer(pointer);\n if (params.frequency! < diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n currentPointer.x * (size.width / 2),\n currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class TransitionBgMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n material.uniforms.uResolution.value = resolution.clone();\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as TransitionBgMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** background texture resolution , default:THREE.Vector2(0, 0) */\n textureResolution?: THREE.Vector2;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n textureResolution: new THREE.Vector2(0, 0),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n setUniform(material, \"uTextureResolution\", params.textureResolution!);\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"progress\", params.progress!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import { DomSyncerParams } from \"..\";\nimport { ISDEV } from \"../../../libs/constants\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n const resolutionLength = params.resolution?.length;\n\n if (!domLength || !textureLength || !resolutionLength) {\n ISDEV && console.warn(\"No dom or texture or resolution is set\");\n return false;\n }\n\n if (domLength !== textureLength || domLength !== resolutionLength) {\n ISDEV && console.warn(\"not Match dom , texture and resolution length\");\n return false;\n }\n\n return true;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: { value: new THREE.Vector2(0, 0) },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\nimport { ISDEV } from \"../../../libs/constants\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n ISDEV && console.warn(\"DOM is null.\");\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(\n material,\n \"u_textureResolution\",\n params.resolution![i]\n );\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** Texture resolution array to pass */\n resolution?: THREE.Vector2[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n resolution: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams(DOMSYNCER_PARAMS);\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (errorHandler(params)) {\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: { \n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0,0) },\n uBlurSize: { value: 1, }\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture: THREE.Texture;\n /** blurSize, default:3 */\n blurSize: number;\n /** blurPower, affects performance default:5 */\n blurPower: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"uResolution\", [\n params.texture.source.data.width,\n params.texture.source.data.height,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BrightnessPickerMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n return material as ColorStrataMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:null */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","prevPointer","useRef","diffPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","props","pointer","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","isVelocityUpdate","scaledDiff","color","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","FXTEXTURE_PARAMS","useFxTexture","NOISE_PARAMS","useNoise","ISDEV","errorHandler","domLength","textureLength","resolutionLength","_c","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","index","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","intersectionHandler","useDomView","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","COLORSTRATA_PARAMS","useColorStrata","FXBLENDING_PARAMS","useFxBlending","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/hooks/useBrush/shader/main.vert","../src/hooks/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/useAddMesh.ts","../src/utils/setUniforms.ts","../src/hooks/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/utils/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/hooks/useBrush/index.ts","../src/hooks/useDuoTone/shader/main.vert","../src/hooks/useDuoTone/shader/main.frag","../src/hooks/useDuoTone/useMesh.ts","../src/hooks/useDuoTone/index.ts","../src/hooks/useBlending/shader/main.vert","../src/hooks/useBlending/shader/main.frag","../src/hooks/useBlending/useMesh.ts","../src/hooks/useBlending/index.ts","../src/hooks/useFluid/shaders/main.vert","../src/hooks/useFluid/shaders/init.frag","../src/hooks/useFluid/materials/useInitialMaterial.ts","../src/hooks/useFluid/shaders/advection.frag","../src/hooks/useFluid/materials/useAdvectionMaterial.ts","../src/hooks/useFluid/shaders/divergence.frag","../src/hooks/useFluid/materials/useDivergenceMaterial.ts","../src/hooks/useFluid/shaders/pressure.frag","../src/hooks/useFluid/materials/usePressureMaterial.ts","../src/hooks/useFluid/shaders/curl.frag","../src/hooks/useFluid/materials/useCurlMaterial.ts","../src/hooks/useFluid/shaders/vorticity.frag","../src/hooks/useFluid/materials/useVorticityMaterial.ts","../src/hooks/useFluid/shaders/clear.frag","../src/hooks/useFluid/materials/useClearMaterial.ts","../src/hooks/useFluid/shaders/gradientSubtract.frag","../src/hooks/useFluid/materials/useGradientSubtractMaterial.ts","../src/hooks/useFluid/shaders/splat.frag","../src/hooks/useFluid/materials/useSplatMaterial.ts","../src/hooks/useFluid/useMesh.ts","../src/hooks/useFluid/index.ts","../src/hooks/useRipple/useMesh.ts","../src/hooks/useRipple/index.ts","../src/hooks/useFxTexture/shader/main.vert","../src/hooks/useFxTexture/shader/main.frag","../src/hooks/useFxTexture/useMesh.ts","../src/hooks/useFxTexture/index.ts","../src/hooks/useNoise/shader/main.vert","../src/hooks/useNoise/shader/main.frag","../src/hooks/useNoise/useMesh.ts","../src/hooks/useNoise/index.ts","../src/libs/constants.ts","../src/hooks/useDomSyncer/utils/errorHandler.ts","../src/hooks/useDomSyncer/shader/main.vert","../src/hooks/useDomSyncer/shader/main.frag","../src/hooks/useDomSyncer/utils/createMesh.ts","../src/hooks/useDomSyncer/utils/useIntersectionHandler.ts","../src/hooks/useDomSyncer/utils/useUpdateDomRect.ts","../src/hooks/useDomSyncer/utils/useIsIntersecting.ts","../src/hooks/useDomSyncer/utils/createUseDomView.ts","../src/hooks/useDomSyncer/index.ts","../src/hooks/useSimpleBlur/shader/main.vert","../src/hooks/useSimpleBlur/shader/main.frag","../src/hooks/useSimpleBlur/useMesh.ts","../src/hooks/useSimpleBlur/index.ts","../src/hooks/useWave/shader/main.vert","../src/hooks/useWave/shader/main.frag","../src/hooks/useWave/useMesh.ts","../src/hooks/useWave/index.ts","../src/hooks/useBrightnessPicker/shader/main.vert","../src/hooks/useBrightnessPicker/shader/main.frag","../src/hooks/useBrightnessPicker/useMesh.ts","../src/hooks/useBrightnessPicker/index.ts","../src/hooks/useColorStrata/shader/main.vert","../src/hooks/useColorStrata/shader/main.frag","../src/hooks/useColorStrata/useMesh.ts","../src/hooks/useColorStrata/index.ts","../src/hooks/useFxBlending/shader/main.vert","../src/hooks/useFxBlending/shader/main.frag","../src/hooks/useFxBlending/useMesh.ts","../src/hooks/useFxBlending/index.ts","../src/utils/useCopyTexture.ts"],"sourcesContent":["varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nuniform sampler2D uMap;\nuniform sampler2D uTexture;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform float uAspect;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float width, float aspect) {\n\t// make circle\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\t// unit vector in direction\n\tvec2 dir = normalize(end - start);\n\t\n\t// unit vector perpendicular to the line segment\n\tvec2 n = vec2(dir.y, -dir.x);\n\n\tvec2 p0 = point - start;\n\t\n\t// calculate distance on a line\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\t// Include the radius of the circle at the start and end points in the range\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < width && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < width || distFromEnd < width;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(){\n\tvec2 offsets[9];\n\toffsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1);\n\toffsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0);\n\toffsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1);\n\t// Scale offset to texture size\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.0);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uMap, vUv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec4 baseColor, vec2 velocity, float motion, int samples) {\n\tvec4 motionBlurredColor = baseColor;\n\tvec2 scaledVelocity = velocity * motion;\n\tfor(int i = 1; i < samples; i++) {\n\t\tfloat t = float(i) / float(samples - 1);\n\t\tvec2 offset = t * scaledVelocity / uResolution;\n\t\tmotionBlurredColor += texture2D(uMap, vUv + offset);\n\t}\n\treturn motionBlurredColor / float(samples);\n}\n\n\nvoid main() {\n\t// Convert UV coordinates to range [-1, 1]\n\tvec2 st = vUv * 2.0 - 1.0;\n\t\n\t// velocity vector\n\tvec2 velocity = uVelocity * uResolution;\n\n\t// add smudge\n\tvec4 smudgedColor = createSmudge();\n\t\n\t// add motion blur\n\tvec4 motionBlurredColor = createMotionBlur(smudgedColor, velocity, uMotionBlur,uMotionSample);\n\n\tvec4 bufferColor = motionBlurredColor * uDissipation;\n\n\t// radius\n\tfloat modifiedRadius = max(0.0,uRadius);\n\n\t//\tcolor \n\tvec3 color = uColor;\n\n\t// map texture to color\n\tvec4 textureColor = texture2D(uTexture, vUv);\n\tvec3 finalColor = mix(color, textureColor.rgb, textureColor.a);\n\n\tfloat onLine = isOnLine(st, uPrevMouse, uMouse, modifiedRadius, uAspect);\n\tbufferColor.rgb = mix(bufferColor.rgb, finalColor, onLine);\n\t\n\tgl_FragColor = vec4(bufferColor.rgb,1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\n/**\n * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr.\n */\nexport const useResolution = (size: Size, dpr: number | false = false) => {\n const _width = dpr ? size.width * dpr : size.width;\n const _height = dpr ? size.height * dpr : size.height;\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(\n () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (\n material.uniforms &&\n material.uniforms[key] &&\n value !== undefined &&\n value !== null\n ) {\n material.uniforms[key].value = value;\n } else {\n console.error(\n `Uniform key \"${String(\n key\n )}\" does not exist in the material. or \"${String(\n key\n )}\" is null | undefined`\n );\n }\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useEffect, useMemo } from \"react\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uMap: { value: THREE.Texture };\n uResolution: { value: THREE.Texture };\n uAspect: { value: number };\n uTexture: { value: THREE.Texture };\n uRadius: { value: number };\n uSmudge: { value: number };\n uDissipation: { value: number };\n uMotionBlur: { value: number };\n uMotionSample: { value: number };\n uMouse: { value: number };\n uPrevMouse: { value: number };\n uVelocity: { value: number };\n uColor: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uMap: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uAspect: { value: 0.0 },\n uTexture: { value: new THREE.Texture() },\n uRadius: { value: 0.0 },\n uSmudge: { value: 0.0 },\n uDissipation: { value: 0.0 },\n uMotionBlur: { value: 0.0 },\n uMotionSample: { value: 0 },\n uMouse: { value: new THREE.Vector2(0, 0) },\n uPrevMouse: { value: new THREE.Vector2(0, 0) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Color(0xffffff) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uAspect\", resolution.width / resolution.height);\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as BrushMaterial;\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (size: Size) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(\n () =>\n new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n ),\n [width, height, near, far]\n );\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\n/** When given the pointer vector2 from r3f's RootState, it generates an update function that returns {currentPointer, prevPointer, diffPointer, isVelocityUpdate, velocity}. */\nexport const usePointer = (): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback((currentPointer: THREE.Vector2) => {\n const now = performance.now();\n const current = currentPointer.clone();\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current ? prevPointer.current.clone() : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n }, []);\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype UseParamsReturn = [T, (params: Partial) => void];\n\n/**\n * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it.\n */\nexport const useParams = (params: T): UseParamsReturn => {\n const isContainsFunctions = (obj: object): boolean =>\n Object.values(obj).some((value) => typeof value === \"function\");\n const paramsRef = useRef(\n isContainsFunctions(params) ? params : structuredClone(params)\n );\n\n const setParams = useCallback((updateParams: Partial) => {\n for (const key in updateParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n updateParams[paramKey] !== undefined &&\n updateParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = updateParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type BrushParams = {\n /** Texture applied to the brush.Mixed with the value of a , default:THREE.Texture() */\n texture?: THREE.Texture;\n /** size of the stamp, percentage of the size ,default:0.05 */\n radius?: number;\n /** Strength of smudge effect , default:0.0*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. ,default:1.0 */\n dissipation?: number;\n /** Strength of motion blur , default:0.0 */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default: 5 */\n motionSample?: number;\n /** brush color , default:THREE.Color(0xffffff) */\n color?: THREE.Color;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = {\n texture: new THREE.Texture(),\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Color(0xffffff),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uRadius\", params.radius!);\n setUniform(material, \"uSmudge\", params.smudge!);\n setUniform(material, \"uDissipation\", params.dissipation!);\n setUniform(material, \"uMotionBlur\", params.motionBlur!);\n setUniform(material, \"uMotionSample\", params.motionSample!);\n setUniform(material, \"uColor\", params.color!);\n\n const { currentPointer, prevPointer, velocity } =\n updatePointer(pointer);\n setUniform(material, \"uMouse\", currentPointer);\n setUniform(material, \"uPrevMouse\", prevPointer);\n setUniform(material, \"uVelocity\", velocity);\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uMap\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uColor0: { value: new THREE.Color(0xffffff) },\n uColor1: { value: new THREE.Color(0x000000) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as DuoToneMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { DuoToneMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = {\n texture: new THREE.Texture(),\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float u_mapIntensity;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\nuniform vec3 u_dodgeColor;\nuniform bool u_isDodgeColor;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t// fx blending\n\tvec3 mapColor = texture2D(u_map, uv).rgb;\n\tvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\t// colro blending\n\tfloat brightness = dot(mapColor,u_brightness);\n\tvec4 textureMap = texture2D(u_texture, uv);\n\tfloat blendValue = smoothstep(u_min, u_max, brightness);\n\n\t// set dodge color\n\tvec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor;\n\tvec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb;\n\t\n\t// alpha blending\n\tfloat alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a;\n\tfloat mixValue = u_isAlphaMap ? alpha : 0.0;\n\tvec3 alphColor = mix(outputColor,mapColor,mixValue);\n\n\tgl_FragColor = vec4(alphColor, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n u_mapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_alphaMap: { value: new THREE.Texture() },\n u_isAlphaMap: { value: false },\n u_mapIntensity: { value: 0.0 },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 0.9 },\n u_dodgeColor: { value: new THREE.Color(0xffffff) },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n /** Alpha blending is performed using the alpha of the set texture. , default:false */\n alphaMap?: THREE.Texture | false;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n /** If set, this value will apply color dodge , default: false */\n dodgeColor?: THREE.Color | false;\n};\n\nexport type BlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLENDING_PARAMS: BlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n};\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n }),\n []\n );\n\n return initialMaterial as THREE.ShaderMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float dissipation;\n\nvoid main () {\n\tvec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\tgl_FragColor = dissipation * texture2D(uSource, coord);\n\tgl_FragColor.a = 1.0;\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: new THREE.Texture() },\n uSource: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: 0.0 },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as AdvectionMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvec2 sampleVelocity (in vec2 uv) {\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tif (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }\n\tif (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }\n\tif (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }\n\tif (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }\n\treturn multiplier * texture2D(uVelocity, uv).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = () => {\n const divergenceMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return divergenceMaterial as DivergenceMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = () => {\n const pressureMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = () => {\n const curlMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = () => {\n const vorticityMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: 0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = () => {\n const advectionMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return advectionMaterial as ClearMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvec2 boundary (in vec2 uv) {\n\tuv = min(max(uv, 0.0), 1.0);\n\treturn uv;\n}\n\nvoid main () {\n\tfloat L = texture2D(uPressure, boundary(vL)).x;\n\tfloat R = texture2D(uPressure, boundary(vR)).x;\n\tfloat T = texture2D(uPressure, boundary(vT)).x;\n\tfloat B = texture2D(uPressure, boundary(vB)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = () => {\n const gradientSubtractMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: new THREE.Texture() },\n uVelocity: { value: new THREE.Texture() },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplateMaterial = () => {\n const splatMaterial = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTarget: { value: new THREE.Texture() },\n aspectRatio: { value: 0 },\n color: { value: new THREE.Vector3() },\n point: { value: new THREE.Vector2() },\n radius: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplateMaterial } from \"./materials/useSplatMaterial\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\ntype TUseMeshReturnType = [FluidMaterials, (material: TMaterials) => void];\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}): TUseMeshReturnType => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const initialMaterial = useInitialMaterial();\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCurlMaterial();\n const vorticityMaterial = useVorticityMaterial();\n const advectionMaterial = useAdvectionMaterial();\n const divergenceMaterial = useDivergenceMaterial();\n const pressureMaterial = usePressureMaterial();\n const clearMaterial = useClearMaterial();\n const gradientSubtractMaterial = useGradientSubtractMaterial();\n const splatMaterial = useSplateMaterial();\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddMesh(scene, geometry, initialMaterial);\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return [materials, setMeshMaterial];\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { UseFboProps } from \"../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../utils/useDoubleFBO\";\n\nexport type FluidParams = {\n /** density disspation , default:0.98 */\n density_dissipation?: number;\n /** velocity dissipation , default:0.99 */\n velocity_dissipation?: number;\n /** velocity acceleration , default:10.0 */\n velocity_acceleration?: number;\n /** pressure dissipation , default:0.9 */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default:20 */\n pressure_iterations?: number;\n /** curl_strength , default:35 */\n curl_strength?: number;\n /** splat radius , default:0.002 */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default:THREE.Vector3(1.0, 1.0, 1.0) */\n fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = {\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const [materials, setMeshMaterial] = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const { currentPointer, diffPointer, isVelocityUpdate, velocity } =\n updatePointer(pointer);\n if (isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(materials.splatMaterial, \"point\", currentPointer);\n const scaledDiff = diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n setUniform(\n materials.splatMaterial,\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n setUniform(\n materials.splatMaterial,\n \"radius\",\n params.splat_radius!\n );\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n const color: THREE.Vector3 =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(velocity)\n : params.fluid_color!;\n setUniform(materials.splatMaterial, \"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n setUniform(materials.curlMaterial, \"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n setUniform(materials.vorticityMaterial, \"uVelocity\", read);\n setUniform(materials.vorticityMaterial, \"uCurl\", curlTex);\n setUniform(\n materials.vorticityMaterial,\n \"curl\",\n params.curl_strength!\n );\n setUniform(materials.vorticityMaterial, \"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n setUniform(materials.divergenceMaterial, \"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n setUniform(materials.clearMaterial, \"uTexture\", read);\n setUniform(\n materials.clearMaterial,\n \"value\",\n params.pressure_dissipation!\n );\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n setUniform(materials.pressureMaterial, \"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n setUniform(materials.pressureMaterial, \"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n setUniform(\n materials.gradientSubtractMaterial,\n \"uPressure\",\n pressureTexTemp\n );\n setUniform(materials.gradientSubtractMaterial, \"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n setParams,\n params,\n ]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n materials: materials,\n camera: camera,\n renderTarget: {\n velocity: velocityFBO,\n density: densityFBO,\n curl: curlFBO,\n divergence: divergenceFBO,\n pressure: pressureFBO,\n },\n output: densityFBO.read.texture,\n },\n ];\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(\n () =>\n new THREE.MeshBasicMaterial({\n map: texture ?? null,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n }),\n [texture]\n );\n\n useEffect(() => {\n for (let i = 0; i < max; i++) {\n const mesh = new THREE.Mesh(geometry.clone(), material.clone());\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n meshArr.current.push(mesh);\n }\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.current.forEach((mesh) => {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n scene.remove(mesh);\n });\n meshArr.current = [];\n };\n }, [scene]);\n\n return meshArr.current;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { usePointer } from \"../../utils/usePointer\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type RippleParams = {\n /** How often ripples appear,default:0.01 */\n frequency?: number;\n /** rotation rate,default:0.05 */\n rotation?: number;\n /** fadeout speed,default:0.9 */\n fadeout_speed?: number;\n /** scale rate,default:0.3 */\n scale?: number;\n /** alpha,default:0.6 */\n alpha?: number;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = {\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n};\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const { currentPointer, diffPointer } = updatePointer(pointer);\n if (params.frequency! < diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n currentPointer.x * (size.width / 2),\n currentPointer.y * (size.height / 2),\n 0\n );\n mesh.scale.x = mesh.scale.y = 0.0;\n (mesh.material as THREE.MeshBasicMaterial).opacity = params.alpha!;\n currentWave.current = (currentWave.current + 1) % max;\n }\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.MeshBasicMaterial;\n mesh.rotation.z += params.rotation!;\n material.opacity *= params.fadeout_speed!;\n mesh.scale.x =\n params.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n if (material.opacity < 0.002) mesh.visible = false;\n }\n });\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture0;\nuniform sampler2D uTexture1;\nuniform sampler2D uMap;\nuniform float mapIntensity;\nuniform float edgeIntensity;\nuniform float progress;\nuniform float dirX;\nuniform float dirY;\nuniform vec2 epicenter;\nuniform float padding;\n\nbool isInPaddingArea(vec2 uv) {\n return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding;\n}\n\nvoid main() {\n\tfloat screenAspect = uResolution.x / uResolution.y;\n\tfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\n\tvec2 aspectRatio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\tvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;\n\n\t// fx map\n\tvec2 map = texture2D(uMap, uv).rg;\n\tvec2 normalizedMap = map * 2.0 - 1.0;\n\n\t// multiply edge fx\n\tuv = uv * 2.0 - 1.0;\n\tuv *= map * distance(epicenter, uv) * edgeIntensity + 1.0;\n\tuv = (uv + 1.0) / 2.0;\n\n\t// padding\n\tif (isInPaddingArea(uv)) {\n\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\t\treturn;\n\t}\n\tvec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.;\n\n\t// centered uv\n\tvec2 centeredUV = paddedUV - vec2(0.5);\n\n\t// multiply map fx\n\tcenteredUV *= normalizedMap * map * mapIntensity + 1.0;\n\n\t// texture 0\n\tfloat xOffsetTexture0 = 0.5 - dirX * progress;\n\tfloat yOffsetTexture0 = 0.5 - dirY * progress;\n\tvec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV;\n\n\t//texture 1\n\tfloat xOffsetTexture1 = 0.5 + dirX * (1.0 - progress);\n\tfloat yOffsetTexture1 = 0.5 + dirY * (1.0 - progress);\n\tvec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV;\n\n\tvec4 color0 = texture2D(uTexture0, samplePosTexture0);\n\tvec4 color1 = texture2D(uTexture1, samplePosTexture1);\n\n\tgl_FragColor = mix(color0, color1, progress);\n\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class TransitionBgMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture0: { value: THREE.Texture };\n uTexture1: { value: THREE.Texture };\n padding: { value: number };\n uMap: { value: THREE.Texture };\n edgeIntensity: { value: number };\n mapIntensity: { value: number };\n epicenter: { value: THREE.Vector2 };\n progress: { value: number };\n dirX: { value: number };\n dirY: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: new THREE.Texture() },\n uTexture1: { value: new THREE.Texture() },\n padding: { value: 0.0 },\n uMap: { value: new THREE.Texture() },\n edgeIntensity: { value: 0.0 },\n mapIntensity: { value: 0.0 },\n epicenter: { value: new THREE.Vector2(0.0, 0.0) },\n progress: { value: 0.0 },\n dirX: { value: 0.0 },\n dirY: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n material.uniforms.uResolution.value = resolution.clone();\n }, [resolution, material]);\n\n useAddMesh(scene, geometry, material);\n\n return material as TransitionBgMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxTextureParams = {\n /** 1st texture , default:THREE.Texture() */\n texture0?: THREE.Texture;\n /** 2nd texture , default:THREE.Texture() */\n texture1?: THREE.Texture;\n /** background texture resolution , default:THREE.Vector2(0, 0) */\n textureResolution?: THREE.Vector2;\n /** add transparent padding, 0.0 ~ 1.0 , default:0.0 */\n padding?: number;\n /** The color map. The uv value is affected according to this rbg , default:THREE.Texture() */\n map?: THREE.Texture;\n /** intensity of map , r,g value are affecting , default:0.0 */\n mapIntensity?: number;\n /** Intensity of effect on edges , default:0.0 */\n edgeIntensity?: number;\n /** epicenter of fx, -1 ~ 1 , default:vec2(0.0,0.0)*/\n epicenter?: THREE.Vector2;\n /** Switch value to switch between texture0 and texture1 */\n progress?: number;\n /** direction of transition , default: THREE.Vector2(0, 0) */\n dir?: THREE.Vector2;\n};\n\nexport type FxTextureObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXTEXTURE_PARAMS: FxTextureParams = {\n texture0: new THREE.Texture(),\n texture1: new THREE.Texture(),\n textureResolution: new THREE.Vector2(0, 0),\n padding: 0.0,\n map: new THREE.Texture(),\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n setUniform(material, \"uTextureResolution\", params.textureResolution!);\n setUniform(material, \"padding\", params.padding!);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"mapIntensity\", params.mapIntensity!);\n setUniform(material, \"edgeIntensity\", params.edgeIntensity!);\n setUniform(material, \"epicenter\", params.epicenter!);\n setUniform(material, \"progress\", params.progress!);\n setUniform(material, \"dirX\", params.dir!.x);\n setUniform(material, \"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 0.0 },\n timeStrength: { value: 0.0 },\n noiseOctaves: { value: 0 },\n fbmOctaves: { value: 0 },\n warpOctaves: { value: 0 },\n warpDirection: { value: new THREE.Vector2() },\n warpStrength: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as NoiseMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type NoiseParams = {\n /** noise scale , default:0.004 */\n scale?: number;\n /** time factor default:0.3 */\n timeStrength?: number;\n /** noiseOctaves, affects performance default:2 */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default:2 */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default:2 */\n warpOctaves?: number;\n /** direction of domain warping , default:(2.0,2,0) */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default:8.0 */\n warpStrength?: number;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = {\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import { DomSyncerParams } from \"..\";\nimport { ISDEV } from \"../../../libs/constants\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n const resolutionLength = params.resolution?.length;\n\n if (!domLength || !textureLength || !resolutionLength) {\n ISDEV && console.warn(\"No dom or texture or resolution is set\");\n return false;\n }\n\n if (domLength !== textureLength || domLength !== resolutionLength) {\n ISDEV && console.warn(\"not Match dom , texture and resolution length\");\n return false;\n }\n\n return true;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\n\nexport class DomSyncerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_textureResolution: { value: THREE.Vector2 };\n u_resolution: { value: THREE.Vector2 };\n u_borderRadius: { value: number };\n };\n}\n\nexport const createMesh = ({\n params,\n size,\n scene,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n}) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(1, 1),\n new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: { value: new THREE.Vector2(0, 0) },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n },\n })\n );\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\nimport { ISDEV } from \"../../../libs/constants\";\n\ntype UpdateDomRect = ({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n size: Size;\n resolutionRef: React.MutableRefObject;\n scene: THREE.Scene;\n isIntersectingRef: React.MutableRefObject;\n}) => void;\n\ntype UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect];\n\nexport const useUpdateDomRect = (): UseUpdateDomRectReturn => {\n const domRects = useRef([]);\n\n const updateDomRects: UpdateDomRect = useCallback(\n ({ params, size, resolutionRef, scene, isIntersectingRef }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n ISDEV && console.warn(\"DOM is null.\");\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n setUniform(material, \"u_texture\", params.texture![i]);\n setUniform(\n material,\n \"u_textureResolution\",\n params.resolution![i]\n );\n setUniform(\n material,\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n setUniform(\n material,\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\n\nexport type DomSyncerParams = {\n /** DOM array you want to synchronize */\n dom?: (HTMLElement | Element | null)[];\n /** Texture array that you want to synchronize with the DOM rectangle */\n texture?: THREE.Texture[];\n /** Texture resolution array to pass */\n resolution?: THREE.Vector2[];\n /** default:0.0[] */\n boderRadius?: number[];\n /** the angle you want to rotate */\n rotation?: THREE.Euler[];\n /** Array of callback functions when crossed */\n onIntersect?: ((entry: IntersectionObserverEntry) => void)[];\n /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */\n updateKey?: Key;\n};\n\nexport type DomSyncerObject = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n /**\n * A function that returns a determination whether the DOM intersects or not.\n * The boolean will be updated after executing the onIntersect function.\n * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array.\n * @param once - If set to true, it will continue to return true once crossed.\n */\n isIntersecting: IsIntersecting;\n /** target's DOMRect[] */\n DOMRects: DOMRect[];\n /** target's intersetions boolean[] */\n intersections: boolean[];\n /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */\n useDomView: UseDomView;\n};\n\nexport const DOMSYNCER_PARAMS: DomSyncerParams = {\n texture: [],\n dom: [],\n resolution: [],\n boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n * @param defaultKey - Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.\n */\nexport const useDomSyncer = (\n { size, dpr, samples = 0 }: HooksProps,\n dependencies: React.DependencyList = [],\n defaultKey: Key\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: defaultKey,\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (refreshTrigger) {\n if (updateKey.current === params.updateKey) {\n return emptyTexture;\n } else {\n updateKey.current = params.updateKey!;\n }\n }\n\n if (errorHandler(params)) {\n if (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n updateDomRects({\n params,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","precision mediump float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision mediump float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\n\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: { \n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0,0) },\n uBlurSize: { value: 1, }\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as SampleMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture: THREE.Texture;\n /** blurSize, default:3 */\n blurSize: number;\n /** blurPower, affects performance default:5 */\n blurPower: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = {\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n};\n\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"uResolution\", [\n params.texture.source.data.width,\n params.texture.source.data.height,\n ]);\n setUniform(material, \"uBlurSize\", params.blurSize);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n const iterations = params.blurPower;\n for (let i = 0; i < iterations; i++) {\n setUniform(material, \"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\nimport { Size } from \"@react-three/fiber\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: new THREE.Vector2(0.0, 0.0) },\n uProgress: { value: 0.0 },\n uStrength: { value: 0.0 },\n uWidth: { value: 0.0 },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n\n return material as WaveMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { useParams } from \"../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../types\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default:vec2(0.0,0.0) */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default:0.0 */\n progress?: number;\n /** default:0.0 */\n width?: number;\n /** default:0.0 */\n strength?: number;\n /** default:center */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = {\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useWave = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: new THREE.Vector3() },\n u_min: { value: 0.0 },\n u_max: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as BrightnessPickerMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type BrightnessPickerParams = {\n /** pick brightness from this texture , default:THREE.Texture */\n texture?: THREE.Texture;\n /** default:(0.5,0.5,0.5) */\n brightness?: THREE.Vector3;\n /** default:0.0 */\n min?: number;\n /** default:1.0 */\n max?: number;\n};\n\nexport type BrightnessPickerObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = {\n texture: new THREE.Texture(),\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n isTexture: { value: false },\n scale: { value: 1.0 },\n noise: { value: new THREE.Texture() },\n noiseStrength: { value: new THREE.Vector2(0, 0) },\n isNoise: { value: false },\n laminateLayer: { value: 1.0 },\n laminateInterval: { value: new THREE.Vector2(0.1, 0.1) },\n laminateDetail: { value: new THREE.Vector2(1, 1) },\n distortion: { value: new THREE.Vector2(0, 0) },\n colorFactor: { value: new THREE.Vector3(1, 1, 1) },\n uTime: { value: 0 },\n timeStrength: { value: new THREE.Vector2(0, 0) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n\n useAddMesh(scene, geometry, material);\n return material as ColorStrataMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type ColorStrataParams = {\n /** default: null */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : 1 */\n scale?: number;\n /** default: 1.0 */\n laminateLayer?: number;\n /** default: (0.1, 0.1) */\n laminateInterval?: THREE.Vector2;\n /** default: (1.0, 1.0) */\n laminateDetail?: THREE.Vector2;\n /** default: (0.0, 0.0) */\n distortion?: THREE.Vector2;\n /** default: (1.0, 1.0,1.0) */\n colorFactor?: THREE.Vector3;\n /** default: (0.0, 0.0) */\n timeStrength?: THREE.Vector2;\n /** default:null */\n noise?: THREE.Texture | false;\n /** default : (0.0,0.0) */\n noiseStrength?: THREE.Vector2;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = {\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n};\n\n/**\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", clock.getElapsedTime());\n\n setUniform(material, \"laminateLayer\", params.laminateLayer!);\n setUniform(material, \"laminateInterval\", params.laminateInterval!);\n setUniform(material, \"laminateDetail\", params.laminateDetail!);\n setUniform(material, \"distortion\", params.distortion!);\n setUniform(material, \"colorFactor\", params.colorFactor!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D u_map;\nuniform float u_mapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 mapColor = texture2D(u_map, uv).rg;\n\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\n\tuv = uv * 2.0 - 1.0;\n\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), u_mapIntensity);\n\tuv = (uv + 1.0) / 2.0;\n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddMesh } from \"../../utils/useAddMesh\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_map: { value: THREE.Texture };\n u_mapIntensity: { value: number };\n };\n}\n\nexport const useMesh = (scene: THREE.Scene) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_map: { value: new THREE.Texture() },\n u_mapIntensity: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n );\n useAddMesh(scene, geometry, material);\n return material as FxBlendingMaterial;\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { setUniform } from \"../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../types\";\nimport { useParams } from \"../../utils/useParams\";\n\nexport type FxBlendingParams = {\n /** Make this texture Blending , default:THREE.Texture */\n texture?: THREE.Texture;\n /** map texture, default:THREE.Texture */\n map?: THREE.Texture;\n /** map strength , r,g value are affecting , default:0.3 */\n mapIntensity?: number;\n};\n\nexport type FxBlendingObject = {\n scene: THREE.Scene;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const FXBLENDING_PARAMS: FxBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n mapIntensity: 0.3,\n};\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/takuma-hmng8/use-shader-fx#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const material = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"./useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] -Receives the RenderTarget array as the first argument and the update function as the second argument. updateCopyTexture() receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","useAddMesh","scene","geometry","material","mesh","useEffect","setUniform","key","value","useMesh","vertexShader","fragmentShader","resolution","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","near","far","usePointer","prevPointer","useRef","diffPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","props","pointer","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplateMaterial","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","lastTime","scaledDiffVec","spaltVec","clock","dt","velocityTex","densityTex","isVelocityUpdate","scaledDiff","color","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","FXTEXTURE_PARAMS","useFxTexture","NOISE_PARAMS","useNoise","ISDEV","errorHandler","domLength","textureLength","resolutionLength","_c","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","index","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","defaultKey","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","SIMPLEBLUR_PARAMS","useSimpleBlur","_","updateTempTexture","_tempTexture","iterations","WAVE_PARAMS","useWave","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","COLORSTRATA_PARAMS","useColorStrata","FXBLENDING_PARAMS","useFxBlending","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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"} \ No newline at end of file diff --git a/packages/use-shader-fx/package-lock.json b/packages/use-shader-fx/package-lock.json index c2526cb7..1002b99f 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hmng8/use-shader-fx", - "version": "1.0.43", + "version": "1.0.44", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hmng8/use-shader-fx", - "version": "1.0.43", + "version": "1.0.44", "license": "MIT", "devDependencies": { "@types/node": "20.5.6", diff --git a/packages/use-shader-fx/package.json b/packages/use-shader-fx/package.json index c194e9c5..779d692d 100644 --- a/packages/use-shader-fx/package.json +++ b/packages/use-shader-fx/package.json @@ -1,6 +1,6 @@ { "name": "@hmng8/use-shader-fx", - "version": "1.0.43", + "version": "1.0.44", "description": "The only difficult part is coding the shaders", "main": "./build/use-shader-fx.umd.cjs", "module": "./build/use-shader-fx.js", diff --git a/packages/use-shader-fx/src/hooks/useDomSyncer/index.ts b/packages/use-shader-fx/src/hooks/useDomSyncer/index.ts index 0ac807a1..043779f7 100644 --- a/packages/use-shader-fx/src/hooks/useDomSyncer/index.ts +++ b/packages/use-shader-fx/src/hooks/useDomSyncer/index.ts @@ -1,5 +1,5 @@ import * as THREE from "three"; -import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState, Key } from "react"; import { useCamera } from "../../utils/useCamera"; import { RootState } from "@react-three/fiber"; import { useSingleFBO } from "../../utils/useSingleFBO"; @@ -25,6 +25,8 @@ export type DomSyncerParams = { rotation?: THREE.Euler[]; /** Array of callback functions when crossed */ onIntersect?: ((entry: IntersectionObserverEntry) => void)[]; + /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */ + updateKey?: Key; }; export type DomSyncerObject = { @@ -58,10 +60,13 @@ export const DOMSYNCER_PARAMS: DomSyncerParams = { /** * @link https://github.com/takuma-hmng8/use-shader-fx#usage + * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array. + * @param defaultKey - Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */ export const useDomSyncer = ( { size, dpr, samples = 0 }: HooksProps, - dependencies: React.DependencyList = [] + dependencies: React.DependencyList = [], + defaultKey: Key ): HooksReturn => { const scene = useMemo(() => new THREE.Scene(), []); const camera = useCamera(size); @@ -73,7 +78,10 @@ export const useDomSyncer = ( samples, isSizeUpdate: true, }); - const [params, setParams] = useParams(DOMSYNCER_PARAMS); + const [params, setParams] = useParams({ + ...DOMSYNCER_PARAMS, + updateKey: defaultKey, + }); const [DOMRects, updateDomRects] = useUpdateDomRect(); @@ -87,6 +95,11 @@ export const useDomSyncer = ( // eslint-disable-next-line react-hooks/exhaustive-deps }, dependencies); + // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture + const updateKey = useRef(null); + const emptyTexture = useMemo(() => new THREE.Texture(), []); + + // set intersection const intersectionHandler = useIntersectionHandler(); const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } = useIsIntersecting(); @@ -100,6 +113,14 @@ export const useDomSyncer = ( updateParams && setParams(updateParams); + if (refreshTrigger) { + if (updateKey.current === params.updateKey) { + return emptyTexture; + } else { + updateKey.current = params.updateKey!; + } + } + if (errorHandler(params)) { if (refreshTrigger) { createMesh({ @@ -138,6 +159,7 @@ export const useDomSyncer = ( params, isIntersectingOnceRef, isIntersectingRef, + emptyTexture, ] ); diff --git a/packages/use-shader-fx/types/hooks/useDomSyncer/index.d.ts b/packages/use-shader-fx/types/hooks/useDomSyncer/index.d.ts index 069300e7..5a42dfb7 100644 --- a/packages/use-shader-fx/types/hooks/useDomSyncer/index.d.ts +++ b/packages/use-shader-fx/types/hooks/useDomSyncer/index.d.ts @@ -1,5 +1,5 @@ -/// import * as THREE from "three"; +import { Key } from "react"; import { HooksProps, HooksReturn } from "../types"; import { IsIntersecting } from "./utils/useIsIntersecting"; import { UseDomView } from "./utils/createUseDomView"; @@ -16,6 +16,8 @@ export type DomSyncerParams = { rotation?: THREE.Euler[]; /** Array of callback functions when crossed */ onIntersect?: ((entry: IntersectionObserverEntry) => void)[]; + /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */ + updateKey?: Key; }; export type DomSyncerObject = { scene: THREE.Scene; @@ -39,5 +41,7 @@ export type DomSyncerObject = { export declare const DOMSYNCER_PARAMS: DomSyncerParams; /** * @link https://github.com/takuma-hmng8/use-shader-fx#usage + * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array. + * @param defaultKey - Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates. */ -export declare const useDomSyncer: ({ size, dpr, samples }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; +export declare const useDomSyncer: ({ size, dpr, samples }: HooksProps, dependencies: import("react").DependencyList | undefined, defaultKey: Key) => HooksReturn;