diff --git a/.storybook/stories/UseAlphaBlending.tsx b/.storybook/stories/UseAlphaBlending.tsx index a22f3cca..df530850 100644 --- a/.storybook/stories/UseAlphaBlending.tsx +++ b/.storybook/stories/UseAlphaBlending.tsx @@ -31,8 +31,14 @@ export const UseAlphaBlending = (args: AlphaBlendingParams) => { return { size: state.size, dpr: state.viewport.dpr }; }); - const [updateBrush, setBrush, { output: brush }] = useBrush({ size, dpr }); - const [update, set, { output }] = useAlphaBlending({ size, dpr }); + const [updateBrush, setBrush, { output: brush }] = useBrush({ + size, + dpr, + }); + const [update, set, { output }] = useAlphaBlending({ + size, + dpr, + }); const [updateMarble, setMarble, { output: marble }] = useMarble({ size, dpr, diff --git a/.storybook/stories/UseBlank.stories.tsx b/.storybook/stories/UseBlank.stories.tsx new file mode 100644 index 00000000..1c398605 --- /dev/null +++ b/.storybook/stories/UseBlank.stories.tsx @@ -0,0 +1,24 @@ +import * as React from "react"; +import type { StoryObj } from "@storybook/react"; +import { setArgTypes } from "../utils/setArgTypes"; +import { Setup } from "../utils/Setup"; +import type { Meta } from "@storybook/react"; +import { UseBlank } from "./UseBlank"; +import { + BLANK_PARAMS, + BlankParams, +} from "../../packages/use-shader-fx/src/fxs/misc/useBlank"; + +const meta = { + title: "misc/useBlank", + component: UseBlank, + tags: ["autodocs"], + decorators: [(storyFn: any) => {storyFn()}], +} satisfies Meta; +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: BLANK_PARAMS, + argTypes: setArgTypes(BLANK_PARAMS), +}; diff --git a/.storybook/stories/UseBlank.tsx b/.storybook/stories/UseBlank.tsx new file mode 100644 index 00000000..ad02f590 --- /dev/null +++ b/.storybook/stories/UseBlank.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import * as THREE from "three"; +import { useFrame, extend, useThree } from "@react-three/fiber"; +import { FxMaterial } from "../../utils/fxMaterial"; + +import { useBlank } from "../../packages/use-shader-fx/src"; +import { BlankParams } from "../../packages/use-shader-fx/src/fxs/misc/useBlank"; + +extend({ FxMaterial }); + +/** + * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`. + * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms. + * + * ※ `usf_FragColor` overrides `gl_FragColor` + * + * ※ `usf_Position` overrides `gl_Position` + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export const UseBlank = (args: BlankParams) => { + const { size, dpr } = useThree((state) => { + return { size: state.size, dpr: state.viewport.dpr }; + }); + + const [updateBlank, _, { output: blank }] = useBlank({ + size, + dpr: dpr, + onBeforeCompile: React.useCallback((shader: THREE.Shader) => { + shader.fragmentShader = shader.fragmentShader.replace( + "//#usf main", + `float t=uTime,c;vec2 z,n=vec2(cos(t),sin(t));z=vUv*2.-1.;for(int i=0;i<12;i++){if(dot(z,z)>8.)discard;z=vec2(z.x*z.x-z.y*z.y,z.x*z.y)+n;}c=cos(length(z)+log(length(z)));usf_FragColor=vec4(vec3(c),1.);` + ); + }, []), + }); + + useFrame((props) => { + updateBlank(props); + }); + + return ( + + + + + ); +}; diff --git a/.storybook/stories/UseBlending.tsx b/.storybook/stories/UseBlending.tsx index 2f536c3b..c2f2407a 100644 --- a/.storybook/stories/UseBlending.tsx +++ b/.storybook/stories/UseBlending.tsx @@ -41,7 +41,10 @@ export const UseBlending = (args: BlendingParams) => { return { size: state.size, dpr: state.viewport.dpr }; }); const [updateCover] = useCoverTexture({ size, dpr }); - const [updateFluid, setFluid, { output: fluid }] = useFluid({ size, dpr }); + const [updateFluid, setFluid, { output: fluid }] = useFluid({ + size, + dpr, + }); const [updateBlending, setBlending] = useBlending({ size, dpr }); const [updateBrightnessPicker] = useBrightnessPicker({ size, dpr }); diff --git a/.storybook/stories/UseBrightnessPicker.tsx b/.storybook/stories/UseBrightnessPicker.tsx index 35eaaef8..cf788883 100644 --- a/.storybook/stories/UseBrightnessPicker.tsx +++ b/.storybook/stories/UseBrightnessPicker.tsx @@ -1,5 +1,4 @@ import * as React from "react"; -import * as THREE from "three"; import { useFrame, extend, useThree } from "@react-three/fiber"; import { FxMaterial, FxMaterialProps } from "../../utils/fxMaterial"; import GUI from "lil-gui"; diff --git a/.storybook/stories/UseColorStrata.tsx b/.storybook/stories/UseColorStrata.tsx index 91e7ebbd..2b6f8fce 100644 --- a/.storybook/stories/UseColorStrata.tsx +++ b/.storybook/stories/UseColorStrata.tsx @@ -1,5 +1,4 @@ import * as React from "react"; -import * as THREE from "three"; import { useFrame, extend, useThree } from "@react-three/fiber"; import { FxMaterial, FxMaterialProps } from "../../utils/fxMaterial"; import GUI from "lil-gui"; diff --git a/README.md b/README.md index a0aed9b5..5043c4dd 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ npm install @funtech-inc/use-shader-fx misc -useChromaKey +useChromaKey, useBlank @@ -79,21 +79,22 @@ npm install @funtech-inc/use-shader-fx # Usage -From each `fxHooks`, you can receive [`updateFx`, `setParams`, `fxObject`] in array format. The `config` is an object, which varies for each Hook, containing details such as `size`,`dpr` and `samples`. +From each `fxHooks`, you can receive [`updateFx`, `setParams`, `fxObject`] in array format. `HooksProps` are objects that are different for each hook and contain values such as `size`, `dpr` ... etc. 1. `updateFx` - A function to be invoked inside `useFrame`, returning a `THREE.Texture`. 2. `setParams` - A function to refresh the parameters, beneficial for performance tweaking, etc. 3. `fxObject` - An object that holds various FX components, such as scene, camera, material,renderTarget, and `output`(final rendered texture). +4. `HooksProps` - `size`,`dpr`,`samples`,`isSizeUpdate`,`onBeforeCompile`but may also be hook specific. ※ `isSizeUpdate` : Whether to `setSize` the FBO when updating size or dpr(default : `false`). ```js -const [updateFx, setParams, fxObject] = useSomeFx(config); +const [updateFx, setParams, fxObject] = useSomeFx(HooksProps); ``` invoke `updateFx` in `useFrame`. The first argument receives the RootState from `useFrame`, and the second one takes `HookPrams`. Each fx has its `HookPrams`, and each type is exported. ```js useFrame((props) => { - const texture = updateFx(props, params); + const texture = updateFx(props, HookPrams); const main = mainShaderRef.current; if (main) { main.u_bufferTexture = texture; @@ -327,14 +328,10 @@ Also, you can make more detailed adjustments by passing an object to `dpr` inste type Dpr = | number | { - dpr: number; - /** you can set whether `dpr` affects `shader` and `fbo`. default is `true` for both */ - effect?: { - /** default : `true` */ - shader?: boolean; - /** default : `true` */ - fbo?: boolean; - }; + /** you can set whether `dpr` affects `shader`. default : `false` */ + shader?: false | number; + /** you can set whether `dpr` affects `fbo`. default : `false` */ + fbo?: false | number; }; ``` @@ -531,3 +528,34 @@ return ( 👉 [wobble3D demo](https://use-shader-fx.vercel.app/useWobble3D) 👈 👉 [morphParticles demo](https://use-shader-fx.vercel.app/useMorphParticles) 👈 + +# useBlank + +By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`. + +Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms. + +```tsx +const [updateBlank, _, { output: blank, material }] = useBlank({ + size, + dpr: viewport.dpr, + uniforms: { + hoge: { value: 0 }, + }, + onBeforeCompile: useCallback((shader: THREE.Shader) => { + shader.fragmentShader = shader.fragmentShader.replace( + "//#usf uniforms", + "uniform float hoge;" + ); + shader.fragmentShader = shader.fragmentShader.replace( + "//#usf main", + `usf_FragColor=vec4(vec3(1.,hoge,1.),1.);` + ); + console.log(shader.vertexShader); + console.log(shader.fragmentShader); + }, []), +}); +``` + +※ `usf_FragColor` overrides `gl_FragColor` +※ `usf_Position` overrides `gl_Position` diff --git a/app/_home/Playground.tsx b/app/_home/Playground.tsx index 070a494d..bda93a8b 100644 --- a/app/_home/Playground.tsx +++ b/app/_home/Playground.tsx @@ -113,7 +113,7 @@ export const Playground = ({ }); const [updateFluid, setFluid, { output: brush }] = useFluid({ size, - dpr: 0.03, + dpr: 0.06, }); useMemo(() => { diff --git a/app/_ui/index.tsx b/app/_ui/index.tsx index 1c08b18b..ec4d0cc7 100644 --- a/app/_ui/index.tsx +++ b/app/_ui/index.tsx @@ -12,6 +12,7 @@ const Menu = () => { "/obscurus", "/useMorphParticles", "/useWobble3D", + "/useBlank", ]; const pathname = usePathname(); return ( diff --git a/app/cream/Playground.tsx b/app/cream/Playground.tsx index 75ba58db..a2c4d59d 100644 --- a/app/cream/Playground.tsx +++ b/app/cream/Playground.tsx @@ -13,10 +13,8 @@ export const Playground = () => { const [updateFluid, setFluid, { output: fluid }] = useFluid({ size, dpr: { - dpr: 0.08, - effect: { - fbo: false, - }, + shader: 0.08, + fbo: 0.2, }, }); diff --git a/app/playground/Playground.tsx b/app/playground/Playground.tsx index 452f5446..f2f7288a 100644 --- a/app/playground/Playground.tsx +++ b/app/playground/Playground.tsx @@ -1,7 +1,7 @@ "use client"; import * as THREE from "three"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useFrame, useThree, @@ -46,6 +46,13 @@ export const Playground = () => { useMotionBlur({ size, dpr: 0.1, + onBeforeCompile: useCallback((shader: THREE.Shader) => { + // shader.fragmentShader = shader.fragmentShader.replace( + // "gl_FragColor = mixed;", + // "gl_FragColor = vec4(0.2,1.,0.2,1.);" + // ); + console.log(shader.fragmentShader); + }, []), }); setMotionBlur({ texture: cover, diff --git a/app/useBlank/FxMaterial.tsx b/app/useBlank/FxMaterial.tsx new file mode 100644 index 00000000..b87eac16 --- /dev/null +++ b/app/useBlank/FxMaterial.tsx @@ -0,0 +1,38 @@ +import * as THREE from "three"; +import { shaderMaterial } from "@react-three/drei"; + +declare global { + namespace JSX { + interface IntrinsicElements { + fxMaterial: any; + } + } +} + +export type FxMaterialProps = { + u_fx: THREE.Texture; +}; + +export const FxMaterial = shaderMaterial( + { + u_fx: new THREE.Texture(), + }, + + ` + varying vec2 vUv; + void main() { + vUv = uv; + gl_Position = vec4(position, 1.0); + } + `, + ` + precision highp float; + varying vec2 vUv; + uniform sampler2D u_fx; + void main() { + vec2 uv = vUv; + vec4 color = texture2D(u_fx, uv); + gl_FragColor = color; + } + ` +); diff --git a/app/useBlank/Playground.tsx b/app/useBlank/Playground.tsx new file mode 100644 index 00000000..04ea0fa5 --- /dev/null +++ b/app/useBlank/Playground.tsx @@ -0,0 +1,64 @@ +"use client"; + +import * as THREE from "three"; +import { useCallback } from "react"; +import { useFrame, useThree, extend } from "@react-three/fiber"; +import { useBlank, useCoverTexture } from "@/packages/use-shader-fx/src"; +import { FxMaterial } from "./FxMaterial"; +import { useVideoTexture } from "@react-three/drei"; + +extend({ FxMaterial }); + +export const Playground = () => { + const { size, viewport } = useThree(); + const funkun_mov = useVideoTexture("/FT_Ch02-comp.mp4", { + width: 1280, + height: 720, + }); + const [updateCover, setCover, { output: cover }] = useCoverTexture({ + size, + dpr: 1, + }); + setCover({ + texture: funkun_mov, + }); + const [updateBlank, setBlank, { output: blank, material }] = useBlank({ + size, + dpr: viewport.dpr, + uniforms: { + hoge: { value: 0 }, + }, + onBeforeCompile: useCallback((shader: THREE.Shader) => { + shader.fragmentShader = shader.fragmentShader.replace( + "//#usf uniforms", + "uniform float hoge;" + ); + shader.fragmentShader = shader.fragmentShader.replace( + "//#usf main", + `float t=uTime,c;vec2 z,u,n=vec2(cos(t),sin(t));z=vUv*2.-1.;for(int i=0;i<12;i++){if(dot(z,z)>8.)discard;z=vec2(z.x*z.x-z.y*z.y,z.x*z.y)+n;}c=cos(length(z)+log(length(z)));u=vUv;u+=z*hoge;usf_FragColor=vec4(mix(vec3(c),texture2D(uTexture,u).rgb,1.-hoge),1.);` + ); + console.log(shader.vertexShader); + console.log(shader.fragmentShader); + }, []), + }); + setBlank({ + texture: cover, + }); + + const mat = material as any; + + useFrame((props) => { + mat.uniforms.hoge.value = Math.sin(props.clock.getElapsedTime()); + updateBlank(props); + updateCover(props); + }); + + return ( + <> + + + + + + ); +}; diff --git a/app/useBlank/page.tsx b/app/useBlank/page.tsx new file mode 100644 index 00000000..a84dd222 --- /dev/null +++ b/app/useBlank/page.tsx @@ -0,0 +1,18 @@ +import { ShaderFx } from "../ShaderFx"; +import { Playground } from "./Playground"; + +export default function Page() { + return ( +
+ + + +
+ ); +} diff --git a/app/useMorphParticles/Playground.tsx b/app/useMorphParticles/Playground.tsx index 0e029710..0615c6a9 100644 --- a/app/useMorphParticles/Playground.tsx +++ b/app/useMorphParticles/Playground.tsx @@ -95,6 +95,13 @@ export const Playground = () => { positions: morphList, uvs: uvList, // geometry: new THREE.PlaneGeometry(5, 5, 100, 100), + // onBeforeCompile: useCallback((shader: THREE.Shader) => { + // // shader.vertexShader = shader.vertexShader.replace( + // // "gl_Position = projectedPosition += wobble;", + // // "gl_Position = projectedPosition += wobble + 2.;" + // // ); + // console.log(shader); + // }, []), }); const beat = useBeat(140, "easeOutCubic"); diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js index c2c11fc0..15e04f8f 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js +++ b/packages/use-shader-fx/build/use-shader-fx.js @@ -1,12 +1,12 @@ -import * as t from "three"; -import { BufferAttribute as ue } from "three"; -import { useMemo as x, useEffect as j, useRef as R, useCallback as M, useState as xe } from "react"; -var ye = `varying vec2 vUv; +import * as n from "three"; +import { BufferAttribute as de } from "three"; +import { useMemo as b, useEffect as G, useRef as F, useCallback as _, useState as De } from "react"; +var Re = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, be = `precision highp float; +}`, Ae = `precision highp float; uniform sampler2D uBuffer; uniform sampler2D uTexture; @@ -116,35 +116,36 @@ void main() { gl_FragColor = finalColor; }`; -const q = (e, a = !1) => { - const r = a ? e.width * a : e.width, u = a ? e.height * a : e.height; - return x( - () => new t.Vector2(r, u), - [r, u] +const j = (e, r = !1) => { + const t = r ? e.width * r : e.width, a = r ? e.height * r : e.height; + return b( + () => new n.Vector2(t, a), + [t, a] ); -}, o = (e, a, r) => { - r !== void 0 && e.uniforms && e.uniforms[a] && r !== null && (e.uniforms[a].value = r); -}, z = (e, a, r, u) => { - const s = x(() => { - const c = new u(a, r); - return e && e.add(c), c; - }, [a, r, u, e]); - return j(() => () => { - e && e.remove(s), a.dispose(), r.dispose(); - }, [e, a, r, s]), s; -}, we = ({ +}, T = (e) => (r, t) => { + t !== void 0 && e.uniforms[r] && t !== null && (e.uniforms[r].value = t); +}, U = (e, r, t, a) => { + const s = b(() => { + const u = new a(r, t); + return e && e.add(u), u; + }, [r, t, a, e]); + return G(() => () => { + e && e.remove(s), r.dispose(), t.dispose(); + }, [e, r, t, s]), s; +}, Ie = ({ scene: e, - size: a, - dpr: r + size: r, + dpr: t, + onBeforeCompile: a }) => { - const u = x(() => new t.PlaneGeometry(2, 2), []), s = x( - () => new t.ShaderMaterial({ + const s = b(() => new n.PlaneGeometry(2, 2), []), u = b(() => { + const v = new n.ShaderMaterial({ uniforms: { - uBuffer: { value: new t.Texture() }, - uResolution: { value: new t.Vector2(0, 0) }, - uTexture: { value: new t.Texture() }, + uBuffer: { value: new n.Texture() }, + uResolution: { value: new n.Vector2(0, 0) }, + uTexture: { value: new n.Texture() }, uIsTexture: { value: !1 }, - uMap: { value: new t.Texture() }, + uMap: { value: new n.Texture() }, uIsMap: { value: !1 }, uMapIntensity: { value: 0 }, uRadius: { value: 0 }, @@ -152,216 +153,213 @@ const q = (e, a = !1) => { uDissipation: { value: 0 }, uMotionBlur: { value: 0 }, uMotionSample: { value: 0 }, - uMouse: { value: new t.Vector2(-10, -10) }, - uPrevMouse: { value: new t.Vector2(-10, -10) }, - uVelocity: { value: new t.Vector2(0, 0) }, - uColor: { value: new t.Vector3(1, 0, 0) }, + uMouse: { value: new n.Vector2(-10, -10) }, + uPrevMouse: { value: new n.Vector2(-10, -10) }, + uVelocity: { value: new n.Vector2(0, 0) }, + uColor: { value: new n.Vector3(1, 0, 0) }, uIsCursor: { value: !1 }, uPressureStart: { value: 1 }, uPressureEnd: { value: 1 } }, - vertexShader: ye, - fragmentShader: be - }), - [] - ), c = q(a, r); - o(s, "uResolution", c.clone()); - const n = z(e, u, s, t.Mesh); - return { material: s, mesh: n }; -}, Me = (e, a) => { - const r = a, u = e / a, [s, c] = [r * u / 2, r / 2]; - return { width: s, height: c, near: -1e3, far: 1e3 }; -}, U = (e, a = "OrthographicCamera") => { - const r = q(e), { width: u, height: s, near: c, far: n } = Me( - r.x, - r.y + vertexShader: Re, + fragmentShader: Ae + }); + return a && (v.onBeforeCompile = a), v; + }, [a]), l = j(r, t); + T(u)("uResolution", l.clone()); + const c = U(e, s, u, n.Mesh); + return { material: u, mesh: c }; +}, Fe = (e, r) => { + const t = r, a = e / r, [s, u] = [t * a / 2, t / 2]; + return { width: s, height: u, near: -1e3, far: 1e3 }; +}, O = (e, r = "OrthographicCamera") => { + const t = j(e), { width: a, height: s, near: u, far: l } = Fe( + t.x, + t.y ); - return x(() => a === "OrthographicCamera" ? new t.OrthographicCamera( - -u, - u, + return b(() => r === "OrthographicCamera" ? new n.OrthographicCamera( + -a, + a, s, -s, - c, - n - ) : new t.PerspectiveCamera(50, u / s), [u, s, c, n, a]); -}, te = (e = 0) => { - const a = R(new t.Vector2(0, 0)), r = R(new t.Vector2(0, 0)), u = R(new t.Vector2(0, 0)), s = R(0), c = R(new t.Vector2(0, 0)), n = R(!1); - return M( + u, + l + ) : new n.PerspectiveCamera(50, a / s), [a, s, u, l, r]); +}, se = (e = 0) => { + const r = F(new n.Vector2(0, 0)), t = F(new n.Vector2(0, 0)), a = F(new n.Vector2(0, 0)), s = F(0), u = F(new n.Vector2(0, 0)), l = F(!1); + return _( (v) => { - const l = performance.now(); + const p = performance.now(); let m; - n.current && e ? (u.current = u.current.lerp( + l.current && e ? (a.current = a.current.lerp( v, 1 - e - ), m = u.current.clone()) : (m = v.clone(), u.current = m), s.current === 0 && (s.current = l, a.current = m); - const i = Math.max(1, l - s.current); - s.current = l, c.current.copy(m).sub(a.current).divideScalar(i); - const p = c.current.length() > 0, y = n.current ? a.current.clone() : m; - return !n.current && p && (n.current = !0), a.current = m, { + ), m = a.current.clone()) : (m = v.clone(), a.current = m), s.current === 0 && (s.current = p, r.current = m); + const d = Math.max(1, p - s.current); + s.current = p, u.current.copy(m).sub(r.current).divideScalar(d); + const i = u.current.length() > 0, f = l.current ? r.current.clone() : m; + return !l.current && i && (l.current = !0), r.current = m, { currentPointer: m, - prevPointer: y, - diffPointer: r.current.subVectors(m, y), - velocity: c.current, - isVelocityUpdate: p + prevPointer: f, + diffPointer: t.current.subVectors(m, f), + velocity: u.current, + isVelocityUpdate: i }; }, [e] ); }, B = (e) => { - const r = R( - ((s) => Object.values(s).some((c) => typeof c == "function"))(e) ? e : structuredClone(e) - ), u = M((s) => { - for (const c in s) { - const n = c; - n in r.current && s[n] !== void 0 && s[n] !== null ? r.current[n] = s[n] : console.error( + const t = F( + ((s) => Object.values(s).some((u) => typeof u == "function"))(e) ? e : structuredClone(e) + ), a = _((s) => { + for (const u in s) { + const l = u; + l in t.current && s[l] !== void 0 && s[l] !== null ? t.current[l] = s[l] : console.error( `"${String( - n + l )}" does not exist in the params. or "${String( - n + l )}" is null | undefined` ); } }, []); - return [r.current, u]; -}, J = { - minFilter: t.LinearFilter, - magFilter: t.LinearFilter, - type: t.HalfFloatType, + return [t.current, a]; +}, te = { + minFilter: n.LinearFilter, + magFilter: n.LinearFilter, + type: n.HalfFloatType, stencilBuffer: !1 -}, re = ({ +}, le = ({ gl: e, - fbo: a, - scene: r, - camera: u, + fbo: r, + scene: t, + camera: a, onBeforeRender: s, - onSwap: c + onSwap: u }) => { - e.setRenderTarget(a), s(), e.clear(), e.render(r, u), c && c(), e.setRenderTarget(null), e.clear(); -}, V = ({ + e.setRenderTarget(r), s(), e.clear(), e.render(t, a), u && u(), e.setRenderTarget(null), e.clear(); +}, L = ({ scene: e, - camera: a, - size: r, - dpr: u = !1, + camera: r, + size: t, + dpr: a = !1, isSizeUpdate: s = !1, - samples: c = 0, - depthBuffer: n = !1, - depthTexture: f = !1 + samples: u = 0, + depthBuffer: l = !1, + depthTexture: c = !1 }) => { - var i; - const v = R(), l = q(r, u); - v.current = x( + var d; + const v = F(), p = j(t, a); + v.current = b( () => { - const p = new t.WebGLRenderTarget( - l.x, - l.y, + const i = new n.WebGLRenderTarget( + p.x, + p.y, { - ...J, - samples: c, - depthBuffer: n + ...te, + samples: u, + depthBuffer: l } ); - return f && (p.depthTexture = new t.DepthTexture( - l.x, - l.y, - t.FloatType - )), p; + return c && (i.depthTexture = new n.DepthTexture( + p.x, + p.y, + n.FloatType + )), i; }, // eslint-disable-next-line react-hooks/exhaustive-deps [] - ), s && ((i = v.current) == null || i.setSize(l.x, l.y)), j(() => { - const p = v.current; + ), s && ((d = v.current) == null || d.setSize(p.x, p.y)), G(() => { + const i = v.current; return () => { - p == null || p.dispose(); + i == null || i.dispose(); }; }, []); - const m = M( - (p, y) => { - const h = v.current; - return re({ - gl: p, - fbo: h, + const m = _( + (i, f) => { + const o = v.current; + return le({ + gl: i, + fbo: o, scene: e, - camera: a, - onBeforeRender: () => y && y({ read: h.texture }) - }), h.texture; + camera: r, + onBeforeRender: () => f && f({ read: o.texture }) + }), o.texture; }, - [e, a] + [e, r] ); return [v.current, m]; -}, X = ({ +}, Y = ({ scene: e, - camera: a, - size: r, - dpr: u = !1, + camera: r, + size: t, + dpr: a = !1, isSizeUpdate: s = !1, - samples: c = 0, - depthBuffer: n = !1, - depthTexture: f = !1 + samples: u = 0, + depthBuffer: l = !1, + depthTexture: c = !1 }) => { - var p, y; - const v = R({ + var i, f; + const v = F({ read: null, write: null, swap: function() { - let h = this.read; - this.read = this.write, this.write = h; + let o = this.read; + this.read = this.write, this.write = o; } - }), l = q(r, u), m = x(() => { - const h = new t.WebGLRenderTarget(l.x, l.y, { - ...J, - samples: c, - depthBuffer: n - }), g = new t.WebGLRenderTarget(l.x, l.y, { - ...J, - samples: c, - depthBuffer: n + }), p = j(t, a), m = b(() => { + const o = new n.WebGLRenderTarget(p.x, p.y, { + ...te, + samples: u, + depthBuffer: l + }), g = new n.WebGLRenderTarget(p.x, p.y, { + ...te, + samples: u, + depthBuffer: l }); - return f && (h.depthTexture = new t.DepthTexture( - l.x, - l.y, - t.FloatType - ), g.depthTexture = new t.DepthTexture( - l.x, - l.y, - t.FloatType - )), { read: h, write: g }; + return c && (o.depthTexture = new n.DepthTexture( + p.x, + p.y, + n.FloatType + ), g.depthTexture = new n.DepthTexture( + p.x, + p.y, + n.FloatType + )), { read: o, write: g }; }, []); - v.current.read = m.read, v.current.write = m.write, s && ((p = v.current.read) == null || p.setSize(l.x, l.y), (y = v.current.write) == null || y.setSize(l.x, l.y)), j(() => { - const h = v.current; + v.current.read = m.read, v.current.write = m.write, s && ((i = v.current.read) == null || i.setSize(p.x, p.y), (f = v.current.write) == null || f.setSize(p.x, p.y)), G(() => { + const o = v.current; return () => { - var g, d; - (g = h.read) == null || g.dispose(), (d = h.write) == null || d.dispose(); + var g, x; + (g = o.read) == null || g.dispose(), (x = o.write) == null || x.dispose(); }; }, []); - const i = M( - (h, g) => { - var b; - const d = v.current; - return re({ - gl: h, + const d = _( + (o, g) => { + var y; + const x = v.current; + return le({ + gl: o, scene: e, - camera: a, - fbo: d.write, + camera: r, + fbo: x.write, onBeforeRender: () => g && g({ - read: d.read.texture, - write: d.write.texture + read: x.read.texture, + write: x.write.texture }), - onSwap: () => d.swap() - }), (b = d.read) == null ? void 0 : b.texture; + onSwap: () => x.swap() + }), (y = x.read) == null ? void 0 : y.texture; }, - [e, a] + [e, r] ); return [ { read: v.current.read, write: v.current.write }, - i + d ]; -}, I = (e) => { - var a, r; - return typeof e == "number" ? { shader: e, fbo: e } : { - shader: (((a = e.effect) == null ? void 0 : a.shader) ?? !0) && e.dpr, - fbo: (((r = e.effect) == null ? void 0 : r.fbo) ?? !0) && e.dpr - }; -}, Se = Object.freeze({ +}, V = (e) => typeof e == "number" ? { shader: e, fbo: e } : { + shader: e.shader ?? !1, + fbo: e.fbo ?? !1 +}, Ve = Object.freeze({ texture: !1, map: !1, mapIntensity: 0.1, @@ -370,50 +368,56 @@ const q = (e, a = !1) => { dissipation: 1, motionBlur: 0, motionSample: 5, - color: new t.Vector3(1, 0, 0), + color: new n.Vector3(1, 0, 0), isCursor: !1, pressure: 1, pointerValues: !1 -}), _t = ({ +}), Wt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = we({ scene: c, size: e, dpr: s.shader }), v = U(e), l = te(), [m, i] = X({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Ie({ + scene: l, + size: e, + dpr: u.shader, + onBeforeCompile: s + }), p = O(e), m = se(), [d, i] = Y({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [p, y] = B(Se), h = R(null); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [f, o] = B(Ve), g = F(null), x = T(c); return [ - M( - (d, b) => { - const { gl: w, pointer: C } = d; - b && y(b), p.texture ? (o(n, "uIsTexture", !0), o(n, "uTexture", p.texture)) : o(n, "uIsTexture", !1), p.map ? (o(n, "uIsMap", !0), o(n, "uMap", p.map), o(n, "uMapIntensity", p.mapIntensity)) : o(n, "uIsMap", !1), o(n, "uRadius", p.radius), o(n, "uSmudge", p.smudge), o(n, "uDissipation", p.dissipation), o(n, "uMotionBlur", p.motionBlur), o(n, "uMotionSample", p.motionSample); - const _ = p.pointerValues || l(C); - _.isVelocityUpdate && (o(n, "uMouse", _.currentPointer), o(n, "uPrevMouse", _.prevPointer)), o(n, "uVelocity", _.velocity); - const S = typeof p.color == "function" ? p.color(_.velocity) : p.color; - return o(n, "uColor", S), o(n, "uIsCursor", p.isCursor), o(n, "uPressureEnd", p.pressure), h.current === null && (h.current = p.pressure), o(n, "uPressureStart", h.current), h.current = p.pressure, i(w, ({ read: T }) => { - o(n, "uBuffer", T); + _( + (h, w) => { + const { gl: M, pointer: C } = h; + w && o(w), f.texture ? (x("uIsTexture", !0), x("uTexture", f.texture)) : x("uIsTexture", !1), f.map ? (x("uIsMap", !0), x("uMap", f.map), x("uMapIntensity", f.mapIntensity)) : x("uIsMap", !1), x("uRadius", f.radius), x("uSmudge", f.smudge), x("uDissipation", f.dissipation), x("uMotionBlur", f.motionBlur), x("uMotionSample", f.motionSample); + const S = f.pointerValues || m(C); + S.isVelocityUpdate && (x("uMouse", S.currentPointer), x("uPrevMouse", S.prevPointer)), x("uVelocity", S.velocity); + const D = typeof f.color == "function" ? f.color(S.velocity) : f.color; + return x("uColor", D), x("uIsCursor", f.isCursor), x("uPressureEnd", f.pressure), g.current === null && (g.current = f.pressure), x("uPressureStart", g.current), g.current = f.pressure, i(M, ({ read: A }) => { + x("uBuffer", A); }); }, - [n, l, i, p, y] + [x, m, i, f, o] ), - y, + o, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: m, - output: m.read.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: d, + output: d.read.texture } ]; }; -var N = `varying vec2 vUv; +var K = `varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -427,21 +431,21 @@ void main () { vT = vUv + vec2(0.0, texelSize.y); vB = vUv - vec2(0.0, texelSize.y); gl_Position = vec4(position, 1.0); -}`, _e = `precision highp float; +}`, ze = `precision highp float; void main(){ gl_FragColor = vec4(0.0); }`; -const Te = () => x( - () => new t.ShaderMaterial({ - vertexShader: N, - fragmentShader: _e, +const Ue = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ + vertexShader: K, + fragmentShader: ze, depthTest: !1, depthWrite: !1 - }), - [] -); -var Ce = `precision highp float; + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var Oe = `precision highp float; varying vec2 vUv; uniform sampler2D uVelocity; @@ -455,21 +459,21 @@ void main () { gl_FragColor = dissipation * texture2D(uSource, coord); gl_FragColor.a = 1.0; }`; -const Pe = () => x( - () => new t.ShaderMaterial({ +const Be = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { - uVelocity: { value: new t.Texture() }, - uSource: { value: new t.Texture() }, - texelSize: { value: new t.Vector2() }, + uVelocity: { value: new n.Texture() }, + uSource: { value: new n.Texture() }, + texelSize: { value: new n.Vector2() }, dt: { value: 0 }, dissipation: { value: 0 } }, - vertexShader: N, - fragmentShader: Ce - }), - [] -); -var De = `precision highp float; + vertexShader: K, + fragmentShader: Oe + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var We = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -495,18 +499,18 @@ void main () { float div = 0.5 * (R - L + T - B); gl_FragColor = vec4(div, 0.0, 0.0, 1.0); }`; -const Re = () => x( - () => new t.ShaderMaterial({ +const Le = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { uVelocity: { value: null }, - texelSize: { value: new t.Vector2() } + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: De - }), - [] -); -var Ae = `precision highp float; + vertexShader: K, + fragmentShader: We + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var $e = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -531,19 +535,19 @@ void main () { float pressure = (L + R + B + T - divergence) * 0.25; gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); }`; -const Ie = () => x( - () => new t.ShaderMaterial({ +const Ee = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { uPressure: { value: null }, uDivergence: { value: null }, - texelSize: { value: new t.Vector2() } + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: Ae - }), - [] -); -var Fe = `precision highp float; + vertexShader: K, + fragmentShader: $e + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var qe = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -560,18 +564,18 @@ void main () { float vorticity = R - L - T + B; gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); }`; -const ze = () => x( - () => new t.ShaderMaterial({ +const je = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { uVelocity: { value: null }, - texelSize: { value: new t.Vector2() } + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: Fe - }), - [] -); -var Ve = `precision highp float; + vertexShader: K, + fragmentShader: qe + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var ke = `precision highp float; varying vec2 vUv; varying vec2 vT; @@ -590,21 +594,21 @@ void main () { vec2 vel = texture2D(uVelocity, vUv).xy; gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); }`; -const Ue = () => x( - () => new t.ShaderMaterial({ +const Ne = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { uVelocity: { value: null }, uCurl: { value: null }, curl: { value: 0 }, dt: { value: 0 }, - texelSize: { value: new t.Vector2() } + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: Ve - }), - [] -); -var Be = `precision highp float; + vertexShader: K, + fragmentShader: ke + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var Ge = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -613,19 +617,19 @@ uniform float value; void main () { gl_FragColor = value * texture2D(uTexture, vUv); }`; -const Oe = () => x( - () => new t.ShaderMaterial({ +const Ke = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { - uTexture: { value: new t.Texture() }, + uTexture: { value: new n.Texture() }, value: { value: 0 }, - texelSize: { value: new t.Vector2() } + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: Be - }), - [] -); -var Le = `precision highp float; + vertexShader: K, + fragmentShader: Ge + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var Xe = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -649,19 +653,21 @@ void main () { velocity.xy -= vec2(R - L, T - B); gl_FragColor = vec4(velocity, 0.0, 1.0); }`; -const $e = () => x( - () => new t.ShaderMaterial({ +const Ye = ({ + onBeforeCompile: e +}) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { - uPressure: { value: new t.Texture() }, - uVelocity: { value: new t.Texture() }, - texelSize: { value: new t.Vector2() } + uPressure: { value: new n.Texture() }, + uVelocity: { value: new n.Texture() }, + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: Le - }), - [] -); -var Ee = `precision highp float; + vertexShader: K, + fragmentShader: Xe + }); + return e && (t.onBeforeCompile = e), t; +}, [e]); +var He = `precision highp float; varying vec2 vUv; uniform sampler2D uTarget; @@ -678,75 +684,95 @@ void main () { vec3 base = texture2D(uTarget, vUv).xyz; gl_FragColor = vec4(base + splat, 1.0); }`; -const We = () => x( - () => new t.ShaderMaterial({ +const Qe = ({ onBeforeCompile: e }) => b(() => { + const t = new n.ShaderMaterial({ uniforms: { - uTarget: { value: new t.Texture() }, + uTarget: { value: new n.Texture() }, aspectRatio: { value: 0 }, - color: { value: new t.Vector3() }, - point: { value: new t.Vector2() }, + color: { value: new n.Vector3() }, + point: { value: new n.Vector2() }, radius: { value: 0 }, - texelSize: { value: new t.Vector2() } + texelSize: { value: new n.Vector2() } }, - vertexShader: N, - fragmentShader: Ee - }), - [] -), qe = ({ + vertexShader: K, + fragmentShader: He + }); + return e && (t.onBeforeCompile = e), t; +}, [e]), N = (e, r) => { + const t = r == null ? void 0 : r.onBeforeCompile; + return e({ + onBeforeCompile: t + }); +}, Ze = ({ scene: e, - size: a, - dpr: r + size: r, + dpr: t, + fluidOnBeforeCompile: a }) => { - const u = x(() => new t.PlaneGeometry(2, 2), []), s = Te(), c = s.clone(), n = ze(), f = Ue(), v = Pe(), l = Re(), m = Ie(), i = Oe(), p = $e(), y = We(), h = x( + const s = b(() => new n.PlaneGeometry(2, 2), []), { + initial: u, + curl: l, + vorticity: c, + advection: v, + divergence: p, + pressure: m, + clear: d, + gradientSubtract: i, + splat: f + } = a ?? {}, o = N(Ue, u), g = o.clone(), x = N(je, l), y = N(Ne, c), h = N(Be, v), w = N( + Le, + p + ), M = N(Ee, m), C = N(Ke, d), S = N( + Ye, + i + ), D = N(Qe, f), A = b( () => ({ - vorticityMaterial: f, - curlMaterial: n, - advectionMaterial: v, - divergenceMaterial: l, - pressureMaterial: m, - clearMaterial: i, - gradientSubtractMaterial: p, - splatMaterial: y + vorticityMaterial: y, + curlMaterial: x, + advectionMaterial: h, + divergenceMaterial: w, + pressureMaterial: M, + clearMaterial: C, + gradientSubtractMaterial: S, + splatMaterial: D }), [ - f, - n, - v, - l, - m, - i, - p, - y + y, + x, + h, + w, + M, + C, + S, + D ] - ), g = q(a, r); - x(() => { - o( - h.splatMaterial, + ), R = j(r, t); + b(() => { + T(A.splatMaterial)( "aspectRatio", - g.x / g.y + R.x / R.y ); - for (const w of Object.values(h)) - o( - w, + for (const I of Object.values(A)) + T(I)( "texelSize", - new t.Vector2(1 / g.x, 1 / g.y) + new n.Vector2(1 / R.x, 1 / R.y) ); - }, [g, h]); - const d = z(e, u, s, t.Mesh); - x(() => { - s.dispose(), d.material = c; - }, [s, d, c]), j(() => () => { - for (const w of Object.values(h)) - w.dispose(); - }, [h]); - const b = M( - (w) => { - d.material = w, d.material.needsUpdate = !0; + }, [R, A]); + const P = U(e, s, o, n.Mesh); + b(() => { + o.dispose(), P.material = g; + }, [o, P, g]), G(() => () => { + for (const I of Object.values(A)) + I.dispose(); + }, [A]); + const $ = _( + (I) => { + P.material = I, P.material.needsUpdate = !0; }, - [d] + [P] ); - return { materials: h, setMeshMaterial: b, mesh: d }; -}, je = Object.freeze({ + return { materials: A, setMeshMaterial: $, mesh: P }; +}, Je = Object.freeze({ density_dissipation: 0.98, velocity_dissipation: 0.99, velocity_acceleration: 10, @@ -754,229 +780,220 @@ const We = () => x( pressure_iterations: 20, curl_strength: 35, splat_radius: 2e-3, - fluid_color: new t.Vector3(1, 1, 1), + fluid_color: new n.Vector3(1, 1, 1), pointerValues: !1 -}), Tt = ({ +}), Lt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + fluidOnBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { materials: n, setMeshMaterial: f, mesh: v } = qe({ - scene: c, + const u = V(r), l = b(() => new n.Scene(), []), { materials: c, setMeshMaterial: v, mesh: p } = Ze({ + scene: l, size: e, - dpr: s.shader - }), l = U(e), m = te(), i = x( + dpr: u.shader, + fluidOnBeforeCompile: s + }), m = O(e), d = se(), i = b( () => ({ - scene: c, - camera: l, - dpr: s.fbo, + scene: l, + camera: m, + dpr: u.fbo, size: e, - samples: r, - isSizeUpdate: u + samples: t, + isSizeUpdate: a }), - [c, l, e, r, s.fbo, u] - ), [p, y] = X(i), [h, g] = X(i), [d, b] = V(i), [w, C] = V(i), [_, S] = X(i), T = R(0), F = R(new t.Vector2(0, 0)), P = R(new t.Vector3(0, 0, 0)), [D, $] = B(je); + [l, m, e, t, u.fbo, a] + ), [f, o] = Y(i), [g, x] = Y(i), [y, h] = L(i), [w, M] = L(i), [C, S] = Y(i), D = F(0), A = F(new n.Vector2(0, 0)), R = F(new n.Vector3(0, 0, 0)), [P, $] = B(Je), I = T(c.advectionMaterial), q = T(c.splatMaterial), Q = T(c.curlMaterial), X = T(c.vorticityMaterial), ce = T(c.divergenceMaterial), re = T(c.clearMaterial), oe = T(c.pressureMaterial), ae = T( + c.gradientSubtractMaterial + ); return [ - M( - (E, G) => { - const { gl: W, pointer: fe, clock: ee, size: oe } = E; - G && $(G), T.current === 0 && (T.current = ee.getElapsedTime()); - const ae = Math.min( - (ee.getElapsedTime() - T.current) / 3, + _( + (Se, ve) => { + const { gl: k, pointer: _e, clock: ie, size: me } = Se; + ve && $(ve), D.current === 0 && (D.current = ie.getElapsedTime()); + const pe = Math.min( + (ie.getElapsedTime() - D.current) / 3, 0.02 ); - T.current = ee.getElapsedTime(); - const ne = y(W, ({ read: L }) => { - f(n.advectionMaterial), o(n.advectionMaterial, "uVelocity", L), o(n.advectionMaterial, "uSource", L), o(n.advectionMaterial, "dt", ae), o( - n.advectionMaterial, - "dissipation", - D.velocity_dissipation - ); - }), de = g(W, ({ read: L }) => { - f(n.advectionMaterial), o(n.advectionMaterial, "uVelocity", ne), o(n.advectionMaterial, "uSource", L), o( - n.advectionMaterial, - "dissipation", - D.density_dissipation - ); - }), Q = D.pointerValues || m(fe); - Q.isVelocityUpdate && (y(W, ({ read: L }) => { - f(n.splatMaterial), o(n.splatMaterial, "uTarget", L), o( - n.splatMaterial, - "point", - Q.currentPointer - ); - const K = Q.diffPointer.multiply( - F.current.set(oe.width, oe.height).multiplyScalar(D.velocity_acceleration) + D.current = ie.getElapsedTime(); + const ue = o(k, ({ read: E }) => { + v(c.advectionMaterial), I("uVelocity", E), I("uSource", E), I("dt", pe), I("dissipation", P.velocity_dissipation); + }), Te = x(k, ({ read: E }) => { + v(c.advectionMaterial), I("uVelocity", ue), I("uSource", E), I("dissipation", P.density_dissipation); + }), ee = P.pointerValues || d(_e); + ee.isVelocityUpdate && (o(k, ({ read: E }) => { + v(c.splatMaterial), q("uTarget", E), q("point", ee.currentPointer); + const H = ee.diffPointer.multiply( + A.current.set(me.width, me.height).multiplyScalar(P.velocity_acceleration) ); - o( - n.splatMaterial, + q( "color", - P.current.set(K.x, K.y, 1) - ), o( - n.splatMaterial, - "radius", - D.splat_radius - ); - }), g(W, ({ read: L }) => { - f(n.splatMaterial), o(n.splatMaterial, "uTarget", L); - const K = typeof D.fluid_color == "function" ? D.fluid_color(Q.velocity) : D.fluid_color; - o(n.splatMaterial, "color", K); + R.current.set(H.x, H.y, 1) + ), q("radius", P.splat_radius); + }), x(k, ({ read: E }) => { + v(c.splatMaterial), q("uTarget", E); + const H = typeof P.fluid_color == "function" ? P.fluid_color(ee.velocity) : P.fluid_color; + q("color", H); })); - const ge = b(W, () => { - f(n.curlMaterial), o(n.curlMaterial, "uVelocity", ne); + const Ce = h(k, () => { + v(c.curlMaterial), Q("uVelocity", ue); }); - y(W, ({ read: L }) => { - f(n.vorticityMaterial), o(n.vorticityMaterial, "uVelocity", L), o(n.vorticityMaterial, "uCurl", ge), o( - n.vorticityMaterial, - "curl", - D.curl_strength - ), o(n.vorticityMaterial, "dt", ae); + o(k, ({ read: E }) => { + v(c.vorticityMaterial), X("uVelocity", E), X("uCurl", Ce), X("curl", P.curl_strength), X("dt", pe); }); - const he = C(W, () => { - f(n.divergenceMaterial), o(n.divergenceMaterial, "uVelocity", ne); + const Pe = M(k, () => { + v(c.divergenceMaterial), ce("uVelocity", ue); }); - S(W, ({ read: L }) => { - f(n.clearMaterial), o(n.clearMaterial, "uTexture", L), o( - n.clearMaterial, - "value", - D.pressure_dissipation - ); - }), f(n.pressureMaterial), o(n.pressureMaterial, "uDivergence", he); - let ie; - for (let L = 0; L < D.pressure_iterations; L++) - ie = S(W, ({ read: K }) => { - o(n.pressureMaterial, "uPressure", K); + S(k, ({ read: E }) => { + v(c.clearMaterial), re("uTexture", E), re("value", P.pressure_dissipation); + }), v(c.pressureMaterial), oe("uDivergence", Pe); + let fe; + for (let E = 0; E < P.pressure_iterations; E++) + fe = S(k, ({ read: H }) => { + oe("uPressure", H); }); - return y(W, ({ read: L }) => { - f(n.gradientSubtractMaterial), o( - n.gradientSubtractMaterial, - "uPressure", - ie - ), o(n.gradientSubtractMaterial, "uVelocity", L); - }), de; + return o(k, ({ read: E }) => { + v(c.gradientSubtractMaterial), ae("uPressure", fe), ae("uVelocity", E); + }), Te; }, [ - n, - f, - b, - g, - C, - m, + c, + I, + re, + Q, + ce, + ae, + oe, + q, + X, + v, + h, + x, + M, + d, S, - y, + o, $, - D + P ] ), $, { - scene: c, - mesh: v, - materials: n, - camera: l, + scene: l, + mesh: p, + materials: c, + camera: m, renderTarget: { - velocity: p, - density: h, - curl: d, + velocity: f, + density: g, + curl: y, divergence: w, - pressure: _ + pressure: C }, - output: h.read.texture + output: g.read.texture } ]; -}, Ne = ({ scale: e, max: a, texture: r, scene: u }) => { - const s = R([]), c = x( - () => new t.PlaneGeometry(e, e), +}, en = ({ + scale: e, + max: r, + texture: t, + scene: a, + onBeforeCompile: s +}) => { + const u = F([]), l = b( + () => new n.PlaneGeometry(e, e), [e] - ), n = x( - () => new t.MeshBasicMaterial({ - map: r, + ), c = b(() => { + const v = new n.MeshBasicMaterial({ + map: t, transparent: !0, - blending: t.AdditiveBlending, + blending: n.AdditiveBlending, depthTest: !1, depthWrite: !1 - }), - [r] - ); - return j(() => { - for (let f = 0; f < a; f++) { - const v = new t.Mesh(c.clone(), n.clone()); - v.rotateZ(2 * Math.PI * Math.random()), v.visible = !1, u.add(v), s.current.push(v); + }); + return s && (v.onBeforeCompile = s), v; + }, [t, s]); + return G(() => { + for (let v = 0; v < r; v++) { + const p = new n.Mesh(l.clone(), c.clone()); + p.rotateZ(2 * Math.PI * Math.random()), p.visible = !1, a.add(p), u.current.push(p); } - }, [c, n, u, a]), j(() => () => { - s.current.forEach((f) => { - f.geometry.dispose(), Array.isArray(f.material) ? f.material.forEach((v) => v.dispose()) : f.material.dispose(), u.remove(f); - }), s.current = []; - }, [u]), s.current; -}, ke = Object.freeze({ + }, [l, c, a, r]), G(() => () => { + u.current.forEach((v) => { + v.geometry.dispose(), Array.isArray(v.material) ? v.material.forEach((p) => p.dispose()) : v.material.dispose(), a.remove(v); + }), u.current = []; + }, [a]), u.current; +}, nn = Object.freeze({ frequency: 0.01, rotation: 0.05, fadeout_speed: 0.9, scale: 0.3, alpha: 0.6, pointerValues: !1 -}), Ct = ({ - texture: e = new t.Texture(), - scale: a = 64, - max: r = 100, - size: u, +}), $t = ({ + texture: e = new n.Texture(), + scale: r = 64, + max: t = 100, + size: a, dpr: s, - samples: c, - isSizeUpdate: n + samples: u, + isSizeUpdate: l, + onBeforeCompile: c }) => { - const f = I(s), v = x(() => new t.Scene(), []), l = Ne({ - scale: a, - max: r, + const v = V(s), p = b(() => new n.Scene(), []), m = en({ + scale: r, + max: t, texture: e, - scene: v - }), m = U(u), i = te(), [p, y] = V({ - scene: v, - camera: m, - size: u, - dpr: f.fbo, - samples: c, - isSizeUpdate: n - }), [h, g] = B(ke), d = R(0); + scene: p, + onBeforeCompile: c + }), d = O(a), i = se(), [f, o] = L({ + scene: p, + camera: d, + size: a, + dpr: v.fbo, + samples: u, + isSizeUpdate: l + }), [g, x] = B(nn), y = F(0); return [ - M( - (w, C) => { - const { gl: _, pointer: S, size: T } = w; - C && g(C); - const F = h.pointerValues || i(S); - if (h.frequency < F.diffPointer.length()) { - const P = l[d.current]; - P.visible = !0, P.position.set( - F.currentPointer.x * (T.width / 2), - F.currentPointer.y * (T.height / 2), + _( + (w, M) => { + const { gl: C, pointer: S, size: D } = w; + M && x(M); + const A = g.pointerValues || i(S); + if (g.frequency < A.diffPointer.length()) { + const R = m[y.current]; + R.visible = !0, R.position.set( + A.currentPointer.x * (D.width / 2), + A.currentPointer.y * (D.height / 2), 0 - ), P.scale.x = P.scale.y = 0, P.material.opacity = h.alpha, d.current = (d.current + 1) % r; + ), R.scale.x = R.scale.y = 0, R.material.opacity = g.alpha, y.current = (y.current + 1) % t; } - return l.forEach((P) => { - if (P.visible) { - const D = P.material; - P.rotation.z += h.rotation, D.opacity *= h.fadeout_speed, P.scale.x = h.fadeout_speed * P.scale.x + h.scale, P.scale.y = P.scale.x, D.opacity < 2e-3 && (P.visible = !1); + return m.forEach((R) => { + if (R.visible) { + const P = R.material; + R.rotation.z += g.rotation, P.opacity *= g.fadeout_speed, R.scale.x = g.fadeout_speed * R.scale.x + g.scale, R.scale.y = R.scale.x, P.opacity < 2e-3 && (R.visible = !1); } - }), y(_); + }), o(C); }, - [y, l, i, r, h, g] + [o, m, i, t, g, x] ), - g, + x, { - scene: v, - camera: m, - meshArr: l, - renderTarget: p, - output: p.texture + scene: p, + camera: d, + meshArr: m, + renderTarget: f, + output: f.texture } ]; }; -var Ge = `varying vec2 vUv; +var tn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Ke = `precision highp float; +}`, rn = `precision highp float; precision highp int; varying vec2 vUv; @@ -1050,9 +1067,12 @@ void main() { float noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength); gl_FragColor = vec4(vec3(noise),1.0); }`; -const Xe = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const on = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { uTime: { value: 0 }, scale: { value: 0 }, @@ -1060,63 +1080,64 @@ const Xe = (e) => { noiseOctaves: { value: 0 }, fbmOctaves: { value: 0 }, warpOctaves: { value: 0 }, - warpDirection: { value: new t.Vector2() }, + warpDirection: { value: new n.Vector2() }, warpStrength: { value: 0 } }, - vertexShader: Ge, - fragmentShader: Ke - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, Ye = Object.freeze({ + vertexShader: tn, + fragmentShader: rn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, an = Object.freeze({ scale: 4e-3, timeStrength: 0.3, noiseOctaves: 2, fbmOctaves: 2, warpOctaves: 2, - warpDirection: new t.Vector2(2, 2), + warpDirection: new n.Vector2(2, 2), warpStrength: 8, beat: !1 -}), Pt = ({ +}), Et = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Xe(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = on({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(Ye); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(an), o = T(c); return [ - M( - (h, g) => { - const { gl: d, clock: b } = h; - return g && p(g), o(n, "scale", i.scale), o(n, "timeStrength", i.timeStrength), o(n, "noiseOctaves", i.noiseOctaves), o(n, "fbmOctaves", i.fbmOctaves), o(n, "warpOctaves", i.warpOctaves), o(n, "warpDirection", i.warpDirection), o(n, "warpStrength", i.warpStrength), o(n, "uTime", i.beat || b.getElapsedTime()), m(d); + _( + (x, y) => { + const { gl: h, clock: w } = x; + return y && f(y), o("scale", i.scale), o("timeStrength", i.timeStrength), o("noiseOctaves", i.noiseOctaves), o("fbmOctaves", i.fbmOctaves), o("warpOctaves", i.warpOctaves), o("warpDirection", i.warpDirection), o("warpStrength", i.warpStrength), o("uTime", i.beat || w.getElapsedTime()), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var He = `varying vec2 vUv; +var un = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Qe = `precision highp float; +}`, sn = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -1159,81 +1180,85 @@ void main() { gl_FragColor = vec4(col, alpha); }`; -const Ze = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const ln = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - uTexture: { value: new t.Texture() }, + uTexture: { value: new n.Texture() }, isTexture: { value: !1 }, scale: { value: 1 }, - noise: { value: new t.Texture() }, - noiseStrength: { value: new t.Vector2(0, 0) }, + noise: { value: new n.Texture() }, + noiseStrength: { value: new n.Vector2(0, 0) }, isNoise: { value: !1 }, laminateLayer: { value: 1 }, - laminateInterval: { value: new t.Vector2(0.1, 0.1) }, - laminateDetail: { value: new t.Vector2(1, 1) }, - distortion: { value: new t.Vector2(0, 0) }, - colorFactor: { value: new t.Vector3(1, 1, 1) }, + laminateInterval: { value: new n.Vector2(0.1, 0.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 t.Vector2(0, 0) } + timeStrength: { value: new n.Vector2(0, 0) } }, - vertexShader: He, - fragmentShader: Qe - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, Je = Object.freeze({ + vertexShader: un, + fragmentShader: sn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, cn = Object.freeze({ texture: !1, scale: 1, laminateLayer: 1, - laminateInterval: new t.Vector2(0.1, 0.1), - laminateDetail: new t.Vector2(1, 1), - distortion: new t.Vector2(0, 0), - colorFactor: new t.Vector3(1, 1, 1), - timeStrength: new t.Vector2(0, 0), + laminateInterval: new n.Vector2(0.1, 0.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 t.Vector2(0, 0), + noiseStrength: new n.Vector2(0, 0), beat: !1 -}), Dt = ({ +}), qt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Ze(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = ln({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(Je); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(cn), o = T(c); return [ - M( - (h, g) => { - const { gl: d, clock: b } = h; - return g && p(g), i.texture ? (o(n, "uTexture", i.texture), o(n, "isTexture", !0)) : (o(n, "isTexture", !1), o(n, "scale", i.scale)), i.noise ? (o(n, "noise", i.noise), o(n, "isNoise", !0), o(n, "noiseStrength", i.noiseStrength)) : o(n, "isNoise", !1), o(n, "uTime", i.beat || b.getElapsedTime()), o(n, "laminateLayer", i.laminateLayer), o(n, "laminateInterval", i.laminateInterval), o(n, "laminateDetail", i.laminateDetail), o(n, "distortion", i.distortion), o(n, "colorFactor", i.colorFactor), o(n, "timeStrength", i.timeStrength), m(d); + _( + (x, y) => { + const { gl: h, clock: w } = x; + return y && f(y), i.texture ? (o("uTexture", i.texture), o("isTexture", !0)) : (o("isTexture", !1), o("scale", i.scale)), i.noise ? (o("noise", i.noise), o("isNoise", !0), o("noiseStrength", i.noiseStrength)) : o("isNoise", !1), o("uTime", i.beat || w.getElapsedTime()), o("laminateLayer", i.laminateLayer), o("laminateInterval", i.laminateInterval), o("laminateDetail", i.laminateDetail), o("distortion", i.distortion), o("colorFactor", i.colorFactor), o("timeStrength", i.timeStrength), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var en = `varying vec2 vUv; +var vn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, nn = `precision highp float; +}`, mn = `precision highp float; varying vec2 vUv; uniform float u_time; @@ -1259,9 +1284,12 @@ void main() { vec3 color = clamp(marble(vec3(gl_FragCoord.xy*u_scale,time)),0.,1.); gl_FragColor = vec4(color,1.); }`; -const tn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const pn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { u_time: { value: 0 }, u_pattern: { value: 0 }, @@ -1271,13 +1299,13 @@ const tn = (e) => { u_timeStrength: { value: 0 }, u_scale: { value: 0 } }, - vertexShader: en, - fragmentShader: nn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, rn = Object.freeze({ + vertexShader: vn, + fragmentShader: mn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, fn = Object.freeze({ pattern: 0, complexity: 2, complexityAttenuation: 0.2, @@ -1285,49 +1313,46 @@ const tn = (e) => { timeStrength: 0.2, scale: 2e-3, beat: !1 -}), Rt = ({ +}), jt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = tn(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = pn({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(rn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(fn), o = T(c); return [ - M( - (h, g) => { - const { gl: d, clock: b } = h; - return g && p(g), o(n, "u_pattern", i.pattern), o(n, "u_complexity", i.complexity), o( - n, - "u_complexityAttenuation", - i.complexityAttenuation - ), o(n, "u_iterations", i.iterations), o(n, "u_timeStrength", i.timeStrength), o(n, "u_scale", i.scale), o(n, "u_time", i.beat || b.getElapsedTime()), m(d); + _( + (x, y) => { + const { gl: h, clock: w } = x; + return y && f(y), o("u_pattern", i.pattern), o("u_complexity", i.complexity), o("u_complexityAttenuation", i.complexityAttenuation), o("u_iterations", i.iterations), o("u_timeStrength", i.timeStrength), o("u_scale", i.scale), o("u_time", i.beat || w.getElapsedTime()), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var on = `varying vec2 vUv; +var dn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, an = `precision highp float; +}`, gn = `precision highp float; precision highp int; varying vec2 vUv; @@ -1357,69 +1382,73 @@ void main() { gl_FragColor = vec4(outColor, tex.a); }`; -const un = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const hn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - uTexture: { value: new t.Texture() }, - uRgbWeight: { value: new t.Vector3(0.299, 0.587, 0.114) }, - uColor1: { value: new t.Color().set(0.5, 0.5, 0.5) }, - uColor2: { value: new t.Color().set(0.5, 0.5, 0.5) }, - uColor3: { value: new t.Color().set(1, 1, 1) }, - uColor4: { value: new t.Color().set(0, 0.1, 0.2) } + uTexture: { value: new n.Texture() }, + uRgbWeight: { value: new n.Vector3(0.299, 0.587, 0.114) }, + uColor1: { value: new n.Color().set(0.5, 0.5, 0.5) }, + uColor2: { value: new n.Color().set(0.5, 0.5, 0.5) }, + uColor3: { value: new n.Color().set(1, 1, 1) }, + uColor4: { value: new n.Color().set(0, 0.1, 0.2) } }, - vertexShader: on, - fragmentShader: an - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, sn = Object.freeze({ - texture: new t.Texture(), - color1: new t.Color().set(0.5, 0.5, 0.5), - color2: new t.Color().set(0.5, 0.5, 0.5), - color3: new t.Color().set(1, 1, 1), - color4: new t.Color().set(0, 0.1, 0.2), - rgbWeight: new t.Vector3(0.299, 0.587, 0.114) -}), At = ({ + vertexShader: dn, + fragmentShader: gn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, xn = Object.freeze({ + texture: new n.Texture(), + color1: new n.Color().set(0.5, 0.5, 0.5), + color2: new n.Color().set(0.5, 0.5, 0.5), + color3: new n.Color().set(1, 1, 1), + color4: new n.Color().set(0, 0.1, 0.2), + rgbWeight: new n.Vector3(0.299, 0.587, 0.114) +}), kt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = un(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = hn({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(sn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(xn), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "uTexture", i.texture), o(n, "uColor1", i.color1), o(n, "uColor2", i.color2), o(n, "uColor3", i.color3), o(n, "uColor4", i.color4), o(n, "uRgbWeight", i.rgbWeight), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("uTexture", i.texture), o("uColor1", i.color1), o("uColor2", i.color2), o("uColor3", i.color3), o("uColor4", i.color4), o("uRgbWeight", i.rgbWeight), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var ln = `varying vec2 vUv; +var bn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, cn = `precision highp float; +}`, yn = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -1434,63 +1463,67 @@ void main() { vec3 duotone = mix(uColor0, uColor1, grayscale); gl_FragColor = vec4(duotone, texColor.a); }`; -const vn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const wn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - uTexture: { value: new t.Texture() }, - uColor0: { value: new t.Color(16777215) }, - uColor1: { value: new t.Color(0) } + uTexture: { value: new n.Texture() }, + uColor0: { value: new n.Color(16777215) }, + uColor1: { value: new n.Color(0) } }, - vertexShader: ln, - fragmentShader: cn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, mn = { - texture: new t.Texture(), - color0: new t.Color(16777215), - color1: new t.Color(0) -}, It = ({ + vertexShader: bn, + fragmentShader: yn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, Mn = { + texture: new n.Texture(), + color0: new n.Color(16777215), + color1: new n.Color(0) +}, Nt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = vn(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = wn({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(mn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(Mn), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "uTexture", i.texture), o(n, "uColor0", i.color0), o(n, "uColor1", i.color1), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("uTexture", i.texture), o("uColor0", i.color0), o("uColor1", i.color1), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var pn = `varying vec2 vUv; +var Sn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, fn = `precision highp float; +}`, _n = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1531,75 +1564,79 @@ void main() { gl_FragColor = vec4(alphColor, alpha); }`; -const dn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const Tn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - u_texture: { value: new t.Texture() }, - u_map: { value: new t.Texture() }, - u_alphaMap: { value: new t.Texture() }, + 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 t.Vector3() }, + u_brightness: { value: new n.Vector3() }, u_min: { value: 0 }, u_max: { value: 0.9 }, - u_dodgeColor: { value: new t.Color(16777215) }, + u_dodgeColor: { value: new n.Color(16777215) }, u_isDodgeColor: { value: !1 } }, - vertexShader: pn, - fragmentShader: fn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, gn = { - texture: new t.Texture(), - map: new t.Texture(), + vertexShader: Sn, + fragmentShader: _n + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, Cn = { + texture: new n.Texture(), + map: new n.Texture(), alphaMap: !1, mapIntensity: 0.3, - brightness: new t.Vector3(0.5, 0.5, 0.5), + brightness: new n.Vector3(0.5, 0.5, 0.5), min: 0, max: 1, dodgeColor: !1 -}, Ft = ({ +}, Gt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = dn(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Tn({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(gn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(Cn), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "u_texture", i.texture), o(n, "u_map", i.map), o(n, "u_mapIntensity", i.mapIntensity), i.alphaMap ? (o(n, "u_alphaMap", i.alphaMap), o(n, "u_isAlphaMap", !0)) : o(n, "u_isAlphaMap", !1), o(n, "u_brightness", i.brightness), o(n, "u_min", i.min), o(n, "u_max", i.max), i.dodgeColor ? (o(n, "u_dodgeColor", i.dodgeColor), o(n, "u_isDodgeColor", !0)) : o(n, "u_isDodgeColor", !1), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("u_texture", i.texture), o("u_map", i.map), o("u_mapIntensity", i.mapIntensity), i.alphaMap ? (o("u_alphaMap", i.alphaMap), o("u_isAlphaMap", !0)) : o("u_isAlphaMap", !1), o("u_brightness", i.brightness), o("u_min", i.min), o("u_max", i.max), i.dodgeColor ? (o("u_dodgeColor", i.dodgeColor), o("u_isDodgeColor", !0)) : o("u_isDodgeColor", !1), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var hn = `varying vec2 vUv; +var Pn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, xn = `precision highp float; +}`, Dn = `precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -1666,93 +1703,100 @@ void main() { gl_FragColor = mix(color0, color1, progress); }`; -const yn = ({ +const Rn = ({ scene: e, - size: a, - dpr: r + size: r, + dpr: t, + onBeforeCompile: a }) => { - const u = x(() => new t.PlaneGeometry(2, 2), []), s = x( - () => new t.ShaderMaterial({ + const s = b(() => new n.PlaneGeometry(2, 2), []), u = b(() => { + const v = new n.ShaderMaterial({ uniforms: { - uResolution: { value: new t.Vector2() }, - uTextureResolution: { value: new t.Vector2() }, - uTexture0: { value: new t.Texture() }, - uTexture1: { value: new t.Texture() }, + 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 t.Texture() }, + uMap: { value: new n.Texture() }, edgeIntensity: { value: 0 }, mapIntensity: { value: 0 }, - epicenter: { value: new t.Vector2(0, 0) }, + epicenter: { value: new n.Vector2(0, 0) }, progress: { value: 0 }, dirX: { value: 0 }, dirY: { value: 0 } }, - vertexShader: hn, - fragmentShader: xn - }), - [] - ), c = q(a, r); - o(s, "uResolution", c.clone()); - const n = z(e, u, s, t.Mesh); - return { material: s, mesh: n }; -}, bn = { - texture0: new t.Texture(), - texture1: new t.Texture(), + vertexShader: Pn, + fragmentShader: Dn + }); + return a && (v.onBeforeCompile = a), v; + }, [a]), l = j(r, t); + T(u)("uResolution", l.clone()); + const c = U(e, s, u, n.Mesh); + return { material: u, mesh: c }; +}, An = { + texture0: new n.Texture(), + texture1: new n.Texture(), padding: 0, - map: new t.Texture(), + map: new n.Texture(), mapIntensity: 0, edgeIntensity: 0, - epicenter: new t.Vector2(0, 0), + epicenter: new n.Vector2(0, 0), progress: 0, - dir: new t.Vector2(0, 0) -}, zt = ({ + dir: new n.Vector2(0, 0) +}, Kt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = yn({ scene: c, size: e, dpr: s.shader }), v = U(e), [l, m] = V({ - scene: c, - camera: v, - dpr: s.fbo, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Rn({ + scene: l, + size: e, + dpr: u.shader, + onBeforeCompile: s + }), p = O(e), [m, d] = L({ + scene: l, + camera: p, + dpr: u.fbo, size: e, - samples: r, - isSizeUpdate: u - }), [i, p] = B(bn); + samples: t, + isSizeUpdate: a + }), [i, f] = B(An), o = T(c); return [ - M( - (h, g) => { - var _, S, T, F, P, D, $, k; - const { gl: d } = h; - g && p(g), o(n, "uTexture0", i.texture0), o(n, "uTexture1", i.texture1), o(n, "progress", i.progress); - const b = [ - ((S = (_ = i.texture0) == null ? void 0 : _.image) == null ? void 0 : S.width) || 0, - ((F = (T = i.texture0) == null ? void 0 : T.image) == null ? void 0 : F.height) || 0 - ], w = [ - ((D = (P = i.texture1) == null ? void 0 : P.image) == null ? void 0 : D.width) || 0, - ((k = ($ = i.texture1) == null ? void 0 : $.image) == null ? void 0 : k.height) || 0 - ], C = b.map((E, G) => E + (w[G] - E) * i.progress); - return o(n, "uTextureResolution", C), o(n, "padding", i.padding), o(n, "uMap", i.map), o(n, "mapIntensity", i.mapIntensity), o(n, "edgeIntensity", i.edgeIntensity), o(n, "epicenter", i.epicenter), o(n, "dirX", i.dir.x), o(n, "dirY", i.dir.y), m(d); + _( + (x, y) => { + var S, D, A, R, P, $, I, q; + const { gl: h } = x; + y && f(y), o("uTexture0", i.texture0), o("uTexture1", i.texture1), o("progress", i.progress); + const w = [ + ((D = (S = i.texture0) == null ? void 0 : S.image) == null ? void 0 : D.width) || 0, + ((R = (A = i.texture0) == null ? void 0 : A.image) == null ? void 0 : R.height) || 0 + ], M = [ + (($ = (P = i.texture1) == null ? void 0 : P.image) == null ? void 0 : $.width) || 0, + ((q = (I = i.texture1) == null ? void 0 : I.image) == null ? void 0 : q.height) || 0 + ], C = w.map((Q, X) => Q + (M[X] - Q) * i.progress); + return o("uTextureResolution", C), o("padding", i.padding), o("uMap", i.map), o("mapIntensity", i.mapIntensity), o("edgeIntensity", i.edgeIntensity), o("epicenter", i.epicenter), o("dirX", i.dir.x), o("dirY", i.dir.y), d(h); }, - [m, n, i, p] + [d, o, i, f] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var wn = `varying vec2 vUv; +var In = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Mn = `precision highp float; +}`, Fn = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1767,67 +1811,71 @@ void main() { float alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0); gl_FragColor = vec4(color, alpha); }`; -const Sn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const Vn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - u_texture: { value: new t.Texture() }, - u_brightness: { value: new t.Vector3() }, + u_texture: { value: new n.Texture() }, + u_brightness: { value: new n.Vector3() }, u_min: { value: 0 }, u_max: { value: 1 } }, - vertexShader: wn, - fragmentShader: Mn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, _n = { - texture: new t.Texture(), - brightness: new t.Vector3(0.5, 0.5, 0.5), + vertexShader: In, + fragmentShader: Fn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, zn = { + texture: new n.Texture(), + brightness: new n.Vector3(0.5, 0.5, 0.5), min: 0, max: 1 -}, Vt = ({ +}, Xt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Sn(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Vn({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B( - _n - ); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B( + zn + ), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "u_texture", i.texture), o(n, "u_brightness", i.brightness), o(n, "u_min", i.min), o(n, "u_max", i.max), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("u_texture", i.texture), o("u_brightness", i.brightness), o("u_min", i.min), o("u_max", i.max), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var Tn = `varying vec2 vUv; +var Un = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Cn = `precision highp float; +}`, On = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1846,63 +1894,67 @@ void main() { gl_FragColor = texture2D(u_texture, uv); }`; -const Pn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const Bn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - u_texture: { value: new t.Texture() }, - u_map: { value: new t.Texture() }, + u_texture: { value: new n.Texture() }, + u_map: { value: new n.Texture() }, u_mapIntensity: { value: 0 } }, - vertexShader: Tn, - fragmentShader: Cn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, Dn = { - texture: new t.Texture(), - map: new t.Texture(), + vertexShader: Un, + fragmentShader: On + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, Wn = { + texture: new n.Texture(), + map: new n.Texture(), mapIntensity: 0.3 -}, Ut = ({ +}, Yt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Pn(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Bn({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(Dn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(Wn), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "u_texture", i.texture), o(n, "u_map", i.map), o(n, "u_mapIntensity", i.mapIntensity), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("u_texture", i.texture), o("u_map", i.map), o("u_mapIntensity", i.mapIntensity), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var Rn = `varying vec2 vUv; +var Ln = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, An = `precision highp float; +}`, $n = `precision highp float; uniform sampler2D uTexture; uniform sampler2D uMap; @@ -1915,64 +1967,66 @@ void main() { vec4 map = texture2D(uMap, uv); gl_FragColor = mix(tex,map,map.a); }`; -const In = ({ +const En = ({ scene: e, - size: a + size: r, + onBeforeCompile: t }) => { - const r = x(() => new t.PlaneGeometry(2, 2), []), u = x( - () => new t.ShaderMaterial({ + const a = b(() => new n.PlaneGeometry(2, 2), []), s = b(() => { + const l = new n.ShaderMaterial({ uniforms: { - uTexture: { value: new t.Texture() }, - uMap: { value: new t.Texture() } + uTexture: { value: new n.Texture() }, + uMap: { value: new n.Texture() } }, - vertexShader: Rn, - fragmentShader: An - }), - [] - ), s = z(e, r, u, t.Mesh); - return { material: u, mesh: s }; -}, Fn = { - texture: new t.Texture(), - map: new t.Texture() -}, Bt = ({ + vertexShader: Ln, + fragmentShader: $n + }); + return t && (l.onBeforeCompile = t), l; + }, [t]), u = U(e, a, s, n.Mesh); + return { material: s, mesh: u }; +}, qn = { + texture: new n.Texture(), + map: new n.Texture() +}, Ht = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = In({ scene: c, size: e }), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = En({ scene: l, size: e, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(Fn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(qn), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "uTexture", i.texture), o(n, "uMap", i.map), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("uTexture", i.texture), o("uMap", i.map), d(h); }, - [n, m, i, p] + [o, d, i, f] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var zn = `varying vec2 vUv; +var jn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Vn = `precision highp float; +}`, kn = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -2005,66 +2059,68 @@ void main() { vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); }`; -const Un = ({ +const Nn = ({ scene: e, - size: a + size: r, + onBeforeCompile: t }) => { - const r = x(() => new t.PlaneGeometry(2, 2), []), u = x( - () => new t.ShaderMaterial({ + const a = b(() => new n.PlaneGeometry(2, 2), []), s = b(() => { + const l = new n.ShaderMaterial({ uniforms: { - u_texture: { value: new t.Texture() }, + u_texture: { value: new n.Texture() }, u_brightness: { value: 1 }, u_saturation: { value: 1 } }, - vertexShader: zn, - fragmentShader: Vn - }), - [] - ), s = z(e, r, u, t.Mesh); - return { material: u, mesh: s }; -}, Bn = { - texture: new t.Texture(), + vertexShader: jn, + fragmentShader: kn + }); + return t && (l.onBeforeCompile = t), l; + }, [t]), u = U(e, a, s, n.Mesh); + return { material: s, mesh: u }; +}, Gn = { + texture: new n.Texture(), brightness: 1, saturation: 1 -}, Ot = ({ +}, Qt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Un({ scene: c, size: e }), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Nn({ scene: l, size: e, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(Bn); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(Gn), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "u_texture", i.texture), o(n, "u_brightness", i.brightness), o(n, "u_saturation", i.saturation), m(d); + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("u_texture", i.texture), o("u_brightness", i.brightness), o("u_saturation", i.saturation), d(h); }, - [n, m, i, p] + [o, d, i, f] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var On = `varying vec2 vUv; +var Kn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Ln = `precision highp float; +}`, Xn = `precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -2083,73 +2139,80 @@ void main() { gl_FragColor = texture2D(uTexture, uv); }`; -const $n = ({ +const Yn = ({ scene: e, - size: a, - dpr: r + size: r, + dpr: t, + onBeforeCompile: a }) => { - const u = x(() => new t.PlaneGeometry(2, 2), []), s = x( - () => new t.ShaderMaterial({ + const s = b(() => new n.PlaneGeometry(2, 2), []), u = b(() => { + const v = new n.ShaderMaterial({ uniforms: { - uResolution: { value: new t.Vector2() }, - uTextureResolution: { value: new t.Vector2() }, - uTexture: { value: new t.Texture() } + uResolution: { value: new n.Vector2() }, + uTextureResolution: { value: new n.Vector2() }, + uTexture: { value: new n.Texture() } }, - vertexShader: On, - fragmentShader: Ln - }), - [] - ), c = q(a, r); - o(s, "uResolution", c.clone()); - const n = z(e, u, s, t.Mesh); - return { material: s, mesh: n }; -}, En = { - texture: new t.Texture() -}, Lt = ({ + vertexShader: Kn, + fragmentShader: Xn + }); + return a && (v.onBeforeCompile = a), v; + }, [a]), l = j(r, t); + T(u)("uResolution", l.clone()); + const c = U(e, s, u, n.Mesh); + return { material: u, mesh: c }; +}, Hn = { + texture: new n.Texture() +}, Zt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = $n({ scene: c, size: e, dpr: s.shader }), v = U(e), [l, m] = V({ - scene: c, - camera: v, - dpr: s.fbo, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Yn({ + scene: l, + size: e, + dpr: u.shader, + onBeforeCompile: s + }), p = O(e), [m, d] = L({ + scene: l, + camera: p, + dpr: u.fbo, size: e, - samples: r, - isSizeUpdate: u - }), [i, p] = B(En); + samples: t, + isSizeUpdate: a + }), [i, f] = B(Hn), o = T(c); return [ - M( - (h, g) => { - var b, w, C, _, S, T; - const { gl: d } = h; - return g && p(g), o(n, "uTexture", i.texture), o(n, "uTextureResolution", [ - ((C = (w = (b = i.texture) == null ? void 0 : b.source) == null ? void 0 : w.data) == null ? void 0 : C.width) || 0, - ((T = (S = (_ = i.texture) == null ? void 0 : _.source) == null ? void 0 : S.data) == null ? void 0 : T.height) || 0 - ]), m(d); + _( + (x, y) => { + var w, M, C, S, D, A; + const { gl: h } = x; + return y && f(y), o("uTexture", i.texture), o("uTextureResolution", [ + ((C = (M = (w = i.texture) == null ? void 0 : w.source) == null ? void 0 : M.data) == null ? void 0 : C.width) || 0, + ((A = (D = (S = i.texture) == null ? void 0 : S.source) == null ? void 0 : D.data) == null ? void 0 : A.height) || 0 + ]), d(h); }, - [m, n, i, p] + [d, o, i, f] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var Wn = `precision mediump float; +var Qn = `precision highp float; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, qn = `precision mediump float; +}`, Zn = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -2175,77 +2238,81 @@ void main() { gl_FragColor = outColor; }`; -const jn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const Jn = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - uTexture: { value: new t.Texture() }, - uResolution: { value: new t.Vector2(0, 0) }, - uBlurSize: { value: ve.blurSize } + uTexture: { value: new n.Texture() }, + uResolution: { value: new n.Vector2(0, 0) }, + uBlurSize: { value: be.blurSize } }, - vertexShader: Wn, - fragmentShader: qn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, ve = Object.freeze({ - texture: new t.Texture(), + vertexShader: Qn, + fragmentShader: Zn + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, be = Object.freeze({ + texture: new n.Texture(), blurSize: 3, blurPower: 5 -}), $t = ({ +}), Jt = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = jn(c), v = U(e), l = x( + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = Jn({ scene: l, onBeforeCompile: s }), p = O(e), m = b( () => ({ - scene: c, - camera: v, + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u + dpr: u.fbo, + samples: t, + isSizeUpdate: a }), - [c, v, e, s.fbo, r, u] - ), [m, i] = X(l), [p, y] = B(ve); + [l, p, e, u.fbo, t, a] + ), [d, i] = Y(m), [f, o] = B(be), g = T(c); return [ - M( - (g, d) => { - var _, S, T, F, P, D; - const { gl: b } = g; - d && y(d), o(n, "uTexture", p.texture), o(n, "uResolution", [ - ((T = (S = (_ = p.texture) == null ? void 0 : _.source) == null ? void 0 : S.data) == null ? void 0 : T.width) || 0, - ((D = (P = (F = p.texture) == null ? void 0 : F.source) == null ? void 0 : P.data) == null ? void 0 : D.height) || 0 - ]), o(n, "uBlurSize", p.blurSize); - let w = i(b); - const C = p.blurPower; - for (let $ = 0; $ < C; $++) - o(n, "uTexture", w), w = i(b); - return w; + _( + (y, h) => { + var S, D, A, R, P, $; + const { gl: w } = y; + h && o(h), g("uTexture", f.texture), g("uResolution", [ + ((A = (D = (S = f.texture) == null ? void 0 : S.source) == null ? void 0 : D.data) == null ? void 0 : A.width) || 0, + (($ = (P = (R = f.texture) == null ? void 0 : R.source) == null ? void 0 : P.data) == null ? void 0 : $.height) || 0 + ]), g("uBlurSize", f.blurSize); + let M = i(w); + const C = f.blurPower; + for (let I = 0; I < C; I++) + g("uTexture", M), M = i(w); + return M; }, - [i, n, y, p] + [i, g, o, f] ), - y, + o, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: m, - output: m.read.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: d, + output: d.read.texture } ]; }; -var Nn = `precision mediump float; +var et = `precision highp float; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, kn = `precision mediump float; +}`, nt = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -2261,71 +2328,75 @@ void main() { vec4 mixed = mix(current,back,uStrength); gl_FragColor = mixed; }`; -const Gn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const tt = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - uTexture: { value: Y.texture }, - uBackbuffer: { value: new t.Texture() }, - uBegin: { value: Y.begin }, - uEnd: { value: Y.end }, - uStrength: { value: Y.strength } + uTexture: { value: Z.texture }, + uBackbuffer: { value: new n.Texture() }, + uBegin: { value: Z.begin }, + uEnd: { value: Z.end }, + uStrength: { value: Z.strength } }, - vertexShader: Nn, - fragmentShader: kn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, Y = Object.freeze({ - texture: new t.Texture(), - begin: new t.Vector2(0, 0), - end: new t.Vector2(0, 0), + vertexShader: et, + fragmentShader: nt + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, Z = Object.freeze({ + texture: new n.Texture(), + begin: new n.Vector2(0, 0), + end: new n.Vector2(0, 0), strength: 0.9 -}), Et = ({ +}), er = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Gn(c), v = U(e), l = x( + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = tt({ scene: l, onBeforeCompile: s }), p = O(e), m = b( () => ({ - scene: c, - camera: v, + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u + dpr: u.fbo, + samples: t, + isSizeUpdate: a }), - [c, v, e, s.fbo, r, u] - ), [m, i] = X(l), [p, y] = B(Y); + [l, p, e, u.fbo, t, a] + ), [d, i] = Y(m), [f, o] = B(Z), g = T(c); return [ - M( - (g, d) => { - const { gl: b } = g; - return d && y(d), o(n, "uTexture", p.texture), o(n, "uBegin", p.begin), o(n, "uEnd", p.end), o(n, "uStrength", p.strength), i(b, ({ read: w }) => { - o(n, "uBackbuffer", w); + _( + (y, h) => { + const { gl: w } = y; + return h && o(h), g("uTexture", f.texture), g("uBegin", f.begin), g("uEnd", f.end), g("uStrength", f.strength), i(w, ({ read: M }) => { + g("uBackbuffer", M); }); }, - [i, n, y, p] + [i, g, o, f] ), - y, + o, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: m, - output: m.read.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: d, + output: d.read.texture } ]; }; -var Kn = `varying vec2 vUv; +var rt = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Xn = `precision highp float; +}`, ot = `precision highp float; varying vec2 vUv; uniform float uProgress; @@ -2375,71 +2446,74 @@ void main() { gl_FragColor = vec4(color, 1.0); }`; -const Yn = (e) => { - const a = x(() => new t.PlaneGeometry(2, 2), []), r = x( - () => new t.ShaderMaterial({ +const at = ({ + scene: e, + onBeforeCompile: r +}) => { + const t = b(() => new n.PlaneGeometry(2, 2), []), a = b(() => { + const u = new n.ShaderMaterial({ uniforms: { - uEpicenter: { value: H.epicenter }, - uProgress: { value: H.progress }, - uStrength: { value: H.strength }, - uWidth: { value: H.width }, + uEpicenter: { value: J.epicenter }, + uProgress: { value: J.progress }, + uStrength: { value: J.strength }, + uWidth: { value: J.width }, uMode: { value: 0 } }, - vertexShader: Kn, - fragmentShader: Xn - }), - [] - ), u = z(e, a, r, t.Mesh); - return { material: r, mesh: u }; -}, H = Object.freeze({ - epicenter: new t.Vector2(0, 0), + vertexShader: rt, + fragmentShader: ot + }); + return r && (u.onBeforeCompile = r), u; + }, [r]), s = U(e, t, a, n.Mesh); + return { material: a, mesh: s }; +}, J = Object.freeze({ + epicenter: new n.Vector2(0, 0), progress: 0, width: 0, strength: 0, mode: "center" -}), Wt = ({ +}), nr = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Yn(c), v = U(e), [l, m] = V({ - scene: c, - camera: v, + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = at({ scene: l, onBeforeCompile: s }), p = O(e), [m, d] = L({ + scene: l, + camera: p, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(H); + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(J), o = T(c); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "uEpicenter", i.epicenter), o(n, "uProgress", i.progress), o(n, "uWidth", i.width), o(n, "uStrength", i.strength), o( - n, + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("uEpicenter", i.epicenter), o("uProgress", i.progress), o("uWidth", i.width), o("uStrength", i.strength), o( "uMode", i.mode === "center" ? 0 : i.mode === "horizontal" ? 1 : 2 - ), m(d); + ), d(h); }, - [m, n, p, i] + [d, o, f, i] ), - p, + f, { - scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture } ]; }; -var Hn = `varying vec2 vUv; +var it = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Qn = `precision highp float; +}`, ut = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -2508,97 +2582,206 @@ void main() { gl_FragColor = finColor; }`; -const Zn = ({ +const st = ({ scene: e, - size: a, - dpr: r + size: r, + dpr: t, + onBeforeCompile: a }) => { - const u = x(() => new t.PlaneGeometry(2, 2), []), s = x( - () => new t.ShaderMaterial({ + const s = b(() => new n.PlaneGeometry(2, 2), []), u = b(() => { + const v = new n.ShaderMaterial({ uniforms: { - u_texture: { value: new t.Texture() }, - u_resolution: { value: new t.Vector2() }, - u_keyColor: { value: new t.Color() }, + u_texture: { value: new n.Texture() }, + u_resolution: { value: new n.Vector2() }, + u_keyColor: { value: new n.Color() }, u_similarity: { value: 0 }, u_smoothness: { value: 0 }, u_spill: { value: 0 }, - u_color: { value: new t.Vector4() }, + u_color: { value: new n.Vector4() }, u_contrast: { value: 0 }, u_brightness: { value: 0 }, u_gamma: { value: 0 } }, - vertexShader: Hn, - fragmentShader: Qn - }), - [] - ), c = q(a, r); - o(s, "u_resolution", c.clone()); - const n = z(e, u, s, t.Mesh); - return { material: s, mesh: n }; -}, Jn = Object.freeze({ - texture: new t.Texture(), - keyColor: new t.Color(65280), + vertexShader: it, + fragmentShader: ut + }); + return a && (v.onBeforeCompile = a), v; + }, [a]), l = j(r, t); + T(u)("u_resolution", l.clone()); + const c = U(e, s, u, n.Mesh); + return { material: u, mesh: c }; +}, lt = Object.freeze({ + texture: new n.Texture(), + keyColor: new n.Color(65280), similarity: 0.2, smoothness: 0.1, spill: 0.2, - color: new t.Vector4(1, 1, 1, 1), + color: new n.Vector4(1, 1, 1, 1), contrast: 1, brightness: 0, gamma: 1 -}), qt = ({ +}), tr = ({ + size: e, + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s +}) => { + const u = V(r), l = b(() => new n.Scene(), []), { material: c, mesh: v } = st({ + scene: l, + size: e, + dpr: u.shader, + onBeforeCompile: s + }), p = O(e), [m, d] = L({ + scene: l, + camera: p, + size: e, + dpr: u.fbo, + samples: t, + isSizeUpdate: a + }), [i, f] = B(lt), o = T(c); + return [ + _( + (x, y) => { + const { gl: h } = x; + return y && f(y), o("u_texture", i.texture), o("u_keyColor", i.keyColor), o("u_similarity", i.similarity), o("u_smoothness", i.smoothness), o("u_spill", i.spill), o("u_color", i.color), o("u_contrast", i.contrast), o("u_brightness", i.brightness), o("u_gamma", i.gamma), d(h); + }, + [d, o, f, i] + ), + f, + { + scene: l, + mesh: v, + material: c, + camera: p, + renderTarget: m, + output: m.texture + } + ]; +}; +var ct = `precision highp float; + +varying vec2 vUv; + +void main() { + vec4 usf_Position = vec4(position,1.); + vUv = uv; + + + + gl_Position = usf_Position; +}`, vt = `precision highp float; + +varying vec2 vUv; + +uniform sampler2D uTexture; +uniform sampler2D uBackbuffer; +uniform float uTime; +uniform vec2 uPointer; +uniform vec2 uResolution; + +void main() { + vec4 usf_FragColor = vec4(1.); + + + + gl_FragColor = usf_FragColor; +}`; +const mt = ({ + scene: e, + size: r, + dpr: t, + onBeforeCompile: a, + uniforms: s +}) => { + const u = b(() => new n.PlaneGeometry(2, 2), []), l = b(() => { + const p = new n.ShaderMaterial({ + uniforms: { + uTexture: { value: ye.texture }, + uBackbuffer: { value: new n.Texture() }, + uTime: { value: 0 }, + uPointer: { value: new n.Vector2() }, + uResolution: { value: new n.Vector2() }, + ...s + }, + vertexShader: ct, + fragmentShader: vt + }); + return a && (p.onBeforeCompile = a), p; + }, [a, s]), c = j(r, t); + T(l)("uResolution", c.clone()); + const v = U(e, u, l, n.Mesh); + return { material: l, mesh: v }; +}, ye = Object.freeze({ + texture: new n.Texture(), + beat: !1 +}), rr = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u + dpr: r, + samples: t, + isSizeUpdate: a, + onBeforeCompile: s, + uniforms: u }) => { - const s = I(a), c = x(() => new t.Scene(), []), { material: n, mesh: f } = Zn({ scene: c, size: e, dpr: s.shader }), v = U(e), [l, m] = V({ + const l = V(r), c = b(() => new n.Scene(), []), { material: v, mesh: p } = mt({ scene: c, - camera: v, size: e, - dpr: s.fbo, - samples: r, - isSizeUpdate: u - }), [i, p] = B(Jn); + dpr: l.shader, + onBeforeCompile: s, + uniforms: u + }), m = O(e), d = b( + () => ({ + scene: c, + camera: m, + size: e, + dpr: l.fbo, + samples: t, + isSizeUpdate: a + }), + [c, m, e, l.fbo, t, a] + ), [i, f] = Y(d), [o, g] = B(ye), x = T(v); return [ - M( - (h, g) => { - const { gl: d } = h; - return g && p(g), o(n, "u_texture", i.texture), o(n, "u_keyColor", i.keyColor), o(n, "u_similarity", i.similarity), o(n, "u_smoothness", i.smoothness), o(n, "u_spill", i.spill), o(n, "u_color", i.color), o(n, "u_contrast", i.contrast), o(n, "u_brightness", i.brightness), o(n, "u_gamma", i.gamma), m(d); + _( + (h, w) => { + const { gl: M, clock: C, pointer: S } = h; + return w && g(w), x("uTexture", o.texture), x("uPointer", S), x("uTime", o.beat || C.getElapsedTime()), f(M, ({ read: D }) => { + x("uBackbuffer", D); + }); }, - [m, n, p, i] + [f, x, g, o] ), - p, + g, { scene: c, - mesh: f, - material: n, - camera: v, - renderTarget: l, - output: l.texture + mesh: p, + material: v, + camera: m, + renderTarget: i, + output: i.read.texture } ]; -}, et = ({ +}, pt = ({ scene: e, - geometry: a, - material: r + geometry: r, + material: t }) => { - const u = z( + const a = U( e, - a, r, - t.Points - ), s = z( + t, + n.Points + ), s = U( e, - x(() => a.clone(), [a]), - x(() => r.clone(), [r]), - t.Mesh + b(() => r.clone(), [r]), + b(() => t.clone(), [t]), + n.Mesh ); return s.visible = !1, { - points: u, + points: a, interactiveMesh: s }; }; -var nt = `uniform vec2 uResolution; +var ft = `uniform vec2 uResolution; uniform float uMorphProgress; uniform float uPointSize; @@ -2700,7 +2883,7 @@ void main() { vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; -}`, tt = `precision highp float; +}`, dt = `precision highp float; precision highp int; varying vec3 vColor; @@ -2742,7 +2925,7 @@ void main() { float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); -}`, me = `vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +}`, we = `vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} float permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));} vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} float taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;} @@ -2847,12 +3030,12 @@ float getWobble(vec3 position) return simplexNoise4d(vec4( warpedPosition * uWobblePositionFrequency, - uTime * uWobbleTimeFrequency + uTime * uWobbleTimeFrequency )) * uWobbleStrength; }`; -const pe = process.env.NODE_ENV === "development", se = (e, a, r, u, s) => { +const Me = process.env.NODE_ENV === "development", ge = (e, r, t, a, s) => { var m; - const c = r === "position" ? "positionTarget" : "uvTarget", n = r === "position" ? "#usf " : "#usf ", f = r === "position" ? "#usf " : "#usf ", v = r === "position" ? "positionsList" : "uvsList", l = r === "position" ? ` + const u = t === "position" ? "positionTarget" : "uvTarget", l = t === "position" ? "#usf " : "#usf ", c = t === "position" ? "#usf " : "#usf ", v = t === "position" ? "positionsList" : "uvsList", p = t === "position" ? ` float scaledProgress = uMorphProgress * ${e.length - 1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length - 1}); @@ -2861,232 +3044,213 @@ const pe = process.env.NODE_ENV === "development", se = (e, a, r, u, s) => { newPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress); ` : "newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);"; if (e.length > 0) { - a.deleteAttribute(r), a.setAttribute( - r, - new t.BufferAttribute(e[0], s) + r.deleteAttribute(t), r.setAttribute( + t, + new n.BufferAttribute(e[0], s) ); - let i = "", p = ""; - e.forEach((y, h) => { - a.setAttribute( - `${c}${h}`, - new t.BufferAttribute(y, s) - ), i += `attribute vec${s} ${c}${h}; -`, h === 0 ? p += `${c}${h}` : p += `,${c}${h}`; - }), u = u.replace( - `${n}`, - i - ), u = u.replace( - `${f}`, - `vec${s} ${v}[${e.length}] = vec${s}[](${p}); - ${l} + let d = "", i = ""; + e.forEach((f, o) => { + r.setAttribute( + `${u}${o}`, + new n.BufferAttribute(f, s) + ), d += `attribute vec${s} ${u}${o}; +`, o === 0 ? i += `${u}${o}` : i += `,${u}${o}`; + }), a = a.replace( + `${l}`, + d + ), a = a.replace( + `${c}`, + `vec${s} ${v}[${e.length}] = vec${s}[](${i}); + ${p} ` ); } else - u = u.replace(`${n}`, ""), u = u.replace(`${f}`, ""), (m = a == null ? void 0 : a.attributes[r]) != null && m.array || pe && console.error( - `use-shader-fx:geometry.attributes.${r}.array is not found` + a = a.replace(`${l}`, ""), a = a.replace(`${c}`, ""), (m = r == null ? void 0 : r.attributes[t]) != null && m.array || Me && console.error( + `use-shader-fx:geometry.attributes.${t}.array is not found` ); - return u; -}, le = (e, a, r, u) => { - var c; + return a; +}, he = (e, r, t, a) => { + var u; let s = []; if (e && e.length > 0) { - (c = a == null ? void 0 : a.attributes[r]) != null && c.array ? s = [ - a.attributes[r].array, + (u = r == null ? void 0 : r.attributes[t]) != null && u.array ? s = [ + r.attributes[t].array, ...e ] : s = e; - const n = Math.max(...s.map((f) => f.length)); - s.forEach((f, v) => { - if (f.length < n) { - const l = (n - f.length) / u, m = [], i = Array.from(f); - for (let p = 0; p < l; p++) { - const y = Math.floor(f.length / u * Math.random()) * u; - for (let h = 0; h < u; h++) - m.push(i[y + h]); + const l = Math.max(...s.map((c) => c.length)); + s.forEach((c, v) => { + if (c.length < l) { + const p = (l - c.length) / a, m = [], d = Array.from(c); + for (let i = 0; i < p; i++) { + const f = Math.floor(c.length / a * Math.random()) * a; + for (let o = 0; o < a; o++) + m.push(d[f + o]); } - s[v] = new Float32Array([...i, ...m]); + s[v] = new Float32Array([...d, ...m]); } }); } return s; -}, rt = (e, a) => { - let r = ""; - const u = {}; +}, gt = (e, r) => { + let t = ""; + const a = {}; let s = "mapArrayColor = "; - return e && e.length > 0 ? (e.forEach((n, f) => { - const v = `vMapArrayIndex < ${f}.1`, l = `texture2D(uMapArray${f}, uv)`; - s += `( ${v} ) ? ${l} : `, r += ` - uniform sampler2D uMapArray${f}; - `, u[`uMapArray${f}`] = { value: n }; - }), s += "vec4(1.);", r += "bool isMapArray = true;", u.uMapArrayLength = { value: e.length }) : (s += "vec4(1.0);", r += "bool isMapArray = false;", u.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: a.replace("#usf ", s).replace("#usf ", r), mapArrayUniforms: u }; -}, ot = ({ + return e && e.length > 0 ? (e.forEach((l, c) => { + const v = `vMapArrayIndex < ${c}.1`, p = `texture2D(uMapArray${c}, uv)`; + s += `( ${v} ) ? ${p} : `, t += ` + uniform sampler2D uMapArray${c}; + `, a[`uMapArray${c}`] = { value: l }; + }), s += "vec4(1.);", t += "bool isMapArray = true;", a.uMapArrayLength = { value: e.length }) : (s += "vec4(1.0);", t += "bool isMapArray = false;", a.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: r.replace("#usf ", s).replace("#usf ", t), mapArrayUniforms: a }; +}, ht = ({ size: e, - dpr: a, - geometry: r, - positions: u, + dpr: r, + geometry: t, + positions: a, uvs: s, - mapArray: c + mapArray: u, + onBeforeCompile: l }) => { - const n = x( - () => le(u, r, "position", 3), - [u, r] - ), f = x( - () => le(s, r, "uv", 2), - [s, r] - ), v = x(() => { - n.length !== f.length && pe && console.log("use-shader-fx:positions and uvs are not matched"); - const m = se( - f, - r, + const c = b( + () => he(a, t, "position", 3), + [a, t] + ), v = b( + () => he(s, t, "uv", 2), + [s, t] + ), p = b(() => { + c.length !== v.length && Me && console.log("use-shader-fx:positions and uvs are not matched"); + const d = ge( + v, + t, "uv", - se( - n, - r, + ge( + c, + t, "position", - nt, + ft, 3 ), 2 - ).replace("#usf ", me), i = rt(c, tt); - return new t.ShaderMaterial({ - vertexShader: m, - fragmentShader: i.rewritedFragmentShader, + ).replace("#usf ", we), { rewritedFragmentShader: i, mapArrayUniforms: f } = gt(u, dt), o = new n.ShaderMaterial({ + vertexShader: d, + fragmentShader: i, depthTest: !1, depthWrite: !1, transparent: !0, - blending: t.AdditiveBlending, + blending: n.AdditiveBlending, uniforms: { - uResolution: { value: new t.Vector2(0, 0) }, - uMorphProgress: { value: A.morphProgress }, - uBlurAlpha: { value: A.blurAlpha }, - uBlurRadius: { value: A.blurRadius }, - uPointSize: { value: A.pointSize }, - uPointAlpha: { value: A.pointAlpha }, - uPicture: { value: new t.Texture() }, + uResolution: { value: new n.Vector2(0, 0) }, + uMorphProgress: { value: z.morphProgress }, + uBlurAlpha: { value: z.blurAlpha }, + uBlurRadius: { value: z.blurRadius }, + uPointSize: { value: z.pointSize }, + uPointAlpha: { value: z.pointAlpha }, + uPicture: { value: new n.Texture() }, uIsPicture: { value: !1 }, - uAlphaPicture: { value: new t.Texture() }, + uAlphaPicture: { value: new n.Texture() }, uIsAlphaPicture: { value: !1 }, - uColor0: { value: A.color0 }, - uColor1: { value: A.color1 }, - uColor2: { value: A.color2 }, - uColor3: { value: A.color3 }, - uMap: { value: new t.Texture() }, + uColor0: { value: z.color0 }, + uColor1: { value: z.color1 }, + uColor2: { value: z.color2 }, + uColor3: { value: z.color3 }, + uMap: { value: new n.Texture() }, uIsMap: { value: !1 }, - uAlphaMap: { value: new t.Texture() }, + uAlphaMap: { value: new n.Texture() }, uIsAlphaMap: { value: !1 }, uTime: { value: 0 }, uWobblePositionFrequency: { - value: A.wobblePositionFrequency + value: z.wobblePositionFrequency }, uWobbleTimeFrequency: { - value: A.wobbleTimeFrequency + value: z.wobbleTimeFrequency }, - uWobbleStrength: { value: A.wobbleStrength }, + uWobbleStrength: { value: z.wobbleStrength }, uWarpPositionFrequency: { - value: A.warpPositionFrequency + value: z.warpPositionFrequency }, uWarpTimeFrequency: { - value: A.warpTimeFrequency + value: z.warpTimeFrequency }, - uWarpStrength: { value: A.warpStrength }, - uDisplacement: { value: new t.Texture() }, + uWarpStrength: { value: z.warpStrength }, + uDisplacement: { value: new n.Texture() }, uIsDisplacement: { value: !1 }, uDisplacementIntensity: { - value: A.displacementIntensity + value: z.displacementIntensity }, uDisplacementColorIntensity: { - value: A.displacementColorIntensity + value: z.displacementColorIntensity }, uSizeRandomIntensity: { - value: A.sizeRandomIntensity + value: z.sizeRandomIntensity }, uSizeRandomTimeFrequency: { - value: A.sizeRandomTimeFrequency + value: z.sizeRandomTimeFrequency }, - uSizeRandomMin: { value: A.sizeRandomMin }, - uSizeRandomMax: { value: A.sizeRandomMax }, - uDivergence: { value: A.divergence }, - uDivergencePoint: { value: A.divergencePoint }, - ...i.mapArrayUniforms + uSizeRandomMin: { value: z.sizeRandomMin }, + uSizeRandomMax: { value: z.sizeRandomMax }, + uDivergence: { value: z.divergence }, + uDivergencePoint: { value: z.divergencePoint }, + ...f } }); + return l && (o.onBeforeCompile = l), o; }, [ - r, - n, - f, - c - ]), l = q(e, a); - return o(v, "uResolution", l.clone()), { material: v, modifiedPositions: n, modifiedUvs: f }; -}, at = ({ + t, + c, + v, + u, + l + ]), m = j(e, r); + return T(p)("uResolution", m.clone()), { material: p, modifiedPositions: c, modifiedUvs: v }; +}, xt = ({ size: e, - dpr: a, - scene: r = !1, - geometry: u, + dpr: r, + scene: t = !1, + geometry: a, positions: s, - uvs: c, - mapArray: n + uvs: u, + mapArray: l, + onBeforeCompile: c }) => { - const f = I(a), v = x(() => { - const g = u || new t.SphereGeometry(1, 32, 32); - return g.setIndex(null), g.deleteAttribute("normal"), g; - }, [u]), { material: l, modifiedPositions: m, modifiedUvs: i } = ot({ + const v = V(r), p = b(() => { + const y = a || new n.SphereGeometry(1, 32, 32); + return y.setIndex(null), y.deleteAttribute("normal"), y; + }, [a]), { material: m, modifiedPositions: d, modifiedUvs: i } = ht({ size: e, - dpr: f.shader, - geometry: v, + dpr: v.shader, + geometry: p, positions: s, - uvs: c, - mapArray: n - }), { points: p, interactiveMesh: y } = et({ - scene: r, - geometry: v, - material: l - }); + uvs: u, + mapArray: l, + onBeforeCompile: c + }), { points: f, interactiveMesh: o } = pt({ + scene: t, + geometry: p, + material: m + }), g = T(m); return [ - M( - (g, d) => { - g && o( - l, - "uTime", - (d == null ? void 0 : d.beat) || g.clock.getElapsedTime() - ), d !== void 0 && (o(l, "uMorphProgress", d.morphProgress), o(l, "uBlurAlpha", d.blurAlpha), o(l, "uBlurRadius", d.blurRadius), o(l, "uPointSize", d.pointSize), o(l, "uPointAlpha", d.pointAlpha), d.picture ? (o(l, "uPicture", d.picture), o(l, "uIsPicture", !0)) : d.picture === !1 && o(l, "uIsPicture", !1), d.alphaPicture ? (o(l, "uAlphaPicture", d.alphaPicture), o(l, "uIsAlphaPicture", !0)) : d.alphaPicture === !1 && o(l, "uIsAlphaPicture", !1), o(l, "uColor0", d.color0), o(l, "uColor1", d.color1), o(l, "uColor2", d.color2), o(l, "uColor3", d.color3), d.map ? (o(l, "uMap", d.map), o(l, "uIsMap", !0)) : d.map === !1 && o(l, "uIsMap", !1), d.alphaMap ? (o(l, "uAlphaMap", d.alphaMap), o(l, "uIsAlphaMap", !0)) : d.alphaMap === !1 && o(l, "uIsAlphaMap", !1), o(l, "uWobbleStrength", d.wobbleStrength), o( - l, + _( + (y, h) => { + y && g("uTime", (h == null ? void 0 : h.beat) || y.clock.getElapsedTime()), h !== void 0 && (g("uMorphProgress", h.morphProgress), g("uBlurAlpha", h.blurAlpha), g("uBlurRadius", h.blurRadius), g("uPointSize", h.pointSize), g("uPointAlpha", h.pointAlpha), h.picture ? (g("uPicture", h.picture), g("uIsPicture", !0)) : h.picture === !1 && g("uIsPicture", !1), h.alphaPicture ? (g("uAlphaPicture", h.alphaPicture), g("uIsAlphaPicture", !0)) : h.alphaPicture === !1 && g("uIsAlphaPicture", !1), g("uColor0", h.color0), g("uColor1", h.color1), g("uColor2", h.color2), g("uColor3", h.color3), h.map ? (g("uMap", h.map), g("uIsMap", !0)) : h.map === !1 && g("uIsMap", !1), h.alphaMap ? (g("uAlphaMap", h.alphaMap), g("uIsAlphaMap", !0)) : h.alphaMap === !1 && g("uIsAlphaMap", !1), g("uWobbleStrength", h.wobbleStrength), g( "uWobblePositionFrequency", - d.wobblePositionFrequency - ), o( - l, - "uWobbleTimeFrequency", - d.wobbleTimeFrequency - ), o(l, "uWarpStrength", d.warpStrength), o( - l, - "uWarpPositionFrequency", - d.warpPositionFrequency - ), o(l, "uWarpTimeFrequency", d.warpTimeFrequency), d.displacement ? (o(l, "uDisplacement", d.displacement), o(l, "uIsDisplacement", !0)) : d.displacement === !1 && o(l, "uIsDisplacement", !1), o( - l, - "uDisplacementIntensity", - d.displacementIntensity - ), o( - l, + h.wobblePositionFrequency + ), g("uWobbleTimeFrequency", h.wobbleTimeFrequency), g("uWarpStrength", h.warpStrength), g("uWarpPositionFrequency", h.warpPositionFrequency), g("uWarpTimeFrequency", h.warpTimeFrequency), h.displacement ? (g("uDisplacement", h.displacement), g("uIsDisplacement", !0)) : h.displacement === !1 && g("uIsDisplacement", !1), g("uDisplacementIntensity", h.displacementIntensity), g( "uDisplacementColorIntensity", - d.displacementColorIntensity - ), o( - l, - "uSizeRandomIntensity", - d.sizeRandomIntensity - ), o( - l, + h.displacementColorIntensity + ), g("uSizeRandomIntensity", h.sizeRandomIntensity), g( "uSizeRandomTimeFrequency", - d.sizeRandomTimeFrequency - ), o(l, "uSizeRandomMin", d.sizeRandomMin), o(l, "uSizeRandomMax", d.sizeRandomMax), o(l, "uDivergence", d.divergence), o(l, "uDivergencePoint", d.divergencePoint)); + h.sizeRandomTimeFrequency + ), g("uSizeRandomMin", h.sizeRandomMin), g("uSizeRandomMax", h.sizeRandomMax), g("uDivergence", h.divergence), g("uDivergencePoint", h.divergencePoint)); }, - [l] + [g] ), { - points: p, - interactiveMesh: y, - positions: m, + points: f, + interactiveMesh: o, + positions: d, uvs: i } ]; -}, A = Object.freeze({ +}, z = Object.freeze({ morphProgress: 0, blurAlpha: 0.9, blurRadius: 0.05, @@ -3094,10 +3258,10 @@ const pe = process.env.NODE_ENV === "development", se = (e, a, r, u, s) => { pointAlpha: 1, picture: !1, alphaPicture: !1, - color0: new t.Color(16711680), - color1: new t.Color(65280), - color2: new t.Color(255), - color3: new t.Color(16776960), + color0: new n.Color(16711680), + color1: new n.Color(65280), + color2: new n.Color(255), + color3: new n.Color(16776960), map: !1, alphaMap: !1, wobbleStrength: 0, @@ -3114,104 +3278,113 @@ const pe = process.env.NODE_ENV === "development", se = (e, a, r, u, s) => { sizeRandomMin: 0.5, sizeRandomMax: 1.5, divergence: 0, - divergencePoint: new t.Vector3(0), + divergencePoint: new n.Vector3(0), beat: !1 -}), jt = ({ +}), or = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u, + dpr: r, + samples: t, + isSizeUpdate: a, camera: s, - geometry: c, - positions: n, - uvs: f + geometry: u, + positions: l, + uvs: c, + onBeforeCompile: v }) => { - const v = I(a), l = x(() => new t.Scene(), []), [ - m, + const p = V(r), m = b(() => new n.Scene(), []), [ + d, { points: i, - interactiveMesh: p, - positions: y, - uvs: h + interactiveMesh: f, + positions: o, + uvs: g } - ] = at({ scene: l, size: e, dpr: a, geometry: c, positions: n, uvs: f }), [g, d] = V({ - scene: l, + ] = xt({ + scene: m, + size: e, + dpr: r, + geometry: u, + positions: l, + uvs: c, + onBeforeCompile: v + }), [x, y] = L({ + scene: m, camera: s, size: e, - dpr: v.fbo, - samples: r, - isSizeUpdate: u, + dpr: p.fbo, + samples: t, + isSizeUpdate: a, depthBuffer: !0 - }), b = M( - (C, _) => (m(C, _), d(C.gl)), - [d, m] - ), w = M( - (C) => { - m(null, C); + }), h = _( + (M, C) => (d(M, C), y(M.gl)), + [y, d] + ), w = _( + (M) => { + d(null, M); }, - [m] + [d] ); return [ - b, + h, w, { - scene: l, + scene: m, points: i, - interactiveMesh: p, - renderTarget: g, - output: g.texture, - positions: y, - uvs: h + interactiveMesh: f, + renderTarget: x, + output: x.texture, + positions: o, + uvs: g } ]; }; -function it(e, a = 1e-4) { - a = Math.max(a, Number.EPSILON); - const r = {}, u = e.getIndex(), s = e.getAttribute("position"), c = u ? u.count : s.count; - let n = 0; - const f = Object.keys(e.attributes), v = {}, l = {}, m = [], i = ["getX", "getY", "getZ", "getW"]; - for (let g = 0, d = f.length; g < d; g++) { - const b = f[g]; - v[b] = []; - const w = e.morphAttributes[b]; - w && (l[b] = new Array(w.length).fill(0).map(() => [])); +function bt(e, r = 1e-4) { + r = Math.max(r, Number.EPSILON); + const t = {}, a = e.getIndex(), s = e.getAttribute("position"), u = a ? a.count : s.count; + let l = 0; + const c = Object.keys(e.attributes), v = {}, p = {}, m = [], d = ["getX", "getY", "getZ", "getW"]; + for (let g = 0, x = c.length; g < x; g++) { + const y = c[g]; + v[y] = []; + const h = e.morphAttributes[y]; + h && (p[y] = new Array(h.length).fill(0).map(() => [])); } - const p = Math.log10(1 / a), y = Math.pow(10, p); - for (let g = 0; g < c; g++) { - const d = u ? u.getX(g) : g; - let b = ""; - for (let w = 0, C = f.length; w < C; w++) { - const _ = f[w], S = e.getAttribute(_), T = S.itemSize; - for (let F = 0; F < T; F++) - b += `${~~(S[i[F]](d) * y)},`; + const i = Math.log10(1 / r), f = Math.pow(10, i); + for (let g = 0; g < u; g++) { + const x = a ? a.getX(g) : g; + let y = ""; + for (let h = 0, w = c.length; h < w; h++) { + const M = c[h], C = e.getAttribute(M), S = C.itemSize; + for (let D = 0; D < S; D++) + y += `${~~(C[d[D]](x) * f)},`; } - if (b in r) - m.push(r[b]); + if (y in t) + m.push(t[y]); else { - for (let w = 0, C = f.length; w < C; w++) { - const _ = f[w], S = e.getAttribute(_), T = e.morphAttributes[_], F = S.itemSize, P = v[_], D = l[_]; - for (let $ = 0; $ < F; $++) { - const k = i[$]; - if (P.push(S[k](d)), T) - for (let E = 0, G = T.length; E < G; E++) - D[E].push(T[E][k](d)); + for (let h = 0, w = c.length; h < w; h++) { + const M = c[h], C = e.getAttribute(M), S = e.morphAttributes[M], D = C.itemSize, A = v[M], R = p[M]; + for (let P = 0; P < D; P++) { + const $ = d[P]; + if (A.push(C[$](x)), S) + for (let I = 0, q = S.length; I < q; I++) + R[I].push(S[I][$](x)); } } - r[b] = n, m.push(n), n++; + t[y] = l, m.push(l), l++; } } - const h = e.clone(); - for (let g = 0, d = f.length; g < d; g++) { - const b = f[g], w = e.getAttribute(b), C = new w.array.constructor(v[b]), _ = new ue(C, w.itemSize, w.normalized); - if (h.setAttribute(b, _), b in l) - for (let S = 0; S < l[b].length; S++) { - const T = e.morphAttributes[b][S], F = new T.array.constructor(l[b][S]), P = new ue(F, T.itemSize, T.normalized); - h.morphAttributes[b][S] = P; + const o = e.clone(); + for (let g = 0, x = c.length; g < x; g++) { + const y = c[g], h = e.getAttribute(y), w = new h.array.constructor(v[y]), M = new de(w, h.itemSize, h.normalized); + if (o.setAttribute(y, M), y in p) + for (let C = 0; C < p[y].length; C++) { + const S = e.morphAttributes[y][C], D = new S.array.constructor(p[y][C]), A = new de(D, S.itemSize, S.normalized); + o.morphAttributes[y][C] = A; } } - return h.setIndex(m), h; + return o.setIndex(m), o; } -var ut = `vec3 random3(vec3 c) { +var yt = `vec3 random3(vec3 c) { float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0))); vec3 r; r.z = fract(512.0*j); @@ -3263,7 +3436,7 @@ float snoiseFractal(vec3 m) { +0.2666667* snoise(2.0*m) +0.1333333* snoise(4.0*m) +0.0666667* snoise(8.0*m); -}`, st = `#ifdef USE_TRANSMISSION +}`, wt = `#ifdef USE_TRANSMISSION @@ -3461,7 +3634,7 @@ float snoiseFractal(vec3 m) { return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`, lt = `#ifdef USE_TRANSMISSION +#endif`, Mt = `#ifdef USE_TRANSMISSION material.transmission = _transmission; material.transmissionAlpha = 1.0; @@ -3533,20 +3706,20 @@ transmission /= uSamples; totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); #endif`; -const ce = (e) => { - let a = e; - return a = a.replace( +const xe = (e) => { + let r = e; + return r = r.replace( "#include ", ` vec3 objectNormal = usf_Normal; #ifdef USE_TANGENT vec3 objectTangent = vec3( tangent.xyz ); #endif` - ), a = a.replace( + ), r = r.replace( "#include ", ` vec3 transformed = usf_Position;` - ), a = a.replace( + ), r = r.replace( "void main() {", ` uniform float uTime; @@ -3556,12 +3729,16 @@ const ce = (e) => { uniform float uWarpPositionFrequency; uniform float uWarpTimeFrequency; uniform float uWarpStrength; + uniform bool uIsWobbleMap; + uniform sampler2D uWobbleMap; + uniform float uWobbleMapStrength; + uniform float uWobbleMapDistortion; attribute vec4 tangent; varying float vWobble; varying vec2 vPosition; // #usf void main() {` - ), a = a.replace("// #usf ", `${me}`), a = a.replace( + ), r = r.replace("// #usf ", `${we}`), r = r.replace( "void main() {", ` void main() { @@ -3573,72 +3750,91 @@ const ce = (e) => { float shift = 0.01; vec3 positionA = usf_Position + tangent.xyz * shift; vec3 positionB = usf_Position + biTangent * shift; - // Wobble - float wobble = getWobble(usf_Position); - usf_Position += wobble * normal; - positionA += getWobble(positionA) * normal; - positionB += getWobble(positionB) * normal; + + // wobbleMap & wobble + float wobbleMap = uIsWobbleMap ? texture2D(uWobbleMap, uv).g : 0.0; + vec3 nWobbleMap = wobbleMap * normal * uWobbleMapStrength; + float wobbleMapDistortion = wobbleMap * uWobbleMapDistortion; + + float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; + float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; + float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; + + usf_Position += nWobbleMap + (wobble * normal); + positionA += nWobbleMap + wobbleMapDistortion + (wobblePositionA * normal); + positionB += nWobbleMap + wobbleMapDistortion + (wobblePositionB * normal); + // Compute normal vec3 toA = normalize(positionA - usf_Position); vec3 toB = normalize(positionB - usf_Position); usf_Normal = cross(toA, toB); + // Varying vPosition = usf_Position.xy; - vWobble = wobble / uWobbleStrength;` - ), a; -}, ct = ({ + vWobble = wobble/uWobbleStrength; + ` + ), r; +}, St = ({ baseMaterial: e, - materialParameters: a + materialParameters: r, + onBeforeCompile: t, + depthOnBeforeCompile: a }) => { - const { material: r, depthMaterial: u } = x(() => { - const s = new (e || t.MeshPhysicalMaterial)( - a || {} - ), c = s.type === "MeshPhysicalMaterial" || s.type === "MeshStandardMaterial", n = s.type === "MeshPhysicalMaterial"; - Object.assign(s.userData, { + const { material: s, depthMaterial: u } = b(() => { + const l = new (e || n.MeshPhysicalMaterial)( + r || {} + ), c = l.type === "MeshPhysicalMaterial" || l.type === "MeshStandardMaterial", v = l.type === "MeshPhysicalMaterial"; + Object.assign(l.userData, { uniforms: { uTime: { value: 0 }, uWobblePositionFrequency: { - value: O.wobblePositionFrequency + value: W.wobblePositionFrequency }, uWobbleTimeFrequency: { - value: O.wobbleTimeFrequency + value: W.wobbleTimeFrequency }, - uWobbleStrength: { value: O.wobbleStrength }, + uWobbleStrength: { value: W.wobbleStrength }, uWarpPositionFrequency: { - value: O.warpPositionFrequency + value: W.warpPositionFrequency }, - uWarpTimeFrequency: { value: O.warpTimeFrequency }, - uWarpStrength: { value: O.warpStrength }, - uWobbleShine: { value: O.wobbleShine }, - uColor0: { value: O.color0 }, - uColor1: { value: O.color1 }, - uColor2: { value: O.color2 }, - uColor3: { value: O.color3 }, - uColorMix: { value: O.colorMix }, + uWarpTimeFrequency: { value: W.warpTimeFrequency }, + uWarpStrength: { value: W.warpStrength }, + uWobbleShine: { value: W.wobbleShine }, + uIsWobbleMap: { value: !1 }, + uWobbleMap: { value: new n.Texture() }, + uWobbleMapStrength: { value: W.wobbleMapStrength }, + uWobbleMapDistortion: { + value: W.wobbleMapDistortion + }, + uColor0: { value: W.color0 }, + uColor1: { value: W.color1 }, + uColor2: { value: W.color2 }, + uColor3: { value: W.color3 }, + uColorMix: { value: W.colorMix }, uChromaticAberration: { - value: O.chromaticAberration + value: W.chromaticAberration }, - uAnisotropicBlur: { value: O.anisotropicBlur }, - uDistortion: { value: O.distortion }, - uDistortionScale: { value: O.distortionScale }, - uTemporalDistortion: { value: O.temporalDistortion }, - uSamples: { value: O.samples }, + uAnisotropicBlur: { value: W.anisotropicBlur }, + uDistortion: { value: W.distortion }, + uDistortionScale: { value: W.distortionScale }, + uTemporalDistortion: { value: W.temporalDistortion }, + uSamples: { value: W.samples }, transmission: { value: 0 }, _transmission: { value: 1 }, transmissionMap: { value: null } } - }), s.onBeforeCompile = (v) => { - Object.assign(v.uniforms, s.userData.uniforms), v.vertexShader = ce(v.vertexShader), v.fragmentShader = v.fragmentShader.replace( + }), l.onBeforeCompile = (m, d) => { + Object.assign(m.uniforms, l.userData.uniforms), m.vertexShader = xe(m.vertexShader), m.fragmentShader = m.fragmentShader.replace( "#include ", ` #include diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);` - ), c && (v.fragmentShader = v.fragmentShader.replace( + ), c && (m.fragmentShader = m.fragmentShader.replace( "#include ", ` #include roughnessFactor = usf_Roughness;` - )), v.fragmentShader = v.fragmentShader.replace( + )), m.fragmentShader = m.fragmentShader.replace( "void main() {", ` uniform vec3 uColor0; @@ -3658,10 +3854,11 @@ const ce = (e) => { uniform float uSamples; float rand(float n){return fract(sin(n) * 43758.5453123);} - ${ut} + ${yt} varying float vWobble; varying vec2 vPosition; + void main(){ vec4 usf_DiffuseColor = vec4(1.0); ${c ? "float usf_Roughness = roughness;" : ""} @@ -3671,143 +3868,141 @@ const ce = (e) => { usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); ${c ? "usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);" : ""}` - ), n && (v.fragmentShader = v.fragmentShader.replace( + ), v && (m.fragmentShader = m.fragmentShader.replace( "#include ", - `${st}` - ), v.fragmentShader = v.fragmentShader.replace( + `${wt}` + ), m.fragmentShader = m.fragmentShader.replace( "#include ", - `${lt}` - )); - }, s.needsUpdate = !0; - const f = new t.MeshDepthMaterial({ - depthPacking: t.RGBADepthPacking + `${Mt}` + )), t && t(m, d); + }, l.needsUpdate = !0; + const p = new n.MeshDepthMaterial({ + depthPacking: n.RGBADepthPacking }); - return f.onBeforeCompile = (v) => { - Object.assign(v.uniforms, s.userData.uniforms), v.vertexShader = ce(v.vertexShader); - }, f.needsUpdate = !0, { material: s, depthMaterial: f }; - }, [a, e]); + return p.onBeforeCompile = (m, d) => { + Object.assign(m.uniforms, l.userData.uniforms), m.vertexShader = xe(m.vertexShader), a && a(m, d); + }, p.needsUpdate = !0, { material: l, depthMaterial: p }; + }, [ + r, + e, + t, + a + ]); return { - material: r, + material: s, depthMaterial: u }; -}, vt = ({ +}, _t = ({ scene: e = !1, - geometry: a, - baseMaterial: r, - materialParameters: u + geometry: r, + baseMaterial: t, + materialParameters: a, + onBeforeCompile: s, + depthOnBeforeCompile: u }) => { - const s = x(() => { - let l = a || new t.IcosahedronGeometry(2, 20); - return l = it(l), l.computeTangents(), l; - }, [a]), { material: c, depthMaterial: n } = ct({ - baseMaterial: r, - materialParameters: u - }), f = z(e, s, c, t.Mesh); + const l = b(() => { + let f = r || new n.IcosahedronGeometry(2, 20); + return f = bt(f), f.computeTangents(), f; + }, [r]), { material: c, depthMaterial: v } = St({ + baseMaterial: t, + materialParameters: a, + onBeforeCompile: s, + depthOnBeforeCompile: u + }), p = U(e, l, c, n.Mesh), m = c.userData, d = T(m); return [ - M( - (l, m) => { - const i = c.userData; - l && o( - i, - "uTime", - (m == null ? void 0 : m.beat) || l.clock.getElapsedTime() - ), m !== void 0 && (o(i, "uWobbleStrength", m.wobbleStrength), o( - i, + _( + (f, o) => { + f && d("uTime", (o == null ? void 0 : o.beat) || f.clock.getElapsedTime()), o !== void 0 && (d("uWobbleStrength", o.wobbleStrength), d( "uWobblePositionFrequency", - m.wobblePositionFrequency - ), o( - i, - "uWobbleTimeFrequency", - m.wobbleTimeFrequency - ), o(i, "uWarpStrength", m.warpStrength), o( - i, - "uWarpPositionFrequency", - m.warpPositionFrequency - ), o(i, "uWarpTimeFrequency", m.warpTimeFrequency), o(i, "uWobbleShine", m.wobbleShine), o(i, "uSamples", m.samples), o(i, "uColor0", m.color0), o(i, "uColor1", m.color1), o(i, "uColor2", m.color2), o(i, "uColor3", m.color3), o(i, "uColorMix", m.colorMix), o( - i, - "uChromaticAberration", - m.chromaticAberration - ), o(i, "uAnisotropicBlur", m.anisotropicBlur), o(i, "uDistortion", m.distortion), o(i, "uDistortionScale", m.distortionScale), o(i, "uTemporalDistortion", m.temporalDistortion)); + o.wobblePositionFrequency + ), d("uWobbleTimeFrequency", o.wobbleTimeFrequency), d("uWarpStrength", o.warpStrength), d("uWarpPositionFrequency", o.warpPositionFrequency), d("uWarpTimeFrequency", o.warpTimeFrequency), d("uWobbleShine", o.wobbleShine), o.wobbleMap ? (d("uWobbleMap", o.wobbleMap), d("uIsWobbleMap", !0)) : o.wobbleMap === !1 && d("uIsWobbleMap", !1), d("uWobbleMapStrength", o.wobbleMapStrength), d("uWobbleMapDistortion", o.wobbleMapDistortion), d("uSamples", o.samples), d("uColor0", o.color0), d("uColor1", o.color1), d("uColor2", o.color2), d("uColor3", o.color3), d("uColorMix", o.colorMix), d("uChromaticAberration", o.chromaticAberration), d("uAnisotropicBlur", o.anisotropicBlur), d("uDistortion", o.distortion), d("uDistortionScale", o.distortionScale), d("uTemporalDistortion", o.temporalDistortion)); }, - [c] + [d] ), { - mesh: f, - depthMaterial: n + mesh: p, + depthMaterial: v } ]; -}, O = Object.freeze({ +}, W = Object.freeze({ beat: !1, wobbleStrength: 0.3, - wobblePositionFrequency: 0.5, - wobbleTimeFrequency: 0.4, + wobblePositionFrequency: 0.3, + wobbleTimeFrequency: 0.3, wobbleShine: 0, - warpStrength: 1.7, - warpPositionFrequency: 0.38, - warpTimeFrequency: 0.12, + warpStrength: 0.3, + warpPositionFrequency: 0.3, + warpTimeFrequency: 0.3, + wobbleMap: !1, + wobbleMapStrength: 0.03, + wobbleMapDistortion: 0, samples: 6, - color0: new t.Color(16711680), - color1: new t.Color(65280), - color2: new t.Color(255), - color3: new t.Color(16776960), + color0: new n.Color(16711680), + color1: new n.Color(65280), + color2: new n.Color(255), + color3: new n.Color(16776960), colorMix: 1, - chromaticAberration: 0.5, + chromaticAberration: 0.1, anisotropicBlur: 0.1, - distortion: 0.1, + distortion: 0, distortionScale: 0.1, - temporalDistortion: 0.1 -}), Nt = ({ + temporalDistortion: 0 +}), ar = ({ size: e, - dpr: a, - samples: r, - isSizeUpdate: u, + dpr: r, + samples: t, + isSizeUpdate: a, camera: s, - geometry: c, - baseMaterial: n, - materialParameters: f + geometry: u, + baseMaterial: l, + materialParameters: c, + onBeforeCompile: v, + depthOnBeforeCompile: p }) => { - const v = I(a), l = x(() => new t.Scene(), []), [m, { mesh: i, depthMaterial: p }] = vt({ - baseMaterial: n, - materialParameters: f, - scene: l, - geometry: c - }), [y, h] = V({ - scene: l, + const m = V(r), d = b(() => new n.Scene(), []), [i, { mesh: f, depthMaterial: o }] = _t({ + baseMaterial: l, + materialParameters: c, + scene: d, + geometry: u, + onBeforeCompile: v, + depthOnBeforeCompile: p + }), [g, x] = L({ + scene: d, camera: s, size: e, - dpr: v.fbo, - samples: r, - isSizeUpdate: u, + dpr: m.fbo, + samples: t, + isSizeUpdate: a, depthBuffer: !0 - }), g = M( - (b, w) => (m(b, w), h(b.gl)), - [h, m] - ), d = M( - (b) => { - m(null, b); + }), y = _( + (w, M) => (i(w, M), x(w.gl)), + [x, i] + ), h = _( + (w) => { + i(null, w); }, - [m] + [i] ); return [ - g, - d, + y, + h, { - scene: l, - mesh: i, - depthMaterial: p, - renderTarget: y, - output: y.texture + scene: d, + mesh: f, + depthMaterial: o, + renderTarget: g, + output: g.texture } ]; -}, kt = (e, a, r) => { - const u = x(() => { - const s = new t.Mesh(a, r); +}, ir = (e, r, t) => { + const a = b(() => { + const s = new n.Mesh(r, t); return e.add(s), s; - }, [a, r, e]); - return j(() => () => { - e.remove(u), a.dispose(), r.dispose(); - }, [e, a, r, u]), u; -}, Z = Object.freeze({ + }, [r, t, e]); + return G(() => () => { + e.remove(a), r.dispose(), t.dispose(); + }, [e, r, t, a]), a; +}, ne = Object.freeze({ easeInSine(e) { return 1 - Math.cos(e * Math.PI / 2); }, @@ -3878,72 +4073,72 @@ const ce = (e) => { return 1 + 2.70158 * Math.pow(e - 1, 3) + 1.70158 * Math.pow(e - 1, 2); }, easeInOutBack(e) { - const r = 2.5949095; - return e < 0.5 ? Math.pow(2 * e, 2) * ((r + 1) * 2 * e - r) / 2 : (Math.pow(2 * e - 2, 2) * ((r + 1) * (e * 2 - 2) + r) + 2) / 2; + const t = 2.5949095; + return e < 0.5 ? Math.pow(2 * e, 2) * ((t + 1) * 2 * e - t) / 2 : (Math.pow(2 * e - 2, 2) * ((t + 1) * (e * 2 - 2) + t) + 2) / 2; }, easeInElastic(e) { - const a = 2 * Math.PI / 3; - return e === 0 ? 0 : e === 1 ? 1 : -Math.pow(2, 10 * e - 10) * Math.sin((e * 10 - 10.75) * a); + const r = 2 * Math.PI / 3; + return e === 0 ? 0 : e === 1 ? 1 : -Math.pow(2, 10 * e - 10) * Math.sin((e * 10 - 10.75) * r); }, easeOutElastic(e) { - const a = 2 * Math.PI / 3; - return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e * 10 - 0.75) * a) + 1; + const r = 2 * Math.PI / 3; + return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e * 10 - 0.75) * r) + 1; }, easeInOutElastic(e) { - const a = 2 * Math.PI / 4.5; - return e === 0 ? 0 : e === 1 ? 1 : e < 0.5 ? -(Math.pow(2, 20 * e - 10) * Math.sin((20 * e - 11.125) * a)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * a) / 2 + 1; + const r = 2 * Math.PI / 4.5; + return e === 0 ? 0 : e === 1 ? 1 : e < 0.5 ? -(Math.pow(2, 20 * e - 10) * Math.sin((20 * e - 11.125) * r)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * r) / 2 + 1; }, easeInBounce(e) { - return 1 - Z.easeOutBounce(1 - e); + return 1 - ne.easeOutBounce(1 - e); }, easeOutBounce(e) { return e < 1 / 2.75 ? 7.5625 * e * e : e < 2 / 2.75 ? 7.5625 * (e -= 1.5 / 2.75) * e + 0.75 : e < 2.5 / 2.75 ? 7.5625 * (e -= 2.25 / 2.75) * e + 0.9375 : 7.5625 * (e -= 2.625 / 2.75) * e + 0.984375; }, easeInOutBounce(e) { - return e < 0.5 ? (1 - Z.easeOutBounce(1 - 2 * e)) / 2 : (1 + Z.easeOutBounce(2 * e - 1)) / 2; + return e < 0.5 ? (1 - ne.easeOutBounce(1 - 2 * e)) / 2 : (1 + ne.easeOutBounce(2 * e - 1)) / 2; } }); -function mt(e) { - let a = Math.sin(e * 12.9898) * 43758.5453; - return a - Math.floor(a); +function Tt(e) { + let r = Math.sin(e * 12.9898) * 43758.5453; + return r - Math.floor(r); } -const Gt = (e, a = "easeOutQuart") => { - const r = e / 60, u = Z[a]; - return M( - (c) => { - let n = c.getElapsedTime() * r; - const f = Math.floor(n), v = u(n - f); - n = v + f; - const l = mt(f); +const ur = (e, r = "easeOutQuart") => { + const t = e / 60, a = ne[r]; + return _( + (u) => { + let l = u.getElapsedTime() * t; + const c = Math.floor(l), v = a(l - c); + l = v + c; + const p = Tt(c); return { - beat: n, - floor: f, + beat: l, + floor: c, fract: v, - hash: l + hash: p }; }, - [r, u] + [t, a] ); -}, Kt = (e = 60) => { - const a = x(() => 1 / Math.max(Math.min(e, 60), 1), [e]), r = R(null); - return M( +}, sr = (e = 60) => { + const r = b(() => 1 / Math.max(Math.min(e, 60), 1), [e]), t = F(null); + return _( (s) => { - const c = s.getElapsedTime(); - return r.current === null || c - r.current >= a ? (r.current = c, !0) : !1; + const u = s.getElapsedTime(); + return t.current === null || u - t.current >= r ? (t.current = u, !0) : !1; }, - [a] + [r] ); -}, pt = (e) => { - var u, s; - const a = (u = e.dom) == null ? void 0 : u.length, r = (s = e.texture) == null ? void 0 : s.length; - return !a || !r || a !== r; +}, Ct = (e) => { + var a, s; + const r = (a = e.dom) == null ? void 0 : a.length, t = (s = e.texture) == null ? void 0 : s.length; + return !r || !t || r !== t; }; -var ft = `varying vec2 vUv; +var Pt = `varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`, dt = `precision highp float; +}`, Dt = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -3987,302 +4182,304 @@ void main() { gl_FragColor = vec4(textureColor, alpha); }`; -const gt = ({ +const Rt = ({ params: e, - size: a, - scene: r + size: r, + scene: t, + onBeforeCompile: a }) => { - r.children.length > 0 && (r.children.forEach((u) => { - u instanceof t.Mesh && (u.geometry.dispose(), u.material.dispose()); - }), r.remove(...r.children)), e.texture.forEach((u, s) => { - const c = new t.Mesh( - new t.PlaneGeometry(1, 1), - new t.ShaderMaterial({ - vertexShader: ft, - fragmentShader: dt, - transparent: !0, - uniforms: { - u_texture: { value: u }, - u_textureResolution: { - value: new t.Vector2(0, 0) - }, - u_resolution: { value: new t.Vector2(0, 0) }, - u_borderRadius: { - value: e.boderRadius[s] ? e.boderRadius[s] : 0 - } + t.children.length > 0 && (t.children.forEach((s) => { + s instanceof n.Mesh && (s.geometry.dispose(), s.material.dispose()); + }), t.remove(...t.children)), e.texture.forEach((s, u) => { + const l = new n.ShaderMaterial({ + vertexShader: Pt, + fragmentShader: Dt, + transparent: !0, + uniforms: { + u_texture: { value: s }, + u_textureResolution: { + value: new n.Vector2(0, 0) + }, + u_resolution: { value: new n.Vector2(0, 0) }, + u_borderRadius: { + value: e.boderRadius[u] ? e.boderRadius[u] : 0 } - }) - ); - r.add(c); + } + }); + a && (l.onBeforeCompile = a); + const c = new n.Mesh(new n.PlaneGeometry(1, 1), l); + t.add(c); }); -}, ht = () => { - const e = R([]), a = R([]); - return M( +}, At = () => { + const e = F([]), r = F([]); + return _( ({ - isIntersectingRef: u, + isIntersectingRef: a, isIntersectingOnceRef: s, - params: c + params: u }) => { - e.current.length > 0 && e.current.forEach((f, v) => { - f.unobserve(a.current[v]); - }), a.current = [], e.current = []; - const n = new Array(c.dom.length).fill(!1); - u.current = [...n], s.current = [...n], c.dom.forEach((f, v) => { - const l = (i) => { - i.forEach((p) => { - c.onIntersect[v] && c.onIntersect[v](p), u.current[v] = p.isIntersecting; + e.current.length > 0 && e.current.forEach((c, v) => { + c.unobserve(r.current[v]); + }), r.current = [], e.current = []; + const l = new Array(u.dom.length).fill(!1); + a.current = [...l], s.current = [...l], u.dom.forEach((c, v) => { + const p = (d) => { + d.forEach((i) => { + u.onIntersect[v] && u.onIntersect[v](i), a.current[v] = i.isIntersecting; }); - }, m = new IntersectionObserver(l, { + }, m = new IntersectionObserver(p, { rootMargin: "0px", threshold: 0 }); - m.observe(f), e.current.push(m), a.current.push(f); + m.observe(c), e.current.push(m), r.current.push(c); }); }, [] ); -}, xt = () => { - const e = R([]), a = M( - ({ params: r, size: u, resolutionRef: s, scene: c, isIntersectingRef: n }) => { - c.children.length !== e.current.length && (e.current = new Array(c.children.length)), c.children.forEach((f, v) => { - var i, p, y, h, g, d; - const l = r.dom[v]; - if (!l) +}, It = () => { + const e = F([]), r = _( + ({ params: t, size: a, resolutionRef: s, scene: u, isIntersectingRef: l }) => { + u.children.length !== e.current.length && (e.current = new Array(u.children.length)), u.children.forEach((c, v) => { + var d, i, f, o, g, x; + const p = t.dom[v]; + if (!p) return; - const m = l.getBoundingClientRect(); - if (e.current[v] = m, f.scale.set(m.width, m.height, 1), f.position.set( - m.left + m.width * 0.5 - u.width * 0.5, - -m.top - m.height * 0.5 + u.height * 0.5, + const m = p.getBoundingClientRect(); + if (e.current[v] = m, c.scale.set(m.width, m.height, 1), c.position.set( + m.left + m.width * 0.5 - a.width * 0.5, + -m.top - m.height * 0.5 + a.height * 0.5, 0 - ), n.current[v] && (r.rotation[v] && f.rotation.copy(r.rotation[v]), f instanceof t.Mesh)) { - const b = f.material; - o(b, "u_texture", r.texture[v]), o(b, "u_textureResolution", [ - ((y = (p = (i = r.texture[v]) == null ? void 0 : i.source) == null ? void 0 : p.data) == null ? void 0 : y.width) || 0, - ((d = (g = (h = r.texture[v]) == null ? void 0 : h.source) == null ? void 0 : g.data) == null ? void 0 : d.height) || 0 - ]), o( - b, + ), l.current[v] && (t.rotation[v] && c.rotation.copy(t.rotation[v]), c instanceof n.Mesh)) { + const y = c.material, h = T(y); + h("u_texture", t.texture[v]), h("u_textureResolution", [ + ((f = (i = (d = t.texture[v]) == null ? void 0 : d.source) == null ? void 0 : i.data) == null ? void 0 : f.width) || 0, + ((x = (g = (o = t.texture[v]) == null ? void 0 : o.source) == null ? void 0 : g.data) == null ? void 0 : x.height) || 0 + ]), h( "u_resolution", s.current.set(m.width, m.height) - ), o( - b, + ), h( "u_borderRadius", - r.boderRadius[v] ? r.boderRadius[v] : 0 + t.boderRadius[v] ? t.boderRadius[v] : 0 ); } }); }, [] ); - return [e.current, a]; -}, yt = () => { - const e = R([]), a = R([]), r = M((u, s = !1) => { - e.current.forEach((n, f) => { - n && (a.current[f] = !0); + return [e.current, r]; +}, Ft = () => { + const e = F([]), r = F([]), t = _((a, s = !1) => { + e.current.forEach((l, c) => { + l && (r.current[c] = !0); }); - const c = s ? [...a.current] : [...e.current]; - return u < 0 ? c : c[u]; + const u = s ? [...r.current] : [...e.current]; + return a < 0 ? u : u[a]; }, []); return { isIntersectingRef: e, - isIntersectingOnceRef: a, - isIntersecting: r + isIntersectingOnceRef: r, + isIntersecting: t }; -}, bt = (e) => ({ onView: r, onHidden: u }) => { - const s = R(!1); - j(() => { - let c; - const n = () => { - e.current.some((f) => f) ? s.current || (r && r(), s.current = !0) : s.current && (u && u(), s.current = !1), c = requestAnimationFrame(n); +}, Vt = (e) => ({ onView: t, onHidden: a }) => { + const s = F(!1); + G(() => { + let u; + const l = () => { + e.current.some((c) => c) ? s.current || (t && t(), s.current = !0) : s.current && (a && a(), s.current = !1), u = requestAnimationFrame(l); }; - return c = requestAnimationFrame(n), () => { - cancelAnimationFrame(c); + return u = requestAnimationFrame(l), () => { + cancelAnimationFrame(u); }; - }, [r, u]); -}, wt = { + }, [t, a]); +}, zt = { texture: [], dom: [], boderRadius: [], rotation: [], onIntersect: [] -}, Xt = ({ size: e, dpr: a, samples: r, isSizeUpdate: u }, s = []) => { - const c = I(a), n = x(() => new t.Scene(), []), f = U(e), [v, l] = V({ - scene: n, - camera: f, +}, lr = ({ size: e, dpr: r, samples: t, isSizeUpdate: a, onBeforeCompile: s }, u = []) => { + const l = V(r), c = b(() => new n.Scene(), []), v = O(e), [p, m] = L({ + scene: c, + camera: v, size: e, - dpr: c.fbo, - samples: r, - isSizeUpdate: u - }), [m, i] = B({ - ...wt, + dpr: l.fbo, + samples: t, + isSizeUpdate: a + }), [d, i] = B({ + ...zt, updateKey: performance.now() - }), [p, y] = xt(), h = R(new t.Vector2(0, 0)), [g, d] = xe(!0); - x( - () => d(!0), + }), [f, o] = It(), g = F(new n.Vector2(0, 0)), [x, y] = De(!0); + b( + () => y(!0), // eslint-disable-next-line react-hooks/exhaustive-deps - s + u ); - const b = R(null), w = x(() => new t.Texture(), []), C = ht(), { isIntersectingOnceRef: _, isIntersectingRef: S, isIntersecting: T } = yt(), F = bt(S); + const h = F(null), w = b(() => new n.Texture(), []), M = At(), { isIntersectingOnceRef: C, isIntersectingRef: S, isIntersecting: D } = Ft(), A = Vt(S); return [ - M( - (D, $) => { - const { gl: k, size: E } = D; - if ($ && i($), pt(m)) + _( + (P, $) => { + const { gl: I, size: q } = P; + if ($ && i($), Ct(d)) return w; - if (g) { - if (b.current === m.updateKey) + if (x) { + if (h.current === d.updateKey) return w; - b.current = m.updateKey; + h.current = d.updateKey; } - return g && (gt({ - params: m, - size: E, - scene: n - }), C({ + return x && (Rt({ + params: d, + size: q, + scene: c, + onBeforeCompile: s + }), M({ isIntersectingRef: S, - isIntersectingOnceRef: _, - params: m - }), d(!1)), y({ - params: m, - size: E, - resolutionRef: h, - scene: n, + isIntersectingOnceRef: C, + params: d + }), y(!1)), o({ + params: d, + size: q, + resolutionRef: g, + scene: c, isIntersectingRef: S - }), l(k); + }), m(I); }, [ - l, + m, i, + M, + o, + s, + x, + c, + d, C, - y, - g, - n, - m, - _, S, w ] ), i, { - scene: n, - camera: f, - renderTarget: v, - output: v.texture, - isIntersecting: T, - DOMRects: p, + scene: c, + camera: v, + renderTarget: p, + output: p.texture, + isIntersecting: D, + DOMRects: f, intersections: S.current, - useDomView: F + useDomView: A } ]; -}, Yt = ({ +}, cr = ({ scene: e, - camera: a, - size: r, - dpr: u = !1, + camera: r, + size: t, + dpr: a = !1, isSizeUpdate: s = !1, - samples: c = 0, - depthBuffer: n = !1, - depthTexture: f = !1 + samples: u = 0, + depthBuffer: l = !1, + depthTexture: c = !1 }, v) => { - const l = R([]), m = q(r, u); - l.current = x(() => Array.from({ length: v }, () => { - const p = new t.WebGLRenderTarget( + const p = F([]), m = j(t, a); + p.current = b(() => Array.from({ length: v }, () => { + const i = new n.WebGLRenderTarget( m.x, m.y, { - ...J, - samples: c, - depthBuffer: n + ...te, + samples: u, + depthBuffer: l } ); - return f && (p.depthTexture = new t.DepthTexture( + return c && (i.depthTexture = new n.DepthTexture( m.x, m.y, - t.FloatType - )), p; - }), [v]), s && l.current.forEach( - (p) => p.setSize(m.x, m.y) - ), j(() => { - const p = l.current; + n.FloatType + )), i; + }), [v]), s && p.current.forEach( + (i) => i.setSize(m.x, m.y) + ), G(() => { + const i = p.current; return () => { - p.forEach((y) => y.dispose()); + i.forEach((f) => f.dispose()); }; }, [v]); - const i = M( - (p, y, h) => { - const g = l.current[y]; - return re({ - gl: p, + const d = _( + (i, f, o) => { + const g = p.current[f]; + return le({ + gl: i, scene: e, - camera: a, + camera: r, fbo: g, - onBeforeRender: () => h && h({ read: g.texture }) + onBeforeRender: () => o && o({ read: g.texture }) }), g.texture; }, - [e, a] + [e, r] ); - return [l.current, i]; + return [p.current, d]; }; export { - Fn as ALPHABLENDING_PARAMS, - gn as BLENDING_PARAMS, - _n as BRIGHTNESSPICKER_PARAMS, - Se as BRUSH_PARAMS, - Jn as CHROMAKEY_PARAMS, - Je as COLORSTRATA_PARAMS, - sn as COSPALETTE_PARAMS, - En as COVERTEXTURE_PARAMS, - wt as DOMSYNCER_PARAMS, - mn as DUOTONE_PARAMS, - Z as Easing, - J as FBO_OPTION, - je as FLUID_PARAMS, - Dn as FXBLENDING_PARAMS, - bn as FXTEXTURE_PARAMS, - Bn as HSV_PARAMS, - rn as MARBLE_PARAMS, - A as MORPHPARTICLES_PARAMS, - Y as MOTIONBLUR_PARAMS, - Ye as NOISE_PARAMS, - ke as RIPPLE_PARAMS, - ve as SIMPLEBLUR_PARAMS, - H as WAVE_PARAMS, - O as WOBBLE3D_PARAMS, - re as renderFBO, - o as setUniform, - kt as useAddMesh, - Bt as useAlphaBlending, - Gt as useBeat, - Ft as useBlending, - Vt as useBrightnessPicker, - _t as useBrush, - U as useCamera, - qt as useChromaKey, - Dt as useColorStrata, - Yt as useCopyTexture, - At as useCosPalette, - Lt as useCoverTexture, - at as useCreateMorphParticles, - vt as useCreateWobble3D, - Xt as useDomSyncer, - X as useDoubleFBO, - It as useDuoTone, - Kt as useFPSLimiter, - Tt as useFluid, - Ut as useFxBlending, - zt as useFxTexture, - Ot as useHSV, - Rt as useMarble, - jt as useMorphParticles, - Et as useMotionBlur, - Pt as useNoise, + qn as ALPHABLENDING_PARAMS, + ye as BLANK_PARAMS, + Cn as BLENDING_PARAMS, + zn as BRIGHTNESSPICKER_PARAMS, + Ve as BRUSH_PARAMS, + lt as CHROMAKEY_PARAMS, + cn as COLORSTRATA_PARAMS, + xn as COSPALETTE_PARAMS, + Hn as COVERTEXTURE_PARAMS, + zt as DOMSYNCER_PARAMS, + Mn as DUOTONE_PARAMS, + ne as Easing, + te as FBO_OPTION, + Je as FLUID_PARAMS, + Wn as FXBLENDING_PARAMS, + An as FXTEXTURE_PARAMS, + Gn as HSV_PARAMS, + fn as MARBLE_PARAMS, + z as MORPHPARTICLES_PARAMS, + Z as MOTIONBLUR_PARAMS, + an as NOISE_PARAMS, + nn as RIPPLE_PARAMS, + be as SIMPLEBLUR_PARAMS, + J as WAVE_PARAMS, + W as WOBBLE3D_PARAMS, + le as renderFBO, + T as setUniform, + ir as useAddMesh, + Ht as useAlphaBlending, + ur as useBeat, + rr as useBlank, + Gt as useBlending, + Xt as useBrightnessPicker, + Wt as useBrush, + O as useCamera, + tr as useChromaKey, + qt as useColorStrata, + cr as useCopyTexture, + kt as useCosPalette, + Zt as useCoverTexture, + xt as useCreateMorphParticles, + _t as useCreateWobble3D, + lr as useDomSyncer, + Y as useDoubleFBO, + Nt as useDuoTone, + sr as useFPSLimiter, + Lt as useFluid, + Yt as useFxBlending, + Kt as useFxTexture, + Qt as useHSV, + jt as useMarble, + or as useMorphParticles, + er as useMotionBlur, + Et as useNoise, B as useParams, - te as usePointer, - q as useResolution, - Ct as useRipple, - $t as useSimpleBlur, - V as useSingleFBO, - Wt as useWave, - Nt as useWobble3D + se as usePointer, + j as useResolution, + $t as useRipple, + Jt as useSimpleBlur, + L as useSingleFBO, + nr as useWave, + ar as useWobble3D }; //# 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 760c5c58..ba97f672 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/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/setUniforms.ts","../src/utils/useAddObject.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/libs/shaders/getWobble.glsl","../src/libs/constants.ts","../src/fxs/3D/useMorphParticles/utils/rewriteVertexShader.ts","../src/fxs/3D/useMorphParticles/utils/modifyAttributes.ts","../src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts","../src/fxs/3D/useMorphParticles/utils/useMaterial.ts","../src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts","../src/fxs/3D/useMorphParticles/index.ts","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/libs/shaders/snoise.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/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 uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\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\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\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","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\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (value === undefined) {\n return;\n }\n // By design, I don't want to pass null to uniform\n if (material.uniforms && material.uniforms[key] && value !== null) {\n material.uniforms[key].value = value;\n }\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { 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.Vector3 | THREE.Color };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { 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 | false;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\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(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = 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(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\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\n ? prevPointer.current.clone()\n : 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 [lerp]\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 { useCallback, useEffect, useMemo, useRef } 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 : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `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 if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\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 { useCallback, useEffect, useMemo, useRef } 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 if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\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 { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n // use dpr if `shader` and `fbo` are undefined\n return {\n shader: (dpr.effect?.shader ?? true) && dpr.dpr,\n fbo: (dpr.effect?.fbo ?? true) && dpr.dpr,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\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 , 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 color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n setUniform(material, \"uIsTexture\", true);\n setUniform(material, \"uTexture\", params.texture!);\n } else {\n setUniform(material, \"uIsTexture\", false);\n }\n\n if (params.map!) {\n setUniform(material, \"uIsMap\", true);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"uMapIntensity\", params.mapIntensity!);\n } else {\n setUniform(material, \"uIsMap\", false);\n }\n\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\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n setUniform(material, \"uMouse\", pointerValues.currentPointer);\n setUniform(material, \"uPrevMouse\", pointerValues.prevPointer);\n }\n setUniform(material, \"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n setUniform(material, \"uColor\", color);\n\n setUniform(material, \"uIsCursor\", params.isCursor!);\n\n // pressure\n setUniform(material, \"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n setUniform(material, \"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBuffer\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.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 | THREE.Color };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\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};\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 | false;\n}) => {\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 useMemo(() => {\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 = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\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, mesh };\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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 = Object.freeze({\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 pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\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 pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(\n materials.splatMaterial,\n \"point\",\n pointerValues.currentPointer\n );\n const scaledDiff = pointerValues.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 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.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 mesh: mesh,\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,\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, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\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 = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\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: _dpr.fbo,\n samples,\n isSizeUpdate,\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 pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.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;\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as NoiseMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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\", params.beat || 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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as ColorStrataMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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\", params.beat || 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 mesh: mesh,\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 u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as MarbleMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_pattern\", params.pattern!);\n setUniform(material, \"u_complexity\", params.complexity!);\n setUniform(\n material,\n \"u_complexityAttenuation\",\n params.complexityAttenuation!\n );\n setUniform(material, \"u_iterations\", params.iterations!);\n setUniform(material, \"u_timeStrength\", params.timeStrength!);\n setUniform(material, \"u_scale\", params.scale!);\n\n setUniform(material, \"u_time\", params.beat || 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 mesh: mesh,\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 sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { 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 uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as CosPaletteMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CosPaletteParams = {\n /** color1, default : `rgb(50%, 50%, 50%)` */\n color1?: THREE.Color;\n /** color2, default : `rgb(50%, 50%, 50%)` */\n color2?: THREE.Color;\n /** color3, default : `rgb(100%, 100%, 100%)` */\n color3?: THREE.Color;\n /** color4, default : `rgb(0%, 10%, 20%)` */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default : `THREE.Vector3(1.0,0.0,0.0)` */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = Object.freeze({\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor1\", params.color1!);\n setUniform(material, \"uColor2\", params.color2!);\n setUniform(material, \"uColor3\", params.color3!);\n setUniform(material, \"uColor4\", params.color4!);\n setUniform(material, \"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as DuoToneMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as BlendingMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class FxTextureMaterial 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 | false;\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 ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** 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 , 0 ~ 1 , default : `0` */\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 mesh: THREE.Mesh;\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 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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\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\n setUniform(material, \"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n setUniform(material, \"uTextureResolution\", interpolatedResolution);\n\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, \"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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as BrightnessPickerMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as FxBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n}: {\n scene: THREE.Scene;\n size: Size;\n}) => {\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 uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as AlphaBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type AlphaBlendingParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** alpha map , default : `THREE.Texture()` */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n}: {\n scene: THREE.Scene;\n size: Size;\n}) => {\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: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as HSVMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type HSVParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** default : `1` */\n brightness?: number;\n /** default : `1` */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\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\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\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 uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\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\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\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: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, 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 || 0,\n params.texture!?.source?.data?.height || 0,\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 _tempTexture;\n },\n [updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\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 sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { 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: MOTIONBLUR_PARAMS.texture },\n uBackbuffer: { value: new THREE.Texture() },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MotionBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uBegin\", params.begin!);\n setUniform(material, \"uEnd\", params.end!);\n setUniform(material, \"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\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: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as WaveMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\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/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { 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 | false;\n}) => {\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_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default : `THREE.Texture` */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: `THREE.Color(0x00ff00)` */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default : `0.2` */\n similarity?: number;\n /** smoothness , default : `0.1` */\n smoothness?: number;\n /** spill , default : `0.2` */\n spill?: number;\n /** tone correction , default : `THREE.Vector4(1.0, 1.0, 1.0, 1.0)` */\n color?: THREE.Vector4;\n /** contrast , default : `1.0` */\n contrast?: number;\n /** brightness , default : `0.0` */\n brightness?: number;\n /** gamma correction , default : `1.0` */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = Object.freeze({\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_keyColor\", params.keyColor!);\n setUniform(material, \"u_similarity\", params.similarity!);\n setUniform(material, \"u_smoothness\", params.smoothness!);\n setUniform(material, \"u_spill\", params.spill!);\n setUniform(material, \"u_color\", params.color!);\n setUniform(material, \"u_contrast\", params.contrast!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\n\nfloat random3D(vec3 co) {\n return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453);\n}\n\nvoid main() {\n\tvec3 newPosition = position;\n\tvec2 newUv = uv;\n\t#usf \n\t#usf \n\n\t// displacement for `newPosition`\n\tvec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0);\n\tfloat displacementIntensity = smoothstep(0., 1., displacement.g);\n\tvDisplacementColor = displacement;\n\tvDisplacementIntensity = displacementIntensity;\n\n\t// At this point displacement is 0 ~ 1, so normalize it to -1 ~ 1\n\tdisplacement = displacement * 2.-1.;\n\tdisplacement *= displacementIntensity * uDisplacementIntensity;\n\tnewPosition += displacement;\n\n\t// divergence\n\tvec3 divergenceDir = newPosition - uDivergencePoint;\n\tif (uDivergence > 0.0) {\n\t\tnewPosition += normalize(divergenceDir) * uDivergence;\n\t} else if (uDivergence < 0.0) {\n\t\tnewPosition -= normalize(divergenceDir) * abs(uDivergence);\n\t}\n\n\t// Final position\n\tvec4 modelPosition = modelMatrix * vec4(newPosition, 1.0);\n\tvec4 viewPosition = viewMatrix * modelPosition;\n\tvec4 projectedPosition = projectionMatrix * viewPosition;\n\n\t// wobble ※Do not calculate noise if uWobbleStrength is 0\n\tfloat wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0;\n\n\tgl_Position = projectedPosition += wobble;\n\t\n\t// If picture is true then display picture, otherwise 4 color linear interpolation\n\tvColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z);\n\n\t// Set Alpha on picture's g channel\n\tvPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.;\n\n\t// Multiply the point size by picturAalpha. The size can also be adjusted with alphaMap.\n\t// If uSizeRandomTimeFrequency is greater than 0, the size will be randomly changed\n\tfloat sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.;\n\tgl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand;\n\tgl_PointSize *= (1.0 / - viewPosition.z);\n\n\t// mapArrayIndex\n\tvMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.;\n}","precision highp float;\nprecision highp int;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\nuniform float uBlurAlpha;\nuniform float uBlurRadius;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform sampler2D uAlphaMap;\nuniform bool uIsAlphaMap;\nuniform float uDisplacementColorIntensity;\nuniform float uPointAlpha;\n\n#usf \n\nvoid main() { \n\tvec2 uv = gl_PointCoord;\n\tuv.y = 1.0 - uv.y;\n \n\t// make it a circle\n\tfloat distanceToCenter = length(uv - .5);\n\tfloat alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.);\n\n\t// Map if there is a map\t\n\tvec4 mapArrayColor;\n\t#usf \n\tvec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.);\n\tvec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor;\n\n\t// Mix with finalColor if displacement is true\n\tfloat mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.);\n\tfinalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor;\n\n\t// get alpha map\n\tfloat alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.;\n\n\tgl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha);\n}\n","//\tSimplex 4D Noise \n//\tby Ian McEwan, Ashima Arts\n//\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\nfloat permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\nfloat taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;}\n\nvec4 grad4(float j, vec4 ip)\n{\n\tconst vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\n\tvec4 p,s;\n\n\tp.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\n\tp.w = 1.5 - dot(abs(p.xyz), ones.xyz);\n\ts = vec4(lessThan(p, vec4(0.0)));\n\tp.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; \n\n\treturn p;\n}\n\nfloat simplexNoise4d(vec4 v)\n{\n\tconst vec2 C = vec2( 0.138196601125010504, // (5 - sqrt(5))/20 G4\n\t\t\t\t\t\t\t\t\t0.309016994374947451); // (sqrt(5) - 1)/4 F4\n\t// First corner\n\tvec4 i = floor(v + dot(v, C.yyyy) );\n\tvec4 x0 = v - i + dot(i, C.xxxx);\n\n\t// Other corners\n\n\t// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n\tvec4 i0;\n\n\tvec3 isX = step( x0.yzw, x0.xxx );\n\tvec3 isYZ = step( x0.zww, x0.yyz );\n\t// i0.x = dot( isX, vec3( 1.0 ) );\n\ti0.x = isX.x + isX.y + isX.z;\n\ti0.yzw = 1.0 - isX;\n\n\t// i0.y += dot( isYZ.xy, vec2( 1.0 ) );\n\ti0.y += isYZ.x + isYZ.y;\n\ti0.zw += 1.0 - isYZ.xy;\n\n\ti0.z += isYZ.z;\n\ti0.w += 1.0 - isYZ.z;\n\n\t// i0 now contains the unique values 0,1,2,3 in each channel\n\tvec4 i3 = clamp( i0, 0.0, 1.0 );\n\tvec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\n\tvec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\n\n\t// x0 = x0 - 0.0 + 0.0 * C \n\tvec4 x1 = x0 - i1 + 1.0 * C.xxxx;\n\tvec4 x2 = x0 - i2 + 2.0 * C.xxxx;\n\tvec4 x3 = x0 - i3 + 3.0 * C.xxxx;\n\tvec4 x4 = x0 - 1.0 + 4.0 * C.xxxx;\n\n\t// Permutations\n\ti = mod(i, 289.0); \n\tfloat j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\n\tvec4 j1 = permute( permute( permute( permute (\n\t\t\t\t\ti.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\n\t\t\t\t+ i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\n\t\t\t\t+ i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\n\t\t\t\t+ i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\n\t// Gradients\n\t// ( 7*7*6 points uniformly over a cube, mapped onto a 4-octahedron.)\n\t// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n\n\tvec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\n\n\tvec4 p0 = grad4(j0, ip);\n\tvec4 p1 = grad4(j1.x, ip);\n\tvec4 p2 = grad4(j1.y, ip);\n\tvec4 p3 = grad4(j1.z, ip);\n\tvec4 p4 = grad4(j1.w, ip);\n\n\t// Normalise gradients\n\tvec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\tp4 *= taylorInvSqrt(dot(p4,p4));\n\n\t// Mix contributions from the five corners\n\tvec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\n\tvec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0);\n\tm0 = m0 * m0;\n\tm1 = m1 * m1;\n\treturn 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\n\t\t\t\t\t\t+ dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\n\n}\n\nfloat getWobble(vec3 position)\n{\n\tvec3 warpedPosition = position;\n\twarpedPosition += simplexNoise4d(\n\t\tvec4(\n\t\t\t\tposition * uWarpPositionFrequency,\n\t\t\t\tuTime * uWarpTimeFrequency\n\t\t)\n\t) * uWarpStrength;\n\n\treturn simplexNoise4d(vec4(\n\t\twarpedPosition * uWobblePositionFrequency, // XYZ\n\t\tuTime * uWobbleTimeFrequency // W\n\t)) * uWobbleStrength;\n}","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport getWobble from \"../../../../libs/shaders/getWobble.glsl\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport { ISDEV } from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\n\nexport class MorphParticlesMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uMorphProgress: { value: number };\n uBlurAlpha: { value: number };\n uBlurRadius: { value: number };\n uPointSize: { value: number };\n uPointAlpha: { value: number };\n uPicture: { value: THREE.Texture };\n uIsPicture: { value: boolean };\n uAlphaPicture: { value: THREE.Texture };\n uIsAlphaPicture: { value: boolean };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uAlphaMap: { value: THREE.Texture };\n uIsAlphaMap: { value: boolean };\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uDisplacement: { value: THREE.Texture };\n uIsDisplacement: { value: boolean };\n uDisplacementIntensity: { value: number };\n uDisplacementColorIntensity: { value: number };\n uSizeRandomIntensity: { value: number };\n uSizeRandomTimeFrequency: { value: number };\n uSizeRandomMin: { value: number };\n uSizeRandomMax: { value: number };\n uDivergence: { value: number };\n uDivergencePoint: { value: THREE.Vector3 };\n };\n}\n\nexport const useMaterial = ({\n size,\n dpr,\n geometry,\n positions,\n uvs,\n mapArray,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n}) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n ).replace(`#usf `, getWobble);\n\n // fragment\n const mapArraySwitch = rewriteFragmentShader(mapArray, fragmentShader);\n\n return new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: mapArraySwitch.rewritedFragmentShader,\n depthTest: false,\n depthWrite: false,\n transparent: true,\n blending: THREE.AdditiveBlending,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: new THREE.Texture() },\n uIsPicture: { value: false },\n uAlphaPicture: { value: new THREE.Texture() },\n uIsAlphaPicture: { value: false },\n uColor0: { value: MORPHPARTICLES_PARAMS.color0 },\n uColor1: { value: MORPHPARTICLES_PARAMS.color1 },\n uColor2: { value: MORPHPARTICLES_PARAMS.color2 },\n uColor3: { value: MORPHPARTICLES_PARAMS.color3 },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uAlphaMap: { value: new THREE.Texture() },\n uIsAlphaMap: { value: false },\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: MORPHPARTICLES_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: new THREE.Texture() },\n uIsDisplacement: { value: false },\n uDisplacementIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementIntensity,\n },\n uDisplacementColorIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementColorIntensity,\n },\n uSizeRandomIntensity: {\n value: MORPHPARTICLES_PARAMS.sizeRandomIntensity,\n },\n uSizeRandomTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.sizeRandomTimeFrequency,\n },\n uSizeRandomMin: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArraySwitch.mapArrayUniforms,\n },\n });\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n props: RootState | null,\n params?: MorphParticlesParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateUniform = useCallback(\n (props, params) => {\n if (props) {\n setUniform(\n material,\n \"uTime\",\n params?.beat || props.clock.getElapsedTime()\n );\n }\n if (params === undefined) {\n return;\n }\n setUniform(material, \"uMorphProgress\", params.morphProgress);\n setUniform(material, \"uBlurAlpha\", params.blurAlpha);\n setUniform(material, \"uBlurRadius\", params.blurRadius);\n setUniform(material, \"uPointSize\", params.pointSize);\n setUniform(material, \"uPointAlpha\", params.pointAlpha);\n if (params.picture) {\n setUniform(material, \"uPicture\", params.picture);\n setUniform(material, \"uIsPicture\", true);\n } else if (params.picture === false) {\n setUniform(material, \"uIsPicture\", false);\n }\n if (params.alphaPicture) {\n setUniform(material, \"uAlphaPicture\", params.alphaPicture);\n setUniform(material, \"uIsAlphaPicture\", true);\n } else if (params.alphaPicture === false) {\n setUniform(material, \"uIsAlphaPicture\", false);\n }\n setUniform(material, \"uColor0\", params.color0);\n setUniform(material, \"uColor1\", params.color1);\n setUniform(material, \"uColor2\", params.color2);\n setUniform(material, \"uColor3\", params.color3);\n if (params.map) {\n setUniform(material, \"uMap\", params.map);\n setUniform(material, \"uIsMap\", true);\n } else if (params.map === false) {\n setUniform(material, \"uIsMap\", false);\n }\n if (params.alphaMap) {\n setUniform(material, \"uAlphaMap\", params.alphaMap);\n setUniform(material, \"uIsAlphaMap\", true);\n } else if (params.alphaMap === false) {\n setUniform(material, \"uIsAlphaMap\", false);\n }\n setUniform(material, \"uWobbleStrength\", params.wobbleStrength);\n setUniform(\n material,\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n setUniform(\n material,\n \"uWobbleTimeFrequency\",\n params.wobbleTimeFrequency\n );\n setUniform(material, \"uWarpStrength\", params.warpStrength);\n setUniform(\n material,\n \"uWarpPositionFrequency\",\n params.warpPositionFrequency\n );\n setUniform(material, \"uWarpTimeFrequency\", params.warpTimeFrequency);\n if (params.displacement) {\n setUniform(material, \"uDisplacement\", params.displacement);\n setUniform(material, \"uIsDisplacement\", true);\n } else if (params.displacement === false) {\n setUniform(material, \"uIsDisplacement\", false);\n }\n setUniform(\n material,\n \"uDisplacementIntensity\",\n params.displacementIntensity\n );\n setUniform(\n material,\n \"uDisplacementColorIntensity\",\n params.displacementColorIntensity\n );\n setUniform(\n material,\n \"uSizeRandomIntensity\",\n params.sizeRandomIntensity\n );\n setUniform(\n material,\n \"uSizeRandomTimeFrequency\",\n params.sizeRandomTimeFrequency\n );\n setUniform(material, \"uSizeRandomMin\", params.sizeRandomMin);\n setUniform(material, \"uSizeRandomMax\", params.sizeRandomMax);\n setUniform(material, \"uDivergence\", params.divergence);\n setUniform(material, \"uDivergencePoint\", params.divergencePoint);\n },\n [material]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({ scene, size, dpr, geometry, positions, uvs });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MorphParticlesParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: MorphParticlesParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","// \n//\tby Nikita Miropolskiy\n\n/* discontinuous pseudorandom uniformly distributed in [-0.5, +0.5]^3 */\nvec3 random3(vec3 c) {\n\tfloat j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));\n\tvec3 r;\n\tr.z = fract(512.0*j);\n\tj *= .125;\n\tr.x = fract(512.0*j);\n\tj *= .125;\n\tr.y = fract(512.0*j);\n\treturn r-0.5;\n}\n\nconst float F3 = 0.3333333;\nconst float G3 = 0.1666667;\nfloat snoise(vec3 p) {\n\n\tvec3 s = floor(p + dot(p, vec3(F3)));\n\tvec3 x = p - s + dot(s, vec3(G3));\n\t\n\tvec3 e = step(vec3(0.0), x - x.yzx);\n\tvec3 i1 = e*(1.0 - e.zxy);\n\tvec3 i2 = 1.0 - e.zxy*(1.0 - e);\n \t\n\tvec3 x1 = x - i1 + G3;\n\tvec3 x2 = x - i2 + 2.0*G3;\n\tvec3 x3 = x - 1.0 + 3.0*G3;\n\t \n\tvec4 w, d;\n\t \n\tw.x = dot(x, x);\n\tw.y = dot(x1, x1);\n\tw.z = dot(x2, x2);\n\tw.w = dot(x3, x3);\n\t \n\tw = max(0.6 - w, 0.0);\n\t \n\td.x = dot(random3(s), x);\n\td.y = dot(random3(s + i1), x1);\n\td.z = dot(random3(s + i2), x2);\n\td.w = dot(random3(s + 1.0), x3);\n\t \n\tw *= w;\n\tw *= w;\n\td *= w;\n\t \n\treturn dot(d, vec4(52.0));\n}\n\nfloat snoiseFractal(vec3 m) {\n\treturn 0.5333333* snoise(m)\n\t\t\t\t+0.2666667* snoise(2.0*m)\n\t\t\t\t+0.1333333* snoise(4.0*m)\n\t\t\t\t+0.0666667* snoise(8.0*m);\n}","#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float _transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\t// Mipped Bicubic Texture Filtering by N8\n\t// https://www.shadertoy.com/view/Dl2SDW\n\n\tfloat w0( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w1( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\n\t}\n\n\tfloat w2( float a ){\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w3( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\n\t}\n\n\t// g0 and g1 are the two amplitude functions\n\tfloat g0( float a ) {\n\n\t\treturn w0( a ) + w1( a );\n\n\t}\n\n\tfloat g1( float a ) {\n\n\t\treturn w2( a ) + w3( a );\n\n\t}\n\n\t// h0 and h1 are the two offset functions\n\tfloat h0( float a ) {\n\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\n\t}\n\n\tfloat h1( float a ) {\n\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\n\t}\n\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\n\t\tuv = uv * texelSize.zw + 0.5;\n\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\n\t}\n\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\n\t}\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\n\t}\n\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( isinf( attenuationDistance ) ) {\n\n\t\t\t// Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.\n\t\t\treturn vec3( 1.0 );\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\t// As less light is transmitted, the opacity should be increased. This simple approximation does a decent job \n\t\t// of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color.\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\n\t}\n#endif","#ifdef USE_TRANSMISSION\n\nmaterial.transmission = _transmission;\nmaterial.transmissionAlpha = 1.0;\nmaterial.thickness = thickness;\nmaterial.attenuationDistance = attenuationDistance;\nmaterial.attenuationColor = attenuationColor;\n\n#ifdef USE_TRANSMISSIONMAP\n\n\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\n#endif\n\n#ifdef USE_THICKNESSMAP\n\n\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\n#endif\n\nvec3 pos = vWorldPosition;\n\nvec3 v = normalize( cameraPosition - pos );\nvec3 n = inverseTransformDirection( normal, viewMatrix );\n\nvec4 transmitted = getIBLVolumeRefraction(\n\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\tmaterial.attenuationColor, material.attenuationDistance );\n\nmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\n// Custom from here\nfloat runningSeed = 0.0;\nvec3 transmission = vec3(0.0);\nfloat transmissionR, transmissionB, transmissionG;\nfloat randomCoords = rand(runningSeed++);\nfloat thickness_smear = thickness * max(pow(roughnessFactor, 0.33), uAnisotropicBlur);\nvec3 distortionNormal = vec3(0.0);\nvec3 temporalOffset = vec3(uTime, -uTime, -uTime) * uTemporalDistortion;\n\nif (uDistortion > 0.0) {\n\tdistortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset)));\n}\n\nfor (float i = 0.0; i < uSamples; i ++) {\n\tvec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5)) * pow(rand(runningSeed++), 0.33) + distortionNormal);\n\t\n\ttransmissionR = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).r;\n\ttransmissionG = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uSamples) , material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).g;\n\ttransmissionB = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uSamples), material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport getWobble from \"../../../libs/shaders/getWobble.glsl\";\nimport snoise from \"../../../libs/shaders/snoise.glsl\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\n\nexport class Wobble3DMaterial extends THREE.Material {\n uniforms!: {\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uWobbleShine: { value: number };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uSamples: { value: number };\n };\n}\n\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// #usf \n\t\tvoid main() {`\n );\n\n // wobble\n shader = shader.replace(\"// #usf \", `${getWobble}`);\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t// Wobble\n\t\tfloat wobble = getWobble(usf_Position);\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += getWobble(positionA) * normal;\n\t\tpositionB += getWobble(positionB) * normal;\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble / uWobbleStrength;`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype MaterialParams =\n ConstructorParameters[0];\nexport type WobbleMaterialProps = {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: MaterialParams;\n};\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\n const hasRoughness =\n mat.type === \"MeshPhysicalMaterial\" ||\n mat.type === \"MeshStandardMaterial\";\n\n const hasTransmission = mat.type === \"MeshPhysicalMaterial\";\n\n Object.assign(mat.userData, {\n uniforms: {\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: WOBBLE3D_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: WOBBLE3D_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: WOBBLE3D_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: WOBBLE3D_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: { value: WOBBLE3D_PARAMS.warpTimeFrequency },\n uWarpStrength: { value: WOBBLE3D_PARAMS.warpStrength },\n uWobbleShine: { value: WOBBLE3D_PARAMS.wobbleShine },\n uColor0: { value: WOBBLE3D_PARAMS.color0 },\n uColor1: { value: WOBBLE3D_PARAMS.color1 },\n uColor2: { value: WOBBLE3D_PARAMS.color2 },\n uColor3: { value: WOBBLE3D_PARAMS.color3 },\n uColorMix: { value: WOBBLE3D_PARAMS.colorMix },\n uChromaticAberration: {\n value: WOBBLE3D_PARAMS.chromaticAberration,\n },\n uAnisotropicBlur: { value: WOBBLE3D_PARAMS.anisotropicBlur },\n uDistortion: { value: WOBBLE3D_PARAMS.distortion },\n uDistortionScale: { value: WOBBLE3D_PARAMS.distortionScale },\n uTemporalDistortion: { value: WOBBLE3D_PARAMS.temporalDistortion },\n uSamples: { value: WOBBLE3D_PARAMS.samples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (shader) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t#include \n\t\t\t\tdiffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`\n );\n\n // roughness\n if (hasRoughness) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\t\t\t\t\troughnessFactor = usf_Roughness;`\n );\n }\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uWobbleShine;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t${snoise}\n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\t${hasRoughness ? \"float usf_Roughness = roughness;\" : \"\"}\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\n\t\t\t\t\t${\n hasRoughness\n ? \"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);\"\n : \"\"\n }`\n );\n\n // transmission\n if (hasTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [materialParameters, baseMaterial]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (props: RootState | null, params?: Wobble3DParams) => void;\ntype UseCreateWobble3DReturn = [\n UpdateUniform,\n {\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n }\n];\n\nexport const useCreateWobble3D = ({\n scene = false,\n geometry,\n baseMaterial,\n materialParameters,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const updateUniform = useCallback(\n (props, params) => {\n const userData = material.userData as Wobble3DMaterial;\n if (props) {\n setUniform(\n userData,\n \"uTime\",\n params?.beat || props.clock.getElapsedTime()\n );\n }\n if (params === undefined) {\n return;\n }\n setUniform(userData, \"uWobbleStrength\", params.wobbleStrength);\n setUniform(\n userData,\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n setUniform(\n userData,\n \"uWobbleTimeFrequency\",\n params.wobbleTimeFrequency\n );\n setUniform(userData, \"uWarpStrength\", params.warpStrength);\n setUniform(\n userData,\n \"uWarpPositionFrequency\",\n params.warpPositionFrequency\n );\n setUniform(userData, \"uWarpTimeFrequency\", params.warpTimeFrequency);\n setUniform(userData, \"uWobbleShine\", params.wobbleShine);\n setUniform(userData, \"uSamples\", params.samples);\n setUniform(userData, \"uColor0\", params.color0);\n setUniform(userData, \"uColor1\", params.color1);\n setUniform(userData, \"uColor2\", params.color2);\n setUniform(userData, \"uColor3\", params.color3);\n setUniform(userData, \"uColorMix\", params.colorMix);\n setUniform(\n userData,\n \"uChromaticAberration\",\n params.chromaticAberration\n );\n setUniform(userData, \"uAnisotropicBlur\", params.anisotropicBlur);\n setUniform(userData, \"uDistortion\", params.distortion);\n setUniform(userData, \"uDistortionScale\", params.distortionScale);\n setUniform(userData, \"uTemporalDistortion\", params.temporalDistortion);\n },\n [material]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type Wobble3DParams = {\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param ,default : `0` */\n wobbleShine?: number;\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Refraction samples, default : `6` */\n samples?: number;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */\n colorMix?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.5` */\n chromaticAberration?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n distortion?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n distortionScale?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n temporalDistortion?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type Wobble3DObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WOBBLE3D_PARAMS: Wobble3DParams = Object.freeze({\n beat: false,\n wobbleStrength: 0.3,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.4,\n wobbleShine: 0,\n warpStrength: 1.7,\n warpPositionFrequency: 0.38,\n warpTimeFrequency: 0.12,\n samples: 6,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n colorMix: 1,\n chromaticAberration: 0.5,\n anisotropicBlur: 0.1,\n distortion: 0.1,\n distortionScale: 0.1,\n temporalDistortion: 0.1,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: Wobble3DParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: Wobble3DParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\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 const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\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: {\n value: new THREE.Vector2(0, 0),\n },\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\";\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 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(material, \"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\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, 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 \"../../fxs/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\";\nimport { getDpr } from \"../../utils/getDpr\";\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 /** 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.updateKey must be a unique value for each update, for example `performance.now()`.*/\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 boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples, isSizeUpdate }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\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: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\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 useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\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 (errorHandler(params)) {\n return emptyTexture;\n }\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 (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 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","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/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 if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\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","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","useMesh","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","getDpr","BRUSH_PARAMS","useBrush","_dpr","updatePointer","pressureEnd","props","pointer","pointerValues","color","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","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","updateTempTexture","_tempTexture","iterations","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","useCreateObject","points","interactiveMesh","getWobble_default","ISDEV","rewriteVertexShader","modifeidAttributes","targetGeometry","targetAttibute","itemSize","vTargetName","vAttributeRewriteKey","vTransitionRewriteKey","vListName","vMorphTransition","stringToAddToMorphAttibutes","stringToAddToMorphAttibutesList","modifyAttributes","attribute","modifiedAttribute","maxLength","arr","diff","addArray","oldArray","randomIndex","j","rewriteFragmentShader","mapArray","mapArrayShader","mapArrayUniforms","textureSwitcherCode","map","condition","action","useMaterial","positions","uvs","modifiedPositions","modifiedUvs","rewritedVertexShader","getWobble","mapArraySwitch","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","snoise_default","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthMaterial","mat","hasRoughness","hasTransmission","WOBBLE3D_PARAMS","snoise","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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AA,IACA,iBAAAC;AAAA,EAAA;AAEN;AC5CA,IAAAtM,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAuM,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SCAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACiCA,MAAMC,KAAgB,CAACC,MAAmB;AACvC,MAAIC,IAASD;AACb,SAAAC,IAASA,EAAO;AAAA,IACb;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,GAOHA,IAASA,EAAO;AAAA,IACb;AAAA,IACA;AAAA;AAAA,EAAA,GAKHA,IAASA,EAAO;AAAA,IACb;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,GAgBHA,IAASA,EAAO,QAAQ,uBAAuB,GAAG9C,EAAS,EAAE,GAG7D8C,IAASA,EAAO;AAAA,IACb;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,GAuBIA;AACV,GAaapD,KAAc,CAAsC;AAAA,EAC9D,cAAAqD;AAAA,EACA,oBAAAC;AACH,MAA8B;AAC3B,QAAM,EAAE,UAAApR,GAAU,eAAAqR,EAAc,IAAIxR,EAAQ,MAAM;AACzC,UAAAyR,IAAM,KAAKH,KAAgBrR,EAAM;AAAA,MACpCsR,KAAsB,CAAC;AAAA,IAAA,GAEpBG,IACHD,EAAI,SAAS,0BACbA,EAAI,SAAS,wBAEVE,IAAkBF,EAAI,SAAS;AAE9B,WAAA,OAAOA,EAAI,UAAU;AAAA,MACzB,UAAU;AAAA,QACP,OAAO,EAAE,OAAO,EAAE;AAAA,QAClB,0BAA0B;AAAA,UACvB,OAAOG,EAAgB;AAAA,QAC1B;AAAA,QACA,sBAAsB;AAAA,UACnB,OAAOA,EAAgB;AAAA,QAC1B;AAAA,QACA,iBAAiB,EAAE,OAAOA,EAAgB,eAAe;AAAA,QACzD,wBAAwB;AAAA,UACrB,OAAOA,EAAgB;AAAA,QAC1B;AAAA,QACA,oBAAoB,EAAE,OAAOA,EAAgB,kBAAkB;AAAA,QAC/D,eAAe,EAAE,OAAOA,EAAgB,aAAa;AAAA,QACrD,cAAc,EAAE,OAAOA,EAAgB,YAAY;AAAA,QACnD,SAAS,EAAE,OAAOA,EAAgB,OAAO;AAAA,QACzC,SAAS,EAAE,OAAOA,EAAgB,OAAO;AAAA,QACzC,SAAS,EAAE,OAAOA,EAAgB,OAAO;AAAA,QACzC,SAAS,EAAE,OAAOA,EAAgB,OAAO;AAAA,QACzC,WAAW,EAAE,OAAOA,EAAgB,SAAS;AAAA,QAC7C,sBAAsB;AAAA,UACnB,OAAOA,EAAgB;AAAA,QAC1B;AAAA,QACA,kBAAkB,EAAE,OAAOA,EAAgB,gBAAgB;AAAA,QAC3D,aAAa,EAAE,OAAOA,EAAgB,WAAW;AAAA,QACjD,kBAAkB,EAAE,OAAOA,EAAgB,gBAAgB;AAAA,QAC3D,qBAAqB,EAAE,OAAOA,EAAgB,mBAAmB;AAAA,QACjE,UAAU,EAAE,OAAOA,EAAgB,QAAQ;AAAA,QAC3C,cAAc,EAAE,OAAO,EAAE;AAAA,QACzB,eAAe,EAAE,OAAO,EAAE;AAAA,QAC1B,iBAAiB,EAAE,OAAO,KAAK;AAAA,MAClC;AAAA,IAAA,CACF,GAEGH,EAAA,kBAAkB,CAACJ,MAAW;AAC/B,aAAO,OAAOA,EAAO,UAAUI,EAAI,SAAS,QAAQ,GAK7CJ,EAAA,eAAeF,GAAcE,EAAO,YAAY,GAMhDA,EAAA,iBAAiBA,EAAO,eAAe;AAAA,QAC3C;AAAA,QACA;AAAA;AAAA;AAAA,MAAA,GAMCK,MACML,EAAA,iBAAiBA,EAAO,eAAe;AAAA,QAC3C;AAAA,QACA;AAAA;AAAA;AAAA,MAAA,IAOCA,EAAA,iBAAiBA,EAAO,eAAe;AAAA,QAC3C;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBNQ,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAMLH,IAAe,qCAAqC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAO3CA,IACK,uEACA,EACR;AAAA,MAAA,GAIFC,MACMN,EAAA,iBAAiBA,EAAO,eAAe;AAAA,QAC3C;AAAA,QACA,GAAGS,EAA0B;AAAA,MAAA,GAGzBT,EAAA,iBAAiBA,EAAO,eAAe;AAAA,QAC3C;AAAA,QACA,GAAGU,EAAqB;AAAA,MAAA;AAAA,IAE9B,GAEHN,EAAI,cAAc;AAKZ,UAAAO,IAAW,IAAI/R,EAAM,kBAAkB;AAAA,MAC1C,cAAcA,EAAM;AAAA,IAAA,CACtB;AACQ,WAAA+R,EAAA,kBAAkB,CAACX,MAAW;AACpC,aAAO,OAAOA,EAAO,UAAUI,EAAI,SAAS,QAAQ,GAC7CJ,EAAA,eAAeF,GAAcE,EAAO,YAAY;AAAA,IAAA,GAE1DW,EAAS,cAAc,IAEhB,EAAE,UAAUP,GAAK,eAAeO,EAAS;AAAA,EAAA,GAChD,CAACT,GAAoBD,CAAY,CAAC;AAE9B,SAAA;AAAA,IACJ,UAAAnR;AAAA,IACA,eAAAqR;AAAA,EAAA;AAEN,GC1OaS,KAAoB,CAAsC;AAAA,EACpE,OAAA1R,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,cAAA8Q;AAAA,EACA,oBAAAC;AACH,MAE0D;AACjD,QAAAW,IAAiBlS,EAAQ,MAAM;AAClC,QAAI4O,IAAMpO,KAAY,IAAIP,EAAM,oBAAoB,GAAG,EAAE;AACzD,WAAA2O,IAAMM,GAAcN,CAAG,GACvBA,EAAI,gBAAgB,GACbA;AAAA,EAAA,GACP,CAACpO,CAAQ,CAAC,GACP,EAAE,UAAAL,GAAU,eAAAqR,EAAc,IAAIvD,GAAY;AAAA,IAC7C,cAAAqD;AAAA,IACA,oBAAAC;AAAA,EAAA,CACF,GAEKtQ,IAAOX,EAAaC,GAAO2R,GAAgB/R,GAAUF,EAAM,IAAI;AAqD9D,SAAA;AAAA,IAnDeqC;AAAA,MACnB,CAACyC,GAAOjC,MAAW;AAChB,cAAMqP,IAAWhS,EAAS;AAQ1B,QAPI4E,KACD7E;AAAA,UACGiS;AAAA,UACA;AAAA,WACArP,KAAA,gBAAAA,EAAQ,SAAQiC,EAAM,MAAM,eAAe;AAAA,QAAA,GAG7CjC,MAAW,WAGJ5C,EAAAiS,GAAU,mBAAmBrP,EAAO,cAAc,GAC7D5C;AAAA,UACGiS;AAAA,UACA;AAAA,UACArP,EAAO;AAAA,QAAA,GAEV5C;AAAA,UACGiS;AAAA,UACA;AAAA,UACArP,EAAO;AAAA,QAAA,GAEC5C,EAAAiS,GAAU,iBAAiBrP,EAAO,YAAY,GACzD5C;AAAA,UACGiS;AAAA,UACA;AAAA,UACArP,EAAO;AAAA,QAAA,GAEC5C,EAAAiS,GAAU,sBAAsBrP,EAAO,iBAAiB,GACxD5C,EAAAiS,GAAU,gBAAgBrP,EAAO,WAAW,GAC5C5C,EAAAiS,GAAU,YAAYrP,EAAO,OAAO,GACpC5C,EAAAiS,GAAU,WAAWrP,EAAO,MAAM,GAClC5C,EAAAiS,GAAU,WAAWrP,EAAO,MAAM,GAClC5C,EAAAiS,GAAU,WAAWrP,EAAO,MAAM,GAClC5C,EAAAiS,GAAU,WAAWrP,EAAO,MAAM,GAClC5C,EAAAiS,GAAU,aAAarP,EAAO,QAAQ,GACjD5C;AAAA,UACGiS;AAAA,UACA;AAAA,UACArP,EAAO;AAAA,QAAA,GAEC5C,EAAAiS,GAAU,oBAAoBrP,EAAO,eAAe,GACpD5C,EAAAiS,GAAU,eAAerP,EAAO,UAAU,GAC1C5C,EAAAiS,GAAU,oBAAoBrP,EAAO,eAAe,GACpD5C,EAAAiS,GAAU,uBAAuBrP,EAAO,kBAAkB;AAAA,MACxE;AAAA,MACA,CAAC3C,CAAQ;AAAA,IAAA;AAAA,IAKT;AAAA,MACG,MAAAc;AAAA,MACA,eAAAuQ;AAAA,IACH;AAAA,EAAA;AAEN,GC3DaI,IAAkC,OAAO,OAAO;AAAA,EAC1D,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ,IAAI3R,EAAM,MAAM,QAAQ;AAAA,EAChC,QAAQ,IAAIA,EAAM,MAAM,KAAQ;AAAA,EAChC,QAAQ,IAAIA,EAAM,MAAM,GAAQ;AAAA,EAChC,QAAQ,IAAIA,EAAM,MAAM,QAAQ;AAAA,EAChC,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,oBAAoB;AACvB,CAAC,GAKYmS,KAAc,CAAsC;AAAA,EAC9D,MAAAxS;AAAA,EACA,KAAAC;AAAA,EACA,SAAA+D;AAAA,EACA,cAAAD;AAAA,EACA,QAAAJ;AAAA,EACA,UAAA/C;AAAA,EACA,cAAA8Q;AAAA,EACA,oBAAAC;AACH,MAGK;AACI,QAAA3M,IAAOH,EAAO5E,CAAG,GAEjBU,IAAQP,EAAQ,MAAM,IAAIC,EAAM,MAAM,GAAG,CAAA,CAAE,GAE3C,CAAC6O,GAAe,EAAE,MAAA7N,GAAM,eAAAuQ,EAAe,CAAA,IAAIS,GAAkB;AAAA,IAChE,cAAAX;AAAA,IACA,oBAAAC;AAAA,IACA,OAAAhR;AAAA,IACA,UAAAC;AAAA,EAAA,CACF,GAEK,CAACuD,GAAcI,CAAkB,IAAIT,EAAa;AAAA,IACrD,OAAAnD;AAAA,IACA,QAAAgD;AAAA,IACA,MAAA3D;AAAA,IACA,KAAKgF,EAAK;AAAA,IACV,SAAAhB;AAAA,IACA,cAAAD;AAAA,IACA,aAAa;AAAA,EAAA,CACf,GAEKsL,IAAW3M;AAAA,IACd,CAACyC,GAAkB9B,OAChB6L,EAAc/J,GAAO9B,CAAY,GAC1BkB,EAAmBY,EAAM,EAAE;AAAA,IAErC,CAACZ,GAAoB2K,CAAa;AAAA,EAAA,GAG/B9L,IAAYV;AAAA,IACf,CAACW,MAAiC;AAC/B,MAAA6L,EAAc,MAAM7L,CAAY;AAAA,IACnC;AAAA,IACA,CAAC6L,CAAa;AAAA,EAAA;AAGV,SAAA;AAAA,IACJG;AAAA,IACAjM;AAAA,IACA;AAAA,MACG,OAAAzC;AAAA,MACA,MAAAU;AAAA,MACA,eAAAuQ;AAAA,MACA,cAAAzN;AAAA,MACA,QAAQA,EAAa;AAAA,IACxB;AAAA,EAAA;AAEN,GClIasO,KAAa,CACvB9R,GACAC,GACAL,MACE;AACI,QAAAc,IAAOjB,EAAQ,MAAM;AACxB,UAAMiB,IAAO,IAAIhB,EAAM,KAAKO,GAAUL,CAAQ;AAC9C,WAAAI,EAAM,IAAIU,CAAI,GACPA;AAAAA,EACP,GAAA,CAACT,GAAUL,GAAUI,CAAK,CAAC;AAE9B,SAAAK,EAAU,MACA,MAAM;AACV,IAAAL,EAAM,OAAOU,CAAI,GACjBT,EAAS,QAAQ,GACjBL,EAAS,QAAQ;AAAA,EAAA,GAEpB,CAACI,GAAOC,GAAUL,GAAUc,CAAI,CAAC,GAE7BA;AACV,GCeaqR,IAA0B,OAAO,OAAO;AAAA,EAClD,WAAWC,GAAmB;AAC3B,WAAO,IAAI,KAAK,IAAKA,IAAI,KAAK,KAAM,CAAC;AAAA,EACxC;AAAA,EACA,YAAYA,GAAmB;AAC5B,WAAO,KAAK,IAAKA,IAAI,KAAK,KAAM,CAAC;AAAA,EACpC;AAAA,EACA,cAAcA,GAAmB;AAC9B,WAAO,EAAE,KAAK,IAAI,KAAK,KAAKA,CAAC,IAAI,KAAK;AAAA,EACzC;AAAA,EACA,WAAWA,GAAmB;AAC3B,WAAOA,IAAIA;AAAA,EACd;AAAA,EACA,YAAYA,GAAmB;AACrB,WAAA,KAAK,IAAIA,MAAM,IAAIA;AAAA,EAC7B;AAAA,EACA,cAAcA,GAAmB;AAC9B,WAAOA,IAAI,MAAM,IAAIA,IAAIA,IAAI,IAAI,KAAK,IAAI,KAAKA,IAAI,GAAG,CAAC,IAAI;AAAA,EAC9D;AAAA,EACA,YAAYA,GAAmB;AAC5B,WAAOA,IAAIA,IAAIA;AAAA,EAClB;AAAA,EACA,aAAaA,GAAmB;AAC7B,WAAO,IAAI,KAAK,IAAI,IAAIA,GAAG,CAAC;AAAA,EAC/B;AAAA,EACA,eAAeA,GAAmB;AAC/B,WAAOA,IAAI,MAAM,IAAIA,IAAIA,IAAIA,IAAI,IAAI,KAAK,IAAI,KAAKA,IAAI,GAAG,CAAC,IAAI;AAAA,EAClE;AAAA,EACA,YAAYA,GAAmB;AACrB,WAAAA,IAAIA,IAAIA,IAAIA;AAAA,EACtB;AAAA,EACA,aAAaA,GAAmB;AAC7B,WAAO,IAAI,KAAK,IAAI,IAAIA,GAAG,CAAC;AAAA,EAC/B;AAAA,EACA,eAAeA,GAAmB;AAC/B,WAAOA,IAAI,MAAM,IAAIA,IAAIA,IAAIA,IAAIA,IAAI,IAAI,KAAK,IAAI,KAAKA,IAAI,GAAG,CAAC,IAAI;AAAA,EACtE;AAAA,EACA,YAAYA,GAAmB;AACrB,WAAAA,IAAIA,IAAIA,IAAIA,IAAIA;AAAA,EAC1B;AAAA,EACA,aAAaA,GAAmB;AAC7B,WAAO,IAAI,KAAK,IAAI,IAAIA,GAAG,CAAC;AAAA,EAC/B;AAAA,EACA,eAAeA,GAAmB;AAC/B,WAAOA,IAAI,MAAM,KAAKA,IAAIA,IAAIA,IAAIA,IAAIA,IAAI,IAAI,KAAK,IAAI,KAAKA,IAAI,GAAG,CAAC,IAAI;AAAA,EAC3E;AAAA,EACA,WAAWA,GAAmB;AACpB,WAAAA,MAAM,IAAI,IAAI,KAAK,IAAI,GAAG,KAAKA,IAAI,EAAE;AAAA,EAC/C;AAAA,EACA,YAAYA,GAAmB;AACrB,WAAAA,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,MAAMA,CAAC;AAAA,EAC/C;AAAA,EACA,cAAcA,GAAmB;AACvB,WAAAA,MAAM,IACR,IACAA,MAAM,IACN,IACAA,IAAI,MACJ,KAAK,IAAI,GAAG,KAAKA,IAAI,EAAE,IAAI,KAC1B,IAAI,KAAK,IAAI,GAAG,MAAMA,IAAI,EAAE,KAAK;AAAA,EAC1C;AAAA,EACA,WAAWA,GAAmB;AACpB,WAAA,IAAI,KAAK,KAAK,IAAI,KAAK,IAAIA,GAAG,CAAC,CAAC;AAAA,EAC1C;AAAA,EACA,YAAYA,GAAmB;AACrB,WAAA,KAAK,KAAK,IAAI,KAAK,IAAIA,IAAI,GAAG,CAAC,CAAC;AAAA,EAC1C;AAAA,EACA,cAAcA,GAAmB;AACvB,WAAAA,IAAI,OACL,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,IAAIA,GAAG,CAAC,CAAC,KAAK,KACzC,KAAK,KAAK,IAAI,KAAK,IAAI,KAAKA,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK;AAAA,EACvD;AAAA,EACA,WAAWA,GAAmB;AAI3B,WAAO,UAAKA,IAAIA,IAAIA,IAAI,UAAKA,IAAIA;AAAA,EACpC;AAAA,EACA,YAAYA,GAAmB;AAI5B,WAAO,IAAI,UAAK,KAAK,IAAIA,IAAI,GAAG,CAAC,IAAI,UAAK,KAAK,IAAIA,IAAI,GAAG,CAAC;AAAA,EAC9D;AAAA,EACA,cAAcA,GAAmB;AAE9B,UAAMC,IAAK;AAEJ,WAAAD,IAAI,MACL,KAAK,IAAI,IAAIA,GAAG,CAAC,MAAMC,IAAK,KAAK,IAAID,IAAIC,KAAO,KAChD,KAAK,IAAI,IAAID,IAAI,GAAG,CAAC,MAAMC,IAAK,MAAMD,IAAI,IAAI,KAAKC,KAAM,KAAK;AAAA,EACvE;AAAA,EACA,cAAcD,GAAmB;AACxB,UAAAE,IAAM,IAAI,KAAK,KAAM;AAE3B,WAAOF,MAAM,IACR,IACAA,MAAM,IACN,IACA,CAAC,KAAK,IAAI,GAAG,KAAKA,IAAI,EAAE,IAAI,KAAK,KAAKA,IAAI,KAAK,SAASE,CAAE;AAAA,EAClE;AAAA,EACA,eAAeF,GAAmB;AACzB,UAAAE,IAAM,IAAI,KAAK,KAAM;AAE3B,WAAOF,MAAM,IACR,IACAA,MAAM,IACN,IACA,KAAK,IAAI,GAAG,MAAMA,CAAC,IAAI,KAAK,KAAKA,IAAI,KAAK,QAAQE,CAAE,IAAI;AAAA,EAChE;AAAA,EACA,iBAAiBF,GAAmB;AAC3B,UAAAG,IAAM,IAAI,KAAK,KAAM;AAE3B,WAAOH,MAAM,IACR,IACAA,MAAM,IACN,IACAA,IAAI,MACJ,EAAE,KAAK,IAAI,GAAG,KAAKA,IAAI,EAAE,IAAI,KAAK,KAAK,KAAKA,IAAI,UAAUG,CAAE,KAAK,IAChE,KAAK,IAAI,GAAG,MAAMH,IAAI,EAAE,IAAI,KAAK,KAAK,KAAKA,IAAI,UAAUG,CAAE,IAAK,IACjE;AAAA,EACR;AAAA,EACA,aAAaH,GAAmB;AAC7B,WAAO,IAAID,EAAO,cAAc,IAAIC,CAAC;AAAA,EACxC;AAAA,EACA,cAAcA,GAAmB;AAI1B,WAAAA,IAAI,IAAI,OACF,SAAKA,IAAIA,IACRA,IAAI,IAAI,OACT,UAAMA,KAAK,MAAM,QAAMA,IAAI,OAC1BA,IAAI,MAAM,OACX,UAAMA,KAAK,OAAO,QAAMA,IAAI,SAE5B,UAAMA,KAAK,QAAQ,QAAMA,IAAI;AAAA,EAE1C;AAAA,EACA,gBAAgBA,GAAmB;AAChC,WAAOA,IAAI,OACL,IAAID,EAAO,cAAc,IAAI,IAAIC,CAAC,KAAK,KACvC,IAAID,EAAO,cAAc,IAAIC,IAAI,CAAC,KAAK;AAAA,EAChD;AACH,CAAC;AClLD,SAASI,GAAQC,GAAe;AAC7B,MAAIC,IAAI,KAAK,IAAID,IAAQ,OAAO,IAAI;AAC7B,SAAAC,IAAI,KAAK,MAAMA,CAAC;AAC1B;AAaO,MAAMC,KAAU,CAACC,GAAaC,IAAoB,mBAAmB;AACzE,QAAMC,IAASF,IAAM,IACfG,IAASZ,EAAOU,CAAI;AAiBnB,SAhBY1Q;AAAA,IAChB,CAAC2F,MAAuB;AACjB,UAAAkL,IAAOlL,EAAM,eAAA,IAAmBgL;AAC9B,YAAAG,IAAQ,KAAK,MAAMD,CAAI,GACvBE,IAAQH,EAAOC,IAAOC,CAAK;AACjC,MAAAD,IAAOE,IAAQD;AACT,YAAAlD,IAAOyC,GAAQS,CAAK;AACnB,aAAA;AAAA,QACJ,MAAAD;AAAA,QACA,OAAAC;AAAA,QACA,OAAAC;AAAA,QACA,MAAAnD;AAAA,MAAA;AAAA,IAEN;AAAA,IACA,CAAC+C,GAAQC,CAAM;AAAA,EAAA;AAGrB,GC1BaI,KAAgB,CAACC,IAAc,OAAO;AAChD,QAAMC,IAAWxT,EAAQ,MAAM,IAAI,KAAK,IAAI,KAAK,IAAIuT,GAAK,EAAE,GAAG,CAAC,GAAG,CAACA,CAAG,CAAC,GAClEE,IAAWzR,EAAsB,IAAI;AAmBpC,SAjBSM;AAAA,IACb,CAAC2F,MAAuB;AACf,YAAAyL,IAAOzL,EAAM;AAMnB,aALIwL,EAAS,YAAY,QAIPC,IAAOD,EAAS,WACjBD,KACdC,EAAS,UAAUC,GACZ,MAEH;AAAA,IACV;AAAA,IACA,CAACF,CAAQ;AAAA,EAAA;AAIf,GCnCaG,KAAe,CAAC7Q,MAA4B;;AAChD,QAAA8Q,KAAY3P,IAAAnB,EAAO,QAAP,gBAAAmB,EAAY,QACxB4P,KAAgBrP,IAAA1B,EAAO,YAAP,gBAAA0B,EAAgB;AAMtC,SAJI,CAACoP,KAAa,CAACC,KAIfD,MAAcC;AAKrB;ACfA,IAAAnU,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACeO,MAAMoU,KAAa,CAAC;AAAA,EACxB,QAAAhR;AAAA,EACA,MAAAlD;AAAA,EACA,OAAAW;AACH,MAIM;AACC,EAAAA,EAAM,SAAS,SAAS,MACnBA,EAAA,SAAS,QAAQ,CAACwT,MAAU;AAC3B,IAAAA,aAAiB9T,EAAM,SACxB8T,EAAM,SAAS,WACfA,EAAM,SAAS;EAClB,CACF,GACKxT,EAAA,OAAO,GAAGA,EAAM,QAAQ,IAGjCuC,EAAO,QAAS,QAAQ,CAAC8F,GAASH,MAAM;AAC/B,UAAAxH,IAAO,IAAIhB,EAAM;AAAA,MACpB,IAAIA,EAAM,cAAc,GAAG,CAAC;AAAA,MAC5B,IAAIA,EAAM,eAAe;AAAA,QAAA,cACtBa;AAAAA,QAAA,gBACAC;AAAAA,QACA,aAAa;AAAA,QACb,UAAU;AAAA,UACP,WAAW,EAAE,OAAO6H,EAAQ;AAAA,UAC5B,qBAAqB;AAAA,YAClB,OAAO,IAAI3I,EAAM,QAAQ,GAAG,CAAC;AAAA,UAChC;AAAA,UACA,cAAc,EAAE,OAAO,IAAIA,EAAM,QAAQ,GAAG,CAAC,EAAE;AAAA,UAC/C,gBAAgB;AAAA,YACb,OAAO6C,EAAO,YAAa2F,CAAC,IAAI3F,EAAO,YAAa2F,CAAC,IAAI;AAAA,UAC5D;AAAA,QACH;AAAA,MAAA,CACF;AAAA,IAAA;AAEJ,IAAAlI,EAAM,IAAIU,CAAI;AAAA,EAAA,CAChB;AACJ,GCpDa+S,KAAyB,MAAM;AACnC,QAAAC,IAA0BjS,EAA+B,CAAA,CAAE,GAC3DkS,IAAqBlS,EAAyC,CAAA,CAAE;AA6C/D,SA3CqBM;AAAA,IACzB,CAAC;AAAA,MACE,mBAAA6R;AAAA,MACA,uBAAAC;AAAA,MACA,QAAAtR;AAAA,IAAA,MAKG;AACC,MAAAmR,EAAwB,QAAQ,SAAS,KAC1CA,EAAwB,QAAQ,QAAQ,CAACI,GAAU5L,MAAM;AACtD,QAAA4L,EAAS,UAAUH,EAAmB,QAAQzL,CAAC,CAAE;AAAA,MAAA,CACnD,GAGJyL,EAAmB,UAAU,IAC7BD,EAAwB,UAAU;AAE5B,YAAAK,IAAS,IAAI,MAAMxR,EAAO,IAAK,MAAM,EAAE,KAAK,EAAK;AACrC,MAAAqR,EAAA,UAAU,CAAC,GAAGG,CAAM,GAChBF,EAAA,UAAU,CAAC,GAAGE,CAAM,GAE1CxR,EAAO,IAAK,QAAQ,CAACyR,GAAK9L,MAAM;AACvB,cAAA+L,IAAW,CAACC,MAAyC;AAChD,UAAAA,EAAA,QAAQ,CAACC,MAAU;AACxB,YAAA5R,EAAO,YAAa2F,CAAC,KAAK3F,EAAO,YAAa2F,CAAC,EAAEiM,CAAK,GAEpCP,EAAA,QAAQ1L,CAAC,IAAIiM,EAAM;AAAA,UAAA,CACvC;AAAA,QAAA,GAEEL,IAAW,IAAI,qBAAqBG,GAAU;AAAA,UACjD,YAAY;AAAA,UACZ,WAAW;AAAA,QAAA,CACb;AACD,QAAAH,EAAS,QAAQE,CAAI,GACGN,EAAA,QAAQ,KAAKI,CAAQ,GAC1BH,EAAA,QAAQ,KAAKK,CAAI;AAAA,MAAA,CACtC;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EAAA;AAIP,GC5BaI,KAAmB,MAA8B;AACrD,QAAAC,IAAW5S,EAAkB,CAAA,CAAE,GAE/B6S,IAAgCvS;AAAA,IACnC,CAAC,EAAE,QAAAQ,GAAQ,MAAAlD,GAAM,eAAAkV,GAAe,OAAAvU,GAAO,mBAAA4T,QAAwB;AAE5D,MAAI5T,EAAM,SAAS,WAAWqU,EAAS,QAAS,WAC7CA,EAAS,UAAU,IAAI,MAAMrU,EAAM,SAAS,MAAM,IAGrDA,EAAM,SAAS,QAAQ,CAACU,GAAMwH,MAAM;;AAC3B,cAAAsM,IAAajS,EAAO,IAAK2F,CAAC;AAChC,YAAI,CAACsM;AACF;AAIG,cAAAC,IAAOD,EAAW;AAWpB,YAVKH,EAAA,QAAQnM,CAAC,IAAIuM,GAGtB/T,EAAK,MAAM,IAAI+T,EAAK,OAAOA,EAAK,QAAQ,CAAG,GAC3C/T,EAAK,SAAS;AAAA,UACX+T,EAAK,OAAOA,EAAK,QAAQ,MAAMpV,EAAK,QAAQ;AAAA,UAC5C,CAACoV,EAAK,MAAMA,EAAK,SAAS,MAAMpV,EAAK,SAAS;AAAA,UAC9C;AAAA,QAAA,GAGCuU,EAAkB,QAAQ1L,CAAC,MACxB3F,EAAO,SAAU2F,CAAC,KACnBxH,EAAK,SAAS,KAAK6B,EAAO,SAAU2F,CAAC,CAAC,GAGrCxH,aAAgBhB,EAAM,OAAM;AAC7B,gBAAME,IAA8Bc,EAAK;AACzC,UAAAf,EAAWC,GAAU,aAAa2C,EAAO,QAAS2F,CAAC,CAAC,GACpDvI,EAAWC,GAAU,uBAAuB;AAAA,cACzC8J,KAAAzF,KAAAP,IAAAnB,EAAO,QAAS2F,CAAC,MAAjB,gBAAAxE,EAAoB,WAApB,gBAAAO,EAA4B,SAA5B,gBAAAyF,EAAkC,UAAS;AAAA,cAC3CE,KAAAC,KAAAJ,IAAAlH,EAAO,QAAS2F,CAAC,MAAjB,gBAAAuB,EAAoB,WAApB,gBAAAI,EAA4B,SAA5B,gBAAAD,EAAkC,WAAU;AAAA,UAAA,CAC9C,GACDjK;AAAA,YACGC;AAAA,YACA;AAAA,YACA2U,EAAc,QAAQ,IAAIE,EAAK,OAAOA,EAAK,MAAM;AAAA,UAAA,GAEpD9U;AAAA,YACGC;AAAA,YACA;AAAA,YACA2C,EAAO,YAAa2F,CAAC,IAAI3F,EAAO,YAAa2F,CAAC,IAAI;AAAA,UAAA;AAAA,QAExD;AAAA,MACH,CACF;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EAAA;AAGG,SAAA,CAACmM,EAAS,SAASC,CAAc;AAC3C,GC1EaI,KAAoB,MAAM;AAC9B,QAAAd,IAAoBnS,EAAkB,CAAA,CAAE,GACxCoS,IAAwBpS,EAAkB,CAAA,CAAE,GAE5CkT,IAAiC5S,EAAY,CAACkI,GAAO2K,IAAO,OAAU;AACzE,IAAAhB,EAAkB,QAAQ,QAAQ,CAAC9T,GAAOoI,MAAM;AAC7C,MAAIpI,MACqB+T,EAAA,QAAQ3L,CAAC,IAAI;AAAA,IACtC,CACF;AACK,UAAAvE,IAAOiR,IACR,CAAC,GAAGf,EAAsB,OAAO,IACjC,CAAC,GAAGD,EAAkB,OAAO;AAClC,WAAO3J,IAAQ,IAAItG,IAAOA,EAAKsG,CAAK;AAAA,EACvC,GAAG,CAAE,CAAA;AAEE,SAAA;AAAA,IACJ,mBAAA2J;AAAA,IACA,uBAAAC;AAAA,IACA,gBAAAc;AAAA,EAAA;AAEN,GCnBaE,KAAmB,CAC7BjB,MAEmB,CAAC,EAAE,QAAAkB,GAAQ,UAAAC,QAAgC;AACrD,QAAAC,IAASvT,EAAgB,EAAK;AACpC,EAAApB,EAAU,MAAM;AACT,QAAA4U;AACJ,UAAMC,IAAqB,MAAM;AAC9B,MAAItB,EAAkB,QAAQ,KAAK,CAACuB,MAASA,CAAI,IACzCH,EAAO,YACTF,KAAUA,EAAO,GACjBE,EAAO,UAAU,MAGhBA,EAAO,YACRD,KAAYA,EAAS,GACrBC,EAAO,UAAU,KAGvBC,IAAK,sBAAsBC,CAAkB;AAAA,IAAA;AAEhD,WAAAD,IAAK,sBAAsBC,CAAkB,GACtC,MAAM;AACV,2BAAqBD,CAAE;AAAA,IAAA;AAAA,EAC1B,GACA,CAACH,GAAQC,CAAQ,CAAC;AAAA,GCgBdK,KAAoC;AAAA,EAC9C,SAAS,CAAC;AAAA,EACV,KAAK,CAAC;AAAA,EACN,aAAa,CAAC;AAAA,EACd,UAAU,CAAC;AAAA,EACX,aAAa,CAAC;AACjB,GAMaC,KAAe,CACzB,EAAE,MAAAhW,GAAM,KAAAC,GAAK,SAAA+D,GAAS,cAAAD,EAAa,GACnCkS,IAAqC,OACY;AAC3C,QAAAjR,IAAOH,EAAO5E,CAAG,GAEjBU,IAAQP,EAAQ,MAAM,IAAIC,EAAM,MAAM,GAAG,CAAA,CAAE,GAC3CsD,IAAS9B,EAAU7B,CAAI,GACvB,CAACmE,GAAcI,CAAkB,IAAIT,EAAa;AAAA,IACrD,OAAAnD;AAAA,IACA,QAAAgD;AAAA,IACA,MAAA3D;AAAA,IACA,KAAKgF,EAAK;AAAA,IACV,SAAAhB;AAAA,IACA,cAAAD;AAAA,EAAA,CACF,GACK,CAACb,GAAQE,CAAS,IAAIH,EAA2B;AAAA,IACpD,GAAG8S;AAAA,IACH,WAAW,YAAY,IAAI;AAAA,EAAA,CAC7B,GAEK,CAACG,GAAUjB,CAAc,IAAIF,GAAiB,GAG9CG,IAAgB9S,EAAsB,IAAI/B,EAAM,QAAQ,GAAG,CAAC,CAAC,GAG7D,CAAC8V,GAAgBC,CAAiB,IAAIC,GAAS,EAAI;AACzD,EAAAjW;AAAA,IACG,MAAMgW,EAAkB,EAAI;AAAA;AAAA,IAE5BH;AAAA,EAAA;AAIG,QAAAK,IAAYlU,EAAmB,IAAI,GACnCmU,IAAenW,EAAQ,MAAM,IAAIC,EAAM,QAAQ,GAAG,CAAA,CAAE,GAGpDmW,IAAsBpC,MACtB,EAAE,uBAAAI,GAAuB,mBAAAD,GAAmB,gBAAAe,MAC/CD,GAAkB,GAGfoB,IAAajB,GAAiBjB,CAAiB;AA4D9C,SAAA;AAAA,IA1DU7R;AAAA,MACd,CAACyC,GAAkB9B,MAAmC;AACnD,cAAM,EAAE,IAAAI,GAAI,MAAAzD,EAAAA,IAASmF;AAIjB,YAFJ9B,KAAgBD,EAAUC,CAAY,GAElC0Q,GAAa7Q,CAAM;AACb,iBAAAqT;AAGV,YAAIJ,GAAgB;AACb,cAAAG,EAAU,YAAYpT,EAAO;AACvB,mBAAAqT;AAEP,UAAAD,EAAU,UAAUpT,EAAO;AAAA,QAEjC;AAEA,eAAIiT,MACUjC,GAAA;AAAA,UACR,QAAAhR;AAAA,UACA,MAAAlD;AAAAA,UACA,OAAAW;AAAA,QAAA,CACF,GAEmB6V,EAAA;AAAA,UACjB,mBAAAjC;AAAA,UACA,uBAAAC;AAAA,UACA,QAAAtR;AAAA,QAAA,CACF,GAEDkT,EAAkB,EAAK,IAGXnB,EAAA;AAAA,UACZ,QAAA/R;AAAA,UACA,MAAAlD;AAAAA,UACA,eAAAkV;AAAA,UACA,OAAAvU;AAAA,UACA,mBAAA4T;AAAA,QAAA,CACF,GAEMhQ,EAAmBd,CAAE;AAAA,MAC/B;AAAA,MACA;AAAA,QACGc;AAAA,QACAnB;AAAA,QACAoT;AAAA,QACAvB;AAAA,QACAkB;AAAA,QACAxV;AAAA,QACAuC;AAAA,QACAsR;AAAA,QACAD;AAAA,QACAgC;AAAA,MACH;AAAA,IAAA;AAAA,IAKAnT;AAAA,IACA;AAAA,MACG,OAAAzC;AAAA,MACA,QAAAgD;AAAA,MACA,cAAAQ;AAAA,MACA,QAAQA,EAAa;AAAA,MACrB,gBAAAmR;AAAA,MACA,UAAAY;AAAA,MACA,eAAe3B,EAAkB;AAAA,MACjC,YAAAkC;AAAA,IACH;AAAA,EAAA;AAEN,GC/JaC,KAAiB,CAC3B;AAAA,EACG,OAAA/V;AAAA,EACA,QAAAgD;AAAA,EACA,MAAA3D;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,cAAA8D,IAAe;AAAA,EACf,SAAAC,IAAU;AAAA,EACV,aAAAC,IAAc;AAAA,EACd,cAAAC,IAAe;AAClB,GACAyS,MACwB;AAClB,QAAAC,IAAkBxU,EAAkC,CAAA,CAAE,GACtDhB,IAAarB,EAAcC,GAAMC,CAAG;AAE1B,EAAA2W,EAAA,UAAUxW,EAAQ,MACxB,MAAM,KAAK,EAAE,QAAAuW,KAAU,MAAM;AAC3B,UAAAvS,IAAS,IAAI/D,EAAM;AAAA,MACtBe,EAAW;AAAA,MACXA,EAAW;AAAA,MACX;AAAA,QACG,GAAGmC;AAAA,QACH,SAAAS;AAAA,QACA,aAAAC;AAAA,MACH;AAAA,IAAA;AAEH,WAAIC,MACME,EAAA,eAAe,IAAI/D,EAAM;AAAA,MAC7Be,EAAW;AAAA,MACXA,EAAW;AAAA,MACXf,EAAM;AAAA,IAAA,IAGL+D;AAAA,EAAA,CACT,GAED,CAACuS,CAAM,CAAC,GAEP5S,KACD6S,EAAgB,QAAQ;AAAA,IAAQ,CAAClT,MAC9BA,EAAI,QAAQtC,EAAW,GAAGA,EAAW,CAAC;AAAA,EAAA,GAI5CJ,EAAU,MAAM;AACb,UAAMsD,IAAOsS,EAAgB;AAC7B,WAAO,MAAM;AACV,MAAAtS,EAAK,QAAQ,CAACZ,MAAQA,EAAI,QAAS,CAAA;AAAA,IAAA;AAAA,EACtC,GACA,CAACiT,CAAM,CAAC;AAEX,QAAME,IAAwCnU;AAAA,IAC3C,CAACe,GAAImH,GAAOhH,MAAmB;AACtB,YAAAF,IAAMkT,EAAgB,QAAQhM,CAAK;AAC/B,aAAApH,GAAA;AAAA,QACP,IAAAC;AAAA,QACA,OAAA9C;AAAA,QACA,QAAAgD;AAAA,QACA,KAAAD;AAAA,QACA,gBAAgB,MACbE,KAAkBA,EAAe,EAAE,MAAMF,EAAI,SAAS;AAAA,MAAA,CAC3D,GACMA,EAAI;AAAA,IACd;AAAA,IACA,CAAC/C,GAAOgD,CAAM;AAAA,EAAA;AAGV,SAAA,CAACiT,EAAgB,SAASC,CAAiB;AACrD;","x_google_ignoreList":[111]} \ No newline at end of file +{"version":3,"file":"use-shader-fx.js","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/setUniforms.ts","../src/utils/useAddObject.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/misc/useBlank/shader/main.vert","../src/fxs/misc/useBlank/shader/main.frag","../src/fxs/misc/useBlank/useMesh.ts","../src/fxs/misc/useBlank/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/libs/shaders/getWobble.glsl","../src/libs/constants.ts","../src/fxs/3D/useMorphParticles/utils/rewriteVertexShader.ts","../src/fxs/3D/useMorphParticles/utils/modifyAttributes.ts","../src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts","../src/fxs/3D/useMorphParticles/utils/useMaterial.ts","../src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts","../src/fxs/3D/useMorphParticles/index.ts","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/libs/shaders/snoise.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/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 uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\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\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\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","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\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n // By design, I don't want to pass null to uniform\n if (material.uniforms[key] && value !== null) {\n material.uniforms[key].value = value;\n }\n };\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { 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.Vector3 | THREE.Color };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\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(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = 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(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\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\n ? prevPointer.current.clone()\n : 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 [lerp]\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 { useCallback, useEffect, useMemo, useRef } 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 : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `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 if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\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 { useCallback, useEffect, useMemo, useRef } 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 if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\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 { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\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 , 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 color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n updateValue(\"uIsTexture\", true);\n updateValue(\"uTexture\", params.texture!);\n } else {\n updateValue(\"uIsTexture\", false);\n }\n\n if (params.map!) {\n updateValue(\"uIsMap\", true);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n } else {\n updateValue(\"uIsMap\", false);\n }\n\n updateValue(\"uRadius\", params.radius!);\n updateValue(\"uSmudge\", params.smudge!);\n updateValue(\"uDissipation\", params.dissipation!);\n updateValue(\"uMotionBlur\", params.motionBlur!);\n updateValue(\"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateValue(\"uMouse\", pointerValues.currentPointer);\n updateValue(\"uPrevMouse\", pointerValues.prevPointer);\n }\n updateValue(\"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n updateValue(\"uColor\", color);\n\n updateValue(\"uIsCursor\", params.isCursor!);\n\n // pressure\n updateValue(\"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n updateValue(\"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBuffer\", read);\n });\n },\n [updateValue, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.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\";\nimport { MaterialProps } from \"../../../types\";\n\nexport const useInitialMaterial = ({ onBeforeCompile }: MaterialProps) => {\n const initialMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 onBeforeCompile,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplatMaterial = ({ onBeforeCompile }: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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, useSplatMaterial } from \"./materials/useSplatMaterial\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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};\n\nexport type FluidOnBeforeCompile = {\n initial?: MaterialProps;\n curl?: MaterialProps;\n vorticity?: MaterialProps;\n advection?: MaterialProps;\n divergence?: MaterialProps;\n pressure?: MaterialProps;\n clear?: MaterialProps;\n gradientSubtract?: MaterialProps;\n splat?: MaterialProps;\n};\n\nconst useCustomMaterial = (\n materialHook: ({ onBeforeCompile }: MaterialProps) => T,\n onBeforeCompileObj?: MaterialProps\n) => {\n const onBeforeCompile = onBeforeCompileObj?.onBeforeCompile;\n return materialHook({\n onBeforeCompile,\n });\n};\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n fluidOnBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n fluidOnBeforeCompile?: FluidOnBeforeCompile;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n\n const {\n initial,\n curl,\n vorticity,\n advection,\n divergence,\n pressure,\n clear,\n gradientSubtract,\n splat,\n } = fluidOnBeforeCompile ?? {};\n\n const initialMaterial = useCustomMaterial(useInitialMaterial, initial);\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCustomMaterial(useCurlMaterial, curl);\n const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity);\n const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection);\n const divergenceMaterial = useCustomMaterial(\n useDivergenceMaterial,\n divergence\n );\n const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure);\n const clearMaterial = useCustomMaterial(useClearMaterial, clear);\n const gradientSubtractMaterial = useCustomMaterial(\n useGradientSubtractMaterial,\n gradientSubtract\n );\n const splatMaterial = useCustomMaterial(useSplatMaterial, splat);\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 useMemo(() => {\n setUniform(materials.splatMaterial)(\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(material)(\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\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, mesh };\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, FluidOnBeforeCompile, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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 = Object.freeze({\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 pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n fluidOnBeforeCompile,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n },\n },\n\t * ```\n\t*/\n fluidOnBeforeCompile?: FluidOnBeforeCompile;\n} & HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n fluidOnBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\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 updateAdvection = setUniform(materials.advectionMaterial);\n const updateSplat = setUniform(materials.splatMaterial);\n const updateCurl = setUniform(materials.curlMaterial);\n const updateVorticity = setUniform(materials.vorticityMaterial);\n const updateDivergence = setUniform(materials.divergenceMaterial);\n const updateClear = setUniform(materials.clearMaterial);\n const updatePressure = setUniform(materials.pressureMaterial);\n const updateGradientSubtract = setUniform(\n materials.gradientSubtractMaterial\n );\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 updateAdvection(\"uVelocity\", read);\n updateAdvection(\"uSource\", read);\n updateAdvection(\"dt\", dt);\n updateAdvection(\"dissipation\", params.velocity_dissipation!);\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateAdvection(\"uVelocity\", velocityTex);\n updateAdvection(\"uSource\", read);\n updateAdvection(\"dissipation\", params.density_dissipation!);\n });\n\n // update splatting\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateSplat(\"uTarget\", read);\n updateSplat(\"point\", pointerValues.currentPointer);\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n updateSplat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateSplat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateSplat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n updateSplat(\"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n updateCurl(\"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n updateVorticity(\"uVelocity\", read);\n updateVorticity(\"uCurl\", curlTex);\n updateVorticity(\"curl\", params.curl_strength!);\n updateVorticity(\"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n updateDivergence(\"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n updateClear(\"uTexture\", read);\n updateClear(\"value\", params.pressure_dissipation!);\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n updatePressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n updatePressure(\"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n updateGradientSubtract(\"uPressure\", pressureTexTemp);\n updateGradientSubtract(\"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n updateAdvection,\n updateClear,\n updateCurl,\n updateDivergence,\n updateGradientSubtract,\n updatePressure,\n updateSplat,\n updateVorticity,\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 mesh: mesh,\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\";\nimport { MaterialProps } from \"../../types\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({\n scale,\n max,\n texture,\n scene,\n onBeforeCompile,\n}: UseMeshProps & MaterialProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(() => {\n const mat = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [texture, onBeforeCompile]);\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, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\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 = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.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;\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as NoiseMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"scale\", params.scale!);\n updateValue(\"timeStrength\", params.timeStrength!);\n updateValue(\"noiseOctaves\", params.noiseOctaves!);\n updateValue(\"fbmOctaves\", params.fbmOctaves!);\n updateValue(\"warpOctaves\", params.warpOctaves!);\n updateValue(\"warpDirection\", params.warpDirection!);\n updateValue(\"warpStrength\", params.warpStrength!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as ColorStrataMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\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 updateValue(\"uTexture\", params.texture);\n updateValue(\"isTexture\", true);\n } else {\n updateValue(\"isTexture\", false);\n updateValue(\"scale\", params.scale!);\n }\n\n if (params.noise) {\n updateValue(\"noise\", params.noise);\n updateValue(\"isNoise\", true);\n updateValue(\"noiseStrength\", params.noiseStrength!);\n } else {\n updateValue(\"isNoise\", false);\n }\n\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n updateValue(\"laminateLayer\", params.laminateLayer!);\n updateValue(\"laminateInterval\", params.laminateInterval!);\n updateValue(\"laminateDetail\", params.laminateDetail!);\n updateValue(\"distortion\", params.distortion!);\n updateValue(\"colorFactor\", params.colorFactor!);\n updateValue(\"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as MarbleMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n updateValue(\"u_pattern\", params.pattern!);\n updateValue(\"u_complexity\", params.complexity!);\n updateValue(\"u_complexityAttenuation\", params.complexityAttenuation!);\n updateValue(\"u_iterations\", params.iterations!);\n updateValue(\"u_timeStrength\", params.timeStrength!);\n updateValue(\"u_scale\", params.scale!);\n\n updateValue(\"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as CosPaletteMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CosPaletteParams = {\n /** color1, default : `rgb(50%, 50%, 50%)` */\n color1?: THREE.Color;\n /** color2, default : `rgb(50%, 50%, 50%)` */\n color2?: THREE.Color;\n /** color3, default : `rgb(100%, 100%, 100%)` */\n color3?: THREE.Color;\n /** color4, default : `rgb(0%, 10%, 20%)` */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default : `THREE.Vector3(1.0,0.0,0.0)` */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = Object.freeze({\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor1\", params.color1!);\n updateValue(\"uColor2\", params.color2!);\n updateValue(\"uColor3\", params.color3!);\n updateValue(\"uColor4\", params.color4!);\n updateValue(\"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as DuoToneMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor0\", params.color0!);\n updateValue(\"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as BlendingMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_map\", params.map!);\n updateValue(\"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n updateValue(\"u_alphaMap\", params.alphaMap!);\n updateValue(\"u_isAlphaMap\", true);\n } else {\n updateValue(\"u_isAlphaMap\", false);\n }\n\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n if (params.dodgeColor) {\n updateValue(\"u_dodgeColor\", params.dodgeColor);\n updateValue(\"u_isDodgeColor\", true);\n } else {\n updateValue(\"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class FxTextureMaterial 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 onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** 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 , 0 ~ 1 , default : `0` */\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 mesh: THREE.Mesh;\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 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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture0\", params.texture0!);\n updateValue(\"uTexture1\", params.texture1!);\n\n updateValue(\"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n updateValue(\"uTextureResolution\", interpolatedResolution);\n\n updateValue(\"padding\", params.padding!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"mapIntensity\", params.mapIntensity!);\n updateValue(\"edgeIntensity\", params.edgeIntensity!);\n updateValue(\"epicenter\", params.epicenter!);\n updateValue(\"dirX\", params.dir!.x);\n updateValue(\"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as BrightnessPickerMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as FxBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_map\", params.map!);\n updateValue(\"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as AlphaBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type AlphaBlendingParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** alpha map , default : `THREE.Texture()` */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, onBeforeCompile });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as HSVMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type HSVParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** default : `1` */\n brightness?: number;\n /** default : `1` */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, onBeforeCompile });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\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\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying 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;\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\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n updateValue(\"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 updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying 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;\nuniform sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: MOTIONBLUR_PARAMS.texture },\n uBackbuffer: { value: new THREE.Texture() },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MotionBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uBegin\", params.begin!);\n updateValue(\"uEnd\", params.end!);\n updateValue(\"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as WaveMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\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/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uEpicenter\", params.epicenter!);\n updateValue(\"uProgress\", params.progress!);\n updateValue(\"uWidth\", params.width!);\n updateValue(\"uStrength\", params.strength!);\n updateValue(\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, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default : `THREE.Texture` */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: `THREE.Color(0x00ff00)` */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default : `0.2` */\n similarity?: number;\n /** smoothness , default : `0.1` */\n smoothness?: number;\n /** spill , default : `0.2` */\n spill?: number;\n /** tone correction , default : `THREE.Vector4(1.0, 1.0, 1.0, 1.0)` */\n color?: THREE.Vector4;\n /** contrast , default : `1.0` */\n contrast?: number;\n /** brightness , default : `0.0` */\n brightness?: number;\n /** gamma correction , default : `1.0` */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = Object.freeze({\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_keyColor\", params.keyColor!);\n updateValue(\"u_similarity\", params.similarity!);\n updateValue(\"u_smoothness\", params.smoothness!);\n updateValue(\"u_spill\", params.spill!);\n updateValue(\"u_color\", params.color!);\n updateValue(\"u_contrast\", params.contrast!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying vec2 vUv;\n//#usf varyings\n\n//#usf uniforms\n\nvoid main() {\n\tvec4 usf_Position = vec4(position,1.);\n\tvUv = uv;\n\n\t//#usf main\n\t\n\tgl_Position = usf_Position;\n}","precision highp float;\n\nvarying vec2 vUv;\n//#usf varyings\n\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec2 uResolution;\n\n//#usf uniforms\n\nvoid main() {\n\tvec4 usf_FragColor = vec4(1.);\n\n\t//#usf main\n\t\n\tgl_FragColor = usf_FragColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { BLANK_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform, useResolution } from \"../../..\";\n\nexport class BlankMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uTime: { value: number };\n uPointer: { value: THREE.Vector2 };\n uResolution: { value: THREE.Vector2 };\n };\n}\n\nexport type CustomUniforms = {\n uniforms?: {\n [uniform: string]: THREE.IUniform;\n };\n};\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n uniforms,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps &\n CustomUniforms) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: BLANK_PARAMS.texture },\n uBackbuffer: { value: new THREE.Texture() },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, CustomUniforms, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type BlankParams = {\n /** texture, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type BlankObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh<\n THREE.BufferGeometry,\n BlankMaterial\n >;\n material: BlankMaterial;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLANK_PARAMS: BlankParams = Object.freeze({\n texture: new THREE.Texture(),\n beat: false,\n});\n\n/**\n * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`.\n * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms.\n *\n * ※ `usf_FragColor` overrides `gl_FragColor`\n *\n * ※ `usf_Position` overrides `gl_Position`\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlank = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n uniforms,\n}: HooksProps & CustomUniforms): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n uniforms,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlankParams) => {\n const { gl, clock, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uPointer\", pointer);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\n\nfloat random3D(vec3 co) {\n return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453);\n}\n\nvoid main() {\n\tvec3 newPosition = position;\n\tvec2 newUv = uv;\n\t#usf \n\t#usf \n\n\t// displacement for `newPosition`\n\tvec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0);\n\tfloat displacementIntensity = smoothstep(0., 1., displacement.g);\n\tvDisplacementColor = displacement;\n\tvDisplacementIntensity = displacementIntensity;\n\n\t// At this point displacement is 0 ~ 1, so normalize it to -1 ~ 1\n\tdisplacement = displacement * 2.-1.;\n\tdisplacement *= displacementIntensity * uDisplacementIntensity;\n\tnewPosition += displacement;\n\n\t// divergence\n\tvec3 divergenceDir = newPosition - uDivergencePoint;\n\tif (uDivergence > 0.0) {\n\t\tnewPosition += normalize(divergenceDir) * uDivergence;\n\t} else if (uDivergence < 0.0) {\n\t\tnewPosition -= normalize(divergenceDir) * abs(uDivergence);\n\t}\n\n\t// Final position\n\tvec4 modelPosition = modelMatrix * vec4(newPosition, 1.0);\n\tvec4 viewPosition = viewMatrix * modelPosition;\n\tvec4 projectedPosition = projectionMatrix * viewPosition;\n\n\t// wobble ※Do not calculate noise if uWobbleStrength is 0\n\tfloat wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0;\n\n\tgl_Position = projectedPosition += wobble;\n\t\n\t// If picture is true then display picture, otherwise 4 color linear interpolation\n\tvColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z);\n\n\t// Set Alpha on picture's g channel\n\tvPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.;\n\n\t// Multiply the point size by picturAalpha. The size can also be adjusted with alphaMap.\n\t// If uSizeRandomTimeFrequency is greater than 0, the size will be randomly changed\n\tfloat sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.;\n\tgl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand;\n\tgl_PointSize *= (1.0 / - viewPosition.z);\n\n\t// mapArrayIndex\n\tvMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.;\n}","precision highp float;\nprecision highp int;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\nuniform float uBlurAlpha;\nuniform float uBlurRadius;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform sampler2D uAlphaMap;\nuniform bool uIsAlphaMap;\nuniform float uDisplacementColorIntensity;\nuniform float uPointAlpha;\n\n#usf \n\nvoid main() { \n\tvec2 uv = gl_PointCoord;\n\tuv.y = 1.0 - uv.y;\n \n\t// make it a circle\n\tfloat distanceToCenter = length(uv - .5);\n\tfloat alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.);\n\n\t// Map if there is a map\t\n\tvec4 mapArrayColor;\n\t#usf \n\tvec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.);\n\tvec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor;\n\n\t// Mix with finalColor if displacement is true\n\tfloat mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.);\n\tfinalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor;\n\n\t// get alpha map\n\tfloat alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.;\n\n\tgl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha);\n}\n","//\tSimplex 4D Noise \n//\tby Ian McEwan, Ashima Arts\n//\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\nfloat permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\nfloat taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;}\n\nvec4 grad4(float j, vec4 ip)\n{\n\tconst vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\n\tvec4 p,s;\n\n\tp.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\n\tp.w = 1.5 - dot(abs(p.xyz), ones.xyz);\n\ts = vec4(lessThan(p, vec4(0.0)));\n\tp.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; \n\n\treturn p;\n}\n\nfloat simplexNoise4d(vec4 v)\n{\n\tconst vec2 C = vec2( 0.138196601125010504, // (5 - sqrt(5))/20 G4\n\t\t\t\t\t\t\t\t\t0.309016994374947451); // (sqrt(5) - 1)/4 F4\n\t// First corner\n\tvec4 i = floor(v + dot(v, C.yyyy) );\n\tvec4 x0 = v - i + dot(i, C.xxxx);\n\n\t// Other corners\n\n\t// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n\tvec4 i0;\n\n\tvec3 isX = step( x0.yzw, x0.xxx );\n\tvec3 isYZ = step( x0.zww, x0.yyz );\n\t// i0.x = dot( isX, vec3( 1.0 ) );\n\ti0.x = isX.x + isX.y + isX.z;\n\ti0.yzw = 1.0 - isX;\n\n\t// i0.y += dot( isYZ.xy, vec2( 1.0 ) );\n\ti0.y += isYZ.x + isYZ.y;\n\ti0.zw += 1.0 - isYZ.xy;\n\n\ti0.z += isYZ.z;\n\ti0.w += 1.0 - isYZ.z;\n\n\t// i0 now contains the unique values 0,1,2,3 in each channel\n\tvec4 i3 = clamp( i0, 0.0, 1.0 );\n\tvec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\n\tvec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\n\n\t// x0 = x0 - 0.0 + 0.0 * C \n\tvec4 x1 = x0 - i1 + 1.0 * C.xxxx;\n\tvec4 x2 = x0 - i2 + 2.0 * C.xxxx;\n\tvec4 x3 = x0 - i3 + 3.0 * C.xxxx;\n\tvec4 x4 = x0 - 1.0 + 4.0 * C.xxxx;\n\n\t// Permutations\n\ti = mod(i, 289.0); \n\tfloat j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\n\tvec4 j1 = permute( permute( permute( permute (\n\t\t\t\t\ti.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\n\t\t\t\t+ i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\n\t\t\t\t+ i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\n\t\t\t\t+ i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\n\t// Gradients\n\t// ( 7*7*6 points uniformly over a cube, mapped onto a 4-octahedron.)\n\t// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n\n\tvec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\n\n\tvec4 p0 = grad4(j0, ip);\n\tvec4 p1 = grad4(j1.x, ip);\n\tvec4 p2 = grad4(j1.y, ip);\n\tvec4 p3 = grad4(j1.z, ip);\n\tvec4 p4 = grad4(j1.w, ip);\n\n\t// Normalise gradients\n\tvec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\tp4 *= taylorInvSqrt(dot(p4,p4));\n\n\t// Mix contributions from the five corners\n\tvec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\n\tvec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0);\n\tm0 = m0 * m0;\n\tm1 = m1 * m1;\n\treturn 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\n\t\t\t\t\t\t+ dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\n\n}\n\nfloat getWobble(vec3 position)\n{\n\tvec3 warpedPosition = position;\n\twarpedPosition += simplexNoise4d(\n\t\tvec4(\n\t\t\t\tposition * uWarpPositionFrequency,\n\t\t\t\tuTime * uWarpTimeFrequency\n\t\t)\n\t) * uWarpStrength;\n\n\treturn simplexNoise4d(vec4(\n\t\twarpedPosition * uWobblePositionFrequency, // XYZ\n\t\tuTime * uWobbleTimeFrequency // W\n\t)) * uWobbleStrength;\n}","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport getWobble from \"../../../../libs/shaders/getWobble.glsl\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport { ISDEV } from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\nimport { MaterialProps } from \"../../../types\";\n\nexport class MorphParticlesMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uMorphProgress: { value: number };\n uBlurAlpha: { value: number };\n uBlurRadius: { value: number };\n uPointSize: { value: number };\n uPointAlpha: { value: number };\n uPicture: { value: THREE.Texture };\n uIsPicture: { value: boolean };\n uAlphaPicture: { value: THREE.Texture };\n uIsAlphaPicture: { value: boolean };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uAlphaMap: { value: THREE.Texture };\n uIsAlphaMap: { value: boolean };\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uDisplacement: { value: THREE.Texture };\n uIsDisplacement: { value: boolean };\n uDisplacementIntensity: { value: number };\n uDisplacementColorIntensity: { value: number };\n uSizeRandomIntensity: { value: number };\n uSizeRandomTimeFrequency: { value: number };\n uSizeRandomMin: { value: number };\n uSizeRandomMax: { value: number };\n uDivergence: { value: number };\n uDivergencePoint: { value: THREE.Vector3 };\n };\n}\n\nexport const useMaterial = ({\n size,\n dpr,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n ).replace(`#usf `, getWobble);\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n depthTest: false,\n depthWrite: false,\n transparent: true,\n blending: THREE.AdditiveBlending,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: new THREE.Texture() },\n uIsPicture: { value: false },\n uAlphaPicture: { value: new THREE.Texture() },\n uIsAlphaPicture: { value: false },\n uColor0: { value: MORPHPARTICLES_PARAMS.color0 },\n uColor1: { value: MORPHPARTICLES_PARAMS.color1 },\n uColor2: { value: MORPHPARTICLES_PARAMS.color2 },\n uColor3: { value: MORPHPARTICLES_PARAMS.color3 },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uAlphaMap: { value: new THREE.Texture() },\n uIsAlphaMap: { value: false },\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: MORPHPARTICLES_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: new THREE.Texture() },\n uIsDisplacement: { value: false },\n uDisplacementIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementIntensity,\n },\n uDisplacementColorIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementColorIntensity,\n },\n uSizeRandomIntensity: {\n value: MORPHPARTICLES_PARAMS.sizeRandomIntensity,\n },\n uSizeRandomTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.sizeRandomTimeFrequency,\n },\n uSizeRandomMin: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n },\n });\n\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n props: RootState | null,\n params?: MorphParticlesParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const updateUniform = useCallback(\n (props, params) => {\n if (props) {\n updateValue(\"uTime\", params?.beat || props.clock.getElapsedTime());\n }\n if (params === undefined) {\n return;\n }\n updateValue(\"uMorphProgress\", params.morphProgress);\n updateValue(\"uBlurAlpha\", params.blurAlpha);\n updateValue(\"uBlurRadius\", params.blurRadius);\n updateValue(\"uPointSize\", params.pointSize);\n updateValue(\"uPointAlpha\", params.pointAlpha);\n if (params.picture) {\n updateValue(\"uPicture\", params.picture);\n updateValue(\"uIsPicture\", true);\n } else if (params.picture === false) {\n updateValue(\"uIsPicture\", false);\n }\n if (params.alphaPicture) {\n updateValue(\"uAlphaPicture\", params.alphaPicture);\n updateValue(\"uIsAlphaPicture\", true);\n } else if (params.alphaPicture === false) {\n updateValue(\"uIsAlphaPicture\", false);\n }\n updateValue(\"uColor0\", params.color0);\n updateValue(\"uColor1\", params.color1);\n updateValue(\"uColor2\", params.color2);\n updateValue(\"uColor3\", params.color3);\n if (params.map) {\n updateValue(\"uMap\", params.map);\n updateValue(\"uIsMap\", true);\n } else if (params.map === false) {\n updateValue(\"uIsMap\", false);\n }\n if (params.alphaMap) {\n updateValue(\"uAlphaMap\", params.alphaMap);\n updateValue(\"uIsAlphaMap\", true);\n } else if (params.alphaMap === false) {\n updateValue(\"uIsAlphaMap\", false);\n }\n updateValue(\"uWobbleStrength\", params.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", params.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", params.warpStrength);\n updateValue(\"uWarpPositionFrequency\", params.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", params.warpTimeFrequency);\n if (params.displacement) {\n updateValue(\"uDisplacement\", params.displacement);\n updateValue(\"uIsDisplacement\", true);\n } else if (params.displacement === false) {\n updateValue(\"uIsDisplacement\", false);\n }\n updateValue(\"uDisplacementIntensity\", params.displacementIntensity);\n updateValue(\n \"uDisplacementColorIntensity\",\n params.displacementColorIntensity\n );\n updateValue(\"uSizeRandomIntensity\", params.sizeRandomIntensity);\n updateValue(\n \"uSizeRandomTimeFrequency\",\n params.sizeRandomTimeFrequency\n );\n updateValue(\"uSizeRandomMin\", params.sizeRandomMin);\n updateValue(\"uSizeRandomMax\", params.sizeRandomMax);\n updateValue(\"uDivergence\", params.divergence);\n updateValue(\"uDivergencePoint\", params.divergencePoint);\n },\n [updateValue]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n positions,\n uvs,\n onBeforeCompile,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({\n scene,\n size,\n dpr,\n geometry,\n positions,\n uvs,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MorphParticlesParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: MorphParticlesParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","// \n//\tby Nikita Miropolskiy\n\n/* discontinuous pseudorandom uniformly distributed in [-0.5, +0.5]^3 */\nvec3 random3(vec3 c) {\n\tfloat j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));\n\tvec3 r;\n\tr.z = fract(512.0*j);\n\tj *= .125;\n\tr.x = fract(512.0*j);\n\tj *= .125;\n\tr.y = fract(512.0*j);\n\treturn r-0.5;\n}\n\nconst float F3 = 0.3333333;\nconst float G3 = 0.1666667;\nfloat snoise(vec3 p) {\n\n\tvec3 s = floor(p + dot(p, vec3(F3)));\n\tvec3 x = p - s + dot(s, vec3(G3));\n\t\n\tvec3 e = step(vec3(0.0), x - x.yzx);\n\tvec3 i1 = e*(1.0 - e.zxy);\n\tvec3 i2 = 1.0 - e.zxy*(1.0 - e);\n \t\n\tvec3 x1 = x - i1 + G3;\n\tvec3 x2 = x - i2 + 2.0*G3;\n\tvec3 x3 = x - 1.0 + 3.0*G3;\n\t \n\tvec4 w, d;\n\t \n\tw.x = dot(x, x);\n\tw.y = dot(x1, x1);\n\tw.z = dot(x2, x2);\n\tw.w = dot(x3, x3);\n\t \n\tw = max(0.6 - w, 0.0);\n\t \n\td.x = dot(random3(s), x);\n\td.y = dot(random3(s + i1), x1);\n\td.z = dot(random3(s + i2), x2);\n\td.w = dot(random3(s + 1.0), x3);\n\t \n\tw *= w;\n\tw *= w;\n\td *= w;\n\t \n\treturn dot(d, vec4(52.0));\n}\n\nfloat snoiseFractal(vec3 m) {\n\treturn 0.5333333* snoise(m)\n\t\t\t\t+0.2666667* snoise(2.0*m)\n\t\t\t\t+0.1333333* snoise(4.0*m)\n\t\t\t\t+0.0666667* snoise(8.0*m);\n}","#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float _transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\t// Mipped Bicubic Texture Filtering by N8\n\t// https://www.shadertoy.com/view/Dl2SDW\n\n\tfloat w0( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w1( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\n\t}\n\n\tfloat w2( float a ){\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w3( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\n\t}\n\n\t// g0 and g1 are the two amplitude functions\n\tfloat g0( float a ) {\n\n\t\treturn w0( a ) + w1( a );\n\n\t}\n\n\tfloat g1( float a ) {\n\n\t\treturn w2( a ) + w3( a );\n\n\t}\n\n\t// h0 and h1 are the two offset functions\n\tfloat h0( float a ) {\n\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\n\t}\n\n\tfloat h1( float a ) {\n\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\n\t}\n\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\n\t\tuv = uv * texelSize.zw + 0.5;\n\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\n\t}\n\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\n\t}\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\n\t}\n\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( isinf( attenuationDistance ) ) {\n\n\t\t\t// Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.\n\t\t\treturn vec3( 1.0 );\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\t// As less light is transmitted, the opacity should be increased. This simple approximation does a decent job \n\t\t// of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color.\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\n\t}\n#endif","#ifdef USE_TRANSMISSION\n\nmaterial.transmission = _transmission;\nmaterial.transmissionAlpha = 1.0;\nmaterial.thickness = thickness;\nmaterial.attenuationDistance = attenuationDistance;\nmaterial.attenuationColor = attenuationColor;\n\n#ifdef USE_TRANSMISSIONMAP\n\n\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\n#endif\n\n#ifdef USE_THICKNESSMAP\n\n\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\n#endif\n\nvec3 pos = vWorldPosition;\n\nvec3 v = normalize( cameraPosition - pos );\nvec3 n = inverseTransformDirection( normal, viewMatrix );\n\nvec4 transmitted = getIBLVolumeRefraction(\n\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\tmaterial.attenuationColor, material.attenuationDistance );\n\nmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\n// Custom from here\nfloat runningSeed = 0.0;\nvec3 transmission = vec3(0.0);\nfloat transmissionR, transmissionB, transmissionG;\nfloat randomCoords = rand(runningSeed++);\nfloat thickness_smear = thickness * max(pow(roughnessFactor, 0.33), uAnisotropicBlur);\nvec3 distortionNormal = vec3(0.0);\nvec3 temporalOffset = vec3(uTime, -uTime, -uTime) * uTemporalDistortion;\n\nif (uDistortion > 0.0) {\n\tdistortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset)));\n}\n\nfor (float i = 0.0; i < uSamples; i ++) {\n\tvec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5)) * pow(rand(runningSeed++), 0.33) + distortionNormal);\n\t\n\ttransmissionR = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).r;\n\ttransmissionG = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uSamples) , material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).g;\n\ttransmissionB = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uSamples), material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport getWobble from \"../../../libs/shaders/getWobble.glsl\";\nimport snoise from \"../../../libs/shaders/snoise.glsl\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\n\nexport class Wobble3DMaterial extends THREE.Material {\n uniforms!: {\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uWobbleShine: { value: number };\n uIsWobbleMap: { value: boolean };\n uWobbleMap: { value: THREE.Texture };\n uWobbleMapStrength: { value: number };\n uWobbleMapDistortion: { value: number };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uSamples: { value: number };\n };\n}\n\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tuniform bool uIsWobbleMap;\n\t\tuniform sampler2D uWobbleMap;\n\t\tuniform float uWobbleMapStrength;\n\t\tuniform float uWobbleMapDistortion;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// #usf \n\t\tvoid main() {`\n );\n\n // wobble\n shader = shader.replace(\"// #usf \", `${getWobble}`);\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobbleMap & wobble\n\t\tfloat wobbleMap = uIsWobbleMap ? texture2D(uWobbleMap, uv).g : 0.0;\n\t\tvec3 nWobbleMap = wobbleMap * normal * uWobbleMapStrength;\n\t\tfloat wobbleMapDistortion = wobbleMap * uWobbleMapDistortion;\n\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += nWobbleMap + (wobble * normal);\n\t\tpositionA += nWobbleMap + wobbleMapDistortion + (wobblePositionA * normal);\n\t\tpositionB += nWobbleMap + wobbleMapDistortion + (wobblePositionB * normal);\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype MaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: MaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.Shader,\n renderer: THREE.WebGLRenderer\n ) => void;\n}\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\n const hasRoughness =\n mat.type === \"MeshPhysicalMaterial\" ||\n mat.type === \"MeshStandardMaterial\";\n\n const hasTransmission = mat.type === \"MeshPhysicalMaterial\";\n\n Object.assign(mat.userData, {\n uniforms: {\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: WOBBLE3D_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: WOBBLE3D_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: WOBBLE3D_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: WOBBLE3D_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: { value: WOBBLE3D_PARAMS.warpTimeFrequency },\n uWarpStrength: { value: WOBBLE3D_PARAMS.warpStrength },\n uWobbleShine: { value: WOBBLE3D_PARAMS.wobbleShine },\n uIsWobbleMap: { value: false },\n uWobbleMap: { value: new THREE.Texture() },\n uWobbleMapStrength: { value: WOBBLE3D_PARAMS.wobbleMapStrength },\n uWobbleMapDistortion: {\n value: WOBBLE3D_PARAMS.wobbleMapDistortion,\n },\n uColor0: { value: WOBBLE3D_PARAMS.color0 },\n uColor1: { value: WOBBLE3D_PARAMS.color1 },\n uColor2: { value: WOBBLE3D_PARAMS.color2 },\n uColor3: { value: WOBBLE3D_PARAMS.color3 },\n uColorMix: { value: WOBBLE3D_PARAMS.colorMix },\n uChromaticAberration: {\n value: WOBBLE3D_PARAMS.chromaticAberration,\n },\n uAnisotropicBlur: { value: WOBBLE3D_PARAMS.anisotropicBlur },\n uDistortion: { value: WOBBLE3D_PARAMS.distortion },\n uDistortionScale: { value: WOBBLE3D_PARAMS.distortionScale },\n uTemporalDistortion: { value: WOBBLE3D_PARAMS.temporalDistortion },\n uSamples: { value: WOBBLE3D_PARAMS.samples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t#include \n\t\t\t\tdiffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`\n );\n\n // roughness\n if (hasRoughness) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\t\t\t\t\troughnessFactor = usf_Roughness;`\n );\n }\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uWobbleShine;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t${snoise}\n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\t${hasRoughness ? \"float usf_Roughness = roughness;\" : \"\"}\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\n\t\t\t\t\t${\n hasRoughness\n ? \"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);\"\n : \"\"\n }`\n );\n\n // transmission\n if (hasTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n onBeforeCompile && onBeforeCompile(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n depthOnBeforeCompile && depthOnBeforeCompile(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n ]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (props: RootState | null, params?: Wobble3DParams) => void;\ntype UseCreateWobble3DReturn = [\n UpdateUniform,\n {\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n }\n];\n\nexport const useCreateWobble3D = ({\n scene = false,\n geometry,\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const updateUniform = useCallback(\n (props, params) => {\n if (props) {\n updateValue(\"uTime\", params?.beat || props.clock.getElapsedTime());\n }\n if (params === undefined) {\n return;\n }\n updateValue(\"uWobbleStrength\", params.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", params.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", params.warpStrength);\n updateValue(\"uWarpPositionFrequency\", params.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", params.warpTimeFrequency);\n updateValue(\"uWobbleShine\", params.wobbleShine);\n if (params.wobbleMap) {\n updateValue(\"uWobbleMap\", params.wobbleMap);\n updateValue(\"uIsWobbleMap\", true);\n } else if (params.wobbleMap === false) {\n updateValue(\"uIsWobbleMap\", false);\n }\n updateValue(\"uWobbleMapStrength\", params.wobbleMapStrength);\n updateValue(\"uWobbleMapDistortion\", params.wobbleMapDistortion);\n updateValue(\"uSamples\", params.samples);\n updateValue(\"uColor0\", params.color0);\n updateValue(\"uColor1\", params.color1);\n updateValue(\"uColor2\", params.color2);\n updateValue(\"uColor3\", params.color3);\n updateValue(\"uColorMix\", params.colorMix);\n updateValue(\"uChromaticAberration\", params.chromaticAberration);\n updateValue(\"uAnisotropicBlur\", params.anisotropicBlur);\n updateValue(\"uDistortion\", params.distortion);\n updateValue(\"uDistortionScale\", params.distortionScale);\n updateValue(\"uTemporalDistortion\", params.temporalDistortion);\n },\n [updateValue]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type Wobble3DParams = {\n /** default : `0.3` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param, default : `0` */\n wobbleShine?: number;\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the wobble changes depending on the g channel of this texture, default : `false` */\n wobbleMap?: THREE.Texture | false;\n /** Strength of wobbleMap, default : `0.03` */\n wobbleMapStrength?: number;\n /** Strength of distorting the 'normal' by wobbleMap, default : `0.0` */\n wobbleMapDistortion?: number;\n /** Refraction samples, default : `6` */\n samples?: number;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */\n colorMix?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n chromaticAberration?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.0` */\n distortion?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n distortionScale?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.0` */\n temporalDistortion?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type Wobble3DObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WOBBLE3D_PARAMS: Wobble3DParams = Object.freeze({\n beat: false,\n wobbleStrength: 0.3,\n wobblePositionFrequency: 0.3,\n wobbleTimeFrequency: 0.3,\n wobbleShine: 0,\n warpStrength: 0.3,\n warpPositionFrequency: 0.3,\n warpTimeFrequency: 0.3,\n wobbleMap: false,\n wobbleMapStrength: 0.03,\n wobbleMapDistortion: 0.0,\n samples: 6,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n colorMix: 1,\n chromaticAberration: 0.1,\n anisotropicBlur: 0.1,\n distortion: 0.0,\n distortionScale: 0.1,\n temporalDistortion: 0.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n onBeforeCompile,\n depthOnBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: Wobble3DParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: Wobble3DParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\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 const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\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\";\nimport { MaterialProps } from \"../../../fxs/types\";\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 onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\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 mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\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\";\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 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 const updateValue = setUniform(material);\n updateValue(\"u_texture\", params.texture![i]);\n updateValue(\"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n updateValue(\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n updateValue(\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, 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 \"../../fxs/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\";\nimport { getDpr } from \"../../utils/getDpr\";\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 /** 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.updateKey must be a unique value for each update, for example `performance.now()`.*/\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 boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples, isSizeUpdate, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\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: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\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 useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\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 (errorHandler(params)) {\n return emptyTexture;\n }\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 (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n onBeforeCompile,\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 return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n onBeforeCompile,\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","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/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 if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\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","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","useMesh","onBeforeCompile","mat","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","getDpr","BRUSH_PARAMS","useBrush","_dpr","updatePointer","pressureEnd","updateValue","props","pointer","pointerValues","color","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","useSplatMaterial","useCustomMaterial","materialHook","onBeforeCompileObj","fluidOnBeforeCompile","initial","curl","vorticity","advection","divergence","pressure","clear","gradientSubtract","splat","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","updateAdvection","updateSplat","updateCurl","updateVorticity","updateDivergence","updateClear","updatePressure","updateGradientSubtract","clock","dt","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","updateTempTexture","_tempTexture","iterations","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","uniforms","BLANK_PARAMS","useBlank","useCreateObject","points","interactiveMesh","getWobble_default","ISDEV","rewriteVertexShader","modifeidAttributes","targetGeometry","targetAttibute","itemSize","vTargetName","vAttributeRewriteKey","vTransitionRewriteKey","vListName","vMorphTransition","stringToAddToMorphAttibutes","stringToAddToMorphAttibutesList","modifyAttributes","attribute","modifiedAttribute","maxLength","arr","diff","addArray","oldArray","randomIndex","j","rewriteFragmentShader","mapArray","mapArrayShader","mapArrayUniforms","textureSwitcherCode","map","condition","action","useMaterial","positions","uvs","modifiedPositions","modifiedUvs","rewritedVertexShader","getWobble","rewritedFragmentShader","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","snoise_default","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","depthMaterial","hasRoughness","hasTransmission","WOBBLE3D_PARAMS","renderer","snoise","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[115]} \ 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 eec5f369..0269a19b 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(M,j){typeof exports=="object"&&typeof module<"u"?j(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],j):(M=typeof globalThis<"u"?globalThis:M||self,j(M["use-shader-fx"]={},M.THREE,M.React))})(this,function(M,j,v){"use strict";function Ie(e){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const u=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(i,r,u.get?u:{enumerable:!0,get:()=>e[r]})}}return i.default=e,Object.freeze(i)}const t=Ie(j);var Fe=`varying vec2 vUv; +(function(y,K){typeof exports=="object"&&typeof module<"u"?K(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],K):(y=typeof globalThis<"u"?globalThis:y||self,K(y["use-shader-fx"]={},y.THREE,y.React))})(this,function(y,K,v){"use strict";function Le(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const n=Le(K);var ke=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,ze=`precision highp float; +}`,$e=`precision highp float; uniform sampler2D uBuffer; uniform sampler2D uTexture; @@ -112,7 +112,7 @@ void main() { vec4 finalColor = mix(bufferColor, brushColor, isOnLine); gl_FragColor = finalColor; -}`;const W=(e,i=!1)=>{const r=i?e.width*i:e.width,u=i?e.height*i:e.height;return v.useMemo(()=>new t.Vector2(r,u),[r,u])},o=(e,i,r)=>{r!==void 0&&e.uniforms&&e.uniforms[i]&&r!==null&&(e.uniforms[i].value=r)},I=(e,i,r,u)=>{const s=v.useMemo(()=>{const c=new u(i,r);return e&&e.add(c),c},[i,r,u,e]);return v.useEffect(()=>()=>{e&&e.remove(s),i.dispose(),r.dispose()},[e,i,r,s]),s},Ue=({scene:e,size:i,dpr:r})=>{const u=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),s=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uBuffer:{value:new t.Texture},uResolution:{value:new t.Vector2(0,0)},uTexture:{value:new t.Texture},uIsTexture:{value:!1},uMap:{value:new t.Texture},uIsMap:{value:!1},uMapIntensity:{value:0},uRadius:{value:0},uSmudge:{value:0},uDissipation:{value:0},uMotionBlur:{value:0},uMotionSample:{value:0},uMouse:{value:new t.Vector2(-10,-10)},uPrevMouse:{value:new t.Vector2(-10,-10)},uVelocity:{value:new t.Vector2(0,0)},uColor:{value:new t.Vector3(1,0,0)},uIsCursor:{value:!1},uPressureStart:{value:1},uPressureEnd:{value:1}},vertexShader:Fe,fragmentShader:ze}),[]),c=W(i,r);o(s,"uResolution",c.clone());const n=I(e,u,s,t.Mesh);return{material:s,mesh:n}},Be=(e,i)=>{const r=i,u=e/i,[s,c]=[r*u/2,r/2];return{width:s,height:c,near:-1e3,far:1e3}},F=(e,i="OrthographicCamera")=>{const r=W(e),{width:u,height:s,near:c,far:n}=Be(r.x,r.y);return v.useMemo(()=>i==="OrthographicCamera"?new t.OrthographicCamera(-u,u,s,-s,c,n):new t.PerspectiveCamera(50,u/s),[u,s,c,n,i])},Z=(e=0)=>{const i=v.useRef(new t.Vector2(0,0)),r=v.useRef(new t.Vector2(0,0)),u=v.useRef(new t.Vector2(0,0)),s=v.useRef(0),c=v.useRef(new t.Vector2(0,0)),n=v.useRef(!1);return v.useCallback(m=>{const l=performance.now();let f;n.current&&e?(u.current=u.current.lerp(m,1-e),f=u.current.clone()):(f=m.clone(),u.current=f),s.current===0&&(s.current=l,i.current=f);const a=Math.max(1,l-s.current);s.current=l,c.current.copy(f).sub(i.current).divideScalar(a);const p=c.current.length()>0,y=n.current?i.current.clone():f;return!n.current&&p&&(n.current=!0),i.current=f,{currentPointer:f,prevPointer:y,diffPointer:r.current.subVectors(f,y),velocity:c.current,isVelocityUpdate:p}},[e])},z=e=>{const i=s=>Object.values(s).some(c=>typeof c=="function"),r=v.useRef(i(e)?e:structuredClone(e)),u=v.useCallback(s=>{for(const c in s){const n=c;n in r.current&&s[n]!==void 0&&s[n]!==null?r.current[n]=s[n]:console.error(`"${String(n)}" does not exist in the params. or "${String(n)}" is null | undefined`)}},[]);return[r.current,u]},Y={minFilter:t.LinearFilter,magFilter:t.LinearFilter,type:t.HalfFloatType,stencilBuffer:!1},J=({gl:e,fbo:i,scene:r,camera:u,onBeforeRender:s,onSwap:c})=>{e.setRenderTarget(i),s(),e.clear(),e.render(r,u),c&&c(),e.setRenderTarget(null),e.clear()},U=({scene:e,camera:i,size:r,dpr:u=!1,isSizeUpdate:s=!1,samples:c=0,depthBuffer:n=!1,depthTexture:d=!1})=>{var a;const m=v.useRef(),l=W(r,u);m.current=v.useMemo(()=>{const p=new t.WebGLRenderTarget(l.x,l.y,{...Y,samples:c,depthBuffer:n});return d&&(p.depthTexture=new t.DepthTexture(l.x,l.y,t.FloatType)),p},[]),s&&((a=m.current)==null||a.setSize(l.x,l.y)),v.useEffect(()=>{const p=m.current;return()=>{p==null||p.dispose()}},[]);const f=v.useCallback((p,y)=>{const x=m.current;return J({gl:p,fbo:x,scene:e,camera:i,onBeforeRender:()=>y&&y({read:x.texture})}),x.texture},[e,i]);return[m.current,f]},N=({scene:e,camera:i,size:r,dpr:u=!1,isSizeUpdate:s=!1,samples:c=0,depthBuffer:n=!1,depthTexture:d=!1})=>{var p,y;const m=v.useRef({read:null,write:null,swap:function(){let x=this.read;this.read=this.write,this.write=x}}),l=W(r,u),f=v.useMemo(()=>{const x=new t.WebGLRenderTarget(l.x,l.y,{...Y,samples:c,depthBuffer:n}),h=new t.WebGLRenderTarget(l.x,l.y,{...Y,samples:c,depthBuffer:n});return d&&(x.depthTexture=new t.DepthTexture(l.x,l.y,t.FloatType),h.depthTexture=new t.DepthTexture(l.x,l.y,t.FloatType)),{read:x,write:h}},[]);m.current.read=f.read,m.current.write=f.write,s&&((p=m.current.read)==null||p.setSize(l.x,l.y),(y=m.current.write)==null||y.setSize(l.x,l.y)),v.useEffect(()=>{const x=m.current;return()=>{var h,g;(h=x.read)==null||h.dispose(),(g=x.write)==null||g.dispose()}},[]);const a=v.useCallback((x,h)=>{var b;const g=m.current;return J({gl:x,scene:e,camera:i,fbo:g.write,onBeforeRender:()=>h&&h({read:g.read.texture,write:g.write.texture}),onSwap:()=>g.swap()}),(b=g.read)==null?void 0:b.texture},[e,i]);return[{read:m.current.read,write:m.current.write},a]},A=e=>{var i,r;return typeof e=="number"?{shader:e,fbo:e}:{shader:(((i=e.effect)==null?void 0:i.shader)??!0)&&e.dpr,fbo:(((r=e.effect)==null?void 0:r.fbo)??!0)&&e.dpr}},oe=Object.freeze({texture:!1,map:!1,mapIntensity:.1,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new t.Vector3(1,0,0),isCursor:!1,pressure:1,pointerValues:!1}),Ve=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Ue({scene:c,size:e,dpr:s.shader}),m=F(e),l=Z(),[f,a]=N({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[p,y]=z(oe),x=v.useRef(null);return[v.useCallback((g,b)=>{const{gl:w,pointer:T}=g;b&&y(b),p.texture?(o(n,"uIsTexture",!0),o(n,"uTexture",p.texture)):o(n,"uIsTexture",!1),p.map?(o(n,"uIsMap",!0),o(n,"uMap",p.map),o(n,"uMapIntensity",p.mapIntensity)):o(n,"uIsMap",!1),o(n,"uRadius",p.radius),o(n,"uSmudge",p.smudge),o(n,"uDissipation",p.dissipation),o(n,"uMotionBlur",p.motionBlur),o(n,"uMotionSample",p.motionSample);const _=p.pointerValues||l(T);_.isVelocityUpdate&&(o(n,"uMouse",_.currentPointer),o(n,"uPrevMouse",_.prevPointer)),o(n,"uVelocity",_.velocity);const S=typeof p.color=="function"?p.color(_.velocity):p.color;return o(n,"uColor",S),o(n,"uIsCursor",p.isCursor),o(n,"uPressureEnd",p.pressure),x.current===null&&(x.current=p.pressure),o(n,"uPressureStart",x.current),x.current=p.pressure,a(w,({read:C})=>{o(n,"uBuffer",C)})},[n,l,a,p,y]),y,{scene:c,mesh:d,material:n,camera:m,renderTarget:f,output:f.read.texture}]};var $=`varying vec2 vUv; +}`;const $=(e,r=!1)=>{const t=r?e.width*r:e.width,a=r?e.height*r:e.height;return v.useMemo(()=>new n.Vector2(t,a),[t,a])},T=e=>(r,t)=>{t!==void 0&&e.uniforms[r]&&t!==null&&(e.uniforms[r].value=t)},z=(e,r,t,a)=>{const s=v.useMemo(()=>{const u=new a(r,t);return e&&e.add(u),u},[r,t,a,e]);return v.useEffect(()=>()=>{e&&e.remove(s),r.dispose(),t.dispose()},[e,r,t,s]),s},qe=({scene:e,size:r,dpr:t,onBeforeCompile:a})=>{const s=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),u=v.useMemo(()=>{const m=new n.ShaderMaterial({uniforms:{uBuffer:{value:new n.Texture},uResolution:{value:new n.Vector2(0,0)},uTexture:{value:new n.Texture},uIsTexture:{value:!1},uMap:{value:new n.Texture},uIsMap:{value:!1},uMapIntensity:{value:0},uRadius:{value:0},uSmudge:{value:0},uDissipation:{value:0},uMotionBlur:{value:0},uMotionSample:{value:0},uMouse:{value:new n.Vector2(-10,-10)},uPrevMouse:{value:new n.Vector2(-10,-10)},uVelocity:{value:new n.Vector2(0,0)},uColor:{value:new n.Vector3(1,0,0)},uIsCursor:{value:!1},uPressureStart:{value:1},uPressureEnd:{value:1}},vertexShader:ke,fragmentShader:$e});return a&&(m.onBeforeCompile=a),m},[a]),l=$(r,t);T(u)("uResolution",l.clone());const c=z(e,s,u,n.Mesh);return{material:u,mesh:c}},je=(e,r)=>{const t=r,a=e/r,[s,u]=[t*a/2,t/2];return{width:s,height:u,near:-1e3,far:1e3}},U=(e,r="OrthographicCamera")=>{const t=$(e),{width:a,height:s,near:u,far:l}=je(t.x,t.y);return v.useMemo(()=>r==="OrthographicCamera"?new n.OrthographicCamera(-a,a,s,-s,u,l):new n.PerspectiveCamera(50,a/s),[a,s,u,l,r])},ne=(e=0)=>{const r=v.useRef(new n.Vector2(0,0)),t=v.useRef(new n.Vector2(0,0)),a=v.useRef(new n.Vector2(0,0)),s=v.useRef(0),u=v.useRef(new n.Vector2(0,0)),l=v.useRef(!1);return v.useCallback(m=>{const p=performance.now();let f;l.current&&e?(a.current=a.current.lerp(m,1-e),f=a.current.clone()):(f=m.clone(),a.current=f),s.current===0&&(s.current=p,r.current=f);const g=Math.max(1,p-s.current);s.current=p,u.current.copy(f).sub(r.current).divideScalar(g);const i=u.current.length()>0,d=l.current?r.current.clone():f;return!l.current&&i&&(l.current=!0),r.current=f,{currentPointer:f,prevPointer:d,diffPointer:t.current.subVectors(f,d),velocity:u.current,isVelocityUpdate:i}},[e])},O=e=>{const r=s=>Object.values(s).some(u=>typeof u=="function"),t=v.useRef(r(e)?e:structuredClone(e)),a=v.useCallback(s=>{for(const u in s){const l=u;l in t.current&&s[l]!==void 0&&s[l]!==null?t.current[l]=s[l]:console.error(`"${String(l)}" does not exist in the params. or "${String(l)}" is null | undefined`)}},[]);return[t.current,a]},Z={minFilter:n.LinearFilter,magFilter:n.LinearFilter,type:n.HalfFloatType,stencilBuffer:!1},te=({gl:e,fbo:r,scene:t,camera:a,onBeforeRender:s,onSwap:u})=>{e.setRenderTarget(r),s(),e.clear(),e.render(t,a),u&&u(),e.setRenderTarget(null),e.clear()},B=({scene:e,camera:r,size:t,dpr:a=!1,isSizeUpdate:s=!1,samples:u=0,depthBuffer:l=!1,depthTexture:c=!1})=>{var g;const m=v.useRef(),p=$(t,a);m.current=v.useMemo(()=>{const i=new n.WebGLRenderTarget(p.x,p.y,{...Z,samples:u,depthBuffer:l});return c&&(i.depthTexture=new n.DepthTexture(p.x,p.y,n.FloatType)),i},[]),s&&((g=m.current)==null||g.setSize(p.x,p.y)),v.useEffect(()=>{const i=m.current;return()=>{i==null||i.dispose()}},[]);const f=v.useCallback((i,d)=>{const o=m.current;return te({gl:i,fbo:o,scene:e,camera:r,onBeforeRender:()=>d&&d({read:o.texture})}),o.texture},[e,r]);return[m.current,f]},G=({scene:e,camera:r,size:t,dpr:a=!1,isSizeUpdate:s=!1,samples:u=0,depthBuffer:l=!1,depthTexture:c=!1})=>{var i,d;const m=v.useRef({read:null,write:null,swap:function(){let o=this.read;this.read=this.write,this.write=o}}),p=$(t,a),f=v.useMemo(()=>{const o=new n.WebGLRenderTarget(p.x,p.y,{...Z,samples:u,depthBuffer:l}),h=new n.WebGLRenderTarget(p.x,p.y,{...Z,samples:u,depthBuffer:l});return c&&(o.depthTexture=new n.DepthTexture(p.x,p.y,n.FloatType),h.depthTexture=new n.DepthTexture(p.x,p.y,n.FloatType)),{read:o,write:h}},[]);m.current.read=f.read,m.current.write=f.write,s&&((i=m.current.read)==null||i.setSize(p.x,p.y),(d=m.current.write)==null||d.setSize(p.x,p.y)),v.useEffect(()=>{const o=m.current;return()=>{var h,b;(h=o.read)==null||h.dispose(),(b=o.write)==null||b.dispose()}},[]);const g=v.useCallback((o,h)=>{var M;const b=m.current;return te({gl:o,scene:e,camera:r,fbo:b.write,onBeforeRender:()=>h&&h({read:b.read.texture,write:b.write.texture}),onSwap:()=>b.swap()}),(M=b.read)==null?void 0:M.texture},[e,r]);return[{read:m.current.read,write:m.current.write},g]},F=e=>typeof e=="number"?{shader:e,fbo:e}:{shader:e.shader??!1,fbo:e.fbo??!1},ve=Object.freeze({texture:!1,map:!1,mapIntensity:.1,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new n.Vector3(1,0,0),isCursor:!1,pressure:1,pointerValues:!1}),Ne=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=qe({scene:l,size:e,dpr:u.shader,onBeforeCompile:s}),p=U(e),f=ne(),[g,i]=G({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[d,o]=O(ve),h=v.useRef(null),b=T(c);return[v.useCallback((x,w)=>{const{gl:S,pointer:C}=x;w&&o(w),d.texture?(b("uIsTexture",!0),b("uTexture",d.texture)):b("uIsTexture",!1),d.map?(b("uIsMap",!0),b("uMap",d.map),b("uMapIntensity",d.mapIntensity)):b("uIsMap",!1),b("uRadius",d.radius),b("uSmudge",d.smudge),b("uDissipation",d.dissipation),b("uMotionBlur",d.motionBlur),b("uMotionSample",d.motionSample);const _=d.pointerValues||f(C);_.isVelocityUpdate&&(b("uMouse",_.currentPointer),b("uPrevMouse",_.prevPointer)),b("uVelocity",_.velocity);const D=typeof d.color=="function"?d.color(_.velocity):d.color;return b("uColor",D),b("uIsCursor",d.isCursor),b("uPressureEnd",d.pressure),h.current===null&&(h.current=d.pressure),b("uPressureStart",h.current),h.current=d.pressure,i(S,({read:A})=>{b("uBuffer",A)})},[b,f,i,d,o]),o,{scene:l,mesh:m,material:c,camera:p,renderTarget:g,output:g.read.texture}]};var j=`varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -126,11 +126,11 @@ void main () { vT = vUv + vec2(0.0, texelSize.y); vB = vUv - vec2(0.0, texelSize.y); gl_Position = vec4(position, 1.0); -}`,Oe=`precision highp float; +}`,Ge=`precision highp float; void main(){ gl_FragColor = vec4(0.0); -}`;const Ee=()=>v.useMemo(()=>new t.ShaderMaterial({vertexShader:$,fragmentShader:Oe,depthTest:!1,depthWrite:!1}),[]);var Le=`precision highp float; +}`;const Ke=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({vertexShader:j,fragmentShader:Ge,depthTest:!1,depthWrite:!1});return e&&(t.onBeforeCompile=e),t},[e]);var Xe=`precision highp float; varying vec2 vUv; uniform sampler2D uVelocity; @@ -143,7 +143,7 @@ void main () { vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; gl_FragColor = dissipation * texture2D(uSource, coord); gl_FragColor.a = 1.0; -}`;const We=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uVelocity:{value:new t.Texture},uSource:{value:new t.Texture},texelSize:{value:new t.Vector2},dt:{value:0},dissipation:{value:0}},vertexShader:$,fragmentShader:Le}),[]);var ke=`precision highp float; +}`;const He=({onBeforeCompile:e})=>v.useMemo(()=>{const t=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:j,fragmentShader:Xe});return e&&(t.onBeforeCompile=e),t},[e]);var Ye=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -168,7 +168,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 $e=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:ke}),[]);var qe=`precision highp float; +}`;const Qe=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new n.Vector2}},vertexShader:j,fragmentShader:Ye});return e&&(t.onBeforeCompile=e),t},[e]);var Ze=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -192,7 +192,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 je=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:qe}),[]);var Ne=`precision highp float; +}`;const Je=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new n.Vector2}},vertexShader:j,fragmentShader:Ze});return e&&(t.onBeforeCompile=e),t},[e]);var en=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -208,7 +208,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 Ge=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:Ne}),[]);var Ke=`precision highp float; +}`;const nn=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new n.Vector2}},vertexShader:j,fragmentShader:en});return e&&(t.onBeforeCompile=e),t},[e]);var tn=`precision highp float; varying vec2 vUv; varying vec2 vT; @@ -226,7 +226,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 Xe=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:0},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:Ke}),[]);var He=`precision highp float; +}`;const rn=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:0},texelSize:{value:new n.Vector2}},vertexShader:j,fragmentShader:tn});return e&&(t.onBeforeCompile=e),t},[e]);var on=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -234,7 +234,7 @@ uniform float value; void main () { gl_FragColor = value * texture2D(uTexture, vUv); -}`;const Ye=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},value:{value:0},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:He}),[]);var Qe=`precision highp float; +}`;const an=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},value:{value:0},texelSize:{value:new n.Vector2}},vertexShader:j,fragmentShader:on});return e&&(t.onBeforeCompile=e),t},[e]);var un=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -257,7 +257,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 Ze=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uPressure:{value:new t.Texture},uVelocity:{value:new t.Texture},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:Qe}),[]);var Je=`precision highp float; +}`;const sn=({onBeforeCompile:e})=>v.useMemo(()=>{const t=new n.ShaderMaterial({uniforms:{uPressure:{value:new n.Texture},uVelocity:{value:new n.Texture},texelSize:{value:new n.Vector2}},vertexShader:j,fragmentShader:un});return e&&(t.onBeforeCompile=e),t},[e]);var ln=`precision highp float; varying vec2 vUv; uniform sampler2D uTarget; @@ -273,12 +273,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 en=()=>v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTarget:{value:new t.Texture},aspectRatio:{value:0},color:{value:new t.Vector3},point:{value:new t.Vector2},radius:{value:0},texelSize:{value:new t.Vector2}},vertexShader:$,fragmentShader:Je}),[]),nn=({scene:e,size:i,dpr:r})=>{const u=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),s=Ee(),c=s.clone(),n=Ge(),d=Xe(),m=We(),l=$e(),f=je(),a=Ye(),p=Ze(),y=en(),x=v.useMemo(()=>({vorticityMaterial:d,curlMaterial:n,advectionMaterial:m,divergenceMaterial:l,pressureMaterial:f,clearMaterial:a,gradientSubtractMaterial:p,splatMaterial:y}),[d,n,m,l,f,a,p,y]),h=W(i,r);v.useMemo(()=>{o(x.splatMaterial,"aspectRatio",h.x/h.y);for(const w of Object.values(x))o(w,"texelSize",new t.Vector2(1/h.x,1/h.y))},[h,x]);const g=I(e,u,s,t.Mesh);v.useMemo(()=>{s.dispose(),g.material=c},[s,g,c]),v.useEffect(()=>()=>{for(const w of Object.values(x))w.dispose()},[x]);const b=v.useCallback(w=>{g.material=w,g.material.needsUpdate=!0},[g]);return{materials:x,setMeshMaterial:b,mesh:g}},ie=Object.freeze({density_dissipation:.98,velocity_dissipation:.99,velocity_acceleration:10,pressure_dissipation:.9,pressure_iterations:20,curl_strength:35,splat_radius:.002,fluid_color:new t.Vector3(1,1,1),pointerValues:!1}),tn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{materials:n,setMeshMaterial:d,mesh:m}=nn({scene:c,size:e,dpr:s.shader}),l=F(e),f=Z(),a=v.useMemo(()=>({scene:c,camera:l,dpr:s.fbo,size:e,samples:r,isSizeUpdate:u}),[c,l,e,r,s.fbo,u]),[p,y]=N(a),[x,h]=N(a),[g,b]=U(a),[w,T]=U(a),[_,S]=N(a),C=v.useRef(0),B=v.useRef(new t.Vector2(0,0)),P=v.useRef(new t.Vector3(0,0,0)),[R,E]=z(ie);return[v.useCallback((L,X)=>{const{gl:k,pointer:$t,clock:te,size:Re}=L;X&&E(X),C.current===0&&(C.current=te.getElapsedTime());const De=Math.min((te.getElapsedTime()-C.current)/3,.02);C.current=te.getElapsedTime();const re=y(k,({read:O})=>{d(n.advectionMaterial),o(n.advectionMaterial,"uVelocity",O),o(n.advectionMaterial,"uSource",O),o(n.advectionMaterial,"dt",De),o(n.advectionMaterial,"dissipation",R.velocity_dissipation)}),qt=h(k,({read:O})=>{d(n.advectionMaterial),o(n.advectionMaterial,"uVelocity",re),o(n.advectionMaterial,"uSource",O),o(n.advectionMaterial,"dissipation",R.density_dissipation)}),ee=R.pointerValues||f($t);ee.isVelocityUpdate&&(y(k,({read:O})=>{d(n.splatMaterial),o(n.splatMaterial,"uTarget",O),o(n.splatMaterial,"point",ee.currentPointer);const H=ee.diffPointer.multiply(B.current.set(Re.width,Re.height).multiplyScalar(R.velocity_acceleration));o(n.splatMaterial,"color",P.current.set(H.x,H.y,1)),o(n.splatMaterial,"radius",R.splat_radius)}),h(k,({read:O})=>{d(n.splatMaterial),o(n.splatMaterial,"uTarget",O);const H=typeof R.fluid_color=="function"?R.fluid_color(ee.velocity):R.fluid_color;o(n.splatMaterial,"color",H)}));const jt=b(k,()=>{d(n.curlMaterial),o(n.curlMaterial,"uVelocity",re)});y(k,({read:O})=>{d(n.vorticityMaterial),o(n.vorticityMaterial,"uVelocity",O),o(n.vorticityMaterial,"uCurl",jt),o(n.vorticityMaterial,"curl",R.curl_strength),o(n.vorticityMaterial,"dt",De)});const Nt=T(k,()=>{d(n.divergenceMaterial),o(n.divergenceMaterial,"uVelocity",re)});S(k,({read:O})=>{d(n.clearMaterial),o(n.clearMaterial,"uTexture",O),o(n.clearMaterial,"value",R.pressure_dissipation)}),d(n.pressureMaterial),o(n.pressureMaterial,"uDivergence",Nt);let Ae;for(let O=0;O{o(n.pressureMaterial,"uPressure",H)});return y(k,({read:O})=>{d(n.gradientSubtractMaterial),o(n.gradientSubtractMaterial,"uPressure",Ae),o(n.gradientSubtractMaterial,"uVelocity",O)}),qt},[n,d,b,h,T,f,S,y,E,R]),E,{scene:c,mesh:m,materials:n,camera:l,renderTarget:{velocity:p,density:x,curl:g,divergence:w,pressure:_},output:x.read.texture}]},rn=({scale:e,max:i,texture:r,scene:u})=>{const s=v.useRef([]),c=v.useMemo(()=>new t.PlaneGeometry(e,e),[e]),n=v.useMemo(()=>new t.MeshBasicMaterial({map:r,transparent:!0,blending:t.AdditiveBlending,depthTest:!1,depthWrite:!1}),[r]);return v.useEffect(()=>{for(let d=0;d()=>{s.current.forEach(d=>{d.geometry.dispose(),Array.isArray(d.material)?d.material.forEach(m=>m.dispose()):d.material.dispose(),u.remove(d)}),s.current=[]},[u]),s.current},ae=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),on=({texture:e=new t.Texture,scale:i=64,max:r=100,size:u,dpr:s,samples:c,isSizeUpdate:n})=>{const d=A(s),m=v.useMemo(()=>new t.Scene,[]),l=rn({scale:i,max:r,texture:e,scene:m}),f=F(u),a=Z(),[p,y]=U({scene:m,camera:f,size:u,dpr:d.fbo,samples:c,isSizeUpdate:n}),[x,h]=z(ae),g=v.useRef(0);return[v.useCallback((w,T)=>{const{gl:_,pointer:S,size:C}=w;T&&h(T);const B=x.pointerValues||a(S);if(x.frequency{if(P.visible){const R=P.material;P.rotation.z+=x.rotation,R.opacity*=x.fadeout_speed,P.scale.x=x.fadeout_speed*P.scale.x+x.scale,P.scale.y=P.scale.x,R.opacity<.002&&(P.visible=!1)}}),y(_)},[y,l,a,r,x,h]),h,{scene:m,camera:f,meshArr:l,renderTarget:p,output:p.texture}]};var an=`varying vec2 vUv; +}`;const cn=({onBeforeCompile:e})=>v.useMemo(()=>{const t=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:j,fragmentShader:ln});return e&&(t.onBeforeCompile=e),t},[e]),N=(e,r)=>{const t=r==null?void 0:r.onBeforeCompile;return e({onBeforeCompile:t})},vn=({scene:e,size:r,dpr:t,fluidOnBeforeCompile:a})=>{const s=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),{initial:u,curl:l,vorticity:c,advection:m,divergence:p,pressure:f,clear:g,gradientSubtract:i,splat:d}=a??{},o=N(Ke,u),h=o.clone(),b=N(nn,l),M=N(rn,c),x=N(He,m),w=N(Qe,p),S=N(Je,f),C=N(an,g),_=N(sn,i),D=N(cn,d),A=v.useMemo(()=>({vorticityMaterial:M,curlMaterial:b,advectionMaterial:x,divergenceMaterial:w,pressureMaterial:S,clearMaterial:C,gradientSubtractMaterial:_,splatMaterial:D}),[M,b,x,w,S,C,_,D]),R=$(r,t);v.useMemo(()=>{T(A.splatMaterial)("aspectRatio",R.x/R.y);for(const I of Object.values(A))T(I)("texelSize",new n.Vector2(1/R.x,1/R.y))},[R,A]);const P=z(e,s,o,n.Mesh);v.useMemo(()=>{o.dispose(),P.material=h},[o,P,h]),v.useEffect(()=>()=>{for(const I of Object.values(A))I.dispose()},[A]);const W=v.useCallback(I=>{P.material=I,P.material.needsUpdate=!0},[P]);return{materials:A,setMeshMaterial:W,mesh:P}},me=Object.freeze({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),pointerValues:!1}),mn=({size:e,dpr:r,samples:t,isSizeUpdate:a,fluidOnBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{materials:c,setMeshMaterial:m,mesh:p}=vn({scene:l,size:e,dpr:u.shader,fluidOnBeforeCompile:s}),f=U(e),g=ne(),i=v.useMemo(()=>({scene:l,camera:f,dpr:u.fbo,size:e,samples:t,isSizeUpdate:a}),[l,f,e,t,u.fbo,a]),[d,o]=G(i),[h,b]=G(i),[M,x]=B(i),[w,S]=B(i),[C,_]=G(i),D=v.useRef(0),A=v.useRef(new n.Vector2(0,0)),R=v.useRef(new n.Vector3(0,0,0)),[P,W]=O(me),I=T(c.advectionMaterial),k=T(c.splatMaterial),ee=T(c.curlMaterial),X=T(c.vorticityMaterial),Ue=T(c.divergenceMaterial),ie=T(c.clearMaterial),ue=T(c.pressureMaterial),se=T(c.gradientSubtractMaterial);return[v.useCallback((nr,Oe)=>{const{gl:q,pointer:tr,clock:le,size:Be}=nr;Oe&&W(Oe),D.current===0&&(D.current=le.getElapsedTime());const Ee=Math.min((le.getElapsedTime()-D.current)/3,.02);D.current=le.getElapsedTime();const ce=o(q,({read:L})=>{m(c.advectionMaterial),I("uVelocity",L),I("uSource",L),I("dt",Ee),I("dissipation",P.velocity_dissipation)}),rr=b(q,({read:L})=>{m(c.advectionMaterial),I("uVelocity",ce),I("uSource",L),I("dissipation",P.density_dissipation)}),re=P.pointerValues||g(tr);re.isVelocityUpdate&&(o(q,({read:L})=>{m(c.splatMaterial),k("uTarget",L),k("point",re.currentPointer);const Q=re.diffPointer.multiply(A.current.set(Be.width,Be.height).multiplyScalar(P.velocity_acceleration));k("color",R.current.set(Q.x,Q.y,1)),k("radius",P.splat_radius)}),b(q,({read:L})=>{m(c.splatMaterial),k("uTarget",L);const Q=typeof P.fluid_color=="function"?P.fluid_color(re.velocity):P.fluid_color;k("color",Q)}));const or=x(q,()=>{m(c.curlMaterial),ee("uVelocity",ce)});o(q,({read:L})=>{m(c.vorticityMaterial),X("uVelocity",L),X("uCurl",or),X("curl",P.curl_strength),X("dt",Ee)});const ar=S(q,()=>{m(c.divergenceMaterial),Ue("uVelocity",ce)});_(q,({read:L})=>{m(c.clearMaterial),ie("uTexture",L),ie("value",P.pressure_dissipation)}),m(c.pressureMaterial),ue("uDivergence",ar);let We;for(let L=0;L{ue("uPressure",Q)});return o(q,({read:L})=>{m(c.gradientSubtractMaterial),se("uPressure",We),se("uVelocity",L)}),rr},[c,I,ie,ee,Ue,se,ue,k,X,m,x,b,S,g,_,o,W,P]),W,{scene:l,mesh:p,materials:c,camera:f,renderTarget:{velocity:d,density:h,curl:M,divergence:w,pressure:C},output:h.read.texture}]},fn=({scale:e,max:r,texture:t,scene:a,onBeforeCompile:s})=>{const u=v.useRef([]),l=v.useMemo(()=>new n.PlaneGeometry(e,e),[e]),c=v.useMemo(()=>{const m=new n.MeshBasicMaterial({map:t,transparent:!0,blending:n.AdditiveBlending,depthTest:!1,depthWrite:!1});return s&&(m.onBeforeCompile=s),m},[t,s]);return v.useEffect(()=>{for(let m=0;m()=>{u.current.forEach(m=>{m.geometry.dispose(),Array.isArray(m.material)?m.material.forEach(p=>p.dispose()):m.material.dispose(),a.remove(m)}),u.current=[]},[a]),u.current},fe=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),pn=({texture:e=new n.Texture,scale:r=64,max:t=100,size:a,dpr:s,samples:u,isSizeUpdate:l,onBeforeCompile:c})=>{const m=F(s),p=v.useMemo(()=>new n.Scene,[]),f=fn({scale:r,max:t,texture:e,scene:p,onBeforeCompile:c}),g=U(a),i=ne(),[d,o]=B({scene:p,camera:g,size:a,dpr:m.fbo,samples:u,isSizeUpdate:l}),[h,b]=O(fe),M=v.useRef(0);return[v.useCallback((w,S)=>{const{gl:C,pointer:_,size:D}=w;S&&b(S);const A=h.pointerValues||i(_);if(h.frequency{if(R.visible){const P=R.material;R.rotation.z+=h.rotation,P.opacity*=h.fadeout_speed,R.scale.x=h.fadeout_speed*R.scale.x+h.scale,R.scale.y=R.scale.x,P.opacity<.002&&(R.visible=!1)}}),o(C)},[o,f,i,t,h,b]),b,{scene:p,camera:g,meshArr:f,renderTarget:d,output:d.texture}]};var dn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,un=`precision highp float; +}`,gn=`precision highp float; precision highp int; varying vec2 vUv; @@ -351,12 +351,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 sn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTime:{value:0},scale:{value:0},timeStrength:{value:0},noiseOctaves:{value:0},fbmOctaves:{value:0},warpOctaves:{value:0},warpDirection:{value:new t.Vector2},warpStrength:{value:0}},vertexShader:an,fragmentShader:un}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},ue=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new t.Vector2(2,2),warpStrength:8,beat:!1}),ln=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=sn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(ue);return[v.useCallback((x,h)=>{const{gl:g,clock:b}=x;return h&&p(h),o(n,"scale",a.scale),o(n,"timeStrength",a.timeStrength),o(n,"noiseOctaves",a.noiseOctaves),o(n,"fbmOctaves",a.fbmOctaves),o(n,"warpOctaves",a.warpOctaves),o(n,"warpDirection",a.warpDirection),o(n,"warpStrength",a.warpStrength),o(n,"uTime",a.beat||b.getElapsedTime()),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var cn=`varying vec2 vUv; +}`;const hn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=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:dn,fragmentShader:gn});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},pe=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new n.Vector2(2,2),warpStrength:8,beat:!1}),xn=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=hn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(pe),o=T(c);return[v.useCallback((b,M)=>{const{gl:x,clock:w}=b;return M&&d(M),o("scale",i.scale),o("timeStrength",i.timeStrength),o("noiseOctaves",i.noiseOctaves),o("fbmOctaves",i.fbmOctaves),o("warpOctaves",i.warpOctaves),o("warpDirection",i.warpDirection),o("warpStrength",i.warpStrength),o("uTime",i.beat||w.getElapsedTime()),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var bn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,vn=`precision highp float; +}`,Mn=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -398,12 +398,12 @@ void main() { col = clamp(col, 0.0, 1.0); gl_FragColor = vec4(col, alpha); -}`;const mn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},isTexture:{value:!1},scale:{value:1},noise:{value:new t.Texture},noiseStrength:{value:new t.Vector2(0,0)},isNoise:{value:!1},laminateLayer:{value:1},laminateInterval:{value:new t.Vector2(.1,.1)},laminateDetail:{value:new t.Vector2(1,1)},distortion:{value:new t.Vector2(0,0)},colorFactor:{value:new t.Vector3(1,1,1)},uTime:{value:0},timeStrength:{value:new t.Vector2(0,0)}},vertexShader:cn,fragmentShader:vn}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},se=Object.freeze({texture:!1,scale:1,laminateLayer:1,laminateInterval:new t.Vector2(.1,.1),laminateDetail:new t.Vector2(1,1),distortion:new t.Vector2(0,0),colorFactor:new t.Vector3(1,1,1),timeStrength:new t.Vector2(0,0),noise:!1,noiseStrength:new t.Vector2(0,0),beat:!1}),fn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=mn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(se);return[v.useCallback((x,h)=>{const{gl:g,clock:b}=x;return h&&p(h),a.texture?(o(n,"uTexture",a.texture),o(n,"isTexture",!0)):(o(n,"isTexture",!1),o(n,"scale",a.scale)),a.noise?(o(n,"noise",a.noise),o(n,"isNoise",!0),o(n,"noiseStrength",a.noiseStrength)):o(n,"isNoise",!1),o(n,"uTime",a.beat||b.getElapsedTime()),o(n,"laminateLayer",a.laminateLayer),o(n,"laminateInterval",a.laminateInterval),o(n,"laminateDetail",a.laminateDetail),o(n,"distortion",a.distortion),o(n,"colorFactor",a.colorFactor),o(n,"timeStrength",a.timeStrength),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var pn=`varying vec2 vUv; +}`;const yn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=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:bn,fragmentShader:Mn});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},de=Object.freeze({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),beat:!1}),wn=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=yn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(de),o=T(c);return[v.useCallback((b,M)=>{const{gl:x,clock:w}=b;return M&&d(M),i.texture?(o("uTexture",i.texture),o("isTexture",!0)):(o("isTexture",!1),o("scale",i.scale)),i.noise?(o("noise",i.noise),o("isNoise",!0),o("noiseStrength",i.noiseStrength)):o("isNoise",!1),o("uTime",i.beat||w.getElapsedTime()),o("laminateLayer",i.laminateLayer),o("laminateInterval",i.laminateInterval),o("laminateDetail",i.laminateDetail),o("distortion",i.distortion),o("colorFactor",i.colorFactor),o("timeStrength",i.timeStrength),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Sn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,dn=`precision highp float; +}`,_n=`precision highp float; varying vec2 vUv; uniform float u_time; @@ -428,12 +428,12 @@ void main() { float time = u_time * u_timeStrength; vec3 color = clamp(marble(vec3(gl_FragCoord.xy*u_scale,time)),0.,1.); gl_FragColor = vec4(color,1.); -}`;const gn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{u_time:{value:0},u_pattern:{value:0},u_complexity:{value:0},u_complexityAttenuation:{value:0},u_iterations:{value:0},u_timeStrength:{value:0},u_scale:{value:0}},vertexShader:pn,fragmentShader:dn}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},le=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),hn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=gn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(le);return[v.useCallback((x,h)=>{const{gl:g,clock:b}=x;return h&&p(h),o(n,"u_pattern",a.pattern),o(n,"u_complexity",a.complexity),o(n,"u_complexityAttenuation",a.complexityAttenuation),o(n,"u_iterations",a.iterations),o(n,"u_timeStrength",a.timeStrength),o(n,"u_scale",a.scale),o(n,"u_time",a.beat||b.getElapsedTime()),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var xn=`varying vec2 vUv; +}`;const Tn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{u_time:{value:0},u_pattern:{value:0},u_complexity:{value:0},u_complexityAttenuation:{value:0},u_iterations:{value:0},u_timeStrength:{value:0},u_scale:{value:0}},vertexShader:Sn,fragmentShader:_n});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},ge=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),Cn=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Tn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(ge),o=T(c);return[v.useCallback((b,M)=>{const{gl:x,clock:w}=b;return M&&d(M),o("u_pattern",i.pattern),o("u_complexity",i.complexity),o("u_complexityAttenuation",i.complexityAttenuation),o("u_iterations",i.iterations),o("u_timeStrength",i.timeStrength),o("u_scale",i.scale),o("u_time",i.beat||w.getElapsedTime()),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Pn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,yn=`precision highp float; +}`,Dn=`precision highp float; precision highp int; varying vec2 vUv; @@ -462,12 +462,12 @@ void main() { ); gl_FragColor = vec4(outColor, tex.a); -}`;const Mn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uRgbWeight:{value:new t.Vector3(.299,.587,.114)},uColor1:{value:new t.Color().set(.5,.5,.5)},uColor2:{value:new t.Color().set(.5,.5,.5)},uColor3:{value:new t.Color().set(1,1,1)},uColor4:{value:new t.Color().set(0,.1,.2)}},vertexShader:xn,fragmentShader:yn}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},ce=Object.freeze({texture:new t.Texture,color1:new t.Color().set(.5,.5,.5),color2:new t.Color().set(.5,.5,.5),color3:new t.Color().set(1,1,1),color4:new t.Color().set(0,.1,.2),rgbWeight:new t.Vector3(.299,.587,.114)}),bn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Mn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(ce);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"uTexture",a.texture),o(n,"uColor1",a.color1),o(n,"uColor2",a.color2),o(n,"uColor3",a.color3),o(n,"uColor4",a.color4),o(n,"uRgbWeight",a.rgbWeight),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var wn=`varying vec2 vUv; +}`;const Rn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uRgbWeight:{value:new n.Vector3(.299,.587,.114)},uColor1:{value:new n.Color().set(.5,.5,.5)},uColor2:{value:new n.Color().set(.5,.5,.5)},uColor3:{value:new n.Color().set(1,1,1)},uColor4:{value:new n.Color().set(0,.1,.2)}},vertexShader:Pn,fragmentShader:Dn});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},he=Object.freeze({texture:new n.Texture,color1:new n.Color().set(.5,.5,.5),color2:new n.Color().set(.5,.5,.5),color3:new n.Color().set(1,1,1),color4:new n.Color().set(0,.1,.2),rgbWeight:new n.Vector3(.299,.587,.114)}),An=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Rn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(he),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("uTexture",i.texture),o("uColor1",i.color1),o("uColor2",i.color2),o("uColor3",i.color3),o("uColor4",i.color4),o("uRgbWeight",i.rgbWeight),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var In=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Sn=`precision highp float; +}`,Fn=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -481,12 +481,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 _n=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uColor0:{value:new t.Color(16777215)},uColor1:{value:new t.Color(0)}},vertexShader:wn,fragmentShader:Sn}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},ve={texture:new t.Texture,color0:new t.Color(16777215),color1:new t.Color(0)},Cn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=_n(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(ve);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"uTexture",a.texture),o(n,"uColor0",a.color0),o(n,"uColor1",a.color1),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var Tn=`varying vec2 vUv; +}`;const Vn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uColor0:{value:new n.Color(16777215)},uColor1:{value:new n.Color(0)}},vertexShader:In,fragmentShader:Fn});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},xe={texture:new n.Texture,color0:new n.Color(16777215),color1:new n.Color(0)},zn=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Vn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(xe),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("uTexture",i.texture),o("uColor0",i.color0),o("uColor1",i.color1),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Un=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Pn=`precision highp float; +}`,On=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -526,12 +526,12 @@ void main() { vec3 alphColor = mix(outputColor,mapColor,mixValue); gl_FragColor = vec4(alphColor, alpha); -}`;const Rn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_map:{value:new t.Texture},u_alphaMap:{value:new t.Texture},u_isAlphaMap:{value:!1},u_mapIntensity:{value:0},u_brightness:{value:new t.Vector3},u_min:{value:0},u_max:{value:.9},u_dodgeColor:{value:new t.Color(16777215)},u_isDodgeColor:{value:!1}},vertexShader:Tn,fragmentShader:Pn}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},me={texture:new t.Texture,map:new t.Texture,alphaMap:!1,mapIntensity:.3,brightness:new t.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1},Dn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Rn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(me);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"u_texture",a.texture),o(n,"u_map",a.map),o(n,"u_mapIntensity",a.mapIntensity),a.alphaMap?(o(n,"u_alphaMap",a.alphaMap),o(n,"u_isAlphaMap",!0)):o(n,"u_isAlphaMap",!1),o(n,"u_brightness",a.brightness),o(n,"u_min",a.min),o(n,"u_max",a.max),a.dodgeColor?(o(n,"u_dodgeColor",a.dodgeColor),o(n,"u_isDodgeColor",!0)):o(n,"u_isDodgeColor",!1),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var An=`varying vec2 vUv; +}`;const Bn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=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:Un,fragmentShader:On});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},be={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},En=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Bn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(be),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("u_texture",i.texture),o("u_map",i.map),o("u_mapIntensity",i.mapIntensity),i.alphaMap?(o("u_alphaMap",i.alphaMap),o("u_isAlphaMap",!0)):o("u_isAlphaMap",!1),o("u_brightness",i.brightness),o("u_min",i.min),o("u_max",i.max),i.dodgeColor?(o("u_dodgeColor",i.dodgeColor),o("u_isDodgeColor",!0)):o("u_isDodgeColor",!1),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Wn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,In=`precision highp float; +}`,Ln=`precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -597,12 +597,12 @@ void main() { gl_FragColor = mix(color0, color1, progress); -}`;const Fn=({scene:e,size:i,dpr:r})=>{const u=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),s=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uResolution:{value:new t.Vector2},uTextureResolution:{value:new t.Vector2},uTexture0:{value:new t.Texture},uTexture1:{value:new t.Texture},padding:{value:0},uMap:{value:new t.Texture},edgeIntensity:{value:0},mapIntensity:{value:0},epicenter:{value:new t.Vector2(0,0)},progress:{value:0},dirX:{value:0},dirY:{value:0}},vertexShader:An,fragmentShader:In}),[]),c=W(i,r);o(s,"uResolution",c.clone());const n=I(e,u,s,t.Mesh);return{material:s,mesh:n}},fe={texture0:new t.Texture,texture1:new t.Texture,padding:0,map:new t.Texture,mapIntensity:0,edgeIntensity:0,epicenter:new t.Vector2(0,0),progress:0,dir:new t.Vector2(0,0)},zn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Fn({scene:c,size:e,dpr:s.shader}),m=F(e),[l,f]=U({scene:c,camera:m,dpr:s.fbo,size:e,samples:r,isSizeUpdate:u}),[a,p]=z(fe);return[v.useCallback((x,h)=>{var _,S,C,B,P,R,E,q;const{gl:g}=x;h&&p(h),o(n,"uTexture0",a.texture0),o(n,"uTexture1",a.texture1),o(n,"progress",a.progress);const b=[((S=(_=a.texture0)==null?void 0:_.image)==null?void 0:S.width)||0,((B=(C=a.texture0)==null?void 0:C.image)==null?void 0:B.height)||0],w=[((R=(P=a.texture1)==null?void 0:P.image)==null?void 0:R.width)||0,((q=(E=a.texture1)==null?void 0:E.image)==null?void 0:q.height)||0],T=b.map((L,X)=>L+(w[X]-L)*a.progress);return o(n,"uTextureResolution",T),o(n,"padding",a.padding),o(n,"uMap",a.map),o(n,"mapIntensity",a.mapIntensity),o(n,"edgeIntensity",a.edgeIntensity),o(n,"epicenter",a.epicenter),o(n,"dirX",a.dir.x),o(n,"dirY",a.dir.y),f(g)},[f,n,a,p]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var Un=`varying vec2 vUv; +}`;const kn=({scene:e,size:r,dpr:t,onBeforeCompile:a})=>{const s=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),u=v.useMemo(()=>{const m=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:Wn,fragmentShader:Ln});return a&&(m.onBeforeCompile=a),m},[a]),l=$(r,t);T(u)("uResolution",l.clone());const c=z(e,s,u,n.Mesh);return{material:u,mesh:c}},Me={texture0:new n.Texture,texture1:new n.Texture,padding:0,map:new n.Texture,mapIntensity:0,edgeIntensity:0,epicenter:new n.Vector2(0,0),progress:0,dir:new n.Vector2(0,0)},$n=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=kn({scene:l,size:e,dpr:u.shader,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,dpr:u.fbo,size:e,samples:t,isSizeUpdate:a}),[i,d]=O(Me),o=T(c);return[v.useCallback((b,M)=>{var _,D,A,R,P,W,I,k;const{gl:x}=b;M&&d(M),o("uTexture0",i.texture0),o("uTexture1",i.texture1),o("progress",i.progress);const w=[((D=(_=i.texture0)==null?void 0:_.image)==null?void 0:D.width)||0,((R=(A=i.texture0)==null?void 0:A.image)==null?void 0:R.height)||0],S=[((W=(P=i.texture1)==null?void 0:P.image)==null?void 0:W.width)||0,((k=(I=i.texture1)==null?void 0:I.image)==null?void 0:k.height)||0],C=w.map((ee,X)=>ee+(S[X]-ee)*i.progress);return o("uTextureResolution",C),o("padding",i.padding),o("uMap",i.map),o("mapIntensity",i.mapIntensity),o("edgeIntensity",i.edgeIntensity),o("epicenter",i.epicenter),o("dirX",i.dir.x),o("dirY",i.dir.y),g(x)},[g,o,i,d]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var qn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Bn=`precision highp float; +}`,jn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -616,12 +616,12 @@ 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 Vn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_brightness:{value:new t.Vector3},u_min:{value:0},u_max:{value:1}},vertexShader:Un,fragmentShader:Bn}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},pe={texture:new t.Texture,brightness:new t.Vector3(.5,.5,.5),min:0,max:1},On=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Vn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(pe);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"u_texture",a.texture),o(n,"u_brightness",a.brightness),o(n,"u_min",a.min),o(n,"u_max",a.max),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var En=`varying vec2 vUv; +}`;const Nn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=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:qn,fragmentShader:jn});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},ye={texture:new n.Texture,brightness:new n.Vector3(.5,.5,.5),min:0,max:1},Gn=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Nn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(ye),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("u_texture",i.texture),o("u_brightness",i.brightness),o("u_min",i.min),o("u_max",i.max),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Kn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Ln=`precision highp float; +}`,Xn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -639,12 +639,12 @@ void main() { uv = (uv + 1.0) / 2.0; gl_FragColor = texture2D(u_texture, uv); -}`;const Wn=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_map:{value:new t.Texture},u_mapIntensity:{value:0}},vertexShader:En,fragmentShader:Ln}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},de={texture:new t.Texture,map:new t.Texture,mapIntensity:.3},kn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Wn(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(de);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"u_texture",a.texture),o(n,"u_map",a.map),o(n,"u_mapIntensity",a.mapIntensity),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var $n=`varying vec2 vUv; +}`;const Hn=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_map:{value:new n.Texture},u_mapIntensity:{value:0}},vertexShader:Kn,fragmentShader:Xn});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},we={texture:new n.Texture,map:new n.Texture,mapIntensity:.3},Yn=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Hn({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(we),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("u_texture",i.texture),o("u_map",i.map),o("u_mapIntensity",i.mapIntensity),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Qn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,qn=`precision highp float; +}`,Zn=`precision highp float; uniform sampler2D uTexture; uniform sampler2D uMap; @@ -656,12 +656,12 @@ void main() { vec4 tex = texture2D(uTexture, uv); vec4 map = texture2D(uMap, uv); gl_FragColor = mix(tex,map,map.a); -}`;const jn=({scene:e,size:i})=>{const r=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),u=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uMap:{value:new t.Texture}},vertexShader:$n,fragmentShader:qn}),[]),s=I(e,r,u,t.Mesh);return{material:u,mesh:s}},ge={texture:new t.Texture,map:new t.Texture},Nn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=jn({scene:c,size:e}),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(ge);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"uTexture",a.texture),o(n,"uMap",a.map),f(g)},[n,f,a,p]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var Gn=`varying vec2 vUv; +}`;const Jn=({scene:e,size:r,onBeforeCompile:t})=>{const a=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),s=v.useMemo(()=>{const l=new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uMap:{value:new n.Texture}},vertexShader:Qn,fragmentShader:Zn});return t&&(l.onBeforeCompile=t),l},[t]),u=z(e,a,s,n.Mesh);return{material:s,mesh:u}},Se={texture:new n.Texture,map:new n.Texture},et=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=Jn({scene:l,size:e,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(Se),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("uTexture",i.texture),o("uMap",i.map),g(x)},[o,g,i,d]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var nt=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Kn=`precision highp float; +}`,tt=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -693,12 +693,12 @@ void main() { hsv.z *= u_brightness; vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); -}`;const Xn=({scene:e,size:i})=>{const r=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),u=v.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_brightness:{value:1},u_saturation:{value:1}},vertexShader:Gn,fragmentShader:Kn}),[]),s=I(e,r,u,t.Mesh);return{material:u,mesh:s}},he={texture:new t.Texture,brightness:1,saturation:1},Hn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Xn({scene:c,size:e}),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(he);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"u_texture",a.texture),o(n,"u_brightness",a.brightness),o(n,"u_saturation",a.saturation),f(g)},[n,f,a,p]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var Yn=`varying vec2 vUv; +}`;const rt=({scene:e,size:r,onBeforeCompile:t})=>{const a=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),s=v.useMemo(()=>{const l=new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_brightness:{value:1},u_saturation:{value:1}},vertexShader:nt,fragmentShader:tt});return t&&(l.onBeforeCompile=t),l},[t]),u=z(e,a,s,n.Mesh);return{material:s,mesh:u}},_e={texture:new n.Texture,brightness:1,saturation:1},ot=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=rt({scene:l,size:e,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(_e),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("u_texture",i.texture),o("u_brightness",i.brightness),o("u_saturation",i.saturation),g(x)},[o,g,i,d]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var at=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Qn=`precision highp float; +}`,it=`precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -716,14 +716,14 @@ void main() { gl_FragColor = texture2D(uTexture, uv); -}`;const Zn=({scene:e,size:i,dpr:r})=>{const u=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),s=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uResolution:{value:new t.Vector2},uTextureResolution:{value:new t.Vector2},uTexture:{value:new t.Texture}},vertexShader:Yn,fragmentShader:Qn}),[]),c=W(i,r);o(s,"uResolution",c.clone());const n=I(e,u,s,t.Mesh);return{material:s,mesh:n}},xe={texture:new t.Texture},Jn=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=Zn({scene:c,size:e,dpr:s.shader}),m=F(e),[l,f]=U({scene:c,camera:m,dpr:s.fbo,size:e,samples:r,isSizeUpdate:u}),[a,p]=z(xe);return[v.useCallback((x,h)=>{var b,w,T,_,S,C;const{gl:g}=x;return h&&p(h),o(n,"uTexture",a.texture),o(n,"uTextureResolution",[((T=(w=(b=a.texture)==null?void 0:b.source)==null?void 0:w.data)==null?void 0:T.width)||0,((C=(S=(_=a.texture)==null?void 0:_.source)==null?void 0:S.data)==null?void 0:C.height)||0]),f(g)},[f,n,a,p]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var et=`precision mediump float; +}`;const ut=({scene:e,size:r,dpr:t,onBeforeCompile:a})=>{const s=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),u=v.useMemo(()=>{const m=new n.ShaderMaterial({uniforms:{uResolution:{value:new n.Vector2},uTextureResolution:{value:new n.Vector2},uTexture:{value:new n.Texture}},vertexShader:at,fragmentShader:it});return a&&(m.onBeforeCompile=a),m},[a]),l=$(r,t);T(u)("uResolution",l.clone());const c=z(e,s,u,n.Mesh);return{material:u,mesh:c}},Te={texture:new n.Texture},st=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=ut({scene:l,size:e,dpr:u.shader,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,dpr:u.fbo,size:e,samples:t,isSizeUpdate:a}),[i,d]=O(Te),o=T(c);return[v.useCallback((b,M)=>{var w,S,C,_,D,A;const{gl:x}=b;return M&&d(M),o("uTexture",i.texture),o("uTextureResolution",[((C=(S=(w=i.texture)==null?void 0:w.source)==null?void 0:S.data)==null?void 0:C.width)||0,((A=(D=(_=i.texture)==null?void 0:_.source)==null?void 0:D.data)==null?void 0:A.height)||0]),g(x)},[g,o,i,d]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var lt=`precision highp float; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,nt=`precision mediump float; +}`,ct=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -748,14 +748,14 @@ void main() { ) / 9.0; gl_FragColor = outColor; -}`;const tt=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uResolution:{value:new t.Vector2(0,0)},uBlurSize:{value:ne.blurSize}},vertexShader:et,fragmentShader:nt}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},ne=Object.freeze({texture:new t.Texture,blurSize:3,blurPower:5}),rt=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=tt(c),m=F(e),l=v.useMemo(()=>({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[c,m,e,s.fbo,r,u]),[f,a]=N(l),[p,y]=z(ne);return[v.useCallback((h,g)=>{var _,S,C,B,P,R;const{gl:b}=h;g&&y(g),o(n,"uTexture",p.texture),o(n,"uResolution",[((C=(S=(_=p.texture)==null?void 0:_.source)==null?void 0:S.data)==null?void 0:C.width)||0,((R=(P=(B=p.texture)==null?void 0:B.source)==null?void 0:P.data)==null?void 0:R.height)||0]),o(n,"uBlurSize",p.blurSize);let w=a(b);const T=p.blurPower;for(let E=0;E{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{uTexture:{value:new n.Texture},uResolution:{value:new n.Vector2(0,0)},uBlurSize:{value:oe.blurSize}},vertexShader:lt,fragmentShader:ct});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},oe=Object.freeze({texture:new n.Texture,blurSize:3,blurPower:5}),mt=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=vt({scene:l,onBeforeCompile:s}),p=U(e),f=v.useMemo(()=>({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[l,p,e,u.fbo,t,a]),[g,i]=G(f),[d,o]=O(oe),h=T(c);return[v.useCallback((M,x)=>{var _,D,A,R,P,W;const{gl:w}=M;x&&o(x),h("uTexture",d.texture),h("uResolution",[((A=(D=(_=d.texture)==null?void 0:_.source)==null?void 0:D.data)==null?void 0:A.width)||0,((W=(P=(R=d.texture)==null?void 0:R.source)==null?void 0:P.data)==null?void 0:W.height)||0]),h("uBlurSize",d.blurSize);let S=i(w);const C=d.blurPower;for(let I=0;I{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:G.texture},uBackbuffer:{value:new t.Texture},uBegin:{value:G.begin},uEnd:{value:G.end},uStrength:{value:G.strength}},vertexShader:ot,fragmentShader:it}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},G=Object.freeze({texture:new t.Texture,begin:new t.Vector2(0,0),end:new t.Vector2(0,0),strength:.9}),ut=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=at(c),m=F(e),l=v.useMemo(()=>({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[c,m,e,s.fbo,r,u]),[f,a]=N(l),[p,y]=z(G);return[v.useCallback((h,g)=>{const{gl:b}=h;return g&&y(g),o(n,"uTexture",p.texture),o(n,"uBegin",p.begin),o(n,"uEnd",p.end),o(n,"uStrength",p.strength),a(b,({read:w})=>{o(n,"uBackbuffer",w)})},[a,n,y,p]),y,{scene:c,mesh:d,material:n,camera:m,renderTarget:f,output:f.read.texture}]};var st=`varying vec2 vUv; +}`;const dt=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{uTexture:{value:H.texture},uBackbuffer:{value:new n.Texture},uBegin:{value:H.begin},uEnd:{value:H.end},uStrength:{value:H.strength}},vertexShader:ft,fragmentShader:pt});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},H=Object.freeze({texture:new n.Texture,begin:new n.Vector2(0,0),end:new n.Vector2(0,0),strength:.9}),gt=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=dt({scene:l,onBeforeCompile:s}),p=U(e),f=v.useMemo(()=>({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[l,p,e,u.fbo,t,a]),[g,i]=G(f),[d,o]=O(H),h=T(c);return[v.useCallback((M,x)=>{const{gl:w}=M;return x&&o(x),h("uTexture",d.texture),h("uBegin",d.begin),h("uEnd",d.end),h("uStrength",d.strength),i(w,({read:S})=>{h("uBackbuffer",S)})},[i,h,o,d]),o,{scene:l,mesh:m,material:c,camera:p,renderTarget:g,output:g.read.texture}]};var ht=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,lt=`precision highp float; +}`,xt=`precision highp float; varying vec2 vUv; uniform float uProgress; @@ -824,12 +824,12 @@ void main() { color *= progressFactor; gl_FragColor = vec4(color, 1.0); -}`;const ct=e=>{const i=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=v.useMemo(()=>new t.ShaderMaterial({uniforms:{uEpicenter:{value:K.epicenter},uProgress:{value:K.progress},uStrength:{value:K.strength},uWidth:{value:K.width},uMode:{value:0}},vertexShader:st,fragmentShader:lt}),[]),u=I(e,i,r,t.Mesh);return{material:r,mesh:u}},K=Object.freeze({epicenter:new t.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),vt=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=ct(c),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(K);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"uEpicenter",a.epicenter),o(n,"uProgress",a.progress),o(n,"uWidth",a.width),o(n,"uStrength",a.strength),o(n,"uMode",a.mode==="center"?0:a.mode==="horizontal"?1:2),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]};var mt=`varying vec2 vUv; +}`;const bt=({scene:e,onBeforeCompile:r})=>{const t=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),a=v.useMemo(()=>{const u=new n.ShaderMaterial({uniforms:{uEpicenter:{value:Y.epicenter},uProgress:{value:Y.progress},uStrength:{value:Y.strength},uWidth:{value:Y.width},uMode:{value:0}},vertexShader:ht,fragmentShader:xt});return r&&(u.onBeforeCompile=r),u},[r]),s=z(e,t,a,n.Mesh);return{material:a,mesh:s}},Y=Object.freeze({epicenter:new n.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),Mt=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=bt({scene:l,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(Y),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("uEpicenter",i.epicenter),o("uProgress",i.progress),o("uWidth",i.width),o("uStrength",i.strength),o("uMode",i.mode==="center"?0:i.mode==="horizontal"?1:2),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var yt=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,ft=`precision highp float; +}`,wt=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -897,7 +897,34 @@ void main() { vec4 finColor = CalcColor(texColor); gl_FragColor = finColor; -}`;const pt=({scene:e,size:i,dpr:r})=>{const u=v.useMemo(()=>new t.PlaneGeometry(2,2),[]),s=v.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_resolution:{value:new t.Vector2},u_keyColor:{value:new t.Color},u_similarity:{value:0},u_smoothness:{value:0},u_spill:{value:0},u_color:{value:new t.Vector4},u_contrast:{value:0},u_brightness:{value:0},u_gamma:{value:0}},vertexShader:mt,fragmentShader:ft}),[]),c=W(i,r);o(s,"u_resolution",c.clone());const n=I(e,u,s,t.Mesh);return{material:s,mesh:n}},ye=Object.freeze({texture:new t.Texture,keyColor:new t.Color(65280),similarity:.2,smoothness:.1,spill:.2,color:new t.Vector4(1,1,1,1),contrast:1,brightness:0,gamma:1}),dt=({size:e,dpr:i,samples:r,isSizeUpdate:u})=>{const s=A(i),c=v.useMemo(()=>new t.Scene,[]),{material:n,mesh:d}=pt({scene:c,size:e,dpr:s.shader}),m=F(e),[l,f]=U({scene:c,camera:m,size:e,dpr:s.fbo,samples:r,isSizeUpdate:u}),[a,p]=z(ye);return[v.useCallback((x,h)=>{const{gl:g}=x;return h&&p(h),o(n,"u_texture",a.texture),o(n,"u_keyColor",a.keyColor),o(n,"u_similarity",a.similarity),o(n,"u_smoothness",a.smoothness),o(n,"u_spill",a.spill),o(n,"u_color",a.color),o(n,"u_contrast",a.contrast),o(n,"u_brightness",a.brightness),o(n,"u_gamma",a.gamma),f(g)},[f,n,p,a]),p,{scene:c,mesh:d,material:n,camera:m,renderTarget:l,output:l.texture}]},gt=({scene:e,geometry:i,material:r})=>{const u=I(e,i,r,t.Points),s=I(e,v.useMemo(()=>i.clone(),[i]),v.useMemo(()=>r.clone(),[r]),t.Mesh);return s.visible=!1,{points:u,interactiveMesh:s}};var ht=`uniform vec2 uResolution; +}`;const St=({scene:e,size:r,dpr:t,onBeforeCompile:a})=>{const s=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),u=v.useMemo(()=>{const m=new n.ShaderMaterial({uniforms:{u_texture:{value:new n.Texture},u_resolution:{value:new n.Vector2},u_keyColor:{value:new n.Color},u_similarity:{value:0},u_smoothness:{value:0},u_spill:{value:0},u_color:{value:new n.Vector4},u_contrast:{value:0},u_brightness:{value:0},u_gamma:{value:0}},vertexShader:yt,fragmentShader:wt});return a&&(m.onBeforeCompile=a),m},[a]),l=$(r,t);T(u)("u_resolution",l.clone());const c=z(e,s,u,n.Mesh);return{material:u,mesh:c}},Ce=Object.freeze({texture:new n.Texture,keyColor:new n.Color(65280),similarity:.2,smoothness:.1,spill:.2,color:new n.Vector4(1,1,1,1),contrast:1,brightness:0,gamma:1}),_t=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s})=>{const u=F(r),l=v.useMemo(()=>new n.Scene,[]),{material:c,mesh:m}=St({scene:l,size:e,dpr:u.shader,onBeforeCompile:s}),p=U(e),[f,g]=B({scene:l,camera:p,size:e,dpr:u.fbo,samples:t,isSizeUpdate:a}),[i,d]=O(Ce),o=T(c);return[v.useCallback((b,M)=>{const{gl:x}=b;return M&&d(M),o("u_texture",i.texture),o("u_keyColor",i.keyColor),o("u_similarity",i.similarity),o("u_smoothness",i.smoothness),o("u_spill",i.spill),o("u_color",i.color),o("u_contrast",i.contrast),o("u_brightness",i.brightness),o("u_gamma",i.gamma),g(x)},[g,o,d,i]),d,{scene:l,mesh:m,material:c,camera:p,renderTarget:f,output:f.texture}]};var Tt=`precision highp float; + +varying vec2 vUv; + +void main() { + vec4 usf_Position = vec4(position,1.); + vUv = uv; + + + + gl_Position = usf_Position; +}`,Ct=`precision highp float; + +varying vec2 vUv; + +uniform sampler2D uTexture; +uniform sampler2D uBackbuffer; +uniform float uTime; +uniform vec2 uPointer; +uniform vec2 uResolution; + +void main() { + vec4 usf_FragColor = vec4(1.); + + + + gl_FragColor = usf_FragColor; +}`;const Pt=({scene:e,size:r,dpr:t,onBeforeCompile:a,uniforms:s})=>{const u=v.useMemo(()=>new n.PlaneGeometry(2,2),[]),l=v.useMemo(()=>{const p=new n.ShaderMaterial({uniforms:{uTexture:{value:ae.texture},uBackbuffer:{value:new n.Texture},uTime:{value:0},uPointer:{value:new n.Vector2},uResolution:{value:new n.Vector2},...s},vertexShader:Tt,fragmentShader:Ct});return a&&(p.onBeforeCompile=a),p},[a,s]),c=$(r,t);T(l)("uResolution",c.clone());const m=z(e,u,l,n.Mesh);return{material:l,mesh:m}},ae=Object.freeze({texture:new n.Texture,beat:!1}),Dt=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s,uniforms:u})=>{const l=F(r),c=v.useMemo(()=>new n.Scene,[]),{material:m,mesh:p}=Pt({scene:c,size:e,dpr:l.shader,onBeforeCompile:s,uniforms:u}),f=U(e),g=v.useMemo(()=>({scene:c,camera:f,size:e,dpr:l.fbo,samples:t,isSizeUpdate:a}),[c,f,e,l.fbo,t,a]),[i,d]=G(g),[o,h]=O(ae),b=T(m);return[v.useCallback((x,w)=>{const{gl:S,clock:C,pointer:_}=x;return w&&h(w),b("uTexture",o.texture),b("uPointer",_),b("uTime",o.beat||C.getElapsedTime()),d(S,({read:D})=>{b("uBackbuffer",D)})},[d,b,h,o]),h,{scene:c,mesh:p,material:m,camera:f,renderTarget:i,output:i.read.texture}]},Rt=({scene:e,geometry:r,material:t})=>{const a=z(e,r,t,n.Points),s=z(e,v.useMemo(()=>r.clone(),[r]),v.useMemo(()=>t.clone(),[t]),n.Mesh);return s.visible=!1,{points:a,interactiveMesh:s}};var At=`uniform vec2 uResolution; uniform float uMorphProgress; uniform float uPointSize; @@ -999,7 +1026,7 @@ void main() { vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; -}`,xt=`precision highp float; +}`,It=`precision highp float; precision highp int; varying vec3 vColor; @@ -1041,7 +1068,7 @@ void main() { float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); -}`,Me=`vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +}`,Pe=`vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} float permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));} vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} float taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;} @@ -1146,21 +1173,21 @@ float getWobble(vec3 position) return simplexNoise4d(vec4( warpedPosition * uWobblePositionFrequency, - uTime * uWobbleTimeFrequency + uTime * uWobbleTimeFrequency )) * uWobbleStrength; -}`;const be=process.env.NODE_ENV==="development",we=(e,i,r,u,s)=>{var f;const c=r==="position"?"positionTarget":"uvTarget",n=r==="position"?"#usf ":"#usf ",d=r==="position"?"#usf ":"#usf ",m=r==="position"?"positionsList":"uvsList",l=r==="position"?` +}`;const De=process.env.NODE_ENV==="development",Re=(e,r,t,a,s)=>{var f;const u=t==="position"?"positionTarget":"uvTarget",l=t==="position"?"#usf ":"#usf ",c=t==="position"?"#usf ":"#usf ",m=t==="position"?"positionsList":"uvsList",p=t==="position"?` float scaledProgress = uMorphProgress * ${e.length-1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length-1}); float progress = fract(scaledProgress); int nextIndex = baseIndex + 1; newPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress); - `:"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);";if(e.length>0){i.deleteAttribute(r),i.setAttribute(r,new t.BufferAttribute(e[0],s));let a="",p="";e.forEach((y,x)=>{i.setAttribute(`${c}${x}`,new t.BufferAttribute(y,s)),a+=`attribute vec${s} ${c}${x}; -`,x===0?p+=`${c}${x}`:p+=`,${c}${x}`}),u=u.replace(`${n}`,a),u=u.replace(`${d}`,`vec${s} ${m}[${e.length}] = vec${s}[](${p}); - ${l} - `)}else u=u.replace(`${n}`,""),u=u.replace(`${d}`,""),(f=i==null?void 0:i.attributes[r])!=null&&f.array||be&&console.error(`use-shader-fx:geometry.attributes.${r}.array is not found`);return u},Se=(e,i,r,u)=>{var c;let s=[];if(e&&e.length>0){(c=i==null?void 0:i.attributes[r])!=null&&c.array?s=[i.attributes[r].array,...e]:s=e;const n=Math.max(...s.map(d=>d.length));s.forEach((d,m)=>{if(d.length{let r="";const u={};let s="mapArrayColor = ";return e&&e.length>0?(e.forEach((n,d)=>{const m=`vMapArrayIndex < ${d}.1`,l=`texture2D(uMapArray${d}, uv)`;s+=`( ${m} ) ? ${l} : `,r+=` - uniform sampler2D uMapArray${d}; - `,u[`uMapArray${d}`]={value:n}}),s+="vec4(1.);",r+="bool isMapArray = true;",u.uMapArrayLength={value:e.length}):(s+="vec4(1.0);",r+="bool isMapArray = false;",u.uMapArrayLength={value:0}),{rewritedFragmentShader:i.replace("#usf ",s).replace("#usf ",r),mapArrayUniforms:u}},Mt=({size:e,dpr:i,geometry:r,positions:u,uvs:s,mapArray:c})=>{const n=v.useMemo(()=>Se(u,r,"position",3),[u,r]),d=v.useMemo(()=>Se(s,r,"uv",2),[s,r]),m=v.useMemo(()=>{n.length!==d.length&&be&&console.log("use-shader-fx:positions and uvs are not matched");const f=we(d,r,"uv",we(n,r,"position",ht,3),2).replace("#usf ",Me),a=yt(c,xt);return new t.ShaderMaterial({vertexShader:f,fragmentShader:a.rewritedFragmentShader,depthTest:!1,depthWrite:!1,transparent:!0,blending:t.AdditiveBlending,uniforms:{uResolution:{value:new t.Vector2(0,0)},uMorphProgress:{value:D.morphProgress},uBlurAlpha:{value:D.blurAlpha},uBlurRadius:{value:D.blurRadius},uPointSize:{value:D.pointSize},uPointAlpha:{value:D.pointAlpha},uPicture:{value:new t.Texture},uIsPicture:{value:!1},uAlphaPicture:{value:new t.Texture},uIsAlphaPicture:{value:!1},uColor0:{value:D.color0},uColor1:{value:D.color1},uColor2:{value:D.color2},uColor3:{value:D.color3},uMap:{value:new t.Texture},uIsMap:{value:!1},uAlphaMap:{value:new t.Texture},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:D.wobblePositionFrequency},uWobbleTimeFrequency:{value:D.wobbleTimeFrequency},uWobbleStrength:{value:D.wobbleStrength},uWarpPositionFrequency:{value:D.warpPositionFrequency},uWarpTimeFrequency:{value:D.warpTimeFrequency},uWarpStrength:{value:D.warpStrength},uDisplacement:{value:new t.Texture},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:D.displacementIntensity},uDisplacementColorIntensity:{value:D.displacementColorIntensity},uSizeRandomIntensity:{value:D.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:D.sizeRandomTimeFrequency},uSizeRandomMin:{value:D.sizeRandomMin},uSizeRandomMax:{value:D.sizeRandomMax},uDivergence:{value:D.divergence},uDivergencePoint:{value:D.divergencePoint},...a.mapArrayUniforms}})},[r,n,d,c]),l=W(e,i);return o(m,"uResolution",l.clone()),{material:m,modifiedPositions:n,modifiedUvs:d}},_e=({size:e,dpr:i,scene:r=!1,geometry:u,positions:s,uvs:c,mapArray:n})=>{const d=A(i),m=v.useMemo(()=>{const h=u||new t.SphereGeometry(1,32,32);return h.setIndex(null),h.deleteAttribute("normal"),h},[u]),{material:l,modifiedPositions:f,modifiedUvs:a}=Mt({size:e,dpr:d.shader,geometry:m,positions:s,uvs:c,mapArray:n}),{points:p,interactiveMesh:y}=gt({scene:r,geometry:m,material:l});return[v.useCallback((h,g)=>{h&&o(l,"uTime",(g==null?void 0:g.beat)||h.clock.getElapsedTime()),g!==void 0&&(o(l,"uMorphProgress",g.morphProgress),o(l,"uBlurAlpha",g.blurAlpha),o(l,"uBlurRadius",g.blurRadius),o(l,"uPointSize",g.pointSize),o(l,"uPointAlpha",g.pointAlpha),g.picture?(o(l,"uPicture",g.picture),o(l,"uIsPicture",!0)):g.picture===!1&&o(l,"uIsPicture",!1),g.alphaPicture?(o(l,"uAlphaPicture",g.alphaPicture),o(l,"uIsAlphaPicture",!0)):g.alphaPicture===!1&&o(l,"uIsAlphaPicture",!1),o(l,"uColor0",g.color0),o(l,"uColor1",g.color1),o(l,"uColor2",g.color2),o(l,"uColor3",g.color3),g.map?(o(l,"uMap",g.map),o(l,"uIsMap",!0)):g.map===!1&&o(l,"uIsMap",!1),g.alphaMap?(o(l,"uAlphaMap",g.alphaMap),o(l,"uIsAlphaMap",!0)):g.alphaMap===!1&&o(l,"uIsAlphaMap",!1),o(l,"uWobbleStrength",g.wobbleStrength),o(l,"uWobblePositionFrequency",g.wobblePositionFrequency),o(l,"uWobbleTimeFrequency",g.wobbleTimeFrequency),o(l,"uWarpStrength",g.warpStrength),o(l,"uWarpPositionFrequency",g.warpPositionFrequency),o(l,"uWarpTimeFrequency",g.warpTimeFrequency),g.displacement?(o(l,"uDisplacement",g.displacement),o(l,"uIsDisplacement",!0)):g.displacement===!1&&o(l,"uIsDisplacement",!1),o(l,"uDisplacementIntensity",g.displacementIntensity),o(l,"uDisplacementColorIntensity",g.displacementColorIntensity),o(l,"uSizeRandomIntensity",g.sizeRandomIntensity),o(l,"uSizeRandomTimeFrequency",g.sizeRandomTimeFrequency),o(l,"uSizeRandomMin",g.sizeRandomMin),o(l,"uSizeRandomMax",g.sizeRandomMax),o(l,"uDivergence",g.divergence),o(l,"uDivergencePoint",g.divergencePoint))},[l]),{points:p,interactiveMesh:y,positions:f,uvs:a}]},D=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,pointAlpha:1,picture:!1,alphaPicture:!1,color0:new t.Color(16711680),color1:new t.Color(65280),color2:new t.Color(255),color3:new t.Color(16776960),map:!1,alphaMap:!1,wobbleStrength:0,wobblePositionFrequency:.5,wobbleTimeFrequency:.5,warpStrength:0,warpPositionFrequency:.5,warpTimeFrequency:.5,displacement:!1,displacementIntensity:1,displacementColorIntensity:0,sizeRandomIntensity:0,sizeRandomTimeFrequency:.2,sizeRandomMin:.5,sizeRandomMax:1.5,divergence:0,divergencePoint:new t.Vector3(0),beat:!1}),bt=({size:e,dpr:i,samples:r,isSizeUpdate:u,camera:s,geometry:c,positions:n,uvs:d})=>{const m=A(i),l=v.useMemo(()=>new t.Scene,[]),[f,{points:a,interactiveMesh:p,positions:y,uvs:x}]=_e({scene:l,size:e,dpr:i,geometry:c,positions:n,uvs:d}),[h,g]=U({scene:l,camera:s,size:e,dpr:m.fbo,samples:r,isSizeUpdate:u,depthBuffer:!0}),b=v.useCallback((T,_)=>(f(T,_),g(T.gl)),[g,f]),w=v.useCallback(T=>{f(null,T)},[f]);return[b,w,{scene:l,points:a,interactiveMesh:p,renderTarget:h,output:h.texture,positions:y,uvs:x}]};function wt(e,i=1e-4){i=Math.max(i,Number.EPSILON);const r={},u=e.getIndex(),s=e.getAttribute("position"),c=u?u.count:s.count;let n=0;const d=Object.keys(e.attributes),m={},l={},f=[],a=["getX","getY","getZ","getW"];for(let h=0,g=d.length;h[]))}const p=Math.log10(1/i),y=Math.pow(10,p);for(let h=0;h0){r.deleteAttribute(t),r.setAttribute(t,new n.BufferAttribute(e[0],s));let g="",i="";e.forEach((d,o)=>{r.setAttribute(`${u}${o}`,new n.BufferAttribute(d,s)),g+=`attribute vec${s} ${u}${o}; +`,o===0?i+=`${u}${o}`:i+=`,${u}${o}`}),a=a.replace(`${l}`,g),a=a.replace(`${c}`,`vec${s} ${m}[${e.length}] = vec${s}[](${i}); + ${p} + `)}else a=a.replace(`${l}`,""),a=a.replace(`${c}`,""),(f=r==null?void 0:r.attributes[t])!=null&&f.array||De&&console.error(`use-shader-fx:geometry.attributes.${t}.array is not found`);return a},Ae=(e,r,t,a)=>{var u;let s=[];if(e&&e.length>0){(u=r==null?void 0:r.attributes[t])!=null&&u.array?s=[r.attributes[t].array,...e]:s=e;const l=Math.max(...s.map(c=>c.length));s.forEach((c,m)=>{if(c.length{let t="";const a={};let s="mapArrayColor = ";return e&&e.length>0?(e.forEach((l,c)=>{const m=`vMapArrayIndex < ${c}.1`,p=`texture2D(uMapArray${c}, uv)`;s+=`( ${m} ) ? ${p} : `,t+=` + uniform sampler2D uMapArray${c}; + `,a[`uMapArray${c}`]={value:l}}),s+="vec4(1.);",t+="bool isMapArray = true;",a.uMapArrayLength={value:e.length}):(s+="vec4(1.0);",t+="bool isMapArray = false;",a.uMapArrayLength={value:0}),{rewritedFragmentShader:r.replace("#usf ",s).replace("#usf ",t),mapArrayUniforms:a}},Vt=({size:e,dpr:r,geometry:t,positions:a,uvs:s,mapArray:u,onBeforeCompile:l})=>{const c=v.useMemo(()=>Ae(a,t,"position",3),[a,t]),m=v.useMemo(()=>Ae(s,t,"uv",2),[s,t]),p=v.useMemo(()=>{c.length!==m.length&&De&&console.log("use-shader-fx:positions and uvs are not matched");const g=Re(m,t,"uv",Re(c,t,"position",At,3),2).replace("#usf ",Pe),{rewritedFragmentShader:i,mapArrayUniforms:d}=Ft(u,It),o=new n.ShaderMaterial({vertexShader:g,fragmentShader:i,depthTest:!1,depthWrite:!1,transparent:!0,blending:n.AdditiveBlending,uniforms:{uResolution:{value:new n.Vector2(0,0)},uMorphProgress:{value:V.morphProgress},uBlurAlpha:{value:V.blurAlpha},uBlurRadius:{value:V.blurRadius},uPointSize:{value:V.pointSize},uPointAlpha:{value:V.pointAlpha},uPicture:{value:new n.Texture},uIsPicture:{value:!1},uAlphaPicture:{value:new n.Texture},uIsAlphaPicture:{value:!1},uColor0:{value:V.color0},uColor1:{value:V.color1},uColor2:{value:V.color2},uColor3:{value:V.color3},uMap:{value:new n.Texture},uIsMap:{value:!1},uAlphaMap:{value:new n.Texture},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:V.wobblePositionFrequency},uWobbleTimeFrequency:{value:V.wobbleTimeFrequency},uWobbleStrength:{value:V.wobbleStrength},uWarpPositionFrequency:{value:V.warpPositionFrequency},uWarpTimeFrequency:{value:V.warpTimeFrequency},uWarpStrength:{value:V.warpStrength},uDisplacement:{value:new n.Texture},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:V.displacementIntensity},uDisplacementColorIntensity:{value:V.displacementColorIntensity},uSizeRandomIntensity:{value:V.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:V.sizeRandomTimeFrequency},uSizeRandomMin:{value:V.sizeRandomMin},uSizeRandomMax:{value:V.sizeRandomMax},uDivergence:{value:V.divergence},uDivergencePoint:{value:V.divergencePoint},...d}});return l&&(o.onBeforeCompile=l),o},[t,c,m,u,l]),f=$(e,r);return T(p)("uResolution",f.clone()),{material:p,modifiedPositions:c,modifiedUvs:m}},Ie=({size:e,dpr:r,scene:t=!1,geometry:a,positions:s,uvs:u,mapArray:l,onBeforeCompile:c})=>{const m=F(r),p=v.useMemo(()=>{const M=a||new n.SphereGeometry(1,32,32);return M.setIndex(null),M.deleteAttribute("normal"),M},[a]),{material:f,modifiedPositions:g,modifiedUvs:i}=Vt({size:e,dpr:m.shader,geometry:p,positions:s,uvs:u,mapArray:l,onBeforeCompile:c}),{points:d,interactiveMesh:o}=Rt({scene:t,geometry:p,material:f}),h=T(f);return[v.useCallback((M,x)=>{M&&h("uTime",(x==null?void 0:x.beat)||M.clock.getElapsedTime()),x!==void 0&&(h("uMorphProgress",x.morphProgress),h("uBlurAlpha",x.blurAlpha),h("uBlurRadius",x.blurRadius),h("uPointSize",x.pointSize),h("uPointAlpha",x.pointAlpha),x.picture?(h("uPicture",x.picture),h("uIsPicture",!0)):x.picture===!1&&h("uIsPicture",!1),x.alphaPicture?(h("uAlphaPicture",x.alphaPicture),h("uIsAlphaPicture",!0)):x.alphaPicture===!1&&h("uIsAlphaPicture",!1),h("uColor0",x.color0),h("uColor1",x.color1),h("uColor2",x.color2),h("uColor3",x.color3),x.map?(h("uMap",x.map),h("uIsMap",!0)):x.map===!1&&h("uIsMap",!1),x.alphaMap?(h("uAlphaMap",x.alphaMap),h("uIsAlphaMap",!0)):x.alphaMap===!1&&h("uIsAlphaMap",!1),h("uWobbleStrength",x.wobbleStrength),h("uWobblePositionFrequency",x.wobblePositionFrequency),h("uWobbleTimeFrequency",x.wobbleTimeFrequency),h("uWarpStrength",x.warpStrength),h("uWarpPositionFrequency",x.warpPositionFrequency),h("uWarpTimeFrequency",x.warpTimeFrequency),x.displacement?(h("uDisplacement",x.displacement),h("uIsDisplacement",!0)):x.displacement===!1&&h("uIsDisplacement",!1),h("uDisplacementIntensity",x.displacementIntensity),h("uDisplacementColorIntensity",x.displacementColorIntensity),h("uSizeRandomIntensity",x.sizeRandomIntensity),h("uSizeRandomTimeFrequency",x.sizeRandomTimeFrequency),h("uSizeRandomMin",x.sizeRandomMin),h("uSizeRandomMax",x.sizeRandomMax),h("uDivergence",x.divergence),h("uDivergencePoint",x.divergencePoint))},[h]),{points:d,interactiveMesh:o,positions:g,uvs:i}]},V=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,pointAlpha:1,picture:!1,alphaPicture:!1,color0:new n.Color(16711680),color1:new n.Color(65280),color2:new n.Color(255),color3:new n.Color(16776960),map:!1,alphaMap:!1,wobbleStrength:0,wobblePositionFrequency:.5,wobbleTimeFrequency:.5,warpStrength:0,warpPositionFrequency:.5,warpTimeFrequency:.5,displacement:!1,displacementIntensity:1,displacementColorIntensity:0,sizeRandomIntensity:0,sizeRandomTimeFrequency:.2,sizeRandomMin:.5,sizeRandomMax:1.5,divergence:0,divergencePoint:new n.Vector3(0),beat:!1}),zt=({size:e,dpr:r,samples:t,isSizeUpdate:a,camera:s,geometry:u,positions:l,uvs:c,onBeforeCompile:m})=>{const p=F(r),f=v.useMemo(()=>new n.Scene,[]),[g,{points:i,interactiveMesh:d,positions:o,uvs:h}]=Ie({scene:f,size:e,dpr:r,geometry:u,positions:l,uvs:c,onBeforeCompile:m}),[b,M]=B({scene:f,camera:s,size:e,dpr:p.fbo,samples:t,isSizeUpdate:a,depthBuffer:!0}),x=v.useCallback((S,C)=>(g(S,C),M(S.gl)),[M,g]),w=v.useCallback(S=>{g(null,S)},[g]);return[x,w,{scene:f,points:i,interactiveMesh:d,renderTarget:b,output:b.texture,positions:o,uvs:h}]};function Ut(e,r=1e-4){r=Math.max(r,Number.EPSILON);const t={},a=e.getIndex(),s=e.getAttribute("position"),u=a?a.count:s.count;let l=0;const c=Object.keys(e.attributes),m={},p={},f=[],g=["getX","getY","getZ","getW"];for(let h=0,b=c.length;h[]))}const i=Math.log10(1/r),d=Math.pow(10,i);for(let h=0;h{let i=e;return i=i.replace("#include ",` +#endif`;const Fe=e=>{let r=e;return r=r.replace("#include ",` vec3 objectNormal = usf_Normal; #ifdef USE_TANGENT vec3 objectTangent = vec3( tangent.xyz ); - #endif`),i=i.replace("#include ",` - vec3 transformed = usf_Position;`),i=i.replace("void main() {",` + #endif`),r=r.replace("#include ",` + vec3 transformed = usf_Position;`),r=r.replace("void main() {",` uniform float uTime; uniform float uWobblePositionFrequency; uniform float uWobbleTimeFrequency; @@ -1494,11 +1521,15 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); uniform float uWarpPositionFrequency; uniform float uWarpTimeFrequency; uniform float uWarpStrength; + uniform bool uIsWobbleMap; + uniform sampler2D uWobbleMap; + uniform float uWobbleMapStrength; + uniform float uWobbleMapDistortion; attribute vec4 tangent; varying float vWobble; varying vec2 vPosition; // #usf - void main() {`),i=i.replace("// #usf ",`${Me}`),i=i.replace("void main() {",` + void main() {`),r=r.replace("// #usf ",`${Pe}`),r=r.replace("void main() {",` void main() { vec3 usf_Position = position; vec3 usf_Normal = normal; @@ -1508,22 +1539,33 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); float shift = 0.01; vec3 positionA = usf_Position + tangent.xyz * shift; vec3 positionB = usf_Position + biTangent * shift; - // Wobble - float wobble = getWobble(usf_Position); - usf_Position += wobble * normal; - positionA += getWobble(positionA) * normal; - positionB += getWobble(positionB) * normal; + + // wobbleMap & wobble + float wobbleMap = uIsWobbleMap ? texture2D(uWobbleMap, uv).g : 0.0; + vec3 nWobbleMap = wobbleMap * normal * uWobbleMapStrength; + float wobbleMapDistortion = wobbleMap * uWobbleMapDistortion; + + float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; + float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; + float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; + + usf_Position += nWobbleMap + (wobble * normal); + positionA += nWobbleMap + wobbleMapDistortion + (wobblePositionA * normal); + positionB += nWobbleMap + wobbleMapDistortion + (wobblePositionB * normal); + // Compute normal vec3 toA = normalize(positionA - usf_Position); vec3 toB = normalize(positionB - usf_Position); usf_Normal = cross(toA, toB); + // Varying vPosition = usf_Position.xy; - vWobble = wobble / uWobbleStrength;`),i},Tt=({baseMaterial:e,materialParameters:i})=>{const{material:r,depthMaterial:u}=v.useMemo(()=>{const s=new(e||t.MeshPhysicalMaterial)(i||{}),c=s.type==="MeshPhysicalMaterial"||s.type==="MeshStandardMaterial",n=s.type==="MeshPhysicalMaterial";Object.assign(s.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:V.wobblePositionFrequency},uWobbleTimeFrequency:{value:V.wobbleTimeFrequency},uWobbleStrength:{value:V.wobbleStrength},uWarpPositionFrequency:{value:V.warpPositionFrequency},uWarpTimeFrequency:{value:V.warpTimeFrequency},uWarpStrength:{value:V.warpStrength},uWobbleShine:{value:V.wobbleShine},uColor0:{value:V.color0},uColor1:{value:V.color1},uColor2:{value:V.color2},uColor3:{value:V.color3},uColorMix:{value:V.colorMix},uChromaticAberration:{value:V.chromaticAberration},uAnisotropicBlur:{value:V.anisotropicBlur},uDistortion:{value:V.distortion},uDistortionScale:{value:V.distortionScale},uTemporalDistortion:{value:V.temporalDistortion},uSamples:{value:V.samples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),s.onBeforeCompile=m=>{Object.assign(m.uniforms,s.userData.uniforms),m.vertexShader=Ce(m.vertexShader),m.fragmentShader=m.fragmentShader.replace("#include ",` + vWobble = wobble/uWobbleStrength; + `),r},Wt=({baseMaterial:e,materialParameters:r,onBeforeCompile:t,depthOnBeforeCompile:a})=>{const{material:s,depthMaterial:u}=v.useMemo(()=>{const l=new(e||n.MeshPhysicalMaterial)(r||{}),c=l.type==="MeshPhysicalMaterial"||l.type==="MeshStandardMaterial",m=l.type==="MeshPhysicalMaterial";Object.assign(l.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:E.wobblePositionFrequency},uWobbleTimeFrequency:{value:E.wobbleTimeFrequency},uWobbleStrength:{value:E.wobbleStrength},uWarpPositionFrequency:{value:E.warpPositionFrequency},uWarpTimeFrequency:{value:E.warpTimeFrequency},uWarpStrength:{value:E.warpStrength},uWobbleShine:{value:E.wobbleShine},uIsWobbleMap:{value:!1},uWobbleMap:{value:new n.Texture},uWobbleMapStrength:{value:E.wobbleMapStrength},uWobbleMapDistortion:{value:E.wobbleMapDistortion},uColor0:{value:E.color0},uColor1:{value:E.color1},uColor2:{value:E.color2},uColor3:{value:E.color3},uColorMix:{value:E.colorMix},uChromaticAberration:{value:E.chromaticAberration},uAnisotropicBlur:{value:E.anisotropicBlur},uDistortion:{value:E.distortion},uDistortionScale:{value:E.distortionScale},uTemporalDistortion:{value:E.temporalDistortion},uSamples:{value:E.samples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),l.onBeforeCompile=(f,g)=>{Object.assign(f.uniforms,l.userData.uniforms),f.vertexShader=Fe(f.vertexShader),f.fragmentShader=f.fragmentShader.replace("#include ",` #include - diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`),c&&(m.fragmentShader=m.fragmentShader.replace("#include ",` + diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`),c&&(f.fragmentShader=f.fragmentShader.replace("#include ",` #include - roughnessFactor = usf_Roughness;`)),m.fragmentShader=m.fragmentShader.replace("void main() {",` + roughnessFactor = usf_Roughness;`)),f.fragmentShader=f.fragmentShader.replace("void main() {",` uniform vec3 uColor0; uniform vec3 uColor1; uniform vec3 uColor2; @@ -1541,10 +1583,11 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); uniform float uSamples; float rand(float n){return fract(sin(n) * 43758.5453123);} - ${St} + ${Ot} varying float vWobble; varying vec2 vPosition; + void main(){ vec4 usf_DiffuseColor = vec4(1.0); ${c?"float usf_Roughness = roughness;":""} @@ -1553,12 +1596,12 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); - ${c?"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);":""}`),n&&(m.fragmentShader=m.fragmentShader.replace("#include ",`${_t}`),m.fragmentShader=m.fragmentShader.replace("#include ",`${Ct}`))},s.needsUpdate=!0;const d=new t.MeshDepthMaterial({depthPacking:t.RGBADepthPacking});return d.onBeforeCompile=m=>{Object.assign(m.uniforms,s.userData.uniforms),m.vertexShader=Ce(m.vertexShader)},d.needsUpdate=!0,{material:s,depthMaterial:d}},[i,e]);return{material:r,depthMaterial:u}},Te=({scene:e=!1,geometry:i,baseMaterial:r,materialParameters:u})=>{const s=v.useMemo(()=>{let l=i||new t.IcosahedronGeometry(2,20);return l=wt(l),l.computeTangents(),l},[i]),{material:c,depthMaterial:n}=Tt({baseMaterial:r,materialParameters:u}),d=I(e,s,c,t.Mesh);return[v.useCallback((l,f)=>{const a=c.userData;l&&o(a,"uTime",(f==null?void 0:f.beat)||l.clock.getElapsedTime()),f!==void 0&&(o(a,"uWobbleStrength",f.wobbleStrength),o(a,"uWobblePositionFrequency",f.wobblePositionFrequency),o(a,"uWobbleTimeFrequency",f.wobbleTimeFrequency),o(a,"uWarpStrength",f.warpStrength),o(a,"uWarpPositionFrequency",f.warpPositionFrequency),o(a,"uWarpTimeFrequency",f.warpTimeFrequency),o(a,"uWobbleShine",f.wobbleShine),o(a,"uSamples",f.samples),o(a,"uColor0",f.color0),o(a,"uColor1",f.color1),o(a,"uColor2",f.color2),o(a,"uColor3",f.color3),o(a,"uColorMix",f.colorMix),o(a,"uChromaticAberration",f.chromaticAberration),o(a,"uAnisotropicBlur",f.anisotropicBlur),o(a,"uDistortion",f.distortion),o(a,"uDistortionScale",f.distortionScale),o(a,"uTemporalDistortion",f.temporalDistortion))},[c]),{mesh:d,depthMaterial:n}]},V=Object.freeze({beat:!1,wobbleStrength:.3,wobblePositionFrequency:.5,wobbleTimeFrequency:.4,wobbleShine:0,warpStrength:1.7,warpPositionFrequency:.38,warpTimeFrequency:.12,samples:6,color0:new t.Color(16711680),color1:new t.Color(65280),color2:new t.Color(255),color3:new t.Color(16776960),colorMix:1,chromaticAberration:.5,anisotropicBlur:.1,distortion:.1,distortionScale:.1,temporalDistortion:.1}),Pt=({size:e,dpr:i,samples:r,isSizeUpdate:u,camera:s,geometry:c,baseMaterial:n,materialParameters:d})=>{const m=A(i),l=v.useMemo(()=>new t.Scene,[]),[f,{mesh:a,depthMaterial:p}]=Te({baseMaterial:n,materialParameters:d,scene:l,geometry:c}),[y,x]=U({scene:l,camera:s,size:e,dpr:m.fbo,samples:r,isSizeUpdate:u,depthBuffer:!0}),h=v.useCallback((b,w)=>(f(b,w),x(b.gl)),[x,f]),g=v.useCallback(b=>{f(null,b)},[f]);return[h,g,{scene:l,mesh:a,depthMaterial:p,renderTarget:y,output:y.texture}]},Rt=(e,i,r)=>{const u=v.useMemo(()=>{const s=new t.Mesh(i,r);return e.add(s),s},[i,r,e]);return v.useEffect(()=>()=>{e.remove(u),i.dispose(),r.dispose()},[e,i,r,u]),u},Q=Object.freeze({easeInSine(e){return 1-Math.cos(e*Math.PI/2)},easeOutSine(e){return Math.sin(e*Math.PI/2)},easeInOutSine(e){return-(Math.cos(Math.PI*e)-1)/2},easeInQuad(e){return e*e},easeOutQuad(e){return 1-(1-e)*(1-e)},easeInOutQuad(e){return e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},easeInCubic(e){return e*e*e},easeOutCubic(e){return 1-Math.pow(1-e,3)},easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2},easeInQuart(e){return e*e*e*e},easeOutQuart(e){return 1-Math.pow(1-e,4)},easeInOutQuart(e){return e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2},easeInQuint(e){return e*e*e*e*e},easeOutQuint(e){return 1-Math.pow(1-e,5)},easeInOutQuint(e){return e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2},easeInExpo(e){return e===0?0:Math.pow(2,10*e-10)},easeOutExpo(e){return e===1?1:1-Math.pow(2,-10*e)},easeInOutExpo(e){return e===0?0:e===1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2},easeInCirc(e){return 1-Math.sqrt(1-Math.pow(e,2))},easeOutCirc(e){return Math.sqrt(1-Math.pow(e-1,2))},easeInOutCirc(e){return e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2},easeInBack(e){return 2.70158*e*e*e-1.70158*e*e},easeOutBack(e){return 1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2)},easeInOutBack(e){const r=2.5949095;return e<.5?Math.pow(2*e,2)*((r+1)*2*e-r)/2:(Math.pow(2*e-2,2)*((r+1)*(e*2-2)+r)+2)/2},easeInElastic(e){const i=2*Math.PI/3;return e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*i)},easeOutElastic(e){const i=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*i)+1},easeInOutElastic(e){const i=2*Math.PI/4.5;return e===0?0:e===1?1:e<.5?-(Math.pow(2,20*e-10)*Math.sin((20*e-11.125)*i))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*i)/2+1},easeInBounce(e){return 1-Q.easeOutBounce(1-e)},easeOutBounce(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},easeInOutBounce(e){return e<.5?(1-Q.easeOutBounce(1-2*e))/2:(1+Q.easeOutBounce(2*e-1))/2}});function Dt(e){let i=Math.sin(e*12.9898)*43758.5453;return i-Math.floor(i)}const At=(e,i="easeOutQuart")=>{const r=e/60,u=Q[i];return v.useCallback(c=>{let n=c.getElapsedTime()*r;const d=Math.floor(n),m=u(n-d);n=m+d;const l=Dt(d);return{beat:n,floor:d,fract:m,hash:l}},[r,u])},It=(e=60)=>{const i=v.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),r=v.useRef(null);return v.useCallback(s=>{const c=s.getElapsedTime();return r.current===null||c-r.current>=i?(r.current=c,!0):!1},[i])},Ft=e=>{var u,s;const i=(u=e.dom)==null?void 0:u.length,r=(s=e.texture)==null?void 0:s.length;return!i||!r||i!==r};var zt=`varying vec2 vUv; + ${c?"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);":""}`),m&&(f.fragmentShader=f.fragmentShader.replace("#include ",`${Bt}`),f.fragmentShader=f.fragmentShader.replace("#include ",`${Et}`)),t&&t(f,g)},l.needsUpdate=!0;const p=new n.MeshDepthMaterial({depthPacking:n.RGBADepthPacking});return p.onBeforeCompile=(f,g)=>{Object.assign(f.uniforms,l.userData.uniforms),f.vertexShader=Fe(f.vertexShader),a&&a(f,g)},p.needsUpdate=!0,{material:l,depthMaterial:p}},[r,e,t,a]);return{material:s,depthMaterial:u}},Ve=({scene:e=!1,geometry:r,baseMaterial:t,materialParameters:a,onBeforeCompile:s,depthOnBeforeCompile:u})=>{const l=v.useMemo(()=>{let d=r||new n.IcosahedronGeometry(2,20);return d=Ut(d),d.computeTangents(),d},[r]),{material:c,depthMaterial:m}=Wt({baseMaterial:t,materialParameters:a,onBeforeCompile:s,depthOnBeforeCompile:u}),p=z(e,l,c,n.Mesh),f=c.userData,g=T(f);return[v.useCallback((d,o)=>{d&&g("uTime",(o==null?void 0:o.beat)||d.clock.getElapsedTime()),o!==void 0&&(g("uWobbleStrength",o.wobbleStrength),g("uWobblePositionFrequency",o.wobblePositionFrequency),g("uWobbleTimeFrequency",o.wobbleTimeFrequency),g("uWarpStrength",o.warpStrength),g("uWarpPositionFrequency",o.warpPositionFrequency),g("uWarpTimeFrequency",o.warpTimeFrequency),g("uWobbleShine",o.wobbleShine),o.wobbleMap?(g("uWobbleMap",o.wobbleMap),g("uIsWobbleMap",!0)):o.wobbleMap===!1&&g("uIsWobbleMap",!1),g("uWobbleMapStrength",o.wobbleMapStrength),g("uWobbleMapDistortion",o.wobbleMapDistortion),g("uSamples",o.samples),g("uColor0",o.color0),g("uColor1",o.color1),g("uColor2",o.color2),g("uColor3",o.color3),g("uColorMix",o.colorMix),g("uChromaticAberration",o.chromaticAberration),g("uAnisotropicBlur",o.anisotropicBlur),g("uDistortion",o.distortion),g("uDistortionScale",o.distortionScale),g("uTemporalDistortion",o.temporalDistortion))},[g]),{mesh:p,depthMaterial:m}]},E=Object.freeze({beat:!1,wobbleStrength:.3,wobblePositionFrequency:.3,wobbleTimeFrequency:.3,wobbleShine:0,warpStrength:.3,warpPositionFrequency:.3,warpTimeFrequency:.3,wobbleMap:!1,wobbleMapStrength:.03,wobbleMapDistortion:0,samples:6,color0:new n.Color(16711680),color1:new n.Color(65280),color2:new n.Color(255),color3:new n.Color(16776960),colorMix:1,chromaticAberration:.1,anisotropicBlur:.1,distortion:0,distortionScale:.1,temporalDistortion:0}),Lt=({size:e,dpr:r,samples:t,isSizeUpdate:a,camera:s,geometry:u,baseMaterial:l,materialParameters:c,onBeforeCompile:m,depthOnBeforeCompile:p})=>{const f=F(r),g=v.useMemo(()=>new n.Scene,[]),[i,{mesh:d,depthMaterial:o}]=Ve({baseMaterial:l,materialParameters:c,scene:g,geometry:u,onBeforeCompile:m,depthOnBeforeCompile:p}),[h,b]=B({scene:g,camera:s,size:e,dpr:f.fbo,samples:t,isSizeUpdate:a,depthBuffer:!0}),M=v.useCallback((w,S)=>(i(w,S),b(w.gl)),[b,i]),x=v.useCallback(w=>{i(null,w)},[i]);return[M,x,{scene:g,mesh:d,depthMaterial:o,renderTarget:h,output:h.texture}]},kt=(e,r,t)=>{const a=v.useMemo(()=>{const s=new n.Mesh(r,t);return e.add(s),s},[r,t,e]);return v.useEffect(()=>()=>{e.remove(a),r.dispose(),t.dispose()},[e,r,t,a]),a},J=Object.freeze({easeInSine(e){return 1-Math.cos(e*Math.PI/2)},easeOutSine(e){return Math.sin(e*Math.PI/2)},easeInOutSine(e){return-(Math.cos(Math.PI*e)-1)/2},easeInQuad(e){return e*e},easeOutQuad(e){return 1-(1-e)*(1-e)},easeInOutQuad(e){return e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},easeInCubic(e){return e*e*e},easeOutCubic(e){return 1-Math.pow(1-e,3)},easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2},easeInQuart(e){return e*e*e*e},easeOutQuart(e){return 1-Math.pow(1-e,4)},easeInOutQuart(e){return e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2},easeInQuint(e){return e*e*e*e*e},easeOutQuint(e){return 1-Math.pow(1-e,5)},easeInOutQuint(e){return e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2},easeInExpo(e){return e===0?0:Math.pow(2,10*e-10)},easeOutExpo(e){return e===1?1:1-Math.pow(2,-10*e)},easeInOutExpo(e){return e===0?0:e===1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2},easeInCirc(e){return 1-Math.sqrt(1-Math.pow(e,2))},easeOutCirc(e){return Math.sqrt(1-Math.pow(e-1,2))},easeInOutCirc(e){return e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2},easeInBack(e){return 2.70158*e*e*e-1.70158*e*e},easeOutBack(e){return 1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2)},easeInOutBack(e){const t=2.5949095;return e<.5?Math.pow(2*e,2)*((t+1)*2*e-t)/2:(Math.pow(2*e-2,2)*((t+1)*(e*2-2)+t)+2)/2},easeInElastic(e){const r=2*Math.PI/3;return e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*r)},easeOutElastic(e){const r=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*r)+1},easeInOutElastic(e){const r=2*Math.PI/4.5;return e===0?0:e===1?1:e<.5?-(Math.pow(2,20*e-10)*Math.sin((20*e-11.125)*r))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*r)/2+1},easeInBounce(e){return 1-J.easeOutBounce(1-e)},easeOutBounce(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},easeInOutBounce(e){return e<.5?(1-J.easeOutBounce(1-2*e))/2:(1+J.easeOutBounce(2*e-1))/2}});function $t(e){let r=Math.sin(e*12.9898)*43758.5453;return r-Math.floor(r)}const qt=(e,r="easeOutQuart")=>{const t=e/60,a=J[r];return v.useCallback(u=>{let l=u.getElapsedTime()*t;const c=Math.floor(l),m=a(l-c);l=m+c;const p=$t(c);return{beat:l,floor:c,fract:m,hash:p}},[t,a])},jt=(e=60)=>{const r=v.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),t=v.useRef(null);return v.useCallback(s=>{const u=s.getElapsedTime();return t.current===null||u-t.current>=r?(t.current=u,!0):!1},[r])},Nt=e=>{var a,s;const r=(a=e.dom)==null?void 0:a.length,t=(s=e.texture)==null?void 0:s.length;return!r||!t||r!==t};var Gt=`varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`,Ut=`precision highp float; +}`,Kt=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1601,5 +1644,5 @@ void main() { alpha *= textureAlpha; gl_FragColor = vec4(textureColor, alpha); -}`;const Bt=({params:e,size:i,scene:r})=>{r.children.length>0&&(r.children.forEach(u=>{u instanceof t.Mesh&&(u.geometry.dispose(),u.material.dispose())}),r.remove(...r.children)),e.texture.forEach((u,s)=>{const c=new t.Mesh(new t.PlaneGeometry(1,1),new t.ShaderMaterial({vertexShader:zt,fragmentShader:Ut,transparent:!0,uniforms:{u_texture:{value:u},u_textureResolution:{value:new t.Vector2(0,0)},u_resolution:{value:new t.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[s]?e.boderRadius[s]:0}}}));r.add(c)})},Vt=()=>{const e=v.useRef([]),i=v.useRef([]);return v.useCallback(({isIntersectingRef:u,isIntersectingOnceRef:s,params:c})=>{e.current.length>0&&e.current.forEach((d,m)=>{d.unobserve(i.current[m])}),i.current=[],e.current=[];const n=new Array(c.dom.length).fill(!1);u.current=[...n],s.current=[...n],c.dom.forEach((d,m)=>{const l=a=>{a.forEach(p=>{c.onIntersect[m]&&c.onIntersect[m](p),u.current[m]=p.isIntersecting})},f=new IntersectionObserver(l,{rootMargin:"0px",threshold:0});f.observe(d),e.current.push(f),i.current.push(d)})},[])},Ot=()=>{const e=v.useRef([]),i=v.useCallback(({params:r,size:u,resolutionRef:s,scene:c,isIntersectingRef:n})=>{c.children.length!==e.current.length&&(e.current=new Array(c.children.length)),c.children.forEach((d,m)=>{var a,p,y,x,h,g;const l=r.dom[m];if(!l)return;const f=l.getBoundingClientRect();if(e.current[m]=f,d.scale.set(f.width,f.height,1),d.position.set(f.left+f.width*.5-u.width*.5,-f.top-f.height*.5+u.height*.5,0),n.current[m]&&(r.rotation[m]&&d.rotation.copy(r.rotation[m]),d instanceof t.Mesh)){const b=d.material;o(b,"u_texture",r.texture[m]),o(b,"u_textureResolution",[((y=(p=(a=r.texture[m])==null?void 0:a.source)==null?void 0:p.data)==null?void 0:y.width)||0,((g=(h=(x=r.texture[m])==null?void 0:x.source)==null?void 0:h.data)==null?void 0:g.height)||0]),o(b,"u_resolution",s.current.set(f.width,f.height)),o(b,"u_borderRadius",r.boderRadius[m]?r.boderRadius[m]:0)}})},[]);return[e.current,i]},Et=()=>{const e=v.useRef([]),i=v.useRef([]),r=v.useCallback((u,s=!1)=>{e.current.forEach((n,d)=>{n&&(i.current[d]=!0)});const c=s?[...i.current]:[...e.current];return u<0?c:c[u]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:i,isIntersecting:r}},Lt=e=>({onView:r,onHidden:u})=>{const s=v.useRef(!1);v.useEffect(()=>{let c;const n=()=>{e.current.some(d=>d)?s.current||(r&&r(),s.current=!0):s.current&&(u&&u(),s.current=!1),c=requestAnimationFrame(n)};return c=requestAnimationFrame(n),()=>{cancelAnimationFrame(c)}},[r,u])},Pe={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},Wt=({size:e,dpr:i,samples:r,isSizeUpdate:u},s=[])=>{const c=A(i),n=v.useMemo(()=>new t.Scene,[]),d=F(e),[m,l]=U({scene:n,camera:d,size:e,dpr:c.fbo,samples:r,isSizeUpdate:u}),[f,a]=z({...Pe,updateKey:performance.now()}),[p,y]=Ot(),x=v.useRef(new t.Vector2(0,0)),[h,g]=v.useState(!0);v.useMemo(()=>g(!0),s);const b=v.useRef(null),w=v.useMemo(()=>new t.Texture,[]),T=Vt(),{isIntersectingOnceRef:_,isIntersectingRef:S,isIntersecting:C}=Et(),B=Lt(S);return[v.useCallback((R,E)=>{const{gl:q,size:L}=R;if(E&&a(E),Ft(f))return w;if(h){if(b.current===f.updateKey)return w;b.current=f.updateKey}return h&&(Bt({params:f,size:L,scene:n}),T({isIntersectingRef:S,isIntersectingOnceRef:_,params:f}),g(!1)),y({params:f,size:L,resolutionRef:x,scene:n,isIntersectingRef:S}),l(q)},[l,a,T,y,h,n,f,_,S,w]),a,{scene:n,camera:d,renderTarget:m,output:m.texture,isIntersecting:C,DOMRects:p,intersections:S.current,useDomView:B}]},kt=({scene:e,camera:i,size:r,dpr:u=!1,isSizeUpdate:s=!1,samples:c=0,depthBuffer:n=!1,depthTexture:d=!1},m)=>{const l=v.useRef([]),f=W(r,u);l.current=v.useMemo(()=>Array.from({length:m},()=>{const p=new t.WebGLRenderTarget(f.x,f.y,{...Y,samples:c,depthBuffer:n});return d&&(p.depthTexture=new t.DepthTexture(f.x,f.y,t.FloatType)),p}),[m]),s&&l.current.forEach(p=>p.setSize(f.x,f.y)),v.useEffect(()=>{const p=l.current;return()=>{p.forEach(y=>y.dispose())}},[m]);const a=v.useCallback((p,y,x)=>{const h=l.current[y];return J({gl:p,scene:e,camera:i,fbo:h,onBeforeRender:()=>x&&x({read:h.texture})}),h.texture},[e,i]);return[l.current,a]};M.ALPHABLENDING_PARAMS=ge,M.BLENDING_PARAMS=me,M.BRIGHTNESSPICKER_PARAMS=pe,M.BRUSH_PARAMS=oe,M.CHROMAKEY_PARAMS=ye,M.COLORSTRATA_PARAMS=se,M.COSPALETTE_PARAMS=ce,M.COVERTEXTURE_PARAMS=xe,M.DOMSYNCER_PARAMS=Pe,M.DUOTONE_PARAMS=ve,M.Easing=Q,M.FBO_OPTION=Y,M.FLUID_PARAMS=ie,M.FXBLENDING_PARAMS=de,M.FXTEXTURE_PARAMS=fe,M.HSV_PARAMS=he,M.MARBLE_PARAMS=le,M.MORPHPARTICLES_PARAMS=D,M.MOTIONBLUR_PARAMS=G,M.NOISE_PARAMS=ue,M.RIPPLE_PARAMS=ae,M.SIMPLEBLUR_PARAMS=ne,M.WAVE_PARAMS=K,M.WOBBLE3D_PARAMS=V,M.renderFBO=J,M.setUniform=o,M.useAddMesh=Rt,M.useAlphaBlending=Nn,M.useBeat=At,M.useBlending=Dn,M.useBrightnessPicker=On,M.useBrush=Ve,M.useCamera=F,M.useChromaKey=dt,M.useColorStrata=fn,M.useCopyTexture=kt,M.useCosPalette=bn,M.useCoverTexture=Jn,M.useCreateMorphParticles=_e,M.useCreateWobble3D=Te,M.useDomSyncer=Wt,M.useDoubleFBO=N,M.useDuoTone=Cn,M.useFPSLimiter=It,M.useFluid=tn,M.useFxBlending=kn,M.useFxTexture=zn,M.useHSV=Hn,M.useMarble=hn,M.useMorphParticles=bt,M.useMotionBlur=ut,M.useNoise=ln,M.useParams=z,M.usePointer=Z,M.useResolution=W,M.useRipple=on,M.useSimpleBlur=rt,M.useSingleFBO=U,M.useWave=vt,M.useWobble3D=Pt,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})}); +}`;const Xt=({params:e,size:r,scene:t,onBeforeCompile:a})=>{t.children.length>0&&(t.children.forEach(s=>{s instanceof n.Mesh&&(s.geometry.dispose(),s.material.dispose())}),t.remove(...t.children)),e.texture.forEach((s,u)=>{const l=new n.ShaderMaterial({vertexShader:Gt,fragmentShader:Kt,transparent:!0,uniforms:{u_texture:{value:s},u_textureResolution:{value:new n.Vector2(0,0)},u_resolution:{value:new n.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[u]?e.boderRadius[u]:0}}});a&&(l.onBeforeCompile=a);const c=new n.Mesh(new n.PlaneGeometry(1,1),l);t.add(c)})},Ht=()=>{const e=v.useRef([]),r=v.useRef([]);return v.useCallback(({isIntersectingRef:a,isIntersectingOnceRef:s,params:u})=>{e.current.length>0&&e.current.forEach((c,m)=>{c.unobserve(r.current[m])}),r.current=[],e.current=[];const l=new Array(u.dom.length).fill(!1);a.current=[...l],s.current=[...l],u.dom.forEach((c,m)=>{const p=g=>{g.forEach(i=>{u.onIntersect[m]&&u.onIntersect[m](i),a.current[m]=i.isIntersecting})},f=new IntersectionObserver(p,{rootMargin:"0px",threshold:0});f.observe(c),e.current.push(f),r.current.push(c)})},[])},Yt=()=>{const e=v.useRef([]),r=v.useCallback(({params:t,size:a,resolutionRef:s,scene:u,isIntersectingRef:l})=>{u.children.length!==e.current.length&&(e.current=new Array(u.children.length)),u.children.forEach((c,m)=>{var g,i,d,o,h,b;const p=t.dom[m];if(!p)return;const f=p.getBoundingClientRect();if(e.current[m]=f,c.scale.set(f.width,f.height,1),c.position.set(f.left+f.width*.5-a.width*.5,-f.top-f.height*.5+a.height*.5,0),l.current[m]&&(t.rotation[m]&&c.rotation.copy(t.rotation[m]),c instanceof n.Mesh)){const M=c.material,x=T(M);x("u_texture",t.texture[m]),x("u_textureResolution",[((d=(i=(g=t.texture[m])==null?void 0:g.source)==null?void 0:i.data)==null?void 0:d.width)||0,((b=(h=(o=t.texture[m])==null?void 0:o.source)==null?void 0:h.data)==null?void 0:b.height)||0]),x("u_resolution",s.current.set(f.width,f.height)),x("u_borderRadius",t.boderRadius[m]?t.boderRadius[m]:0)}})},[]);return[e.current,r]},Qt=()=>{const e=v.useRef([]),r=v.useRef([]),t=v.useCallback((a,s=!1)=>{e.current.forEach((l,c)=>{l&&(r.current[c]=!0)});const u=s?[...r.current]:[...e.current];return a<0?u:u[a]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:r,isIntersecting:t}},Zt=e=>({onView:t,onHidden:a})=>{const s=v.useRef(!1);v.useEffect(()=>{let u;const l=()=>{e.current.some(c=>c)?s.current||(t&&t(),s.current=!0):s.current&&(a&&a(),s.current=!1),u=requestAnimationFrame(l)};return u=requestAnimationFrame(l),()=>{cancelAnimationFrame(u)}},[t,a])},ze={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},Jt=({size:e,dpr:r,samples:t,isSizeUpdate:a,onBeforeCompile:s},u=[])=>{const l=F(r),c=v.useMemo(()=>new n.Scene,[]),m=U(e),[p,f]=B({scene:c,camera:m,size:e,dpr:l.fbo,samples:t,isSizeUpdate:a}),[g,i]=O({...ze,updateKey:performance.now()}),[d,o]=Yt(),h=v.useRef(new n.Vector2(0,0)),[b,M]=v.useState(!0);v.useMemo(()=>M(!0),u);const x=v.useRef(null),w=v.useMemo(()=>new n.Texture,[]),S=Ht(),{isIntersectingOnceRef:C,isIntersectingRef:_,isIntersecting:D}=Qt(),A=Zt(_);return[v.useCallback((P,W)=>{const{gl:I,size:k}=P;if(W&&i(W),Nt(g))return w;if(b){if(x.current===g.updateKey)return w;x.current=g.updateKey}return b&&(Xt({params:g,size:k,scene:c,onBeforeCompile:s}),S({isIntersectingRef:_,isIntersectingOnceRef:C,params:g}),M(!1)),o({params:g,size:k,resolutionRef:h,scene:c,isIntersectingRef:_}),f(I)},[f,i,S,o,s,b,c,g,C,_,w]),i,{scene:c,camera:m,renderTarget:p,output:p.texture,isIntersecting:D,DOMRects:d,intersections:_.current,useDomView:A}]},er=({scene:e,camera:r,size:t,dpr:a=!1,isSizeUpdate:s=!1,samples:u=0,depthBuffer:l=!1,depthTexture:c=!1},m)=>{const p=v.useRef([]),f=$(t,a);p.current=v.useMemo(()=>Array.from({length:m},()=>{const i=new n.WebGLRenderTarget(f.x,f.y,{...Z,samples:u,depthBuffer:l});return c&&(i.depthTexture=new n.DepthTexture(f.x,f.y,n.FloatType)),i}),[m]),s&&p.current.forEach(i=>i.setSize(f.x,f.y)),v.useEffect(()=>{const i=p.current;return()=>{i.forEach(d=>d.dispose())}},[m]);const g=v.useCallback((i,d,o)=>{const h=p.current[d];return te({gl:i,scene:e,camera:r,fbo:h,onBeforeRender:()=>o&&o({read:h.texture})}),h.texture},[e,r]);return[p.current,g]};y.ALPHABLENDING_PARAMS=Se,y.BLANK_PARAMS=ae,y.BLENDING_PARAMS=be,y.BRIGHTNESSPICKER_PARAMS=ye,y.BRUSH_PARAMS=ve,y.CHROMAKEY_PARAMS=Ce,y.COLORSTRATA_PARAMS=de,y.COSPALETTE_PARAMS=he,y.COVERTEXTURE_PARAMS=Te,y.DOMSYNCER_PARAMS=ze,y.DUOTONE_PARAMS=xe,y.Easing=J,y.FBO_OPTION=Z,y.FLUID_PARAMS=me,y.FXBLENDING_PARAMS=we,y.FXTEXTURE_PARAMS=Me,y.HSV_PARAMS=_e,y.MARBLE_PARAMS=ge,y.MORPHPARTICLES_PARAMS=V,y.MOTIONBLUR_PARAMS=H,y.NOISE_PARAMS=pe,y.RIPPLE_PARAMS=fe,y.SIMPLEBLUR_PARAMS=oe,y.WAVE_PARAMS=Y,y.WOBBLE3D_PARAMS=E,y.renderFBO=te,y.setUniform=T,y.useAddMesh=kt,y.useAlphaBlending=et,y.useBeat=qt,y.useBlank=Dt,y.useBlending=En,y.useBrightnessPicker=Gn,y.useBrush=Ne,y.useCamera=U,y.useChromaKey=_t,y.useColorStrata=wn,y.useCopyTexture=er,y.useCosPalette=An,y.useCoverTexture=st,y.useCreateMorphParticles=Ie,y.useCreateWobble3D=Ve,y.useDomSyncer=Jt,y.useDoubleFBO=G,y.useDuoTone=zn,y.useFPSLimiter=jt,y.useFluid=mn,y.useFxBlending=Yn,y.useFxTexture=$n,y.useHSV=ot,y.useMarble=Cn,y.useMorphParticles=zt,y.useMotionBlur=gt,y.useNoise=xn,y.useParams=O,y.usePointer=ne,y.useResolution=$,y.useRipple=pn,y.useSimpleBlur=mt,y.useSingleFBO=B,y.useWave=Mt,y.useWobble3D=Lt,Object.defineProperty(y,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 7f22bbfe..674f9930 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/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/setUniforms.ts","../src/utils/useAddObject.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/libs/shaders/getWobble.glsl","../src/libs/constants.ts","../src/fxs/3D/useMorphParticles/utils/rewriteVertexShader.ts","../src/fxs/3D/useMorphParticles/utils/modifyAttributes.ts","../src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts","../src/fxs/3D/useMorphParticles/utils/useMaterial.ts","../src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts","../src/fxs/3D/useMorphParticles/index.ts","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/libs/shaders/snoise.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/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 uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\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\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\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","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\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform = (\n material: { uniforms: T },\n key: keyof T,\n value: UniformValue\n) => {\n if (value === undefined) {\n return;\n }\n // By design, I don't want to pass null to uniform\n if (material.uniforms && material.uniforms[key] && value !== null) {\n material.uniforms[key].value = value;\n }\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { 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.Vector3 | THREE.Color };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { 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 | false;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\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(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = 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(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\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\n ? prevPointer.current.clone()\n : 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 [lerp]\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 { useCallback, useEffect, useMemo, useRef } 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 : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `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 if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\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 { useCallback, useEffect, useMemo, useRef } 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 if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\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 { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n // use dpr if `shader` and `fbo` are undefined\n return {\n shader: (dpr.effect?.shader ?? true) && dpr.dpr,\n fbo: (dpr.effect?.fbo ?? true) && dpr.dpr,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\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 , 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 color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n setUniform(material, \"uIsTexture\", true);\n setUniform(material, \"uTexture\", params.texture!);\n } else {\n setUniform(material, \"uIsTexture\", false);\n }\n\n if (params.map!) {\n setUniform(material, \"uIsMap\", true);\n setUniform(material, \"uMap\", params.map!);\n setUniform(material, \"uMapIntensity\", params.mapIntensity!);\n } else {\n setUniform(material, \"uIsMap\", false);\n }\n\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\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n setUniform(material, \"uMouse\", pointerValues.currentPointer);\n setUniform(material, \"uPrevMouse\", pointerValues.prevPointer);\n }\n setUniform(material, \"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n setUniform(material, \"uColor\", color);\n\n setUniform(material, \"uIsCursor\", params.isCursor!);\n\n // pressure\n setUniform(material, \"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n setUniform(material, \"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBuffer\", read);\n });\n },\n [material, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.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 | THREE.Color };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\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};\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 | false;\n}) => {\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 useMemo(() => {\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 = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\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, mesh };\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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 = Object.freeze({\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 pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\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 pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n setUniform(materials.splatMaterial, \"uTarget\", read);\n setUniform(\n materials.splatMaterial,\n \"point\",\n pointerValues.currentPointer\n );\n const scaledDiff = pointerValues.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 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.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 mesh: mesh,\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,\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, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\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 = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\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: _dpr.fbo,\n samples,\n isSizeUpdate,\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 pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.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;\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as NoiseMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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\", params.beat || 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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as ColorStrataMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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\", params.beat || 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 mesh: mesh,\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 u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as MarbleMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_pattern\", params.pattern!);\n setUniform(material, \"u_complexity\", params.complexity!);\n setUniform(\n material,\n \"u_complexityAttenuation\",\n params.complexityAttenuation!\n );\n setUniform(material, \"u_iterations\", params.iterations!);\n setUniform(material, \"u_timeStrength\", params.timeStrength!);\n setUniform(material, \"u_scale\", params.scale!);\n\n setUniform(material, \"u_time\", params.beat || 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 mesh: mesh,\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 sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { 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 uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as CosPaletteMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CosPaletteParams = {\n /** color1, default : `rgb(50%, 50%, 50%)` */\n color1?: THREE.Color;\n /** color2, default : `rgb(50%, 50%, 50%)` */\n color2?: THREE.Color;\n /** color3, default : `rgb(100%, 100%, 100%)` */\n color3?: THREE.Color;\n /** color4, default : `rgb(0%, 10%, 20%)` */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default : `THREE.Vector3(1.0,0.0,0.0)` */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = Object.freeze({\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor1\", params.color1!);\n setUniform(material, \"uColor2\", params.color2!);\n setUniform(material, \"uColor3\", params.color3!);\n setUniform(material, \"uColor4\", params.color4!);\n setUniform(material, \"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as DuoToneMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as BlendingMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class FxTextureMaterial 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 | false;\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 ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** 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 , 0 ~ 1 , default : `0` */\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 mesh: THREE.Mesh;\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 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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\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\n setUniform(material, \"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n setUniform(material, \"uTextureResolution\", interpolatedResolution);\n\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, \"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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as BrightnessPickerMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\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 ) as FxBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n}: {\n scene: THREE.Scene;\n size: Size;\n}) => {\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 uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as AlphaBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type AlphaBlendingParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** alpha map , default : `THREE.Texture()` */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n}: {\n scene: THREE.Scene;\n size: Size;\n}) => {\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: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as HSVMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type HSVParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** default : `1` */\n brightness?: number;\n /** default : `1` */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [material, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\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\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\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 uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\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\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\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: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, 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 || 0,\n params.texture!?.source?.data?.height || 0,\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 _tempTexture;\n },\n [updateTempTexture, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\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 sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { 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: MOTIONBLUR_PARAMS.texture },\n uBackbuffer: { value: new THREE.Texture() },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MotionBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uBegin\", params.begin!);\n setUniform(material, \"uEnd\", params.end!);\n setUniform(material, \"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n setUniform(material, \"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\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: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as WaveMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\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/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh(scene);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 mesh: mesh,\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 u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { 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 | false;\n}) => {\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_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n }),\n []\n ) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default : `THREE.Texture` */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: `THREE.Color(0x00ff00)` */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default : `0.2` */\n similarity?: number;\n /** smoothness , default : `0.1` */\n smoothness?: number;\n /** spill , default : `0.2` */\n spill?: number;\n /** tone correction , default : `THREE.Vector4(1.0, 1.0, 1.0, 1.0)` */\n color?: THREE.Vector4;\n /** contrast , default : `1.0` */\n contrast?: number;\n /** brightness , default : `0.0` */\n brightness?: number;\n /** gamma correction , default : `1.0` */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = Object.freeze({\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_keyColor\", params.keyColor!);\n setUniform(material, \"u_similarity\", params.similarity!);\n setUniform(material, \"u_smoothness\", params.smoothness!);\n setUniform(material, \"u_spill\", params.spill!);\n setUniform(material, \"u_color\", params.color!);\n setUniform(material, \"u_contrast\", params.contrast!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\n\nfloat random3D(vec3 co) {\n return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453);\n}\n\nvoid main() {\n\tvec3 newPosition = position;\n\tvec2 newUv = uv;\n\t#usf \n\t#usf \n\n\t// displacement for `newPosition`\n\tvec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0);\n\tfloat displacementIntensity = smoothstep(0., 1., displacement.g);\n\tvDisplacementColor = displacement;\n\tvDisplacementIntensity = displacementIntensity;\n\n\t// At this point displacement is 0 ~ 1, so normalize it to -1 ~ 1\n\tdisplacement = displacement * 2.-1.;\n\tdisplacement *= displacementIntensity * uDisplacementIntensity;\n\tnewPosition += displacement;\n\n\t// divergence\n\tvec3 divergenceDir = newPosition - uDivergencePoint;\n\tif (uDivergence > 0.0) {\n\t\tnewPosition += normalize(divergenceDir) * uDivergence;\n\t} else if (uDivergence < 0.0) {\n\t\tnewPosition -= normalize(divergenceDir) * abs(uDivergence);\n\t}\n\n\t// Final position\n\tvec4 modelPosition = modelMatrix * vec4(newPosition, 1.0);\n\tvec4 viewPosition = viewMatrix * modelPosition;\n\tvec4 projectedPosition = projectionMatrix * viewPosition;\n\n\t// wobble ※Do not calculate noise if uWobbleStrength is 0\n\tfloat wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0;\n\n\tgl_Position = projectedPosition += wobble;\n\t\n\t// If picture is true then display picture, otherwise 4 color linear interpolation\n\tvColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z);\n\n\t// Set Alpha on picture's g channel\n\tvPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.;\n\n\t// Multiply the point size by picturAalpha. The size can also be adjusted with alphaMap.\n\t// If uSizeRandomTimeFrequency is greater than 0, the size will be randomly changed\n\tfloat sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.;\n\tgl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand;\n\tgl_PointSize *= (1.0 / - viewPosition.z);\n\n\t// mapArrayIndex\n\tvMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.;\n}","precision highp float;\nprecision highp int;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\nuniform float uBlurAlpha;\nuniform float uBlurRadius;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform sampler2D uAlphaMap;\nuniform bool uIsAlphaMap;\nuniform float uDisplacementColorIntensity;\nuniform float uPointAlpha;\n\n#usf \n\nvoid main() { \n\tvec2 uv = gl_PointCoord;\n\tuv.y = 1.0 - uv.y;\n \n\t// make it a circle\n\tfloat distanceToCenter = length(uv - .5);\n\tfloat alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.);\n\n\t// Map if there is a map\t\n\tvec4 mapArrayColor;\n\t#usf \n\tvec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.);\n\tvec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor;\n\n\t// Mix with finalColor if displacement is true\n\tfloat mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.);\n\tfinalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor;\n\n\t// get alpha map\n\tfloat alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.;\n\n\tgl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha);\n}\n","//\tSimplex 4D Noise \n//\tby Ian McEwan, Ashima Arts\n//\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\nfloat permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\nfloat taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;}\n\nvec4 grad4(float j, vec4 ip)\n{\n\tconst vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\n\tvec4 p,s;\n\n\tp.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\n\tp.w = 1.5 - dot(abs(p.xyz), ones.xyz);\n\ts = vec4(lessThan(p, vec4(0.0)));\n\tp.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; \n\n\treturn p;\n}\n\nfloat simplexNoise4d(vec4 v)\n{\n\tconst vec2 C = vec2( 0.138196601125010504, // (5 - sqrt(5))/20 G4\n\t\t\t\t\t\t\t\t\t0.309016994374947451); // (sqrt(5) - 1)/4 F4\n\t// First corner\n\tvec4 i = floor(v + dot(v, C.yyyy) );\n\tvec4 x0 = v - i + dot(i, C.xxxx);\n\n\t// Other corners\n\n\t// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n\tvec4 i0;\n\n\tvec3 isX = step( x0.yzw, x0.xxx );\n\tvec3 isYZ = step( x0.zww, x0.yyz );\n\t// i0.x = dot( isX, vec3( 1.0 ) );\n\ti0.x = isX.x + isX.y + isX.z;\n\ti0.yzw = 1.0 - isX;\n\n\t// i0.y += dot( isYZ.xy, vec2( 1.0 ) );\n\ti0.y += isYZ.x + isYZ.y;\n\ti0.zw += 1.0 - isYZ.xy;\n\n\ti0.z += isYZ.z;\n\ti0.w += 1.0 - isYZ.z;\n\n\t// i0 now contains the unique values 0,1,2,3 in each channel\n\tvec4 i3 = clamp( i0, 0.0, 1.0 );\n\tvec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\n\tvec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\n\n\t// x0 = x0 - 0.0 + 0.0 * C \n\tvec4 x1 = x0 - i1 + 1.0 * C.xxxx;\n\tvec4 x2 = x0 - i2 + 2.0 * C.xxxx;\n\tvec4 x3 = x0 - i3 + 3.0 * C.xxxx;\n\tvec4 x4 = x0 - 1.0 + 4.0 * C.xxxx;\n\n\t// Permutations\n\ti = mod(i, 289.0); \n\tfloat j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\n\tvec4 j1 = permute( permute( permute( permute (\n\t\t\t\t\ti.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\n\t\t\t\t+ i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\n\t\t\t\t+ i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\n\t\t\t\t+ i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\n\t// Gradients\n\t// ( 7*7*6 points uniformly over a cube, mapped onto a 4-octahedron.)\n\t// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n\n\tvec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\n\n\tvec4 p0 = grad4(j0, ip);\n\tvec4 p1 = grad4(j1.x, ip);\n\tvec4 p2 = grad4(j1.y, ip);\n\tvec4 p3 = grad4(j1.z, ip);\n\tvec4 p4 = grad4(j1.w, ip);\n\n\t// Normalise gradients\n\tvec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\tp4 *= taylorInvSqrt(dot(p4,p4));\n\n\t// Mix contributions from the five corners\n\tvec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\n\tvec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0);\n\tm0 = m0 * m0;\n\tm1 = m1 * m1;\n\treturn 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\n\t\t\t\t\t\t+ dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\n\n}\n\nfloat getWobble(vec3 position)\n{\n\tvec3 warpedPosition = position;\n\twarpedPosition += simplexNoise4d(\n\t\tvec4(\n\t\t\t\tposition * uWarpPositionFrequency,\n\t\t\t\tuTime * uWarpTimeFrequency\n\t\t)\n\t) * uWarpStrength;\n\n\treturn simplexNoise4d(vec4(\n\t\twarpedPosition * uWobblePositionFrequency, // XYZ\n\t\tuTime * uWobbleTimeFrequency // W\n\t)) * uWobbleStrength;\n}","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport getWobble from \"../../../../libs/shaders/getWobble.glsl\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport { ISDEV } from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\n\nexport class MorphParticlesMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uMorphProgress: { value: number };\n uBlurAlpha: { value: number };\n uBlurRadius: { value: number };\n uPointSize: { value: number };\n uPointAlpha: { value: number };\n uPicture: { value: THREE.Texture };\n uIsPicture: { value: boolean };\n uAlphaPicture: { value: THREE.Texture };\n uIsAlphaPicture: { value: boolean };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uAlphaMap: { value: THREE.Texture };\n uIsAlphaMap: { value: boolean };\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uDisplacement: { value: THREE.Texture };\n uIsDisplacement: { value: boolean };\n uDisplacementIntensity: { value: number };\n uDisplacementColorIntensity: { value: number };\n uSizeRandomIntensity: { value: number };\n uSizeRandomTimeFrequency: { value: number };\n uSizeRandomMin: { value: number };\n uSizeRandomMax: { value: number };\n uDivergence: { value: number };\n uDivergencePoint: { value: THREE.Vector3 };\n };\n}\n\nexport const useMaterial = ({\n size,\n dpr,\n geometry,\n positions,\n uvs,\n mapArray,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n}) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n ).replace(`#usf `, getWobble);\n\n // fragment\n const mapArraySwitch = rewriteFragmentShader(mapArray, fragmentShader);\n\n return new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: mapArraySwitch.rewritedFragmentShader,\n depthTest: false,\n depthWrite: false,\n transparent: true,\n blending: THREE.AdditiveBlending,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: new THREE.Texture() },\n uIsPicture: { value: false },\n uAlphaPicture: { value: new THREE.Texture() },\n uIsAlphaPicture: { value: false },\n uColor0: { value: MORPHPARTICLES_PARAMS.color0 },\n uColor1: { value: MORPHPARTICLES_PARAMS.color1 },\n uColor2: { value: MORPHPARTICLES_PARAMS.color2 },\n uColor3: { value: MORPHPARTICLES_PARAMS.color3 },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uAlphaMap: { value: new THREE.Texture() },\n uIsAlphaMap: { value: false },\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: MORPHPARTICLES_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: new THREE.Texture() },\n uIsDisplacement: { value: false },\n uDisplacementIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementIntensity,\n },\n uDisplacementColorIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementColorIntensity,\n },\n uSizeRandomIntensity: {\n value: MORPHPARTICLES_PARAMS.sizeRandomIntensity,\n },\n uSizeRandomTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.sizeRandomTimeFrequency,\n },\n uSizeRandomMin: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArraySwitch.mapArrayUniforms,\n },\n });\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material, \"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n props: RootState | null,\n params?: MorphParticlesParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateUniform = useCallback(\n (props, params) => {\n if (props) {\n setUniform(\n material,\n \"uTime\",\n params?.beat || props.clock.getElapsedTime()\n );\n }\n if (params === undefined) {\n return;\n }\n setUniform(material, \"uMorphProgress\", params.morphProgress);\n setUniform(material, \"uBlurAlpha\", params.blurAlpha);\n setUniform(material, \"uBlurRadius\", params.blurRadius);\n setUniform(material, \"uPointSize\", params.pointSize);\n setUniform(material, \"uPointAlpha\", params.pointAlpha);\n if (params.picture) {\n setUniform(material, \"uPicture\", params.picture);\n setUniform(material, \"uIsPicture\", true);\n } else if (params.picture === false) {\n setUniform(material, \"uIsPicture\", false);\n }\n if (params.alphaPicture) {\n setUniform(material, \"uAlphaPicture\", params.alphaPicture);\n setUniform(material, \"uIsAlphaPicture\", true);\n } else if (params.alphaPicture === false) {\n setUniform(material, \"uIsAlphaPicture\", false);\n }\n setUniform(material, \"uColor0\", params.color0);\n setUniform(material, \"uColor1\", params.color1);\n setUniform(material, \"uColor2\", params.color2);\n setUniform(material, \"uColor3\", params.color3);\n if (params.map) {\n setUniform(material, \"uMap\", params.map);\n setUniform(material, \"uIsMap\", true);\n } else if (params.map === false) {\n setUniform(material, \"uIsMap\", false);\n }\n if (params.alphaMap) {\n setUniform(material, \"uAlphaMap\", params.alphaMap);\n setUniform(material, \"uIsAlphaMap\", true);\n } else if (params.alphaMap === false) {\n setUniform(material, \"uIsAlphaMap\", false);\n }\n setUniform(material, \"uWobbleStrength\", params.wobbleStrength);\n setUniform(\n material,\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n setUniform(\n material,\n \"uWobbleTimeFrequency\",\n params.wobbleTimeFrequency\n );\n setUniform(material, \"uWarpStrength\", params.warpStrength);\n setUniform(\n material,\n \"uWarpPositionFrequency\",\n params.warpPositionFrequency\n );\n setUniform(material, \"uWarpTimeFrequency\", params.warpTimeFrequency);\n if (params.displacement) {\n setUniform(material, \"uDisplacement\", params.displacement);\n setUniform(material, \"uIsDisplacement\", true);\n } else if (params.displacement === false) {\n setUniform(material, \"uIsDisplacement\", false);\n }\n setUniform(\n material,\n \"uDisplacementIntensity\",\n params.displacementIntensity\n );\n setUniform(\n material,\n \"uDisplacementColorIntensity\",\n params.displacementColorIntensity\n );\n setUniform(\n material,\n \"uSizeRandomIntensity\",\n params.sizeRandomIntensity\n );\n setUniform(\n material,\n \"uSizeRandomTimeFrequency\",\n params.sizeRandomTimeFrequency\n );\n setUniform(material, \"uSizeRandomMin\", params.sizeRandomMin);\n setUniform(material, \"uSizeRandomMax\", params.sizeRandomMax);\n setUniform(material, \"uDivergence\", params.divergence);\n setUniform(material, \"uDivergencePoint\", params.divergencePoint);\n },\n [material]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({ scene, size, dpr, geometry, positions, uvs });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MorphParticlesParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: MorphParticlesParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","// \n//\tby Nikita Miropolskiy\n\n/* discontinuous pseudorandom uniformly distributed in [-0.5, +0.5]^3 */\nvec3 random3(vec3 c) {\n\tfloat j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));\n\tvec3 r;\n\tr.z = fract(512.0*j);\n\tj *= .125;\n\tr.x = fract(512.0*j);\n\tj *= .125;\n\tr.y = fract(512.0*j);\n\treturn r-0.5;\n}\n\nconst float F3 = 0.3333333;\nconst float G3 = 0.1666667;\nfloat snoise(vec3 p) {\n\n\tvec3 s = floor(p + dot(p, vec3(F3)));\n\tvec3 x = p - s + dot(s, vec3(G3));\n\t\n\tvec3 e = step(vec3(0.0), x - x.yzx);\n\tvec3 i1 = e*(1.0 - e.zxy);\n\tvec3 i2 = 1.0 - e.zxy*(1.0 - e);\n \t\n\tvec3 x1 = x - i1 + G3;\n\tvec3 x2 = x - i2 + 2.0*G3;\n\tvec3 x3 = x - 1.0 + 3.0*G3;\n\t \n\tvec4 w, d;\n\t \n\tw.x = dot(x, x);\n\tw.y = dot(x1, x1);\n\tw.z = dot(x2, x2);\n\tw.w = dot(x3, x3);\n\t \n\tw = max(0.6 - w, 0.0);\n\t \n\td.x = dot(random3(s), x);\n\td.y = dot(random3(s + i1), x1);\n\td.z = dot(random3(s + i2), x2);\n\td.w = dot(random3(s + 1.0), x3);\n\t \n\tw *= w;\n\tw *= w;\n\td *= w;\n\t \n\treturn dot(d, vec4(52.0));\n}\n\nfloat snoiseFractal(vec3 m) {\n\treturn 0.5333333* snoise(m)\n\t\t\t\t+0.2666667* snoise(2.0*m)\n\t\t\t\t+0.1333333* snoise(4.0*m)\n\t\t\t\t+0.0666667* snoise(8.0*m);\n}","#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float _transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\t// Mipped Bicubic Texture Filtering by N8\n\t// https://www.shadertoy.com/view/Dl2SDW\n\n\tfloat w0( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w1( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\n\t}\n\n\tfloat w2( float a ){\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w3( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\n\t}\n\n\t// g0 and g1 are the two amplitude functions\n\tfloat g0( float a ) {\n\n\t\treturn w0( a ) + w1( a );\n\n\t}\n\n\tfloat g1( float a ) {\n\n\t\treturn w2( a ) + w3( a );\n\n\t}\n\n\t// h0 and h1 are the two offset functions\n\tfloat h0( float a ) {\n\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\n\t}\n\n\tfloat h1( float a ) {\n\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\n\t}\n\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\n\t\tuv = uv * texelSize.zw + 0.5;\n\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\n\t}\n\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\n\t}\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\n\t}\n\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( isinf( attenuationDistance ) ) {\n\n\t\t\t// Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.\n\t\t\treturn vec3( 1.0 );\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\t// As less light is transmitted, the opacity should be increased. This simple approximation does a decent job \n\t\t// of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color.\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\n\t}\n#endif","#ifdef USE_TRANSMISSION\n\nmaterial.transmission = _transmission;\nmaterial.transmissionAlpha = 1.0;\nmaterial.thickness = thickness;\nmaterial.attenuationDistance = attenuationDistance;\nmaterial.attenuationColor = attenuationColor;\n\n#ifdef USE_TRANSMISSIONMAP\n\n\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\n#endif\n\n#ifdef USE_THICKNESSMAP\n\n\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\n#endif\n\nvec3 pos = vWorldPosition;\n\nvec3 v = normalize( cameraPosition - pos );\nvec3 n = inverseTransformDirection( normal, viewMatrix );\n\nvec4 transmitted = getIBLVolumeRefraction(\n\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\tmaterial.attenuationColor, material.attenuationDistance );\n\nmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\n// Custom from here\nfloat runningSeed = 0.0;\nvec3 transmission = vec3(0.0);\nfloat transmissionR, transmissionB, transmissionG;\nfloat randomCoords = rand(runningSeed++);\nfloat thickness_smear = thickness * max(pow(roughnessFactor, 0.33), uAnisotropicBlur);\nvec3 distortionNormal = vec3(0.0);\nvec3 temporalOffset = vec3(uTime, -uTime, -uTime) * uTemporalDistortion;\n\nif (uDistortion > 0.0) {\n\tdistortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset)));\n}\n\nfor (float i = 0.0; i < uSamples; i ++) {\n\tvec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5)) * pow(rand(runningSeed++), 0.33) + distortionNormal);\n\t\n\ttransmissionR = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).r;\n\ttransmissionG = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uSamples) , material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).g;\n\ttransmissionB = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uSamples), material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport getWobble from \"../../../libs/shaders/getWobble.glsl\";\nimport snoise from \"../../../libs/shaders/snoise.glsl\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\n\nexport class Wobble3DMaterial extends THREE.Material {\n uniforms!: {\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uWobbleShine: { value: number };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uSamples: { value: number };\n };\n}\n\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// #usf \n\t\tvoid main() {`\n );\n\n // wobble\n shader = shader.replace(\"// #usf \", `${getWobble}`);\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t// Wobble\n\t\tfloat wobble = getWobble(usf_Position);\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += getWobble(positionA) * normal;\n\t\tpositionB += getWobble(positionB) * normal;\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble / uWobbleStrength;`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype MaterialParams =\n ConstructorParameters[0];\nexport type WobbleMaterialProps = {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: MaterialParams;\n};\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\n const hasRoughness =\n mat.type === \"MeshPhysicalMaterial\" ||\n mat.type === \"MeshStandardMaterial\";\n\n const hasTransmission = mat.type === \"MeshPhysicalMaterial\";\n\n Object.assign(mat.userData, {\n uniforms: {\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: WOBBLE3D_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: WOBBLE3D_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: WOBBLE3D_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: WOBBLE3D_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: { value: WOBBLE3D_PARAMS.warpTimeFrequency },\n uWarpStrength: { value: WOBBLE3D_PARAMS.warpStrength },\n uWobbleShine: { value: WOBBLE3D_PARAMS.wobbleShine },\n uColor0: { value: WOBBLE3D_PARAMS.color0 },\n uColor1: { value: WOBBLE3D_PARAMS.color1 },\n uColor2: { value: WOBBLE3D_PARAMS.color2 },\n uColor3: { value: WOBBLE3D_PARAMS.color3 },\n uColorMix: { value: WOBBLE3D_PARAMS.colorMix },\n uChromaticAberration: {\n value: WOBBLE3D_PARAMS.chromaticAberration,\n },\n uAnisotropicBlur: { value: WOBBLE3D_PARAMS.anisotropicBlur },\n uDistortion: { value: WOBBLE3D_PARAMS.distortion },\n uDistortionScale: { value: WOBBLE3D_PARAMS.distortionScale },\n uTemporalDistortion: { value: WOBBLE3D_PARAMS.temporalDistortion },\n uSamples: { value: WOBBLE3D_PARAMS.samples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (shader) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t#include \n\t\t\t\tdiffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`\n );\n\n // roughness\n if (hasRoughness) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\t\t\t\t\troughnessFactor = usf_Roughness;`\n );\n }\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uWobbleShine;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t${snoise}\n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\t${hasRoughness ? \"float usf_Roughness = roughness;\" : \"\"}\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\n\t\t\t\t\t${\n hasRoughness\n ? \"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);\"\n : \"\"\n }`\n );\n\n // transmission\n if (hasTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [materialParameters, baseMaterial]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (props: RootState | null, params?: Wobble3DParams) => void;\ntype UseCreateWobble3DReturn = [\n UpdateUniform,\n {\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n }\n];\n\nexport const useCreateWobble3D = ({\n scene = false,\n geometry,\n baseMaterial,\n materialParameters,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const updateUniform = useCallback(\n (props, params) => {\n const userData = material.userData as Wobble3DMaterial;\n if (props) {\n setUniform(\n userData,\n \"uTime\",\n params?.beat || props.clock.getElapsedTime()\n );\n }\n if (params === undefined) {\n return;\n }\n setUniform(userData, \"uWobbleStrength\", params.wobbleStrength);\n setUniform(\n userData,\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n setUniform(\n userData,\n \"uWobbleTimeFrequency\",\n params.wobbleTimeFrequency\n );\n setUniform(userData, \"uWarpStrength\", params.warpStrength);\n setUniform(\n userData,\n \"uWarpPositionFrequency\",\n params.warpPositionFrequency\n );\n setUniform(userData, \"uWarpTimeFrequency\", params.warpTimeFrequency);\n setUniform(userData, \"uWobbleShine\", params.wobbleShine);\n setUniform(userData, \"uSamples\", params.samples);\n setUniform(userData, \"uColor0\", params.color0);\n setUniform(userData, \"uColor1\", params.color1);\n setUniform(userData, \"uColor2\", params.color2);\n setUniform(userData, \"uColor3\", params.color3);\n setUniform(userData, \"uColorMix\", params.colorMix);\n setUniform(\n userData,\n \"uChromaticAberration\",\n params.chromaticAberration\n );\n setUniform(userData, \"uAnisotropicBlur\", params.anisotropicBlur);\n setUniform(userData, \"uDistortion\", params.distortion);\n setUniform(userData, \"uDistortionScale\", params.distortionScale);\n setUniform(userData, \"uTemporalDistortion\", params.temporalDistortion);\n },\n [material]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type Wobble3DParams = {\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param ,default : `0` */\n wobbleShine?: number;\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Refraction samples, default : `6` */\n samples?: number;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */\n colorMix?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.5` */\n chromaticAberration?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n distortion?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n distortionScale?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n temporalDistortion?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type Wobble3DObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WOBBLE3D_PARAMS: Wobble3DParams = Object.freeze({\n beat: false,\n wobbleStrength: 0.3,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.4,\n wobbleShine: 0,\n warpStrength: 1.7,\n warpPositionFrequency: 0.38,\n warpTimeFrequency: 0.12,\n samples: 6,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n colorMix: 1,\n chromaticAberration: 0.5,\n anisotropicBlur: 0.1,\n distortion: 0.1,\n distortionScale: 0.1,\n temporalDistortion: 0.1,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: Wobble3DParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: Wobble3DParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\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 const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\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: {\n value: new THREE.Vector2(0, 0),\n },\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\";\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 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(material, \"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\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, 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 \"../../fxs/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\";\nimport { getDpr } from \"../../utils/getDpr\";\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 /** 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.updateKey must be a unique value for each update, for example `performance.now()`.*/\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 boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples, isSizeUpdate }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\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: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\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 useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\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 (errorHandler(params)) {\n return emptyTexture;\n }\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 (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 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","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/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 if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\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","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","useMesh","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","getDpr","BRUSH_PARAMS","useBrush","_dpr","updatePointer","pressureEnd","props","pointer","pointerValues","color","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","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","updateTempTexture","_tempTexture","iterations","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","useCreateObject","points","interactiveMesh","getWobble_default","ISDEV","rewriteVertexShader","modifeidAttributes","targetGeometry","targetAttibute","itemSize","vTargetName","vAttributeRewriteKey","vTransitionRewriteKey","vListName","vMorphTransition","stringToAddToMorphAttibutes","stringToAddToMorphAttibutesList","modifyAttributes","attribute","modifiedAttribute","maxLength","arr","diff","addArray","oldArray","randomIndex","j","rewriteFragmentShader","mapArray","mapArrayShader","mapArrayUniforms","textureSwitcherCode","map","condition","action","useMaterial","positions","uvs","modifiedPositions","modifiedUvs","rewritedVertexShader","getWobble","mapArraySwitch","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","snoise_default","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthMaterial","mat","hasRoughness","hasTransmission","WOBBLE3D_PARAMS","snoise","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[111]} \ No newline at end of file +{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/setUniforms.ts","../src/utils/useAddObject.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/interactions/useFluid/shaders/main.vert","../src/fxs/interactions/useFluid/shaders/init.frag","../src/fxs/interactions/useFluid/materials/useInitialMaterial.ts","../src/fxs/interactions/useFluid/shaders/advection.frag","../src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/interactions/useFluid/shaders/divergence.frag","../src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/interactions/useFluid/shaders/pressure.frag","../src/fxs/interactions/useFluid/materials/usePressureMaterial.ts","../src/fxs/interactions/useFluid/shaders/curl.frag","../src/fxs/interactions/useFluid/materials/useCurlMaterial.ts","../src/fxs/interactions/useFluid/shaders/vorticity.frag","../src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts","../src/fxs/interactions/useFluid/shaders/clear.frag","../src/fxs/interactions/useFluid/materials/useClearMaterial.ts","../src/fxs/interactions/useFluid/shaders/gradientSubtract.frag","../src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/interactions/useFluid/shaders/splat.frag","../src/fxs/interactions/useFluid/materials/useSplatMaterial.ts","../src/fxs/interactions/useFluid/useMesh.ts","../src/fxs/interactions/useFluid/index.ts","../src/fxs/interactions/useRipple/useMesh.ts","../src/fxs/interactions/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/misc/useBlank/shader/main.vert","../src/fxs/misc/useBlank/shader/main.frag","../src/fxs/misc/useBlank/useMesh.ts","../src/fxs/misc/useBlank/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/libs/shaders/getWobble.glsl","../src/libs/constants.ts","../src/fxs/3D/useMorphParticles/utils/rewriteVertexShader.ts","../src/fxs/3D/useMorphParticles/utils/modifyAttributes.ts","../src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts","../src/fxs/3D/useMorphParticles/utils/useMaterial.ts","../src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts","../src/fxs/3D/useMorphParticles/index.ts","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/libs/shaders/snoise.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/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 uBuffer;\nuniform sampler2D uTexture;\nuniform bool uIsTexture;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform float uMapIntensity;\nuniform float uRadius;\nuniform float uDissipation;\nuniform vec2 uResolution;\nuniform float uSmudge;\nuniform vec2 uMouse;\nuniform vec2 uPrevMouse;\nuniform vec2 uVelocity;\nuniform vec3 uColor;\nuniform float uMotionBlur;\nuniform int uMotionSample;\nuniform bool uIsCursor;\nuniform float uPressureStart;\nuniform float uPressureEnd;\n\nvarying vec2 vUv;\n\nfloat isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) {\n\t\n\tfloat aspect = uResolution.x / uResolution.y;\n\n\tpoint.x *= aspect;\n\tstart.x *= aspect;\n\tend.x *= aspect;\n\n\tvec2 dir = normalize(end - start);\n\tvec2 n = vec2(dir.y, -dir.x);\n\tvec2 p0 = point - start;\n\t\n\tfloat distToLine = abs(dot(p0, n));\n\tfloat distAlongLine = dot(p0, dir);\n\tfloat totalLength = length(end - start);\n\n\tfloat progress = clamp(distAlongLine / totalLength, 0.0, 1.0);\n\tfloat pressure = mix(pressureStart, pressureEnd, progress);\n\tradius = min(radius,radius * pressure);\n\n\tfloat distFromStart = length(point - start);\n\tfloat distFromEnd = length(point - end);\n\t\n\tbool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius;\n\n\treturn float(withinLine);\n}\n\nvec4 createSmudge(vec2 uv){\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\n\tfor(int i = 0; i < 9; i++) {\n\t\toffsets[i] = (offsets[i] * uSmudge) / uResolution;\n\t}\t\n\tvec4 smudgedColor = vec4(0.);\n\tfor(int i = 0; i < 9; i++) {\n\t\tsmudgedColor += texture2D(uBuffer, uv + offsets[i]);\n\t}\n\treturn smudgedColor / 9.0;\n}\n\nvec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) {\n\tvec2 scaledV = velocity * uMotionBlur;\n\tfor(int i = 1; i < uMotionSample; i++) {\n\t\tfloat t = float(i) / float(uMotionSample - 1);\n\t\tvec2 offset = t * scaledV / uResolution;\n\t\tbaseColor += texture2D(uBuffer, uv + offset);\n\t}\n\treturn baseColor / float(uMotionSample);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\tif(uIsMap){\n\t\tvec2 mapColor = texture2D(uMap, uv).rg;\n\t\tvec2 normalizedMap = mapColor * 2.0 - 1.0;\n\t\tuv = uv * 2.0 - 1.0;\n\t\tuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\n\t\tuv = (uv + 1.0) / 2.0;\n\t}\n\tvec2 suv = uv*2.-1.;\n\n\tvec2 velocity = uVelocity * uResolution;\n\n\tfloat radius = max(0.0,uRadius);\n\t\n\tvec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv);\n\n\tvec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor;\n\n\tvec4 bufferColor = motionBlurredColor;\n\tbufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation;\n\t\n\tvec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.);\n\t\n\tfloat onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd);\n\tfloat isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.;\n\n\tvec4 finalColor = mix(bufferColor, brushColor, isOnLine);\n\n\tgl_FragColor = finalColor;\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","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\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n // By design, I don't want to pass null to uniform\n if (material.uniforms[key] && value !== null) {\n material.uniforms[key].value = value;\n }\n };\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class BrushMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uBuffer: { value: THREE.Texture };\n uTexture: { value: THREE.Texture };\n uIsTexture: { value: boolean };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uMapIntensity: { value: number };\n uResolution: { 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.Vector3 | THREE.Color };\n uIsCursor: { value: boolean };\n uPressureStart: { value: number };\n uPressureEnd: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: new THREE.Texture() },\n uIsTexture: { value: false },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uMapIntensity: { value: 0.0 },\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(-10, -10) },\n uPrevMouse: { value: new THREE.Vector2(-10, -10) },\n uVelocity: { value: new THREE.Vector2(0, 0) },\n uColor: { value: new THREE.Vector3(1, 0, 0) },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = 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(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\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\n ? prevPointer.current.clone()\n : 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 [lerp]\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 { useCallback, useEffect, useMemo, useRef } 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 : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `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 if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\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 { useCallback, useEffect, useMemo, useRef } 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 if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\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 { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\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 , 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 color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrushParams) => {\n const { gl, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n if (params.texture!) {\n updateValue(\"uIsTexture\", true);\n updateValue(\"uTexture\", params.texture!);\n } else {\n updateValue(\"uIsTexture\", false);\n }\n\n if (params.map!) {\n updateValue(\"uIsMap\", true);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n } else {\n updateValue(\"uIsMap\", false);\n }\n\n updateValue(\"uRadius\", params.radius!);\n updateValue(\"uSmudge\", params.smudge!);\n updateValue(\"uDissipation\", params.dissipation!);\n updateValue(\"uMotionBlur\", params.motionBlur!);\n updateValue(\"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateValue(\"uMouse\", pointerValues.currentPointer);\n updateValue(\"uPrevMouse\", pointerValues.prevPointer);\n }\n updateValue(\"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n updateValue(\"uColor\", color);\n\n updateValue(\"uIsCursor\", params.isCursor!);\n\n // pressure\n updateValue(\"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n updateValue(\"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBuffer\", read);\n });\n },\n [updateValue, updatePointer, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.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\";\nimport { MaterialProps } from \"../../../types\";\n\nexport const useInitialMaterial = ({ onBeforeCompile }: MaterialProps) => {\n const initialMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n depthTest: false,\n depthWrite: false,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 = ({ onBeforeCompile }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\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 onBeforeCompile,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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\";\nimport { MaterialProps } from \"../../../types\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplatMaterial = ({ onBeforeCompile }: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]);\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, useSplatMaterial } from \"./materials/useSplatMaterial\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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};\n\nexport type FluidOnBeforeCompile = {\n initial?: MaterialProps;\n curl?: MaterialProps;\n vorticity?: MaterialProps;\n advection?: MaterialProps;\n divergence?: MaterialProps;\n pressure?: MaterialProps;\n clear?: MaterialProps;\n gradientSubtract?: MaterialProps;\n splat?: MaterialProps;\n};\n\nconst useCustomMaterial = (\n materialHook: ({ onBeforeCompile }: MaterialProps) => T,\n onBeforeCompileObj?: MaterialProps\n) => {\n const onBeforeCompile = onBeforeCompileObj?.onBeforeCompile;\n return materialHook({\n onBeforeCompile,\n });\n};\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n fluidOnBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n fluidOnBeforeCompile?: FluidOnBeforeCompile;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n\n const {\n initial,\n curl,\n vorticity,\n advection,\n divergence,\n pressure,\n clear,\n gradientSubtract,\n splat,\n } = fluidOnBeforeCompile ?? {};\n\n const initialMaterial = useCustomMaterial(useInitialMaterial, initial);\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCustomMaterial(useCurlMaterial, curl);\n const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity);\n const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection);\n const divergenceMaterial = useCustomMaterial(\n useDivergenceMaterial,\n divergence\n );\n const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure);\n const clearMaterial = useCustomMaterial(useClearMaterial, clear);\n const gradientSubtractMaterial = useCustomMaterial(\n useGradientSubtractMaterial,\n gradientSubtract\n );\n const splatMaterial = useCustomMaterial(useSplatMaterial, splat);\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 useMemo(() => {\n setUniform(materials.splatMaterial)(\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(material)(\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\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, mesh };\n};\n","import * as THREE from \"three\";\nimport { FluidMaterials, FluidOnBeforeCompile, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { PointerValues, usePointer } from \"../../../misc/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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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 = Object.freeze({\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 pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n fluidOnBeforeCompile,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n },\n },\n\t * ```\n\t*/\n fluidOnBeforeCompile?: FluidOnBeforeCompile;\n} & HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n fluidOnBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\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 updateAdvection = setUniform(materials.advectionMaterial);\n const updateSplat = setUniform(materials.splatMaterial);\n const updateCurl = setUniform(materials.curlMaterial);\n const updateVorticity = setUniform(materials.vorticityMaterial);\n const updateDivergence = setUniform(materials.divergenceMaterial);\n const updateClear = setUniform(materials.clearMaterial);\n const updatePressure = setUniform(materials.pressureMaterial);\n const updateGradientSubtract = setUniform(\n materials.gradientSubtractMaterial\n );\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 updateAdvection(\"uVelocity\", read);\n updateAdvection(\"uSource\", read);\n updateAdvection(\"dt\", dt);\n updateAdvection(\"dissipation\", params.velocity_dissipation!);\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateAdvection(\"uVelocity\", velocityTex);\n updateAdvection(\"uSource\", read);\n updateAdvection(\"dissipation\", params.density_dissipation!);\n });\n\n // update splatting\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateSplat(\"uTarget\", read);\n updateSplat(\"point\", pointerValues.currentPointer);\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocity_acceleration!)\n );\n updateSplat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateSplat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateSplat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n updateSplat(\"color\", color);\n });\n }\n\n // update curl\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n updateCurl(\"uVelocity\", velocityTex);\n });\n\n // update vorticity\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n updateVorticity(\"uVelocity\", read);\n updateVorticity(\"uCurl\", curlTex);\n updateVorticity(\"curl\", params.curl_strength!);\n updateVorticity(\"dt\", dt);\n });\n\n // update divergence\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n updateDivergence(\"uVelocity\", velocityTex);\n });\n\n // update pressure\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n updateClear(\"uTexture\", read);\n updateClear(\"value\", params.pressure_dissipation!);\n });\n\n // solve pressure iterative (Gauss-Seidel)\n setMeshMaterial(materials.pressureMaterial);\n updatePressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n updatePressure(\"uPressure\", read);\n });\n }\n\n // update gradienSubtract\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n updateGradientSubtract(\"uPressure\", pressureTexTemp);\n updateGradientSubtract(\"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n updateAdvection,\n updateClear,\n updateCurl,\n updateDivergence,\n updateGradientSubtract,\n updatePressure,\n updateSplat,\n updateVorticity,\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 mesh: mesh,\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\";\nimport { MaterialProps } from \"../../types\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n texture?: THREE.Texture;\n scene: THREE.Scene;\n};\n\nexport const useMesh = ({\n scale,\n max,\n texture,\n scene,\n onBeforeCompile,\n}: UseMeshProps & MaterialProps) => {\n const meshArr = useRef([]);\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n const material = useMemo(() => {\n const mat = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthTest: false,\n depthWrite: false,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [texture, onBeforeCompile]);\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, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\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 = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture = new THREE.Texture(),\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\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 pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n mesh.visible = true;\n mesh.position.set(\n pointerValues.currentPointer.x * (size.width / 2),\n pointerValues.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;\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as NoiseMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"scale\", params.scale!);\n updateValue(\"timeStrength\", params.timeStrength!);\n updateValue(\"noiseOctaves\", params.noiseOctaves!);\n updateValue(\"fbmOctaves\", params.fbmOctaves!);\n updateValue(\"warpOctaves\", params.warpOctaves!);\n updateValue(\"warpDirection\", params.warpDirection!);\n updateValue(\"warpStrength\", params.warpStrength!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as ColorStrataMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\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 beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\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 updateValue(\"uTexture\", params.texture);\n updateValue(\"isTexture\", true);\n } else {\n updateValue(\"isTexture\", false);\n updateValue(\"scale\", params.scale!);\n }\n\n if (params.noise) {\n updateValue(\"noise\", params.noise);\n updateValue(\"isNoise\", true);\n updateValue(\"noiseStrength\", params.noiseStrength!);\n } else {\n updateValue(\"isNoise\", false);\n }\n\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n updateValue(\"laminateLayer\", params.laminateLayer!);\n updateValue(\"laminateInterval\", params.laminateInterval!);\n updateValue(\"laminateDetail\", params.laminateDetail!);\n updateValue(\"distortion\", params.distortion!);\n updateValue(\"colorFactor\", params.colorFactor!);\n updateValue(\"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: 0 },\n u_complexity: { value: 0 },\n u_complexityAttenuation: { value: 0 },\n u_iterations: { value: 0 },\n u_timeStrength: { value: 0 },\n u_scale: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as MarbleMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MarbleParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n updateValue(\"u_pattern\", params.pattern!);\n updateValue(\"u_complexity\", params.complexity!);\n updateValue(\"u_complexityAttenuation\", params.complexityAttenuation!);\n updateValue(\"u_iterations\", params.iterations!);\n updateValue(\"u_timeStrength\", params.timeStrength!);\n updateValue(\"u_scale\", params.scale!);\n\n updateValue(\"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) },\n uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) },\n uColor3: { value: new THREE.Color().set(1, 1, 1) },\n uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as CosPaletteMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CosPaletteParams = {\n /** color1, default : `rgb(50%, 50%, 50%)` */\n color1?: THREE.Color;\n /** color2, default : `rgb(50%, 50%, 50%)` */\n color2?: THREE.Color;\n /** color3, default : `rgb(100%, 100%, 100%)` */\n color3?: THREE.Color;\n /** color4, default : `rgb(0%, 10%, 20%)` */\n color4?: THREE.Color;\n /** texture to be used as a palette */\n texture?: THREE.Texture;\n /** weight of the rgb, default : `THREE.Vector3(1.0,0.0,0.0)` */\n rgbWeight?: THREE.Vector3;\n};\n\nexport type ColorPaletteObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COSPALETTE_PARAMS: CosPaletteParams = Object.freeze({\n texture: new THREE.Texture(),\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CosPaletteParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor1\", params.color1!);\n updateValue(\"uColor2\", params.color2!);\n updateValue(\"uColor3\", params.color3!);\n updateValue(\"uColor4\", params.color4!);\n updateValue(\"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as DuoToneMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor0\", params.color0!);\n updateValue(\"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as BlendingMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_map\", params.map!);\n updateValue(\"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n updateValue(\"u_alphaMap\", params.alphaMap!);\n updateValue(\"u_isAlphaMap\", true);\n } else {\n updateValue(\"u_isAlphaMap\", false);\n }\n\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n if (params.dodgeColor) {\n updateValue(\"u_dodgeColor\", params.dodgeColor);\n updateValue(\"u_isDodgeColor\", true);\n } else {\n updateValue(\"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class FxTextureMaterial 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 onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 /** 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 , 0 ~ 1 , default : `0` */\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 mesh: THREE.Mesh;\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 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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture0\", params.texture0!);\n updateValue(\"uTexture1\", params.texture1!);\n\n updateValue(\"progress\", params.progress!);\n\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n updateValue(\"uTextureResolution\", interpolatedResolution);\n\n updateValue(\"padding\", params.padding!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"mapIntensity\", params.mapIntensity!);\n updateValue(\"edgeIntensity\", params.edgeIntensity!);\n updateValue(\"epicenter\", params.epicenter!);\n updateValue(\"dirX\", params.dir!.x);\n updateValue(\"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as BrightnessPickerMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = 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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as FxBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\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/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_map\", params.map!);\n updateValue(\"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class AlphaBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uMap: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as AlphaBlendingMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type AlphaBlendingParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** alpha map , default : `THREE.Texture()` */\n map?: THREE.Texture;\n};\n\nexport type AlphaBlendingObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const ALPHABLENDING_PARAMS: AlphaBlendingParams = {\n texture: new THREE.Texture(),\n map: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, onBeforeCompile });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: AlphaBlendingParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 float u_brightness;\nuniform float u_saturation;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class HSVMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: number };\n u_saturation: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_brightness: { value: 1 },\n u_saturation: { value: 1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as HSVMaterial;\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n return { material, mesh };\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 { setUniform } from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type HSVParams = {\n /** default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** default : `1` */\n brightness?: number;\n /** default : `1` */\n saturation?: number;\n};\n\nexport type HSVObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const HSV_PARAMS: HSVParams = {\n texture: new THREE.Texture(),\n brightness: 1,\n saturation: 1,\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, onBeforeCompile });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: HSVParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, setParams]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\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\t\n\tgl_FragColor = texture2D(uTexture, uv);\n\n}","import { 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 { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class FxTextureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uTextureResolution: { value: THREE.Vector2 };\n uTexture: { value: THREE.Texture };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: new THREE.Texture() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type CoverTextureParams = {\n /** Textures that you want to display exactly on the screen , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n};\n\nexport type CoverTextureObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COVERTEXTURE_PARAMS: CoverTextureParams = {\n texture: new THREE.Texture(),\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: CoverTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, setParams]\n );\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying 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;\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\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: new THREE.Texture() },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n blurSize: 3,\n blurPower: 5,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n updateValue(\"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 updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying 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;\nuniform sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: MOTIONBLUR_PARAMS.texture },\n uBackbuffer: { value: new THREE.Texture() },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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 { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: new THREE.Texture(),\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MotionBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uBegin\", params.begin!);\n updateValue(\"uEnd\", params.end!);\n updateValue(\"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 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 { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\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 = ({\n scene,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as WaveMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\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 mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\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/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uEpicenter\", params.epicenter!);\n updateValue(\"uProgress\", params.progress!);\n updateValue(\"uWidth\", params.width!);\n updateValue(\"uStrength\", params.strength!);\n updateValue(\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, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\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 u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\nexport class ChromaKeyMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_resolution: { value: THREE.Vector2 };\n u_keyColor: { value: THREE.Color };\n u_similarity: { value: number };\n u_smoothness: { value: number };\n u_spill: { value: number };\n u_color: { value: THREE.Vector4 };\n u_contrast: { value: number };\n u_brightness: { value: number };\n u_gamma: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: new THREE.Texture() },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: new THREE.Color() },\n u_similarity: { value: 0 },\n u_smoothness: { value: 0 },\n u_spill: { value: 0 },\n u_color: { value: new THREE.Vector4() },\n u_contrast: { value: 0 },\n u_brightness: { value: 0 },\n u_gamma: { value: 0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile]) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\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\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ChromaKeyParams = {\n /** Process this texture with chroma key , default : `THREE.Texture` */\n texture?: THREE.Texture;\n /** key color for chromakey processing , default: `THREE.Color(0x00ff00)` */\n keyColor?: THREE.Color;\n /** If the similarity with the key color exceeds this value, it becomes transparent. , default : `0.2` */\n similarity?: number;\n /** smoothness , default : `0.1` */\n smoothness?: number;\n /** spill , default : `0.2` */\n spill?: number;\n /** tone correction , default : `THREE.Vector4(1.0, 1.0, 1.0, 1.0)` */\n color?: THREE.Vector4;\n /** contrast , default : `1.0` */\n contrast?: number;\n /** brightness , default : `0.0` */\n brightness?: number;\n /** gamma correction , default : `1.0` */\n gamma?: number;\n};\n\nexport type ChromaKeyObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const CHROMAKEY_PARAMS: ChromaKeyParams = Object.freeze({\n texture: new THREE.Texture(),\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ChromaKeyParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_keyColor\", params.keyColor!);\n updateValue(\"u_similarity\", params.similarity!);\n updateValue(\"u_smoothness\", params.smoothness!);\n updateValue(\"u_spill\", params.spill!);\n updateValue(\"u_color\", params.color!);\n updateValue(\"u_contrast\", params.contrast!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying vec2 vUv;\n//#usf varyings\n\n//#usf uniforms\n\nvoid main() {\n\tvec4 usf_Position = vec4(position,1.);\n\tvUv = uv;\n\n\t//#usf main\n\t\n\tgl_Position = usf_Position;\n}","precision highp float;\n\nvarying vec2 vUv;\n//#usf varyings\n\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec2 uResolution;\n\n//#usf uniforms\n\nvoid main() {\n\tvec4 usf_FragColor = vec4(1.);\n\n\t//#usf main\n\t\n\tgl_FragColor = usf_FragColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { BLANK_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform, useResolution } from \"../../..\";\n\nexport class BlankMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uTime: { value: number };\n uPointer: { value: THREE.Vector2 };\n uResolution: { value: THREE.Vector2 };\n };\n}\n\nexport type CustomUniforms = {\n uniforms?: {\n [uniform: string]: THREE.IUniform;\n };\n};\n\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeCompile,\n uniforms,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps &\n CustomUniforms) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: BLANK_PARAMS.texture },\n uBackbuffer: { value: new THREE.Texture() },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n });\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, CustomUniforms, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\n\nexport type BlankParams = {\n /** texture, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type BlankObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh<\n THREE.BufferGeometry,\n BlankMaterial\n >;\n material: BlankMaterial;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLANK_PARAMS: BlankParams = Object.freeze({\n texture: new THREE.Texture(),\n beat: false,\n});\n\n/**\n * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`.\n * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms.\n *\n * ※ `usf_FragColor` overrides `gl_FragColor`\n *\n * ※ `usf_Position` overrides `gl_Position`\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlank = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n onBeforeCompile,\n uniforms,\n}: HooksProps & CustomUniforms): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeCompile,\n uniforms,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlankParams) => {\n const { gl, clock, pointer } = props;\n\n updateParams && setParams(updateParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uPointer\", pointer);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\n\nfloat random3D(vec3 co) {\n return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453);\n}\n\nvoid main() {\n\tvec3 newPosition = position;\n\tvec2 newUv = uv;\n\t#usf \n\t#usf \n\n\t// displacement for `newPosition`\n\tvec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0);\n\tfloat displacementIntensity = smoothstep(0., 1., displacement.g);\n\tvDisplacementColor = displacement;\n\tvDisplacementIntensity = displacementIntensity;\n\n\t// At this point displacement is 0 ~ 1, so normalize it to -1 ~ 1\n\tdisplacement = displacement * 2.-1.;\n\tdisplacement *= displacementIntensity * uDisplacementIntensity;\n\tnewPosition += displacement;\n\n\t// divergence\n\tvec3 divergenceDir = newPosition - uDivergencePoint;\n\tif (uDivergence > 0.0) {\n\t\tnewPosition += normalize(divergenceDir) * uDivergence;\n\t} else if (uDivergence < 0.0) {\n\t\tnewPosition -= normalize(divergenceDir) * abs(uDivergence);\n\t}\n\n\t// Final position\n\tvec4 modelPosition = modelMatrix * vec4(newPosition, 1.0);\n\tvec4 viewPosition = viewMatrix * modelPosition;\n\tvec4 projectedPosition = projectionMatrix * viewPosition;\n\n\t// wobble ※Do not calculate noise if uWobbleStrength is 0\n\tfloat wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0;\n\n\tgl_Position = projectedPosition += wobble;\n\t\n\t// If picture is true then display picture, otherwise 4 color linear interpolation\n\tvColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z);\n\n\t// Set Alpha on picture's g channel\n\tvPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.;\n\n\t// Multiply the point size by picturAalpha. The size can also be adjusted with alphaMap.\n\t// If uSizeRandomTimeFrequency is greater than 0, the size will be randomly changed\n\tfloat sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.;\n\tgl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand;\n\tgl_PointSize *= (1.0 / - viewPosition.z);\n\n\t// mapArrayIndex\n\tvMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.;\n}","precision highp float;\nprecision highp int;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\nuniform float uBlurAlpha;\nuniform float uBlurRadius;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform sampler2D uAlphaMap;\nuniform bool uIsAlphaMap;\nuniform float uDisplacementColorIntensity;\nuniform float uPointAlpha;\n\n#usf \n\nvoid main() { \n\tvec2 uv = gl_PointCoord;\n\tuv.y = 1.0 - uv.y;\n \n\t// make it a circle\n\tfloat distanceToCenter = length(uv - .5);\n\tfloat alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.);\n\n\t// Map if there is a map\t\n\tvec4 mapArrayColor;\n\t#usf \n\tvec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.);\n\tvec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor;\n\n\t// Mix with finalColor if displacement is true\n\tfloat mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.);\n\tfinalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor;\n\n\t// get alpha map\n\tfloat alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.;\n\n\tgl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha);\n}\n","//\tSimplex 4D Noise \n//\tby Ian McEwan, Ashima Arts\n//\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\nfloat permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\nfloat taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;}\n\nvec4 grad4(float j, vec4 ip)\n{\n\tconst vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\n\tvec4 p,s;\n\n\tp.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\n\tp.w = 1.5 - dot(abs(p.xyz), ones.xyz);\n\ts = vec4(lessThan(p, vec4(0.0)));\n\tp.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; \n\n\treturn p;\n}\n\nfloat simplexNoise4d(vec4 v)\n{\n\tconst vec2 C = vec2( 0.138196601125010504, // (5 - sqrt(5))/20 G4\n\t\t\t\t\t\t\t\t\t0.309016994374947451); // (sqrt(5) - 1)/4 F4\n\t// First corner\n\tvec4 i = floor(v + dot(v, C.yyyy) );\n\tvec4 x0 = v - i + dot(i, C.xxxx);\n\n\t// Other corners\n\n\t// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n\tvec4 i0;\n\n\tvec3 isX = step( x0.yzw, x0.xxx );\n\tvec3 isYZ = step( x0.zww, x0.yyz );\n\t// i0.x = dot( isX, vec3( 1.0 ) );\n\ti0.x = isX.x + isX.y + isX.z;\n\ti0.yzw = 1.0 - isX;\n\n\t// i0.y += dot( isYZ.xy, vec2( 1.0 ) );\n\ti0.y += isYZ.x + isYZ.y;\n\ti0.zw += 1.0 - isYZ.xy;\n\n\ti0.z += isYZ.z;\n\ti0.w += 1.0 - isYZ.z;\n\n\t// i0 now contains the unique values 0,1,2,3 in each channel\n\tvec4 i3 = clamp( i0, 0.0, 1.0 );\n\tvec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\n\tvec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\n\n\t// x0 = x0 - 0.0 + 0.0 * C \n\tvec4 x1 = x0 - i1 + 1.0 * C.xxxx;\n\tvec4 x2 = x0 - i2 + 2.0 * C.xxxx;\n\tvec4 x3 = x0 - i3 + 3.0 * C.xxxx;\n\tvec4 x4 = x0 - 1.0 + 4.0 * C.xxxx;\n\n\t// Permutations\n\ti = mod(i, 289.0); \n\tfloat j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\n\tvec4 j1 = permute( permute( permute( permute (\n\t\t\t\t\ti.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\n\t\t\t\t+ i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\n\t\t\t\t+ i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\n\t\t\t\t+ i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\n\t// Gradients\n\t// ( 7*7*6 points uniformly over a cube, mapped onto a 4-octahedron.)\n\t// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n\n\tvec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\n\n\tvec4 p0 = grad4(j0, ip);\n\tvec4 p1 = grad4(j1.x, ip);\n\tvec4 p2 = grad4(j1.y, ip);\n\tvec4 p3 = grad4(j1.z, ip);\n\tvec4 p4 = grad4(j1.w, ip);\n\n\t// Normalise gradients\n\tvec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\tp4 *= taylorInvSqrt(dot(p4,p4));\n\n\t// Mix contributions from the five corners\n\tvec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\n\tvec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0);\n\tm0 = m0 * m0;\n\tm1 = m1 * m1;\n\treturn 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\n\t\t\t\t\t\t+ dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\n\n}\n\nfloat getWobble(vec3 position)\n{\n\tvec3 warpedPosition = position;\n\twarpedPosition += simplexNoise4d(\n\t\tvec4(\n\t\t\t\tposition * uWarpPositionFrequency,\n\t\t\t\tuTime * uWarpTimeFrequency\n\t\t)\n\t) * uWarpStrength;\n\n\treturn simplexNoise4d(vec4(\n\t\twarpedPosition * uWobblePositionFrequency, // XYZ\n\t\tuTime * uWobbleTimeFrequency // W\n\t)) * uWobbleStrength;\n}","export const ISDEV = process.env.NODE_ENV === \"development\";\n","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport getWobble from \"../../../../libs/shaders/getWobble.glsl\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport { ISDEV } from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\nimport { MaterialProps } from \"../../../types\";\n\nexport class MorphParticlesMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uResolution: { value: THREE.Vector2 };\n uMorphProgress: { value: number };\n uBlurAlpha: { value: number };\n uBlurRadius: { value: number };\n uPointSize: { value: number };\n uPointAlpha: { value: number };\n uPicture: { value: THREE.Texture };\n uIsPicture: { value: boolean };\n uAlphaPicture: { value: THREE.Texture };\n uIsAlphaPicture: { value: boolean };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uMap: { value: THREE.Texture };\n uIsMap: { value: boolean };\n uAlphaMap: { value: THREE.Texture };\n uIsAlphaMap: { value: boolean };\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uDisplacement: { value: THREE.Texture };\n uIsDisplacement: { value: boolean };\n uDisplacementIntensity: { value: number };\n uDisplacementColorIntensity: { value: number };\n uSizeRandomIntensity: { value: number };\n uSizeRandomTimeFrequency: { value: number };\n uSizeRandomMin: { value: number };\n uSizeRandomMax: { value: number };\n uDivergence: { value: number };\n uDivergencePoint: { value: THREE.Vector3 };\n };\n}\n\nexport const useMaterial = ({\n size,\n dpr,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n ).replace(`#usf `, getWobble);\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n depthTest: false,\n depthWrite: false,\n transparent: true,\n blending: THREE.AdditiveBlending,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: new THREE.Texture() },\n uIsPicture: { value: false },\n uAlphaPicture: { value: new THREE.Texture() },\n uIsAlphaPicture: { value: false },\n uColor0: { value: MORPHPARTICLES_PARAMS.color0 },\n uColor1: { value: MORPHPARTICLES_PARAMS.color1 },\n uColor2: { value: MORPHPARTICLES_PARAMS.color2 },\n uColor3: { value: MORPHPARTICLES_PARAMS.color3 },\n uMap: { value: new THREE.Texture() },\n uIsMap: { value: false },\n uAlphaMap: { value: new THREE.Texture() },\n uIsAlphaMap: { value: false },\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: MORPHPARTICLES_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: new THREE.Texture() },\n uIsDisplacement: { value: false },\n uDisplacementIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementIntensity,\n },\n uDisplacementColorIntensity: {\n value: MORPHPARTICLES_PARAMS.displacementColorIntensity,\n },\n uSizeRandomIntensity: {\n value: MORPHPARTICLES_PARAMS.sizeRandomIntensity,\n },\n uSizeRandomTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.sizeRandomTimeFrequency,\n },\n uSizeRandomMin: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n },\n });\n\n if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n props: RootState | null,\n params?: MorphParticlesParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const updateUniform = useCallback(\n (props, params) => {\n if (props) {\n updateValue(\"uTime\", params?.beat || props.clock.getElapsedTime());\n }\n if (params === undefined) {\n return;\n }\n updateValue(\"uMorphProgress\", params.morphProgress);\n updateValue(\"uBlurAlpha\", params.blurAlpha);\n updateValue(\"uBlurRadius\", params.blurRadius);\n updateValue(\"uPointSize\", params.pointSize);\n updateValue(\"uPointAlpha\", params.pointAlpha);\n if (params.picture) {\n updateValue(\"uPicture\", params.picture);\n updateValue(\"uIsPicture\", true);\n } else if (params.picture === false) {\n updateValue(\"uIsPicture\", false);\n }\n if (params.alphaPicture) {\n updateValue(\"uAlphaPicture\", params.alphaPicture);\n updateValue(\"uIsAlphaPicture\", true);\n } else if (params.alphaPicture === false) {\n updateValue(\"uIsAlphaPicture\", false);\n }\n updateValue(\"uColor0\", params.color0);\n updateValue(\"uColor1\", params.color1);\n updateValue(\"uColor2\", params.color2);\n updateValue(\"uColor3\", params.color3);\n if (params.map) {\n updateValue(\"uMap\", params.map);\n updateValue(\"uIsMap\", true);\n } else if (params.map === false) {\n updateValue(\"uIsMap\", false);\n }\n if (params.alphaMap) {\n updateValue(\"uAlphaMap\", params.alphaMap);\n updateValue(\"uIsAlphaMap\", true);\n } else if (params.alphaMap === false) {\n updateValue(\"uIsAlphaMap\", false);\n }\n updateValue(\"uWobbleStrength\", params.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", params.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", params.warpStrength);\n updateValue(\"uWarpPositionFrequency\", params.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", params.warpTimeFrequency);\n if (params.displacement) {\n updateValue(\"uDisplacement\", params.displacement);\n updateValue(\"uIsDisplacement\", true);\n } else if (params.displacement === false) {\n updateValue(\"uIsDisplacement\", false);\n }\n updateValue(\"uDisplacementIntensity\", params.displacementIntensity);\n updateValue(\n \"uDisplacementColorIntensity\",\n params.displacementColorIntensity\n );\n updateValue(\"uSizeRandomIntensity\", params.sizeRandomIntensity);\n updateValue(\n \"uSizeRandomTimeFrequency\",\n params.sizeRandomTimeFrequency\n );\n updateValue(\"uSizeRandomMin\", params.sizeRandomMin);\n updateValue(\"uSizeRandomMax\", params.sizeRandomMax);\n updateValue(\"uDivergence\", params.divergence);\n updateValue(\"uDivergencePoint\", params.divergencePoint);\n },\n [updateValue]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n positions,\n uvs,\n onBeforeCompile,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({\n scene,\n size,\n dpr,\n geometry,\n positions,\n uvs,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: MorphParticlesParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: MorphParticlesParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","// \n//\tby Nikita Miropolskiy\n\n/* discontinuous pseudorandom uniformly distributed in [-0.5, +0.5]^3 */\nvec3 random3(vec3 c) {\n\tfloat j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));\n\tvec3 r;\n\tr.z = fract(512.0*j);\n\tj *= .125;\n\tr.x = fract(512.0*j);\n\tj *= .125;\n\tr.y = fract(512.0*j);\n\treturn r-0.5;\n}\n\nconst float F3 = 0.3333333;\nconst float G3 = 0.1666667;\nfloat snoise(vec3 p) {\n\n\tvec3 s = floor(p + dot(p, vec3(F3)));\n\tvec3 x = p - s + dot(s, vec3(G3));\n\t\n\tvec3 e = step(vec3(0.0), x - x.yzx);\n\tvec3 i1 = e*(1.0 - e.zxy);\n\tvec3 i2 = 1.0 - e.zxy*(1.0 - e);\n \t\n\tvec3 x1 = x - i1 + G3;\n\tvec3 x2 = x - i2 + 2.0*G3;\n\tvec3 x3 = x - 1.0 + 3.0*G3;\n\t \n\tvec4 w, d;\n\t \n\tw.x = dot(x, x);\n\tw.y = dot(x1, x1);\n\tw.z = dot(x2, x2);\n\tw.w = dot(x3, x3);\n\t \n\tw = max(0.6 - w, 0.0);\n\t \n\td.x = dot(random3(s), x);\n\td.y = dot(random3(s + i1), x1);\n\td.z = dot(random3(s + i2), x2);\n\td.w = dot(random3(s + 1.0), x3);\n\t \n\tw *= w;\n\tw *= w;\n\td *= w;\n\t \n\treturn dot(d, vec4(52.0));\n}\n\nfloat snoiseFractal(vec3 m) {\n\treturn 0.5333333* snoise(m)\n\t\t\t\t+0.2666667* snoise(2.0*m)\n\t\t\t\t+0.1333333* snoise(4.0*m)\n\t\t\t\t+0.0666667* snoise(8.0*m);\n}","#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float _transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\t// Mipped Bicubic Texture Filtering by N8\n\t// https://www.shadertoy.com/view/Dl2SDW\n\n\tfloat w0( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w1( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\n\t}\n\n\tfloat w2( float a ){\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\n\t}\n\n\tfloat w3( float a ) {\n\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\n\t}\n\n\t// g0 and g1 are the two amplitude functions\n\tfloat g0( float a ) {\n\n\t\treturn w0( a ) + w1( a );\n\n\t}\n\n\tfloat g1( float a ) {\n\n\t\treturn w2( a ) + w3( a );\n\n\t}\n\n\t// h0 and h1 are the two offset functions\n\tfloat h0( float a ) {\n\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\n\t}\n\n\tfloat h1( float a ) {\n\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\n\t}\n\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\n\t\tuv = uv * texelSize.zw + 0.5;\n\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\n\t}\n\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\n\t}\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\n\t}\n\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( isinf( attenuationDistance ) ) {\n\n\t\t\t// Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.\n\t\t\treturn vec3( 1.0 );\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\t// As less light is transmitted, the opacity should be increased. This simple approximation does a decent job \n\t\t// of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color.\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\n\t}\n#endif","#ifdef USE_TRANSMISSION\n\nmaterial.transmission = _transmission;\nmaterial.transmissionAlpha = 1.0;\nmaterial.thickness = thickness;\nmaterial.attenuationDistance = attenuationDistance;\nmaterial.attenuationColor = attenuationColor;\n\n#ifdef USE_TRANSMISSIONMAP\n\n\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\n#endif\n\n#ifdef USE_THICKNESSMAP\n\n\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\n#endif\n\nvec3 pos = vWorldPosition;\n\nvec3 v = normalize( cameraPosition - pos );\nvec3 n = inverseTransformDirection( normal, viewMatrix );\n\nvec4 transmitted = getIBLVolumeRefraction(\n\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\tmaterial.attenuationColor, material.attenuationDistance );\n\nmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\n// Custom from here\nfloat runningSeed = 0.0;\nvec3 transmission = vec3(0.0);\nfloat transmissionR, transmissionB, transmissionG;\nfloat randomCoords = rand(runningSeed++);\nfloat thickness_smear = thickness * max(pow(roughnessFactor, 0.33), uAnisotropicBlur);\nvec3 distortionNormal = vec3(0.0);\nvec3 temporalOffset = vec3(uTime, -uTime, -uTime) * uTemporalDistortion;\n\nif (uDistortion > 0.0) {\n\tdistortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset)));\n}\n\nfor (float i = 0.0; i < uSamples; i ++) {\n\tvec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5, rand(runningSeed++) - 0.5)) * pow(rand(runningSeed++), 0.33) + distortionNormal);\n\t\n\ttransmissionR = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).r;\n\ttransmissionG = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uSamples) , material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).g;\n\ttransmissionB = getIBLVolumeRefraction(\n\t\tsampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uSamples), material.thickness + thickness_smear * (i + randomCoords) / uSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport getWobble from \"../../../libs/shaders/getWobble.glsl\";\nimport snoise from \"../../../libs/shaders/snoise.glsl\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\n\nexport class Wobble3DMaterial extends THREE.Material {\n uniforms!: {\n uTime: { value: number };\n uWobblePositionFrequency: { value: number };\n uWobbleTimeFrequency: { value: number };\n uWobbleStrength: { value: number };\n uWarpPositionFrequency: { value: number };\n uWarpTimeFrequency: { value: number };\n uWarpStrength: { value: number };\n uWobbleShine: { value: number };\n uIsWobbleMap: { value: boolean };\n uWobbleMap: { value: THREE.Texture };\n uWobbleMapStrength: { value: number };\n uWobbleMapDistortion: { value: number };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uSamples: { value: number };\n };\n}\n\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tuniform bool uIsWobbleMap;\n\t\tuniform sampler2D uWobbleMap;\n\t\tuniform float uWobbleMapStrength;\n\t\tuniform float uWobbleMapDistortion;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// #usf \n\t\tvoid main() {`\n );\n\n // wobble\n shader = shader.replace(\"// #usf \", `${getWobble}`);\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobbleMap & wobble\n\t\tfloat wobbleMap = uIsWobbleMap ? texture2D(uWobbleMap, uv).g : 0.0;\n\t\tvec3 nWobbleMap = wobbleMap * normal * uWobbleMapStrength;\n\t\tfloat wobbleMapDistortion = wobbleMap * uWobbleMapDistortion;\n\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += nWobbleMap + (wobble * normal);\n\t\tpositionA += nWobbleMap + wobbleMapDistortion + (wobblePositionA * normal);\n\t\tpositionB += nWobbleMap + wobbleMapDistortion + (wobblePositionB * normal);\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype MaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: MaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.Shader,\n renderer: THREE.WebGLRenderer\n ) => void;\n}\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\n const hasRoughness =\n mat.type === \"MeshPhysicalMaterial\" ||\n mat.type === \"MeshStandardMaterial\";\n\n const hasTransmission = mat.type === \"MeshPhysicalMaterial\";\n\n Object.assign(mat.userData, {\n uniforms: {\n uTime: { value: 0 },\n uWobblePositionFrequency: {\n value: WOBBLE3D_PARAMS.wobblePositionFrequency,\n },\n uWobbleTimeFrequency: {\n value: WOBBLE3D_PARAMS.wobbleTimeFrequency,\n },\n uWobbleStrength: { value: WOBBLE3D_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: WOBBLE3D_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: { value: WOBBLE3D_PARAMS.warpTimeFrequency },\n uWarpStrength: { value: WOBBLE3D_PARAMS.warpStrength },\n uWobbleShine: { value: WOBBLE3D_PARAMS.wobbleShine },\n uIsWobbleMap: { value: false },\n uWobbleMap: { value: new THREE.Texture() },\n uWobbleMapStrength: { value: WOBBLE3D_PARAMS.wobbleMapStrength },\n uWobbleMapDistortion: {\n value: WOBBLE3D_PARAMS.wobbleMapDistortion,\n },\n uColor0: { value: WOBBLE3D_PARAMS.color0 },\n uColor1: { value: WOBBLE3D_PARAMS.color1 },\n uColor2: { value: WOBBLE3D_PARAMS.color2 },\n uColor3: { value: WOBBLE3D_PARAMS.color3 },\n uColorMix: { value: WOBBLE3D_PARAMS.colorMix },\n uChromaticAberration: {\n value: WOBBLE3D_PARAMS.chromaticAberration,\n },\n uAnisotropicBlur: { value: WOBBLE3D_PARAMS.anisotropicBlur },\n uDistortion: { value: WOBBLE3D_PARAMS.distortion },\n uDistortionScale: { value: WOBBLE3D_PARAMS.distortionScale },\n uTemporalDistortion: { value: WOBBLE3D_PARAMS.temporalDistortion },\n uSamples: { value: WOBBLE3D_PARAMS.samples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t#include \n\t\t\t\tdiffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`\n );\n\n // roughness\n if (hasRoughness) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\t\t\t\t\troughnessFactor = usf_Roughness;`\n );\n }\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uWobbleShine;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t${snoise}\n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\t${hasRoughness ? \"float usf_Roughness = roughness;\" : \"\"}\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\n\t\t\t\t\t${\n hasRoughness\n ? \"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);\"\n : \"\"\n }`\n );\n\n // transmission\n if (hasTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n onBeforeCompile && onBeforeCompile(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n depthOnBeforeCompile && depthOnBeforeCompile(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n ]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (props: RootState | null, params?: Wobble3DParams) => void;\ntype UseCreateWobble3DReturn = [\n UpdateUniform,\n {\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n }\n];\n\nexport const useCreateWobble3D = ({\n scene = false,\n geometry,\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const updateUniform = useCallback(\n (props, params) => {\n if (props) {\n updateValue(\"uTime\", params?.beat || props.clock.getElapsedTime());\n }\n if (params === undefined) {\n return;\n }\n updateValue(\"uWobbleStrength\", params.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n params.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", params.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", params.warpStrength);\n updateValue(\"uWarpPositionFrequency\", params.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", params.warpTimeFrequency);\n updateValue(\"uWobbleShine\", params.wobbleShine);\n if (params.wobbleMap) {\n updateValue(\"uWobbleMap\", params.wobbleMap);\n updateValue(\"uIsWobbleMap\", true);\n } else if (params.wobbleMap === false) {\n updateValue(\"uIsWobbleMap\", false);\n }\n updateValue(\"uWobbleMapStrength\", params.wobbleMapStrength);\n updateValue(\"uWobbleMapDistortion\", params.wobbleMapDistortion);\n updateValue(\"uSamples\", params.samples);\n updateValue(\"uColor0\", params.color0);\n updateValue(\"uColor1\", params.color1);\n updateValue(\"uColor2\", params.color2);\n updateValue(\"uColor3\", params.color3);\n updateValue(\"uColorMix\", params.colorMix);\n updateValue(\"uChromaticAberration\", params.chromaticAberration);\n updateValue(\"uAnisotropicBlur\", params.anisotropicBlur);\n updateValue(\"uDistortion\", params.distortion);\n updateValue(\"uDistortionScale\", params.distortionScale);\n updateValue(\"uTemporalDistortion\", params.temporalDistortion);\n },\n [updateValue]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type Wobble3DParams = {\n /** default : `0.3` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param, default : `0` */\n wobbleShine?: number;\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the wobble changes depending on the g channel of this texture, default : `false` */\n wobbleMap?: THREE.Texture | false;\n /** Strength of wobbleMap, default : `0.03` */\n wobbleMapStrength?: number;\n /** Strength of distorting the 'normal' by wobbleMap, default : `0.0` */\n wobbleMapDistortion?: number;\n /** Refraction samples, default : `6` */\n samples?: number;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */\n colorMix?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n chromaticAberration?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.0` */\n distortion?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.1` */\n distortionScale?: number;\n /** valid only for MeshPhysicalMaterial , default : `0.0` */\n temporalDistortion?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type Wobble3DObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n depthMaterial: THREE.MeshDepthMaterial;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WOBBLE3D_PARAMS: Wobble3DParams = Object.freeze({\n beat: false,\n wobbleStrength: 0.3,\n wobblePositionFrequency: 0.3,\n wobbleTimeFrequency: 0.3,\n wobbleShine: 0,\n warpStrength: 0.3,\n warpPositionFrequency: 0.3,\n warpTimeFrequency: 0.3,\n wobbleMap: false,\n wobbleMapStrength: 0.03,\n wobbleMapDistortion: 0.0,\n samples: 6,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n colorMix: 1,\n chromaticAberration: 0.1,\n anisotropicBlur: 0.1,\n distortion: 0.0,\n distortionScale: 0.1,\n temporalDistortion: 0.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n onBeforeCompile,\n depthOnBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: Wobble3DParams) => {\n updateUniform(props, updateParams);\n return updateRenderTarget(props.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const setParams = useCallback(\n (updateParams: Wobble3DParams) => {\n updateUniform(null, updateParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\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 const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\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\";\nimport { MaterialProps } from \"../../../fxs/types\";\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 onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\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 mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n transparent: true,\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\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 if (onBeforeCompile) {\n mat.onBeforeCompile = onBeforeCompile;\n }\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\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\";\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 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 const updateValue = setUniform(material);\n updateValue(\"u_texture\", params.texture![i]);\n updateValue(\"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n updateValue(\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n updateValue(\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, 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 \"../../fxs/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\";\nimport { getDpr } from \"../../utils/getDpr\";\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 /** 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.updateKey must be a unique value for each update, for example `performance.now()`.*/\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 boderRadius: [],\n rotation: [],\n onIntersect: [],\n};\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer\n * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array.\n */\nexport const useDomSyncer = (\n { size, dpr, samples, isSizeUpdate, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\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: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\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 useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\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 (errorHandler(params)) {\n return emptyTexture;\n }\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 (refreshTrigger) {\n createMesh({\n params,\n size,\n scene,\n onBeforeCompile,\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 return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n setParams,\n intersectionHandler,\n updateDomRects,\n onBeforeCompile,\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","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/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 if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\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","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","useMesh","onBeforeCompile","mat","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","getDpr","BRUSH_PARAMS","useBrush","_dpr","updatePointer","pressureEnd","updateValue","props","pointer","pointerValues","color","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","useSplatMaterial","useCustomMaterial","materialHook","onBeforeCompileObj","fluidOnBeforeCompile","initial","curl","vorticity","advection","divergence","pressure","clear","gradientSubtract","splat","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","updateAdvection","updateSplat","updateCurl","updateVorticity","updateDivergence","updateClear","updatePressure","updateGradientSubtract","clock","dt","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","RIPPLE_PARAMS","useRipple","currentWave","NOISE_PARAMS","useNoise","COLORSTRATA_PARAMS","useColorStrata","MARBLE_PARAMS","useMarble","COSPALETTE_PARAMS","useCosPalette","DUOTONE_PARAMS","useDuoTone","BLENDING_PARAMS","useBlending","FXTEXTURE_PARAMS","useFxTexture","tex0Res","_d","_c","tex1Res","_f","_e","_h","_g","interpolatedResolution","index","BRIGHTNESSPICKER_PARAMS","useBrightnessPicker","FXBLENDING_PARAMS","useFxBlending","ALPHABLENDING_PARAMS","useAlphaBlending","HSV_PARAMS","useHSV","COVERTEXTURE_PARAMS","useCoverTexture","SIMPLEBLUR_PARAMS","useSimpleBlur","updateTempTexture","_tempTexture","iterations","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","uniforms","BLANK_PARAMS","useBlank","useCreateObject","points","interactiveMesh","getWobble_default","ISDEV","rewriteVertexShader","modifeidAttributes","targetGeometry","targetAttibute","itemSize","vTargetName","vAttributeRewriteKey","vTransitionRewriteKey","vListName","vMorphTransition","stringToAddToMorphAttibutes","stringToAddToMorphAttibutesList","modifyAttributes","attribute","modifiedAttribute","maxLength","arr","diff","addArray","oldArray","randomIndex","j","rewriteFragmentShader","mapArray","mapArrayShader","mapArrayUniforms","textureSwitcherCode","map","condition","action","useMaterial","positions","uvs","modifiedPositions","modifiedUvs","rewritedVertexShader","getWobble","rewritedFragmentShader","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","snoise_default","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","depthMaterial","hasRoughness","hasTransmission","WOBBLE3D_PARAMS","renderer","snoise","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[115]} \ 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 f9904901..2aa8c064 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -1,12 +1,12 @@ { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.15", + "version": "1.1.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.15", + "version": "1.1.16", "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 6a46a556..41563245 100644 --- a/packages/use-shader-fx/package.json +++ b/packages/use-shader-fx/package.json @@ -1,6 +1,6 @@ { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.15", + "version": "1.1.16", "description": "⚡️ More FXs, Less GLSL", "main": "./build/use-shader-fx.umd.cjs", "module": "./build/use-shader-fx.js", diff --git a/packages/use-shader-fx/src/fxs/3D/types/index.ts b/packages/use-shader-fx/src/fxs/3D/types/index.ts index d672bae0..9233ccf0 100644 --- a/packages/use-shader-fx/src/fxs/3D/types/index.ts +++ b/packages/use-shader-fx/src/fxs/3D/types/index.ts @@ -1,12 +1,12 @@ import * as THREE from "three"; -import { HooksProps } from "../../types"; +import { HooksProps, MaterialProps } from "../../types"; export interface HooksProps3D extends HooksProps { /** For 3D series, you should use the r3f camera as it is as the camera passed to renderTarget. */ camera: THREE.Camera; } -export type Create3DHooksProps = { - /** r3fのシーンを入れてもいいし、どのシーンにもaddしたくない場合は何も渡さないとシーンに入れずにオブジェクトだけ返すよ , default : false*/ +export interface Create3DHooksProps extends MaterialProps { + /** You can put the r3f scene in, or if you don't want to add to any scene, you can pass nothing and it will just return the object without putting it in the scene, default : `false` */ scene?: THREE.Scene | false; -}; +} diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts index 6ec363b2..fa0456ee 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts @@ -112,6 +112,7 @@ export const useMorphParticles = ({ geometry, positions, uvs, + onBeforeCompile, }: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn< MorphParticlesParams, MorphParticlesObject @@ -128,7 +129,15 @@ export const useMorphParticles = ({ positions: generatedPositions, uvs: generatedUvs, }, - ] = useCreateMorphParticles({ scene, size, dpr, geometry, positions, uvs }); + ] = useCreateMorphParticles({ + scene, + size, + dpr, + geometry, + positions, + uvs, + onBeforeCompile, + }); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts index 0aa24db7..8e119e6f 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts @@ -47,6 +47,7 @@ export const useCreateMorphParticles = ({ positions, uvs, mapArray, + onBeforeCompile, }: Create3DHooksProps & UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => { const _dpr = getDpr(dpr); @@ -66,6 +67,7 @@ export const useCreateMorphParticles = ({ positions, uvs, mapArray, + onBeforeCompile, }); const { points, interactiveMesh } = useCreateObject({ @@ -74,101 +76,79 @@ export const useCreateMorphParticles = ({ material, }); + const updateValue = setUniform(material); const updateUniform = useCallback( (props, params) => { if (props) { - setUniform( - material, - "uTime", - params?.beat || props.clock.getElapsedTime() - ); + updateValue("uTime", params?.beat || props.clock.getElapsedTime()); } if (params === undefined) { return; } - setUniform(material, "uMorphProgress", params.morphProgress); - setUniform(material, "uBlurAlpha", params.blurAlpha); - setUniform(material, "uBlurRadius", params.blurRadius); - setUniform(material, "uPointSize", params.pointSize); - setUniform(material, "uPointAlpha", params.pointAlpha); + updateValue("uMorphProgress", params.morphProgress); + updateValue("uBlurAlpha", params.blurAlpha); + updateValue("uBlurRadius", params.blurRadius); + updateValue("uPointSize", params.pointSize); + updateValue("uPointAlpha", params.pointAlpha); if (params.picture) { - setUniform(material, "uPicture", params.picture); - setUniform(material, "uIsPicture", true); + updateValue("uPicture", params.picture); + updateValue("uIsPicture", true); } else if (params.picture === false) { - setUniform(material, "uIsPicture", false); + updateValue("uIsPicture", false); } if (params.alphaPicture) { - setUniform(material, "uAlphaPicture", params.alphaPicture); - setUniform(material, "uIsAlphaPicture", true); + updateValue("uAlphaPicture", params.alphaPicture); + updateValue("uIsAlphaPicture", true); } else if (params.alphaPicture === false) { - setUniform(material, "uIsAlphaPicture", false); + updateValue("uIsAlphaPicture", false); } - setUniform(material, "uColor0", params.color0); - setUniform(material, "uColor1", params.color1); - setUniform(material, "uColor2", params.color2); - setUniform(material, "uColor3", params.color3); + updateValue("uColor0", params.color0); + updateValue("uColor1", params.color1); + updateValue("uColor2", params.color2); + updateValue("uColor3", params.color3); if (params.map) { - setUniform(material, "uMap", params.map); - setUniform(material, "uIsMap", true); + updateValue("uMap", params.map); + updateValue("uIsMap", true); } else if (params.map === false) { - setUniform(material, "uIsMap", false); + updateValue("uIsMap", false); } if (params.alphaMap) { - setUniform(material, "uAlphaMap", params.alphaMap); - setUniform(material, "uIsAlphaMap", true); + updateValue("uAlphaMap", params.alphaMap); + updateValue("uIsAlphaMap", true); } else if (params.alphaMap === false) { - setUniform(material, "uIsAlphaMap", false); + updateValue("uIsAlphaMap", false); } - setUniform(material, "uWobbleStrength", params.wobbleStrength); - setUniform( - material, + updateValue("uWobbleStrength", params.wobbleStrength); + updateValue( "uWobblePositionFrequency", params.wobblePositionFrequency ); - setUniform( - material, - "uWobbleTimeFrequency", - params.wobbleTimeFrequency - ); - setUniform(material, "uWarpStrength", params.warpStrength); - setUniform( - material, - "uWarpPositionFrequency", - params.warpPositionFrequency - ); - setUniform(material, "uWarpTimeFrequency", params.warpTimeFrequency); + updateValue("uWobbleTimeFrequency", params.wobbleTimeFrequency); + updateValue("uWarpStrength", params.warpStrength); + updateValue("uWarpPositionFrequency", params.warpPositionFrequency); + updateValue("uWarpTimeFrequency", params.warpTimeFrequency); if (params.displacement) { - setUniform(material, "uDisplacement", params.displacement); - setUniform(material, "uIsDisplacement", true); + updateValue("uDisplacement", params.displacement); + updateValue("uIsDisplacement", true); } else if (params.displacement === false) { - setUniform(material, "uIsDisplacement", false); + updateValue("uIsDisplacement", false); } - setUniform( - material, - "uDisplacementIntensity", - params.displacementIntensity - ); - setUniform( - material, + updateValue("uDisplacementIntensity", params.displacementIntensity); + updateValue( "uDisplacementColorIntensity", params.displacementColorIntensity ); - setUniform( - material, - "uSizeRandomIntensity", - params.sizeRandomIntensity - ); - setUniform( - material, + updateValue("uSizeRandomIntensity", params.sizeRandomIntensity); + updateValue( "uSizeRandomTimeFrequency", params.sizeRandomTimeFrequency ); - setUniform(material, "uSizeRandomMin", params.sizeRandomMin); - setUniform(material, "uSizeRandomMax", params.sizeRandomMax); - setUniform(material, "uDivergence", params.divergence); - setUniform(material, "uDivergencePoint", params.divergencePoint); + updateValue("uSizeRandomMin", params.sizeRandomMin); + updateValue("uSizeRandomMax", params.sizeRandomMax); + updateValue("uDivergence", params.divergence); + updateValue("uDivergencePoint", params.divergencePoint); }, - [material] + [updateValue] ); return [ diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/useMaterial.ts b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/useMaterial.ts index ae57b6de..700c0f3d 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/useMaterial.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/useMaterial.ts @@ -1,5 +1,5 @@ import * as THREE from "three"; -import { useEffect, useMemo } from "react"; +import { useMemo } from "react"; import { Size } from "@react-three/fiber"; import { useResolution } from "../../../../utils/useResolution"; import { setUniform } from "../../../../utils/setUniforms"; @@ -11,6 +11,7 @@ import { ISDEV } from "../../../../libs/constants"; import { rewriteVertexShader } from "./rewriteVertexShader"; import { modifyAttributes } from "./modifyAttributes"; import { rewriteFragmentShader } from "./rewriteFragmentShader"; +import { MaterialProps } from "../../../types"; export class MorphParticlesMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -59,6 +60,7 @@ export const useMaterial = ({ positions, uvs, mapArray, + onBeforeCompile, }: { size: Size; dpr: number | false; @@ -66,7 +68,7 @@ export const useMaterial = ({ positions?: Float32Array[]; uvs?: Float32Array[]; mapArray?: THREE.Texture[]; -}) => { +} & MaterialProps) => { const modifiedPositions = useMemo( () => modifyAttributes(positions, geometry, "position", 3), [positions, geometry] @@ -99,11 +101,12 @@ export const useMaterial = ({ ).replace(`#usf `, getWobble); // fragment - const mapArraySwitch = rewriteFragmentShader(mapArray, fragmentShader); + const { rewritedFragmentShader, mapArrayUniforms } = + rewriteFragmentShader(mapArray, fragmentShader); - return new THREE.ShaderMaterial({ + const mat = new THREE.ShaderMaterial({ vertexShader: rewritedVertexShader, - fragmentShader: mapArraySwitch.rewritedFragmentShader, + fragmentShader: rewritedFragmentShader, depthTest: false, depthWrite: false, transparent: true, @@ -160,18 +163,25 @@ export const useMaterial = ({ uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax }, uDivergence: { value: MORPHPARTICLES_PARAMS.divergence }, uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint }, - ...mapArraySwitch.mapArrayUniforms, + ...mapArrayUniforms, }, }); + + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + + return mat; }, [ geometry, modifiedPositions, modifiedUvs, mapArray, + onBeforeCompile, ]) as MorphParticlesMaterial; const resolution = useResolution(size, dpr); - setUniform(material, "uResolution", resolution.clone()); + setUniform(material)("uResolution", resolution.clone()); return { material, modifiedPositions, modifiedUvs }; }; diff --git a/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts b/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts index 821ea899..951b10d9 100644 --- a/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts +++ b/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts @@ -9,14 +9,21 @@ import { HooksProps3D } from "../types"; import { getDpr } from "../../../utils/getDpr"; export type Wobble3DParams = { + /** default : `0.3` */ wobbleStrength?: number; wobblePositionFrequency?: number; wobbleTimeFrequency?: number; - /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param ,default : `0` */ + /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param, default : `0` */ wobbleShine?: number; warpStrength?: number; warpPositionFrequency?: number; warpTimeFrequency?: number; + /** Manipulate the vertices using the color channels of this texture. The strength of the wobble changes depending on the g channel of this texture, default : `false` */ + wobbleMap?: THREE.Texture | false; + /** Strength of wobbleMap, default : `0.03` */ + wobbleMapStrength?: number; + /** Strength of distorting the 'normal' by wobbleMap, default : `0.0` */ + wobbleMapDistortion?: number; /** Refraction samples, default : `6` */ samples?: number; color0?: THREE.Color; @@ -25,15 +32,15 @@ export type Wobble3DParams = { color3?: THREE.Color; /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */ colorMix?: number; - /** valid only for MeshPhysicalMaterial , default : `0.5` */ + /** valid only for MeshPhysicalMaterial , default : `0.1` */ chromaticAberration?: number; /** valid only for MeshPhysicalMaterial , default : `0.1` */ anisotropicBlur?: number; - /** valid only for MeshPhysicalMaterial , default : `0.1` */ + /** valid only for MeshPhysicalMaterial , default : `0.0` */ distortion?: number; /** valid only for MeshPhysicalMaterial , default : `0.1` */ distortionScale?: number; - /** valid only for MeshPhysicalMaterial , default : `0.1` */ + /** valid only for MeshPhysicalMaterial , default : `0.0` */ temporalDistortion?: number; /** you can get into the rhythm ♪ , default : `false` */ beat?: number | false; @@ -50,23 +57,26 @@ export type Wobble3DObject = { export const WOBBLE3D_PARAMS: Wobble3DParams = Object.freeze({ beat: false, wobbleStrength: 0.3, - wobblePositionFrequency: 0.5, - wobbleTimeFrequency: 0.4, + wobblePositionFrequency: 0.3, + wobbleTimeFrequency: 0.3, wobbleShine: 0, - warpStrength: 1.7, - warpPositionFrequency: 0.38, - warpTimeFrequency: 0.12, + warpStrength: 0.3, + warpPositionFrequency: 0.3, + warpTimeFrequency: 0.3, + wobbleMap: false, + wobbleMapStrength: 0.03, + wobbleMapDistortion: 0.0, samples: 6, color0: new THREE.Color(0xff0000), color1: new THREE.Color(0x00ff00), color2: new THREE.Color(0x0000ff), color3: new THREE.Color(0xffff00), colorMix: 1, - chromaticAberration: 0.5, + chromaticAberration: 0.1, anisotropicBlur: 0.1, - distortion: 0.1, + distortion: 0.0, distortionScale: 0.1, - temporalDistortion: 0.1, + temporalDistortion: 0.0, }); /** @@ -81,6 +91,8 @@ export const useWobble3D = ({ geometry, baseMaterial, materialParameters, + onBeforeCompile, + depthOnBeforeCompile, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn< Wobble3DParams, Wobble3DObject @@ -94,6 +106,8 @@ export const useWobble3D = ({ materialParameters, scene, geometry, + onBeforeCompile, + depthOnBeforeCompile, }); const [renderTarget, updateRenderTarget] = useSingleFBO({ diff --git a/packages/use-shader-fx/src/fxs/3D/useWobble3D/useCreateWobble3D.ts b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useCreateWobble3D.ts index c77f6e8c..f46c069c 100644 --- a/packages/use-shader-fx/src/fxs/3D/useWobble3D/useCreateWobble3D.ts +++ b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useCreateWobble3D.ts @@ -32,6 +32,8 @@ export const useCreateWobble3D = ({ geometry, baseMaterial, materialParameters, + onBeforeCompile, + depthOnBeforeCompile, }: UseCreateWobble3DProps & Create3DHooksProps & WobbleMaterialProps): UseCreateWobble3DReturn => { @@ -44,59 +46,53 @@ export const useCreateWobble3D = ({ const { material, depthMaterial } = useMaterial({ baseMaterial, materialParameters, + onBeforeCompile, + depthOnBeforeCompile, }); const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh); + const userData = material.userData as Wobble3DMaterial; + const updateValue = setUniform(userData); const updateUniform = useCallback( (props, params) => { - const userData = material.userData as Wobble3DMaterial; if (props) { - setUniform( - userData, - "uTime", - params?.beat || props.clock.getElapsedTime() - ); + updateValue("uTime", params?.beat || props.clock.getElapsedTime()); } if (params === undefined) { return; } - setUniform(userData, "uWobbleStrength", params.wobbleStrength); - setUniform( - userData, + updateValue("uWobbleStrength", params.wobbleStrength); + updateValue( "uWobblePositionFrequency", params.wobblePositionFrequency ); - setUniform( - userData, - "uWobbleTimeFrequency", - params.wobbleTimeFrequency - ); - setUniform(userData, "uWarpStrength", params.warpStrength); - setUniform( - userData, - "uWarpPositionFrequency", - params.warpPositionFrequency - ); - setUniform(userData, "uWarpTimeFrequency", params.warpTimeFrequency); - setUniform(userData, "uWobbleShine", params.wobbleShine); - setUniform(userData, "uSamples", params.samples); - setUniform(userData, "uColor0", params.color0); - setUniform(userData, "uColor1", params.color1); - setUniform(userData, "uColor2", params.color2); - setUniform(userData, "uColor3", params.color3); - setUniform(userData, "uColorMix", params.colorMix); - setUniform( - userData, - "uChromaticAberration", - params.chromaticAberration - ); - setUniform(userData, "uAnisotropicBlur", params.anisotropicBlur); - setUniform(userData, "uDistortion", params.distortion); - setUniform(userData, "uDistortionScale", params.distortionScale); - setUniform(userData, "uTemporalDistortion", params.temporalDistortion); + updateValue("uWobbleTimeFrequency", params.wobbleTimeFrequency); + updateValue("uWarpStrength", params.warpStrength); + updateValue("uWarpPositionFrequency", params.warpPositionFrequency); + updateValue("uWarpTimeFrequency", params.warpTimeFrequency); + updateValue("uWobbleShine", params.wobbleShine); + if (params.wobbleMap) { + updateValue("uWobbleMap", params.wobbleMap); + updateValue("uIsWobbleMap", true); + } else if (params.wobbleMap === false) { + updateValue("uIsWobbleMap", false); + } + updateValue("uWobbleMapStrength", params.wobbleMapStrength); + updateValue("uWobbleMapDistortion", params.wobbleMapDistortion); + updateValue("uSamples", params.samples); + updateValue("uColor0", params.color0); + updateValue("uColor1", params.color1); + updateValue("uColor2", params.color2); + updateValue("uColor3", params.color3); + updateValue("uColorMix", params.colorMix); + updateValue("uChromaticAberration", params.chromaticAberration); + updateValue("uAnisotropicBlur", params.anisotropicBlur); + updateValue("uDistortion", params.distortion); + updateValue("uDistortionScale", params.distortionScale); + updateValue("uTemporalDistortion", params.temporalDistortion); }, - [material] + [updateValue] ); return [ diff --git a/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts index 0b2c1190..82330ee0 100644 --- a/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts +++ b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts @@ -5,6 +5,7 @@ import snoise from "../../../libs/shaders/snoise.glsl"; import transmission_pars_fragment from "./shaders/transmission_pars_fragment.glsl"; import transmission_fragment from "./shaders/transmission_fragment.glsl"; import { WOBBLE3D_PARAMS } from "."; +import { MaterialProps } from "../../types"; export class Wobble3DMaterial extends THREE.Material { uniforms!: { @@ -16,6 +17,10 @@ export class Wobble3DMaterial extends THREE.Material { uWarpTimeFrequency: { value: number }; uWarpStrength: { value: number }; uWobbleShine: { value: number }; + uIsWobbleMap: { value: boolean }; + uWobbleMap: { value: THREE.Texture }; + uWobbleMapStrength: { value: number }; + uWobbleMapDistortion: { value: number }; uColor0: { value: THREE.Color }; uColor1: { value: THREE.Color }; uColor2: { value: THREE.Color }; @@ -59,6 +64,10 @@ const rewriteVertex = (vertex: string) => { uniform float uWarpPositionFrequency; uniform float uWarpTimeFrequency; uniform float uWarpStrength; + uniform bool uIsWobbleMap; + uniform sampler2D uWobbleMap; + uniform float uWobbleMapStrength; + uniform float uWobbleMapDistortion; attribute vec4 tangent; varying float vWobble; varying vec2 vPosition; @@ -82,18 +91,29 @@ const rewriteVertex = (vertex: string) => { float shift = 0.01; vec3 positionA = usf_Position + tangent.xyz * shift; vec3 positionB = usf_Position + biTangent * shift; - // Wobble - float wobble = getWobble(usf_Position); - usf_Position += wobble * normal; - positionA += getWobble(positionA) * normal; - positionB += getWobble(positionB) * normal; + + // wobbleMap & wobble + float wobbleMap = uIsWobbleMap ? texture2D(uWobbleMap, uv).g : 0.0; + vec3 nWobbleMap = wobbleMap * normal * uWobbleMapStrength; + float wobbleMapDistortion = wobbleMap * uWobbleMapDistortion; + + float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; + float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; + float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; + + usf_Position += nWobbleMap + (wobble * normal); + positionA += nWobbleMap + wobbleMapDistortion + (wobblePositionA * normal); + positionB += nWobbleMap + wobbleMapDistortion + (wobblePositionB * normal); + // Compute normal vec3 toA = normalize(positionA - usf_Position); vec3 toB = normalize(positionB - usf_Position); usf_Normal = cross(toA, toB); + // Varying vPosition = usf_Position.xy; - vWobble = wobble / uWobbleStrength;` + vWobble = wobble/uWobbleStrength; + ` ); return shader; }; @@ -103,15 +123,27 @@ export type WobbleMaterialConstructor = new (opts: { }) => THREE.Material; type MaterialParams = ConstructorParameters[0]; -export type WobbleMaterialProps = { +export interface WobbleMaterialProps + extends MaterialProps { /** default:THREE.MeshPhysicalMaterial */ baseMaterial?: T; materialParameters?: MaterialParams; -}; + /** + * An optional callback that is executed immediately before the depth shader program is compiled. + * @param shader — Source code of the shader + * @param renderer — WebGLRenderer Context that is initializing the material + */ + depthOnBeforeCompile?: ( + shader: THREE.Shader, + renderer: THREE.WebGLRenderer + ) => void; +} export const useMaterial = ({ baseMaterial, materialParameters, + onBeforeCompile, + depthOnBeforeCompile, }: WobbleMaterialProps) => { const { material, depthMaterial } = useMemo(() => { const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)( @@ -139,6 +171,12 @@ export const useMaterial = ({ uWarpTimeFrequency: { value: WOBBLE3D_PARAMS.warpTimeFrequency }, uWarpStrength: { value: WOBBLE3D_PARAMS.warpStrength }, uWobbleShine: { value: WOBBLE3D_PARAMS.wobbleShine }, + uIsWobbleMap: { value: false }, + uWobbleMap: { value: new THREE.Texture() }, + uWobbleMapStrength: { value: WOBBLE3D_PARAMS.wobbleMapStrength }, + uWobbleMapDistortion: { + value: WOBBLE3D_PARAMS.wobbleMapDistortion, + }, uColor0: { value: WOBBLE3D_PARAMS.color0 }, uColor1: { value: WOBBLE3D_PARAMS.color1 }, uColor2: { value: WOBBLE3D_PARAMS.color2 }, @@ -158,7 +196,7 @@ export const useMaterial = ({ }, }); - mat.onBeforeCompile = (shader) => { + mat.onBeforeCompile = (shader, renderer) => { Object.assign(shader.uniforms, mat.userData.uniforms); /******************** @@ -212,6 +250,7 @@ export const useMaterial = ({ varying float vWobble; varying vec2 vPosition; + void main(){ vec4 usf_DiffuseColor = vec4(1.0); ${hasRoughness ? "float usf_Roughness = roughness;" : ""} @@ -239,6 +278,8 @@ export const useMaterial = ({ `${transmission_fragment}` ); } + + onBeforeCompile && onBeforeCompile(shader, renderer); }; mat.needsUpdate = true; @@ -248,14 +289,20 @@ export const useMaterial = ({ const depthMat = new THREE.MeshDepthMaterial({ depthPacking: THREE.RGBADepthPacking, }); - depthMat.onBeforeCompile = (shader) => { + depthMat.onBeforeCompile = (shader, renderer) => { Object.assign(shader.uniforms, mat.userData.uniforms); shader.vertexShader = rewriteVertex(shader.vertexShader); + depthOnBeforeCompile && depthOnBeforeCompile(shader, renderer); }; depthMat.needsUpdate = true; return { material: mat, depthMaterial: depthMat }; - }, [materialParameters, baseMaterial]); + }, [ + materialParameters, + baseMaterial, + onBeforeCompile, + depthOnBeforeCompile, + ]); return { material: material as Wobble3DMaterial, diff --git a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts index 967b5fbf..f072559c 100755 --- a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts +++ b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts @@ -45,11 +45,12 @@ export const useMotionBlur = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const fboProps = useMemo( @@ -68,22 +69,24 @@ export const useMotionBlur = ({ const [params, setParams] = useParams(MOTIONBLUR_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: MotionBlurParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture", params.texture!); - setUniform(material, "uBegin", params.begin!); - setUniform(material, "uEnd", params.end!); - setUniform(material, "uStrength", params.strength!); + updateValue("uTexture", params.texture!); + updateValue("uBegin", params.begin!); + updateValue("uEnd", params.end!); + updateValue("uStrength", params.strength!); return updateRenderTarget(gl, ({ read }) => { - setUniform(material, "uBackbuffer", read); + updateValue("uBackbuffer", read); }); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.frag b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.frag index e49aac06..4bfb677b 100755 --- a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.frag +++ b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.frag @@ -1,4 +1,4 @@ -precision mediump float; +precision highp float; varying vec2 vUv; uniform sampler2D uTexture; diff --git a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.vert b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.vert index 0ed0962a..304094df 100755 --- a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.vert +++ b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/shader/main.vert @@ -1,4 +1,4 @@ -precision mediump float; +precision highp float; varying vec2 vUv; diff --git a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/useMesh.ts b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/useMesh.ts index 44d7023c..ae8dda6c 100755 --- a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/useMesh.ts @@ -4,6 +4,7 @@ import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; import { MOTIONBLUR_PARAMS } from "."; +import { MaterialProps } from "../../types"; export class MotionBlurMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -15,23 +16,28 @@ export class MotionBlurMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: MOTIONBLUR_PARAMS.texture }, - uBackbuffer: { value: new THREE.Texture() }, - uBegin: { value: MOTIONBLUR_PARAMS.begin }, - uEnd: { value: MOTIONBLUR_PARAMS.end }, - uStrength: { value: MOTIONBLUR_PARAMS.strength }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as MotionBlurMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: MOTIONBLUR_PARAMS.texture }, + uBackbuffer: { value: new THREE.Texture() }, + uBegin: { value: MOTIONBLUR_PARAMS.begin }, + uEnd: { value: MOTIONBLUR_PARAMS.end }, + uStrength: { value: MOTIONBLUR_PARAMS.strength }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as MotionBlurMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts index 5a292761..2427faee 100755 --- a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts +++ b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts @@ -43,10 +43,11 @@ export const useSimpleBlur = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const fboProps = useMemo( @@ -64,30 +65,31 @@ export const useSimpleBlur = ({ const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps); const [params, setParams] = useParams(SIMPLEBLUR_PARAMS); + const updateValue = setUniform(material); const updateFx = useCallback( (props: RootState, updateParams?: SimpleBlurParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture", params.texture!); - setUniform(material, "uResolution", [ + updateValue("uTexture", params.texture!); + updateValue("uResolution", [ params.texture!?.source?.data?.width || 0, params.texture!?.source?.data?.height || 0, ]); - setUniform(material, "uBlurSize", params.blurSize!); + updateValue("uBlurSize", params.blurSize!); let _tempTexture: THREE.Texture = updateTempTexture(gl); const iterations = params.blurPower!; for (let i = 0; i < iterations; i++) { - setUniform(material, "uTexture", _tempTexture); + updateValue("uTexture", _tempTexture); _tempTexture = updateTempTexture(gl); } return _tempTexture; }, - [updateTempTexture, material, setParams, params] + [updateTempTexture, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.frag b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.frag index 59bc64a7..1dd7078e 100755 --- a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.frag +++ b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.frag @@ -1,4 +1,4 @@ -precision mediump float; +precision highp float; varying vec2 vUv; uniform sampler2D uTexture; diff --git a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.vert b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.vert index 0ed0962a..304094df 100755 --- a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.vert +++ b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/shader/main.vert @@ -1,4 +1,4 @@ -precision mediump float; +precision highp float; varying vec2 vUv; diff --git a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/useMesh.ts b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/useMesh.ts index 9e7d7d87..604e8eaf 100755 --- a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/useMesh.ts @@ -4,6 +4,7 @@ import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; import { SIMPLEBLUR_PARAMS } from "."; +import { MaterialProps } from "../../types"; export class SampleMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -13,21 +14,26 @@ export class SampleMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: new THREE.Texture() }, - uResolution: { value: new THREE.Vector2(0, 0) }, - uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as SampleMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: new THREE.Texture() }, + uResolution: { value: new THREE.Vector2(0, 0) }, + uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as SampleMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/effects/useWave/index.ts b/packages/use-shader-fx/src/fxs/effects/useWave/index.ts index f87b709a..432b13f8 100644 --- a/packages/use-shader-fx/src/fxs/effects/useWave/index.ts +++ b/packages/use-shader-fx/src/fxs/effects/useWave/index.ts @@ -47,10 +47,11 @@ export const useWave = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -63,18 +64,19 @@ export const useWave = ({ const [params, setParams] = useParams(WAVE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: WaveParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uEpicenter", params.epicenter!); - setUniform(material, "uProgress", params.progress!); - setUniform(material, "uWidth", params.width!); - setUniform(material, "uStrength", params.strength!); - setUniform( - material, + updateValue("uEpicenter", params.epicenter!); + updateValue("uProgress", params.progress!); + updateValue("uWidth", params.width!); + updateValue("uStrength", params.strength!); + updateValue( "uMode", params.mode! === "center" ? 0 @@ -85,7 +87,7 @@ export const useWave = ({ return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/effects/useWave/useMesh.ts b/packages/use-shader-fx/src/fxs/effects/useWave/useMesh.ts index 35d79b8f..d1727b21 100644 --- a/packages/use-shader-fx/src/fxs/effects/useWave/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/effects/useWave/useMesh.ts @@ -4,6 +4,7 @@ import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { WAVE_PARAMS } from "."; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class WaveMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -15,23 +16,28 @@ export class WaveMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uEpicenter: { value: WAVE_PARAMS.epicenter }, - uProgress: { value: WAVE_PARAMS.progress }, - uStrength: { value: WAVE_PARAMS.strength }, - uWidth: { value: WAVE_PARAMS.width }, - uMode: { value: 0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as WaveMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uEpicenter: { value: WAVE_PARAMS.epicenter }, + uProgress: { value: WAVE_PARAMS.progress }, + uStrength: { value: WAVE_PARAMS.strength }, + uWidth: { value: WAVE_PARAMS.width }, + uMode: { value: 0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as WaveMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts b/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts index a5b95121..624c0735 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts @@ -72,11 +72,17 @@ export const useBrush = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader }); + const { material, mesh } = useMesh({ + scene, + size, + dpr: _dpr.shader, + onBeforeCompile, + }); const camera = useCamera(size); const updatePointer = usePointer(); const [renderTarget, updateRenderTarget] = useDoubleFBO({ @@ -92,6 +98,8 @@ export const useBrush = ({ const pressureEnd = useRef(null); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: BrushParams) => { const { gl, pointer } = props; @@ -99,55 +107,55 @@ export const useBrush = ({ updateParams && setParams(updateParams); if (params.texture!) { - setUniform(material, "uIsTexture", true); - setUniform(material, "uTexture", params.texture!); + updateValue("uIsTexture", true); + updateValue("uTexture", params.texture!); } else { - setUniform(material, "uIsTexture", false); + updateValue("uIsTexture", false); } if (params.map!) { - setUniform(material, "uIsMap", true); - setUniform(material, "uMap", params.map!); - setUniform(material, "uMapIntensity", params.mapIntensity!); + updateValue("uIsMap", true); + updateValue("uMap", params.map!); + updateValue("uMapIntensity", params.mapIntensity!); } else { - setUniform(material, "uIsMap", false); + updateValue("uIsMap", false); } - setUniform(material, "uRadius", params.radius!); - setUniform(material, "uSmudge", params.smudge!); - setUniform(material, "uDissipation", params.dissipation!); - setUniform(material, "uMotionBlur", params.motionBlur!); - setUniform(material, "uMotionSample", params.motionSample!); + updateValue("uRadius", params.radius!); + updateValue("uSmudge", params.smudge!); + updateValue("uDissipation", params.dissipation!); + updateValue("uMotionBlur", params.motionBlur!); + updateValue("uMotionSample", params.motionSample!); const pointerValues = params.pointerValues! || updatePointer(pointer); if (pointerValues.isVelocityUpdate) { - setUniform(material, "uMouse", pointerValues.currentPointer); - setUniform(material, "uPrevMouse", pointerValues.prevPointer); + updateValue("uMouse", pointerValues.currentPointer); + updateValue("uPrevMouse", pointerValues.prevPointer); } - setUniform(material, "uVelocity", pointerValues.velocity); + updateValue("uVelocity", pointerValues.velocity); const color: THREE.Vector3 | THREE.Color = typeof params.color === "function" ? params.color(pointerValues.velocity) : params.color!; - setUniform(material, "uColor", color); + updateValue("uColor", color); - setUniform(material, "uIsCursor", params.isCursor!); + updateValue("uIsCursor", params.isCursor!); // pressure - setUniform(material, "uPressureEnd", params.pressure!); + updateValue("uPressureEnd", params.pressure!); if (pressureEnd.current === null) { pressureEnd.current = params.pressure!; } - setUniform(material, "uPressureStart", pressureEnd.current); + updateValue("uPressureStart", pressureEnd.current); pressureEnd.current = params.pressure!; return updateRenderTarget(gl, ({ read }) => { - setUniform(material, "uBuffer", read); + updateValue("uBuffer", read); }); }, - [material, updatePointer, updateRenderTarget, params, setParams] + [updateValue, updatePointer, updateRenderTarget, params, setParams] ); return [ diff --git a/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts b/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts index 9669896c..2aad1a71 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useBrush/useMesh.ts @@ -1,11 +1,12 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; -import { useEffect, useMemo } from "react"; +import { useMemo } from "react"; import { useResolution } from "../../../utils/useResolution"; import { setUniform } from "../../../utils/setUniforms"; import { Size } from "@react-three/fiber"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class BrushMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -35,44 +36,47 @@ export const useMesh = ({ scene, size, dpr, + onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uBuffer: { value: new THREE.Texture() }, - uResolution: { value: new THREE.Vector2(0, 0) }, - uTexture: { value: new THREE.Texture() }, - uIsTexture: { value: false }, - uMap: { value: new THREE.Texture() }, - uIsMap: { value: false }, - uMapIntensity: { value: 0.0 }, - uRadius: { value: 0.0 }, - uSmudge: { value: 0.0 }, - uDissipation: { value: 0.0 }, - uMotionBlur: { value: 0.0 }, - uMotionSample: { value: 0 }, - uMouse: { value: new THREE.Vector2(-10, -10) }, - uPrevMouse: { value: new THREE.Vector2(-10, -10) }, - uVelocity: { value: new THREE.Vector2(0, 0) }, - uColor: { value: new THREE.Vector3(1, 0, 0) }, - uIsCursor: { value: false }, - uPressureStart: { value: 1.0 }, - uPressureEnd: { value: 1.0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as BrushMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uBuffer: { value: new THREE.Texture() }, + uResolution: { value: new THREE.Vector2(0, 0) }, + uTexture: { value: new THREE.Texture() }, + uIsTexture: { value: false }, + uMap: { value: new THREE.Texture() }, + uIsMap: { value: false }, + uMapIntensity: { value: 0.0 }, + uRadius: { value: 0.0 }, + uSmudge: { value: 0.0 }, + uDissipation: { value: 0.0 }, + uMotionBlur: { value: 0.0 }, + uMotionSample: { value: 0 }, + uMouse: { value: new THREE.Vector2(-10, -10) }, + uPrevMouse: { value: new THREE.Vector2(-10, -10) }, + uVelocity: { value: new THREE.Vector2(0, 0) }, + uColor: { value: new THREE.Vector3(1, 0, 0) }, + uIsCursor: { value: false }, + uPressureStart: { value: 1.0 }, + uPressureEnd: { value: 1.0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as BrushMaterial; const resolution = useResolution(size, dpr); - setUniform(material, "uResolution", resolution.clone()); + setUniform(material)("uResolution", resolution.clone()); const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts index ddd50ede..1cbb6e49 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/index.ts @@ -1,5 +1,5 @@ import * as THREE from "three"; -import { FluidMaterials, useMesh } from "./useMesh"; +import { FluidMaterials, FluidOnBeforeCompile, useMesh } from "./useMesh"; import { useCamera } from "../../../utils/useCamera"; import { useCallback, useMemo, useRef } from "react"; import { PointerValues, usePointer } from "../../../misc/usePointer"; @@ -71,7 +71,19 @@ export const useFluid = ({ dpr, samples, isSizeUpdate, -}: HooksProps): HooksReturn => { + fluidOnBeforeCompile, +}: { + /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` + * ```ts + * fluidOnBeforeCompile: { + vorticity: { + onBeforeCompile: (shader) => console.log(shader), + }, + }, + * ``` + */ + fluidOnBeforeCompile?: FluidOnBeforeCompile; +} & HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); @@ -79,6 +91,7 @@ export const useFluid = ({ scene, size, dpr: _dpr.shader, + fluidOnBeforeCompile, }); const camera = useCamera(size); const updatePointer = usePointer(); @@ -106,6 +119,17 @@ export const useFluid = ({ const [params, setParams] = useParams(FLUID_PARAMS); + const updateAdvection = setUniform(materials.advectionMaterial); + const updateSplat = setUniform(materials.splatMaterial); + const updateCurl = setUniform(materials.curlMaterial); + const updateVorticity = setUniform(materials.vorticityMaterial); + const updateDivergence = setUniform(materials.divergenceMaterial); + const updateClear = setUniform(materials.clearMaterial); + const updatePressure = setUniform(materials.pressureMaterial); + const updateGradientSubtract = setUniform( + materials.gradientSubtractMaterial + ); + const updateFx = useCallback( (props: RootState, updateParams?: FluidParams) => { const { gl, pointer, clock, size } = props; @@ -124,26 +148,18 @@ export const useFluid = ({ // update velocity const velocityTex = updateVelocityFBO(gl, ({ read }) => { setMeshMaterial(materials.advectionMaterial); - setUniform(materials.advectionMaterial, "uVelocity", read); - setUniform(materials.advectionMaterial, "uSource", read); - setUniform(materials.advectionMaterial, "dt", dt); - setUniform( - materials.advectionMaterial, - "dissipation", - params.velocity_dissipation! - ); + updateAdvection("uVelocity", read); + updateAdvection("uSource", read); + updateAdvection("dt", dt); + updateAdvection("dissipation", params.velocity_dissipation!); }); // update density const densityTex = updateDensityFBO(gl, ({ read }) => { setMeshMaterial(materials.advectionMaterial); - setUniform(materials.advectionMaterial, "uVelocity", velocityTex); - setUniform(materials.advectionMaterial, "uSource", read); - setUniform( - materials.advectionMaterial, - "dissipation", - params.density_dissipation! - ); + updateAdvection("uVelocity", velocityTex); + updateAdvection("uSource", read); + updateAdvection("dissipation", params.density_dissipation!); }); // update splatting @@ -152,100 +168,87 @@ export const useFluid = ({ if (pointerValues.isVelocityUpdate) { updateVelocityFBO(gl, ({ read }) => { setMeshMaterial(materials.splatMaterial); - setUniform(materials.splatMaterial, "uTarget", read); - setUniform( - materials.splatMaterial, - "point", - pointerValues.currentPointer - ); + updateSplat("uTarget", read); + updateSplat("point", pointerValues.currentPointer); const scaledDiff = pointerValues.diffPointer.multiply( scaledDiffVec.current .set(size.width, size.height) .multiplyScalar(params.velocity_acceleration!) ); - setUniform( - materials.splatMaterial, + updateSplat( "color", spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0) ); - setUniform( - materials.splatMaterial, - "radius", - params.splat_radius! - ); + updateSplat("radius", params.splat_radius!); }); updateDensityFBO(gl, ({ read }) => { setMeshMaterial(materials.splatMaterial); - setUniform(materials.splatMaterial, "uTarget", read); + updateSplat("uTarget", read); const color: THREE.Vector3 | THREE.Color = typeof params.fluid_color === "function" ? params.fluid_color(pointerValues.velocity) : params.fluid_color!; - setUniform(materials.splatMaterial, "color", color); + updateSplat("color", color); }); } // update curl const curlTex = updateCurlFBO(gl, () => { setMeshMaterial(materials.curlMaterial); - setUniform(materials.curlMaterial, "uVelocity", velocityTex); + updateCurl("uVelocity", velocityTex); }); // update vorticity updateVelocityFBO(gl, ({ read }) => { setMeshMaterial(materials.vorticityMaterial); - setUniform(materials.vorticityMaterial, "uVelocity", read); - setUniform(materials.vorticityMaterial, "uCurl", curlTex); - setUniform( - materials.vorticityMaterial, - "curl", - params.curl_strength! - ); - setUniform(materials.vorticityMaterial, "dt", dt); + updateVorticity("uVelocity", read); + updateVorticity("uCurl", curlTex); + updateVorticity("curl", params.curl_strength!); + updateVorticity("dt", dt); }); // update divergence const divergenceTex = updateDivergenceFBO(gl, () => { setMeshMaterial(materials.divergenceMaterial); - setUniform(materials.divergenceMaterial, "uVelocity", velocityTex); + updateDivergence("uVelocity", velocityTex); }); // update pressure updatePressureFBO(gl, ({ read }) => { setMeshMaterial(materials.clearMaterial); - setUniform(materials.clearMaterial, "uTexture", read); - setUniform( - materials.clearMaterial, - "value", - params.pressure_dissipation! - ); + updateClear("uTexture", read); + updateClear("value", params.pressure_dissipation!); }); // solve pressure iterative (Gauss-Seidel) setMeshMaterial(materials.pressureMaterial); - setUniform(materials.pressureMaterial, "uDivergence", divergenceTex); + updatePressure("uDivergence", divergenceTex); let pressureTexTemp: THREE.Texture; for (let i = 0; i < params.pressure_iterations!; i++) { pressureTexTemp = updatePressureFBO(gl, ({ read }) => { - setUniform(materials.pressureMaterial, "uPressure", read); + updatePressure("uPressure", read); }); } // update gradienSubtract updateVelocityFBO(gl, ({ read }) => { setMeshMaterial(materials.gradientSubtractMaterial); - setUniform( - materials.gradientSubtractMaterial, - "uPressure", - pressureTexTemp - ); - setUniform(materials.gradientSubtractMaterial, "uVelocity", read); + updateGradientSubtract("uPressure", pressureTexTemp); + updateGradientSubtract("uVelocity", read); }); return densityTex; }, [ materials, + updateAdvection, + updateClear, + updateCurl, + updateDivergence, + updateGradientSubtract, + updatePressure, + updateSplat, + updateVorticity, setMeshMaterial, updateCurlFBO, updateDensityFBO, diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts index 46e998c5..b0eef24c 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useAdvectionMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/advection.frag"; +import { MaterialProps } from "../../../types"; export class AdvectionMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -13,22 +14,24 @@ export class AdvectionMaterial extends THREE.ShaderMaterial { }; } -export const useAdvectionMaterial = () => { - const advectionMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uVelocity: { value: new THREE.Texture() }, - uSource: { value: new THREE.Texture() }, - texelSize: { value: new THREE.Vector2() }, - dt: { value: 0.0 }, - dissipation: { value: 0.0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useAdvectionMaterial = ({ onBeforeCompile }: MaterialProps) => { + const advectionMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uVelocity: { value: new THREE.Texture() }, + uSource: { value: new THREE.Texture() }, + texelSize: { value: new THREE.Vector2() }, + dt: { value: 0.0 }, + dissipation: { value: 0.0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return advectionMaterial as AdvectionMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useClearMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useClearMaterial.ts index 62aee3ff..eab3bf95 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useClearMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useClearMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/clear.frag"; +import { MaterialProps } from "../../../types"; export class ClearMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -11,20 +12,22 @@ export class ClearMaterial extends THREE.ShaderMaterial { }; } -export const useClearMaterial = () => { - const advectionMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: new THREE.Texture() }, - value: { value: 0.0 }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useClearMaterial = ({ onBeforeCompile }: MaterialProps) => { + const advectionMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: new THREE.Texture() }, + value: { value: 0.0 }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return advectionMaterial as ClearMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useCurlMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useCurlMaterial.ts index e19ae4e6..cb68ea1f 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useCurlMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useCurlMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/curl.frag"; +import { MaterialProps } from "../../../types"; export class CurlMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -10,19 +11,21 @@ export class CurlMaterial extends THREE.ShaderMaterial { }; } -export const useCurlMaterial = () => { - const curlMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uVelocity: { value: null }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useCurlMaterial = ({ onBeforeCompile }: MaterialProps) => { + const curlMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uVelocity: { value: null }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return curlMaterial as CurlMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts index 46929bc5..e3e47d8e 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useDivergenceMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/divergence.frag"; +import { MaterialProps } from "../../../types"; export class DivergenceMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -10,19 +11,21 @@ export class DivergenceMaterial extends THREE.ShaderMaterial { }; } -export const useDivergenceMaterial = () => { - const divergenceMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uVelocity: { value: null }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useDivergenceMaterial = ({ onBeforeCompile }: MaterialProps) => { + const divergenceMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uVelocity: { value: null }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return divergenceMaterial as DivergenceMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts index 3c5d142d..168e4c03 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/gradientSubtract.frag"; +import { MaterialProps } from "../../../types"; export class GradientSubtractMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -11,20 +12,24 @@ export class GradientSubtractMaterial extends THREE.ShaderMaterial { }; } -export const useGradientSubtractMaterial = () => { - const gradientSubtractMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uPressure: { value: new THREE.Texture() }, - uVelocity: { value: new THREE.Texture() }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useGradientSubtractMaterial = ({ + onBeforeCompile, +}: MaterialProps) => { + const gradientSubtractMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uPressure: { value: new THREE.Texture() }, + uVelocity: { value: new THREE.Texture() }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return gradientSubtractMaterial as GradientSubtractMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useInitialMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useInitialMaterial.ts index a171516b..d95b6715 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useInitialMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useInitialMaterial.ts @@ -2,18 +2,21 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/init.frag"; +import { MaterialProps } from "../../../types"; -export const useInitialMaterial = () => { - const initialMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - vertexShader: vertexShader, - fragmentShader: fragmentShader, - depthTest: false, - depthWrite: false, - }), - [] - ); +export const useInitialMaterial = ({ onBeforeCompile }: MaterialProps) => { + const initialMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + depthTest: false, + depthWrite: false, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return initialMaterial as THREE.ShaderMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/usePressureMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/usePressureMaterial.ts index d30f5849..62cdeac2 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/usePressureMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/usePressureMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/pressure.frag"; +import { MaterialProps } from "../../../types"; export class PressureMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -11,20 +12,22 @@ export class PressureMaterial extends THREE.ShaderMaterial { }; } -export const usePressureMaterial = () => { - const pressureMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uPressure: { value: null }, - uDivergence: { value: null }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const usePressureMaterial = ({ onBeforeCompile }: MaterialProps) => { + const pressureMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uPressure: { value: null }, + uDivergence: { value: null }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return pressureMaterial as PressureMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts index beb8cfd9..b573c203 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useSplatMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/splat.frag"; +import { MaterialProps } from "../../../types"; export class SplatMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -14,23 +15,25 @@ export class SplatMaterial extends THREE.ShaderMaterial { }; } -export const useSplateMaterial = () => { - const splatMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTarget: { value: new THREE.Texture() }, - aspectRatio: { value: 0 }, - color: { value: new THREE.Vector3() }, - point: { value: new THREE.Vector2() }, - radius: { value: 0.0 }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useSplatMaterial = ({ onBeforeCompile }: MaterialProps) => { + const splatMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTarget: { value: new THREE.Texture() }, + aspectRatio: { value: 0 }, + color: { value: new THREE.Vector3() }, + point: { value: new THREE.Vector2() }, + radius: { value: 0.0 }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return splatMaterial as SplatMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts index 5898aeef..42216c6f 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/materials/useVorticityMaterial.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import { useMemo } from "react"; import vertexShader from "../shaders/main.vert"; import fragmentShader from "../shaders/vorticity.frag"; +import { MaterialProps } from "../../../types"; export class VorticityMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -13,22 +14,24 @@ export class VorticityMaterial extends THREE.ShaderMaterial { }; } -export const useVorticityMaterial = () => { - const vorticityMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uVelocity: { value: null }, - uCurl: { value: null }, - curl: { value: 0 }, - dt: { value: 0 }, - texelSize: { value: new THREE.Vector2() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ); +export const useVorticityMaterial = ({ onBeforeCompile }: MaterialProps) => { + const vorticityMaterial = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uVelocity: { value: null }, + uCurl: { value: null }, + curl: { value: 0 }, + dt: { value: 0 }, + texelSize: { value: new THREE.Vector2() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]); return vorticityMaterial as VorticityMaterial; }; diff --git a/packages/use-shader-fx/src/fxs/interactions/useFluid/useMesh.ts b/packages/use-shader-fx/src/fxs/interactions/useFluid/useMesh.ts index 05f62092..a3af0663 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useFluid/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useFluid/useMesh.ts @@ -24,10 +24,11 @@ import { GradientSubtractMaterial, useGradientSubtractMaterial, } from "./materials/useGradientSubtractMaterial"; -import { SplatMaterial, useSplateMaterial } from "./materials/useSplatMaterial"; +import { SplatMaterial, useSplatMaterial } from "./materials/useSplatMaterial"; import { setUniform } from "../../../utils/setUniforms"; import { Size } from "@react-three/fiber"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; type TMaterials = | AdvectionMaterial @@ -49,6 +50,28 @@ export type FluidMaterials = { splatMaterial: SplatMaterial; }; +export type FluidOnBeforeCompile = { + initial?: MaterialProps; + curl?: MaterialProps; + vorticity?: MaterialProps; + advection?: MaterialProps; + divergence?: MaterialProps; + pressure?: MaterialProps; + clear?: MaterialProps; + gradientSubtract?: MaterialProps; + splat?: MaterialProps; +}; + +const useCustomMaterial = ( + materialHook: ({ onBeforeCompile }: MaterialProps) => T, + onBeforeCompileObj?: MaterialProps +) => { + const onBeforeCompile = onBeforeCompileObj?.onBeforeCompile; + return materialHook({ + onBeforeCompile, + }); +}; + /** * Returns the material update function in the second argument */ @@ -56,22 +79,43 @@ export const useMesh = ({ scene, size, dpr, + fluidOnBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; + fluidOnBeforeCompile?: FluidOnBeforeCompile; }) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const initialMaterial = useInitialMaterial(); + + const { + initial, + curl, + vorticity, + advection, + divergence, + pressure, + clear, + gradientSubtract, + splat, + } = fluidOnBeforeCompile ?? {}; + + const initialMaterial = useCustomMaterial(useInitialMaterial, initial); const updateMaterial = initialMaterial.clone(); - const curlMaterial = useCurlMaterial(); - const vorticityMaterial = useVorticityMaterial(); - const advectionMaterial = useAdvectionMaterial(); - const divergenceMaterial = useDivergenceMaterial(); - const pressureMaterial = usePressureMaterial(); - const clearMaterial = useClearMaterial(); - const gradientSubtractMaterial = useGradientSubtractMaterial(); - const splatMaterial = useSplateMaterial(); + const curlMaterial = useCustomMaterial(useCurlMaterial, curl); + const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity); + const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection); + const divergenceMaterial = useCustomMaterial( + useDivergenceMaterial, + divergence + ); + const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure); + const clearMaterial = useCustomMaterial(useClearMaterial, clear); + const gradientSubtractMaterial = useCustomMaterial( + useGradientSubtractMaterial, + gradientSubtract + ); + const splatMaterial = useCustomMaterial(useSplatMaterial, splat); const materials = useMemo( () => ({ vorticityMaterial, @@ -97,14 +141,12 @@ export const useMesh = ({ const resolution = useResolution(size, dpr); useMemo(() => { - setUniform( - materials.splatMaterial, + setUniform(materials.splatMaterial)( "aspectRatio", resolution.x / resolution.y ); for (const material of Object.values(materials)) { - setUniform( - material, + setUniform(material)( "texelSize", new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y) ); diff --git a/packages/use-shader-fx/src/fxs/interactions/useRipple/index.ts b/packages/use-shader-fx/src/fxs/interactions/useRipple/index.ts index 2d204e06..edc0fdca 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useRipple/index.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useRipple/index.ts @@ -61,6 +61,7 @@ export const useRipple = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: UseRippleProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); @@ -69,6 +70,7 @@ export const useRipple = ({ max: max, texture, scene, + onBeforeCompile, }); const camera = useCamera(size); const updatePointer = usePointer(); diff --git a/packages/use-shader-fx/src/fxs/interactions/useRipple/useMesh.ts b/packages/use-shader-fx/src/fxs/interactions/useRipple/useMesh.ts index cb15670b..ba7d273b 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useRipple/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useRipple/useMesh.ts @@ -1,5 +1,6 @@ import { useEffect, useMemo, useRef } from "react"; import * as THREE from "three"; +import { MaterialProps } from "../../types"; type UseMeshProps = { scale: number; @@ -8,23 +9,31 @@ type UseMeshProps = { scene: THREE.Scene; }; -export const useMesh = ({ scale, max, texture, scene }: UseMeshProps) => { +export const useMesh = ({ + scale, + max, + texture, + scene, + onBeforeCompile, +}: UseMeshProps & MaterialProps) => { const meshArr = useRef([]); const geometry = useMemo( () => new THREE.PlaneGeometry(scale, scale), [scale] ); - const material = useMemo( - () => - new THREE.MeshBasicMaterial({ - map: texture, - transparent: true, - blending: THREE.AdditiveBlending, - depthTest: false, - depthWrite: false, - }), - [texture] - ); + const material = useMemo(() => { + const mat = new THREE.MeshBasicMaterial({ + map: texture, + transparent: true, + blending: THREE.AdditiveBlending, + depthTest: false, + depthWrite: false, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [texture, onBeforeCompile]); useEffect(() => { for (let i = 0; i < max; i++) { diff --git a/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts b/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts new file mode 100755 index 00000000..e7964ffb --- /dev/null +++ b/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts @@ -0,0 +1,113 @@ +import { useCallback, useMemo } from "react"; +import * as THREE from "three"; +import { RootState } from "@react-three/fiber"; +import { BlankMaterial, CustomUniforms, useMesh } from "./useMesh"; +import { useCamera } from "../../../utils/useCamera"; +import { useDoubleFBO, DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +import { setUniform } from "../../../utils/setUniforms"; +import { useParams } from "../../../utils/useParams"; +import type { HooksProps, HooksReturn } from "../../types"; +import { getDpr } from "../../../utils/getDpr"; +import { UseFboProps } from "../../.."; + +export type BlankParams = { + /** texture, default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; + +export type BlankObject = { + scene: THREE.Scene; + mesh: THREE.Mesh< + THREE.BufferGeometry, + BlankMaterial + >; + material: BlankMaterial; + camera: THREE.Camera; + renderTarget: DoubleRenderTarget; + output: THREE.Texture; +}; + +export const BLANK_PARAMS: BlankParams = Object.freeze({ + texture: new THREE.Texture(), + beat: false, +}); + +/** + * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`. + * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms. + * + * ※ `usf_FragColor` overrides `gl_FragColor` + * + * ※ `usf_Position` overrides `gl_Position` + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export const useBlank = ({ + size, + dpr, + samples, + isSizeUpdate, + onBeforeCompile, + uniforms, +}: HooksProps & CustomUniforms): HooksReturn => { + const _dpr = getDpr(dpr); + + const scene = useMemo(() => new THREE.Scene(), []); + const { material, mesh } = useMesh({ + scene, + size, + dpr: _dpr.shader, + onBeforeCompile, + uniforms, + }); + const camera = useCamera(size); + + const fboProps = useMemo( + () => ({ + scene, + camera, + size, + dpr: _dpr.fbo, + samples, + isSizeUpdate, + }), + [scene, camera, size, _dpr.fbo, samples, isSizeUpdate] + ) as UseFboProps; + + const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps); + + const [params, setParams] = useParams(BLANK_PARAMS); + + const updateValue = setUniform(material); + + const updateFx = useCallback( + (props: RootState, updateParams?: BlankParams) => { + const { gl, clock, pointer } = props; + + updateParams && setParams(updateParams); + + updateValue("uTexture", params.texture!); + updateValue("uPointer", pointer); + updateValue("uTime", params.beat || clock.getElapsedTime()); + + return updateRenderTarget(gl, ({ read }) => { + updateValue("uBackbuffer", read); + }); + }, + [updateRenderTarget, updateValue, setParams, params] + ); + + return [ + updateFx, + setParams, + { + scene: scene, + mesh: mesh, + material: material, + camera: camera, + renderTarget: renderTarget, + output: renderTarget.read.texture, + }, + ]; +}; diff --git a/packages/use-shader-fx/src/fxs/misc/useBlank/shader/main.frag b/packages/use-shader-fx/src/fxs/misc/useBlank/shader/main.frag new file mode 100755 index 00000000..c6c7c2b2 --- /dev/null +++ b/packages/use-shader-fx/src/fxs/misc/useBlank/shader/main.frag @@ -0,0 +1,20 @@ +precision highp float; + +varying vec2 vUv; +//#usf varyings + +uniform sampler2D uTexture; +uniform sampler2D uBackbuffer; +uniform float uTime; +uniform vec2 uPointer; +uniform vec2 uResolution; + +//#usf uniforms + +void main() { + vec4 usf_FragColor = vec4(1.); + + //#usf main + + gl_FragColor = usf_FragColor; +} \ No newline at end of file diff --git a/packages/use-shader-fx/src/fxs/misc/useBlank/shader/main.vert b/packages/use-shader-fx/src/fxs/misc/useBlank/shader/main.vert new file mode 100755 index 00000000..fc1a90e5 --- /dev/null +++ b/packages/use-shader-fx/src/fxs/misc/useBlank/shader/main.vert @@ -0,0 +1,15 @@ +precision highp float; + +varying vec2 vUv; +//#usf varyings + +//#usf uniforms + +void main() { + vec4 usf_Position = vec4(position,1.); + vUv = uv; + + //#usf main + + gl_Position = usf_Position; +} \ No newline at end of file diff --git a/packages/use-shader-fx/src/fxs/misc/useBlank/useMesh.ts b/packages/use-shader-fx/src/fxs/misc/useBlank/useMesh.ts new file mode 100755 index 00000000..07d45173 --- /dev/null +++ b/packages/use-shader-fx/src/fxs/misc/useBlank/useMesh.ts @@ -0,0 +1,61 @@ +import { useMemo } from "react"; +import * as THREE from "three"; +import vertexShader from "./shader/main.vert"; +import fragmentShader from "./shader/main.frag"; +import { useAddObject } from "../../../utils/useAddObject"; +import { BLANK_PARAMS } from "."; +import { MaterialProps } from "../../types"; +import { Size } from "@react-three/fiber"; +import { setUniform, useResolution } from "../../.."; + +export class BlankMaterial extends THREE.ShaderMaterial { + uniforms!: { + uTexture: { value: THREE.Texture }; + uBackbuffer: { value: THREE.Texture }; + uTime: { value: number }; + uPointer: { value: THREE.Vector2 }; + uResolution: { value: THREE.Vector2 }; + }; +} + +export type CustomUniforms = { + uniforms?: { + [uniform: string]: THREE.IUniform; + }; +}; + +export const useMesh = ({ + scene, + size, + dpr, + onBeforeCompile, + uniforms, +}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps & + CustomUniforms) => { + const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: BLANK_PARAMS.texture }, + uBackbuffer: { value: new THREE.Texture() }, + uTime: { value: 0 }, + uPointer: { value: new THREE.Vector2() }, + uResolution: { value: new THREE.Vector2() }, + ...uniforms, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile, uniforms]) as BlankMaterial; + + const resolution = useResolution(size, dpr); + setUniform(material)("uResolution", resolution.clone()); + + const mesh = useAddObject(scene, geometry, material, THREE.Mesh); + + return { material, mesh }; +}; diff --git a/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts b/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts index 5010975c..7556d5d4 100644 --- a/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts +++ b/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts @@ -59,11 +59,17 @@ export const useChromaKey = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader }); + const { material, mesh } = useMesh({ + scene, + size, + dpr: _dpr.shader, + onBeforeCompile, + }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -76,24 +82,26 @@ export const useChromaKey = ({ const [params, setParams] = useParams(CHROMAKEY_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: ChromaKeyParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "u_texture", params.texture!); - setUniform(material, "u_keyColor", params.keyColor!); - setUniform(material, "u_similarity", params.similarity!); - setUniform(material, "u_smoothness", params.smoothness!); - setUniform(material, "u_spill", params.spill!); - setUniform(material, "u_color", params.color!); - setUniform(material, "u_contrast", params.contrast!); - setUniform(material, "u_brightness", params.brightness!); - setUniform(material, "u_gamma", params.gamma!); + updateValue("u_texture", params.texture!); + updateValue("u_keyColor", params.keyColor!); + updateValue("u_similarity", params.similarity!); + updateValue("u_smoothness", params.smoothness!); + updateValue("u_spill", params.spill!); + updateValue("u_color", params.color!); + updateValue("u_contrast", params.contrast!); + updateValue("u_brightness", params.brightness!); + updateValue("u_gamma", params.gamma!); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/misc/useChromaKey/useMesh.ts b/packages/use-shader-fx/src/fxs/misc/useChromaKey/useMesh.ts index fa8b28fe..a2904602 100644 --- a/packages/use-shader-fx/src/fxs/misc/useChromaKey/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/misc/useChromaKey/useMesh.ts @@ -1,4 +1,4 @@ -import { useEffect, useMemo } from "react"; +import { useMemo } from "react"; import * as THREE from "three"; import { Size } from "@react-three/fiber"; import vertexShader from "./shader/main.vert"; @@ -6,6 +6,7 @@ import fragmentShader from "./shader/main.frag"; import { setUniform } from "../../../utils/setUniforms"; import { useResolution } from "../../../utils/useResolution"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class ChromaKeyMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -26,35 +27,38 @@ export const useMesh = ({ scene, size, dpr, + onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - u_texture: { value: new THREE.Texture() }, - u_resolution: { value: new THREE.Vector2() }, - u_keyColor: { value: new THREE.Color() }, - u_similarity: { value: 0 }, - u_smoothness: { value: 0 }, - u_spill: { value: 0 }, - u_color: { value: new THREE.Vector4() }, - u_contrast: { value: 0 }, - u_brightness: { value: 0 }, - u_gamma: { value: 0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as ChromaKeyMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + u_texture: { value: new THREE.Texture() }, + u_resolution: { value: new THREE.Vector2() }, + u_keyColor: { value: new THREE.Color() }, + u_similarity: { value: 0 }, + u_smoothness: { value: 0 }, + u_spill: { value: 0 }, + u_color: { value: new THREE.Vector4() }, + u_contrast: { value: 0 }, + u_brightness: { value: 0 }, + u_gamma: { value: 0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as ChromaKeyMaterial; const resolution = useResolution(size, dpr); - setUniform(material, "u_resolution", resolution.clone()); + setUniform(material)("u_resolution", resolution.clone()); const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts b/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts index 1d1d21e9..c59ee94b 100644 --- a/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts @@ -65,11 +65,12 @@ export const useColorStrata = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -82,39 +83,41 @@ export const useColorStrata = ({ const [params, setParams] = useParams(COLORSTRATA_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: ColorStrataParams) => { const { gl, clock } = props; updateParams && setParams(updateParams); if (params.texture) { - setUniform(material, "uTexture", params.texture); - setUniform(material, "isTexture", true); + updateValue("uTexture", params.texture); + updateValue("isTexture", true); } else { - setUniform(material, "isTexture", false); - setUniform(material, "scale", params.scale!); + updateValue("isTexture", false); + updateValue("scale", params.scale!); } if (params.noise) { - setUniform(material, "noise", params.noise); - setUniform(material, "isNoise", true); - setUniform(material, "noiseStrength", params.noiseStrength!); + updateValue("noise", params.noise); + updateValue("isNoise", true); + updateValue("noiseStrength", params.noiseStrength!); } else { - setUniform(material, "isNoise", false); + updateValue("isNoise", false); } - setUniform(material, "uTime", params.beat || clock.getElapsedTime()); + updateValue("uTime", params.beat || clock.getElapsedTime()); - setUniform(material, "laminateLayer", params.laminateLayer!); - setUniform(material, "laminateInterval", params.laminateInterval!); - setUniform(material, "laminateDetail", params.laminateDetail!); - setUniform(material, "distortion", params.distortion!); - setUniform(material, "colorFactor", params.colorFactor!); - setUniform(material, "timeStrength", params.timeStrength!); + updateValue("laminateLayer", params.laminateLayer!); + updateValue("laminateInterval", params.laminateInterval!); + updateValue("laminateDetail", params.laminateDetail!); + updateValue("distortion", params.distortion!); + updateValue("colorFactor", params.colorFactor!); + updateValue("timeStrength", params.timeStrength!); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/noises/useColorStrata/useMesh.ts b/packages/use-shader-fx/src/fxs/noises/useColorStrata/useMesh.ts index b0acfc56..95536c2d 100644 --- a/packages/use-shader-fx/src/fxs/noises/useColorStrata/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/noises/useColorStrata/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class ColorStrataMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -22,31 +23,36 @@ export class ColorStrataMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: new THREE.Texture() }, - isTexture: { value: false }, - scale: { value: 1.0 }, - noise: { value: new THREE.Texture() }, - noiseStrength: { value: new THREE.Vector2(0, 0) }, - isNoise: { value: false }, - laminateLayer: { value: 1.0 }, - laminateInterval: { value: new THREE.Vector2(0.1, 0.1) }, - laminateDetail: { value: new THREE.Vector2(1, 1) }, - distortion: { value: new THREE.Vector2(0, 0) }, - colorFactor: { value: new THREE.Vector3(1, 1, 1) }, - uTime: { value: 0 }, - timeStrength: { value: new THREE.Vector2(0, 0) }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as ColorStrataMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: new THREE.Texture() }, + isTexture: { value: false }, + scale: { value: 1.0 }, + noise: { value: new THREE.Texture() }, + noiseStrength: { value: new THREE.Vector2(0, 0) }, + isNoise: { value: false }, + laminateLayer: { value: 1.0 }, + laminateInterval: { value: new THREE.Vector2(0.1, 0.1) }, + laminateDetail: { value: new THREE.Vector2(1, 1) }, + distortion: { value: new THREE.Vector2(0, 0) }, + colorFactor: { value: new THREE.Vector3(1, 1, 1) }, + uTime: { value: 0 }, + timeStrength: { value: new THREE.Vector2(0, 0) }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as ColorStrataMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts b/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts index 3560d65a..b315cc71 100644 --- a/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts @@ -50,11 +50,12 @@ export const useCosPalette = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -67,22 +68,24 @@ export const useCosPalette = ({ const [params, setParams] = useParams(COSPALETTE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: CosPaletteParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture", params.texture!); - setUniform(material, "uColor1", params.color1!); - setUniform(material, "uColor2", params.color2!); - setUniform(material, "uColor3", params.color3!); - setUniform(material, "uColor4", params.color4!); - setUniform(material, "uRgbWeight", params.rgbWeight!); + updateValue("uTexture", params.texture!); + updateValue("uColor1", params.color1!); + updateValue("uColor2", params.color2!); + updateValue("uColor3", params.color3!); + updateValue("uColor4", params.color4!); + updateValue("uRgbWeight", params.rgbWeight!); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/noises/useCosPalette/useMesh.ts b/packages/use-shader-fx/src/fxs/noises/useCosPalette/useMesh.ts index b3901190..fedce80b 100644 --- a/packages/use-shader-fx/src/fxs/noises/useCosPalette/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/noises/useCosPalette/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class CosPaletteMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -15,24 +16,29 @@ export class CosPaletteMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: new THREE.Texture() }, - uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) }, - uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) }, - uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) }, - uColor3: { value: new THREE.Color().set(1, 1, 1) }, - uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as CosPaletteMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: new THREE.Texture() }, + uRgbWeight: { value: new THREE.Vector3(0.299, 0.587, 0.114) }, + uColor1: { value: new THREE.Color().set(0.5, 0.5, 0.5) }, + uColor2: { value: new THREE.Color().set(0.5, 0.5, 0.5) }, + uColor3: { value: new THREE.Color().set(1, 1, 1) }, + uColor4: { value: new THREE.Color().set(0, 0.1, 0.2) }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as CosPaletteMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts b/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts index 64f1162c..777300cb 100644 --- a/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts @@ -53,10 +53,11 @@ export const useMarble = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -69,27 +70,25 @@ export const useMarble = ({ const [params, setParams] = useParams(MARBLE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: MarbleParams) => { const { gl, clock } = props; updateParams && setParams(updateParams); - setUniform(material, "u_pattern", params.pattern!); - setUniform(material, "u_complexity", params.complexity!); - setUniform( - material, - "u_complexityAttenuation", - params.complexityAttenuation! - ); - setUniform(material, "u_iterations", params.iterations!); - setUniform(material, "u_timeStrength", params.timeStrength!); - setUniform(material, "u_scale", params.scale!); + updateValue("u_pattern", params.pattern!); + updateValue("u_complexity", params.complexity!); + updateValue("u_complexityAttenuation", params.complexityAttenuation!); + updateValue("u_iterations", params.iterations!); + updateValue("u_timeStrength", params.timeStrength!); + updateValue("u_scale", params.scale!); - setUniform(material, "u_time", params.beat || clock.getElapsedTime()); + updateValue("u_time", params.beat || clock.getElapsedTime()); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/noises/useMarble/useMesh.ts b/packages/use-shader-fx/src/fxs/noises/useMarble/useMesh.ts index 79d18836..b485784c 100644 --- a/packages/use-shader-fx/src/fxs/noises/useMarble/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/noises/useMarble/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class MarbleMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -16,25 +17,30 @@ export class MarbleMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - u_time: { value: 0 }, - u_pattern: { value: 0 }, - u_complexity: { value: 0 }, - u_complexityAttenuation: { value: 0 }, - u_iterations: { value: 0 }, - u_timeStrength: { value: 0 }, - u_scale: { value: 0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as MarbleMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + u_time: { value: 0 }, + u_pattern: { value: 0 }, + u_complexity: { value: 0 }, + u_complexityAttenuation: { value: 0 }, + u_iterations: { value: 0 }, + u_timeStrength: { value: 0 }, + u_scale: { value: 0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as MarbleMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts b/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts index 57e35f25..871b4105 100644 --- a/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts @@ -58,11 +58,12 @@ export const useNoise = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -75,25 +76,26 @@ export const useNoise = ({ const [params, setParams] = useParams(NOISE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: NoiseParams) => { const { gl, clock } = props; updateParams && setParams(updateParams); - setUniform(material, "scale", params.scale!); - setUniform(material, "timeStrength", params.timeStrength!); - setUniform(material, "noiseOctaves", params.noiseOctaves!); - setUniform(material, "fbmOctaves", params.fbmOctaves!); - setUniform(material, "warpOctaves", params.warpOctaves!); - setUniform(material, "warpDirection", params.warpDirection!); - setUniform(material, "warpStrength", params.warpStrength!); - - setUniform(material, "uTime", params.beat || clock.getElapsedTime()); + updateValue("scale", params.scale!); + updateValue("timeStrength", params.timeStrength!); + updateValue("noiseOctaves", params.noiseOctaves!); + updateValue("fbmOctaves", params.fbmOctaves!); + updateValue("warpOctaves", params.warpOctaves!); + updateValue("warpDirection", params.warpDirection!); + updateValue("warpStrength", params.warpStrength!); + updateValue("uTime", params.beat || clock.getElapsedTime()); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/noises/useNoise/useMesh.ts b/packages/use-shader-fx/src/fxs/noises/useNoise/useMesh.ts index 37a3aa91..b79a647f 100644 --- a/packages/use-shader-fx/src/fxs/noises/useNoise/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/noises/useNoise/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class NoiseMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -17,26 +18,32 @@ export class NoiseMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTime: { value: 0.0 }, - scale: { value: 0.0 }, - timeStrength: { value: 0.0 }, - noiseOctaves: { value: 0 }, - fbmOctaves: { value: 0 }, - warpOctaves: { value: 0 }, - warpDirection: { value: new THREE.Vector2() }, - warpStrength: { value: 0.0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as NoiseMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTime: { value: 0.0 }, + scale: { value: 0.0 }, + timeStrength: { value: 0.0 }, + noiseOctaves: { value: 0 }, + fbmOctaves: { value: 0 }, + warpOctaves: { value: 0 }, + warpDirection: { value: new THREE.Vector2() }, + warpStrength: { value: 0.0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as NoiseMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/fxs/types/index.ts b/packages/use-shader-fx/src/fxs/types/index.ts index 5794d705..f63b307e 100644 --- a/packages/use-shader-fx/src/fxs/types/index.ts +++ b/packages/use-shader-fx/src/fxs/types/index.ts @@ -4,24 +4,32 @@ import { RootState, Size } from "@react-three/fiber"; export type Dpr = | number | { - dpr: number; - /** you can set whether `dpr` affects `shader` and `fbo`. default is `true` for both */ - effect?: { - /** default : `true` */ - shader?: boolean; - /** default : `true` */ - fbo?: boolean; - }; + /** you can set whether `dpr` affects `shader`. default : `false` */ + shader?: false | number; + /** you can set whether `dpr` affects `fbo`. default : `false` */ + fbo?: false | number; }; -export type HooksProps = { +export type MaterialProps = { + /** + * An optional callback that is executed immediately before the shader program is compiled. + * @param shader — Source code of the shader + * @param renderer — WebGLRenderer Context that is initializing the material + */ + onBeforeCompile?: ( + shader: THREE.Shader, + renderer: THREE.WebGLRenderer + ) => void; +}; + +export interface HooksProps extends MaterialProps { size: Size; dpr: Dpr; /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0` */ samples?: number; /** Whether to `setSize` the FBO when updating size or dpr. default : `false` */ isSizeUpdate?: boolean; -}; +} /** * @returns {HooksReturn} diff --git a/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts b/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts index 1c91bf00..59ea71cc 100644 --- a/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts @@ -38,11 +38,12 @@ export const useAlphaBlending = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh({ scene, size }); + const { material, mesh } = useMesh({ scene, size, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ @@ -57,18 +58,20 @@ export const useAlphaBlending = ({ const [params, setParams] = useParams(ALPHABLENDING_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: AlphaBlendingParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture", params.texture!); - setUniform(material, "uMap", params.map!); + updateValue("uTexture", params.texture!); + updateValue("uMap", params.map!); return updateRenderTarget(gl); }, - [material, updateRenderTarget, params, setParams] + [updateValue, updateRenderTarget, params, setParams] ); return [ diff --git a/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/useMesh.ts index f3983ec7..f02a3c39 100644 --- a/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/useMesh.ts @@ -4,6 +4,7 @@ import fragmentShader from "./shader/main.frag"; import { useMemo } from "react"; import { Size } from "@react-three/fiber"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class AlphaBlendingMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -15,23 +16,26 @@ export class AlphaBlendingMaterial extends THREE.ShaderMaterial { export const useMesh = ({ scene, size, + onBeforeCompile, }: { scene: THREE.Scene; size: Size; -}) => { +} & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: new THREE.Texture() }, - uMap: { value: new THREE.Texture() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as AlphaBlendingMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: new THREE.Texture() }, + uMap: { value: new THREE.Texture() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as AlphaBlendingMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts b/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts index 4a889750..64ab09c8 100644 --- a/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts @@ -58,11 +58,12 @@ export const useBlending = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -75,33 +76,35 @@ export const useBlending = ({ const [params, setParams] = useParams(BLENDING_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: BlendingParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "u_texture", params.texture!); - setUniform(material, "u_map", params.map!); - setUniform(material, "u_mapIntensity", params.mapIntensity!); + updateValue("u_texture", params.texture!); + updateValue("u_map", params.map!); + updateValue("u_mapIntensity", params.mapIntensity!); if (params.alphaMap) { - setUniform(material, "u_alphaMap", params.alphaMap!); - setUniform(material, "u_isAlphaMap", true); + updateValue("u_alphaMap", params.alphaMap!); + updateValue("u_isAlphaMap", true); } else { - setUniform(material, "u_isAlphaMap", false); + updateValue("u_isAlphaMap", false); } - setUniform(material, "u_brightness", params.brightness!); - setUniform(material, "u_min", params.min!); - setUniform(material, "u_max", params.max!); + updateValue("u_brightness", params.brightness!); + updateValue("u_min", params.min!); + updateValue("u_max", params.max!); if (params.dodgeColor) { - setUniform(material, "u_dodgeColor", params.dodgeColor); - setUniform(material, "u_isDodgeColor", true); + updateValue("u_dodgeColor", params.dodgeColor); + updateValue("u_isDodgeColor", true); } else { - setUniform(material, "u_isDodgeColor", false); + updateValue("u_isDodgeColor", false); } return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/utils/useBlending/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useBlending/useMesh.ts index 87f4b851..02d45d11 100644 --- a/packages/use-shader-fx/src/fxs/utils/useBlending/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useBlending/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class BlendingMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -19,28 +20,33 @@ export class BlendingMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - u_texture: { value: new THREE.Texture() }, - u_map: { value: new THREE.Texture() }, - u_alphaMap: { value: new THREE.Texture() }, - u_isAlphaMap: { value: false }, - u_mapIntensity: { value: 0.0 }, - u_brightness: { value: new THREE.Vector3() }, - u_min: { value: 0.0 }, - u_max: { value: 0.9 }, - u_dodgeColor: { value: new THREE.Color(0xffffff) }, - u_isDodgeColor: { value: false }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as BlendingMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + u_texture: { value: new THREE.Texture() }, + u_map: { value: new THREE.Texture() }, + u_alphaMap: { value: new THREE.Texture() }, + u_isAlphaMap: { value: false }, + u_mapIntensity: { value: 0.0 }, + u_brightness: { value: new THREE.Vector3() }, + u_min: { value: 0.0 }, + u_max: { value: 0.9 }, + u_dodgeColor: { value: new THREE.Color(0xffffff) }, + u_isDodgeColor: { value: false }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as BlendingMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts b/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts index 94f8be1d..ee81e053 100644 --- a/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts @@ -44,10 +44,11 @@ export const useBrightnessPicker = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -62,17 +63,19 @@ export const useBrightnessPicker = ({ BRIGHTNESSPICKER_PARAMS ); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: BrightnessPickerParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "u_texture", params.texture!); - setUniform(material, "u_brightness", params.brightness!); - setUniform(material, "u_min", params.min!); - setUniform(material, "u_max", params.max!); + updateValue("u_texture", params.texture!); + updateValue("u_brightness", params.brightness!); + updateValue("u_min", params.min!); + updateValue("u_max", params.max!); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/useMesh.ts index 3fb3b507..d5b07340 100644 --- a/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/useMesh.ts @@ -3,6 +3,7 @@ import { useMemo } from "react"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class BrightnessPickerMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -13,22 +14,28 @@ export class BrightnessPickerMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - u_texture: { value: new THREE.Texture() }, - u_brightness: { value: new THREE.Vector3() }, - u_min: { value: 0.0 }, - u_max: { value: 1.0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as BrightnessPickerMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + u_texture: { value: new THREE.Texture() }, + u_brightness: { value: new THREE.Vector3() }, + u_min: { value: 0.0 }, + u_max: { value: 1.0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as BrightnessPickerMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts b/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts index 596fc4e4..96429b21 100644 --- a/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts @@ -35,11 +35,17 @@ export const useCoverTexture = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader }); + const { material, mesh } = useMesh({ + scene, + size, + dpr: _dpr.shader, + onBeforeCompile, + }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -53,21 +59,23 @@ export const useCoverTexture = ({ const [params, setParams] = useParams(COVERTEXTURE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: CoverTextureParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture", params.texture!); - setUniform(material, "uTextureResolution", [ + updateValue("uTexture", params.texture!); + updateValue("uTextureResolution", [ params.texture!?.source?.data?.width || 0, params.texture!?.source?.data?.height || 0, ]); return updateRenderTarget(gl); }, - [updateRenderTarget, material, params, setParams] + [updateRenderTarget, updateValue, params, setParams] ); return [ updateFx, diff --git a/packages/use-shader-fx/src/fxs/utils/useCoverTexture/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useCoverTexture/useMesh.ts index 2fdb6c77..c181cc48 100644 --- a/packages/use-shader-fx/src/fxs/utils/useCoverTexture/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useCoverTexture/useMesh.ts @@ -6,6 +6,7 @@ import fragmentShader from "./shader/main.frag"; import { setUniform } from "../../../utils/setUniforms"; import { Size } from "@react-three/fiber"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class FxTextureMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -19,28 +20,31 @@ export const useMesh = ({ scene, size, dpr, + onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uResolution: { value: new THREE.Vector2() }, - uTextureResolution: { value: new THREE.Vector2() }, - uTexture: { value: new THREE.Texture() }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as FxTextureMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uResolution: { value: new THREE.Vector2() }, + uTextureResolution: { value: new THREE.Vector2() }, + uTexture: { value: new THREE.Texture() }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as FxTextureMaterial; const resolution = useResolution(size, dpr); - setUniform(material, "uResolution", resolution.clone()); + setUniform(material)("uResolution", resolution.clone()); const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts b/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts index 51a2c1bc..b5caa648 100644 --- a/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts @@ -41,11 +41,12 @@ export const useDuoTone = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -58,19 +59,21 @@ export const useDuoTone = ({ const [params, setParams] = useParams(DUOTONE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: DuoToneParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture", params.texture!); - setUniform(material, "uColor0", params.color0!); - setUniform(material, "uColor1", params.color1!); + updateValue("uTexture", params.texture!); + updateValue("uColor0", params.color0!); + updateValue("uColor1", params.color1!); return updateRenderTarget(gl); }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/utils/useDuoTone/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useDuoTone/useMesh.ts index 41989d5f..bf12f0f5 100644 --- a/packages/use-shader-fx/src/fxs/utils/useDuoTone/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useDuoTone/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class DuoToneMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -12,21 +13,26 @@ export class DuoToneMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uTexture: { value: new THREE.Texture() }, - uColor0: { value: new THREE.Color(0xffffff) }, - uColor1: { value: new THREE.Color(0x000000) }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as DuoToneMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uTexture: { value: new THREE.Texture() }, + uColor0: { value: new THREE.Color(0xffffff) }, + uColor1: { value: new THREE.Color(0x000000) }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as DuoToneMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts b/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts index a5fef861..0d72c626 100644 --- a/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts @@ -42,11 +42,12 @@ export const useFxBlending = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh(scene); + const { material, mesh } = useMesh({ scene, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -59,17 +60,19 @@ export const useFxBlending = ({ const [params, setParams] = useParams(FXBLENDING_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: FxBlendingParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "u_texture", params.texture!); - setUniform(material, "u_map", params.map!); - setUniform(material, "u_mapIntensity", params.mapIntensity!); + updateValue("u_texture", params.texture!); + updateValue("u_map", params.map!); + updateValue("u_mapIntensity", params.mapIntensity!); const bufferTexture = updateRenderTarget(gl); return bufferTexture; }, - [updateRenderTarget, material, setParams, params] + [updateRenderTarget, updateValue, setParams, params] ); return [ diff --git a/packages/use-shader-fx/src/fxs/utils/useFxBlending/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useFxBlending/useMesh.ts index 52348dce..26ebb09a 100644 --- a/packages/use-shader-fx/src/fxs/utils/useFxBlending/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useFxBlending/useMesh.ts @@ -3,6 +3,7 @@ import * as THREE from "three"; import vertexShader from "./shader/main.vert"; import fragmentShader from "./shader/main.frag"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class FxBlendingMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -12,21 +13,26 @@ export class FxBlendingMaterial extends THREE.ShaderMaterial { }; } -export const useMesh = (scene: THREE.Scene) => { +export const useMesh = ({ + scene, + onBeforeCompile, +}: { scene: THREE.Scene } & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - u_texture: { value: new THREE.Texture() }, - u_map: { value: new THREE.Texture() }, - u_mapIntensity: { value: 0.0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as FxBlendingMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + u_texture: { value: new THREE.Texture() }, + u_map: { value: new THREE.Texture() }, + u_mapIntensity: { value: 0.0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as FxBlendingMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; diff --git a/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts b/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts index aaf8fa84..62ca6c22 100644 --- a/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts @@ -59,11 +59,17 @@ export const useFxTexture = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh({ scene, size, dpr: _dpr.shader }); + const { material, mesh } = useMesh({ + scene, + size, + dpr: _dpr.shader, + onBeforeCompile, + }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ scene, @@ -76,16 +82,18 @@ export const useFxTexture = ({ const [params, setParams] = useParams(FXTEXTURE_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: FxTextureParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "uTexture0", params.texture0!); - setUniform(material, "uTexture1", params.texture1!); + updateValue("uTexture0", params.texture0!); + updateValue("uTexture1", params.texture1!); - setUniform(material, "progress", params.progress!); + updateValue("progress", params.progress!); // calculate resolution by linear interpolation. const tex0Res = [ @@ -99,19 +107,19 @@ export const useFxTexture = ({ const interpolatedResolution = tex0Res.map((value, index) => { return value + (tex1Res[index] - value) * params.progress!; }); - setUniform(material, "uTextureResolution", interpolatedResolution); + updateValue("uTextureResolution", interpolatedResolution); - setUniform(material, "padding", params.padding!); - setUniform(material, "uMap", params.map!); - setUniform(material, "mapIntensity", params.mapIntensity!); - setUniform(material, "edgeIntensity", params.edgeIntensity!); - setUniform(material, "epicenter", params.epicenter!); - setUniform(material, "dirX", params.dir!.x); - setUniform(material, "dirY", params.dir!.y); + updateValue("padding", params.padding!); + updateValue("uMap", params.map!); + updateValue("mapIntensity", params.mapIntensity!); + updateValue("edgeIntensity", params.edgeIntensity!); + updateValue("epicenter", params.epicenter!); + updateValue("dirX", params.dir!.x); + updateValue("dirY", params.dir!.y); return updateRenderTarget(gl); }, - [updateRenderTarget, material, params, setParams] + [updateRenderTarget, updateValue, params, setParams] ); return [ updateFx, diff --git a/packages/use-shader-fx/src/fxs/utils/useFxTexture/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useFxTexture/useMesh.ts index dc9fd4d8..106b5134 100644 --- a/packages/use-shader-fx/src/fxs/utils/useFxTexture/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useFxTexture/useMesh.ts @@ -6,6 +6,7 @@ import fragmentShader from "./shader/main.frag"; import { setUniform } from "../../../utils/setUniforms"; import { Size } from "@react-three/fiber"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class FxTextureMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -28,37 +29,40 @@ export const useMesh = ({ scene, size, dpr, + onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - uResolution: { value: new THREE.Vector2() }, - uTextureResolution: { value: new THREE.Vector2() }, - uTexture0: { value: new THREE.Texture() }, - uTexture1: { value: new THREE.Texture() }, - padding: { value: 0.0 }, - uMap: { value: new THREE.Texture() }, - edgeIntensity: { value: 0.0 }, - mapIntensity: { value: 0.0 }, - epicenter: { value: new THREE.Vector2(0.0, 0.0) }, - progress: { value: 0.0 }, - dirX: { value: 0.0 }, - dirY: { value: 0.0 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as FxTextureMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + uResolution: { value: new THREE.Vector2() }, + uTextureResolution: { value: new THREE.Vector2() }, + uTexture0: { value: new THREE.Texture() }, + uTexture1: { value: new THREE.Texture() }, + padding: { value: 0.0 }, + uMap: { value: new THREE.Texture() }, + edgeIntensity: { value: 0.0 }, + mapIntensity: { value: 0.0 }, + epicenter: { value: new THREE.Vector2(0.0, 0.0) }, + progress: { value: 0.0 }, + dirX: { value: 0.0 }, + dirY: { value: 0.0 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as FxTextureMaterial; const resolution = useResolution(size, dpr); - setUniform(material, "uResolution", resolution.clone()); + setUniform(material)("uResolution", resolution.clone()); const mesh = useAddObject(scene, geometry, material, THREE.Mesh); diff --git a/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts b/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts index b9dc5757..c330609a 100644 --- a/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts @@ -41,11 +41,12 @@ export const useHSV = ({ dpr, samples, isSizeUpdate, + onBeforeCompile, }: HooksProps): HooksReturn => { const _dpr = getDpr(dpr); const scene = useMemo(() => new THREE.Scene(), []); - const { material, mesh } = useMesh({ scene, size }); + const { material, mesh } = useMesh({ scene, size, onBeforeCompile }); const camera = useCamera(size); const [renderTarget, updateRenderTarget] = useSingleFBO({ @@ -59,19 +60,21 @@ export const useHSV = ({ const [params, setParams] = useParams(HSV_PARAMS); + const updateValue = setUniform(material); + const updateFx = useCallback( (props: RootState, updateParams?: HSVParams) => { const { gl } = props; updateParams && setParams(updateParams); - setUniform(material, "u_texture", params.texture!); - setUniform(material, "u_brightness", params.brightness!); - setUniform(material, "u_saturation", params.saturation!); + updateValue("u_texture", params.texture!); + updateValue("u_brightness", params.brightness!); + updateValue("u_saturation", params.saturation!); return updateRenderTarget(gl); }, - [material, updateRenderTarget, params, setParams] + [updateValue, updateRenderTarget, params, setParams] ); return [ diff --git a/packages/use-shader-fx/src/fxs/utils/useHSV/useMesh.ts b/packages/use-shader-fx/src/fxs/utils/useHSV/useMesh.ts index b0d672cd..b7454b2f 100644 --- a/packages/use-shader-fx/src/fxs/utils/useHSV/useMesh.ts +++ b/packages/use-shader-fx/src/fxs/utils/useHSV/useMesh.ts @@ -4,6 +4,7 @@ import fragmentShader from "./shader/main.frag"; import { useMemo } from "react"; import { Size } from "@react-three/fiber"; import { useAddObject } from "../../../utils/useAddObject"; +import { MaterialProps } from "../../types"; export class HSVMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -16,24 +17,27 @@ export class HSVMaterial extends THREE.ShaderMaterial { export const useMesh = ({ scene, size, + onBeforeCompile, }: { scene: THREE.Scene; size: Size; -}) => { +} & MaterialProps) => { const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []); - const material = useMemo( - () => - new THREE.ShaderMaterial({ - uniforms: { - u_texture: { value: new THREE.Texture() }, - u_brightness: { value: 1 }, - u_saturation: { value: 1 }, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - }), - [] - ) as HSVMaterial; + const material = useMemo(() => { + const mat = new THREE.ShaderMaterial({ + uniforms: { + u_texture: { value: new THREE.Texture() }, + u_brightness: { value: 1 }, + u_saturation: { value: 1 }, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + return mat; + }, [onBeforeCompile]) as HSVMaterial; const mesh = useAddObject(scene, geometry, material, THREE.Mesh); return { material, mesh }; }; diff --git a/packages/use-shader-fx/src/index.js b/packages/use-shader-fx/src/index.js index cdb8a1a6..29ccafb9 100644 --- a/packages/use-shader-fx/src/index.js +++ b/packages/use-shader-fx/src/index.js @@ -29,6 +29,7 @@ export * from "./fxs/effects/useWave"; // misc export * from "./fxs/misc/useChromaKey"; +export * from "./fxs/misc/useBlank"; // 3D export * from "./fxs/3D/useMorphParticles"; diff --git a/packages/use-shader-fx/src/libs/shaders/getWobble.glsl b/packages/use-shader-fx/src/libs/shaders/getWobble.glsl index d863902f..31df8df9 100644 --- a/packages/use-shader-fx/src/libs/shaders/getWobble.glsl +++ b/packages/use-shader-fx/src/libs/shaders/getWobble.glsl @@ -106,6 +106,6 @@ float getWobble(vec3 position) return simplexNoise4d(vec4( warpedPosition * uWobblePositionFrequency, // XYZ - uTime * uWobbleTimeFrequency // W + uTime * uWobbleTimeFrequency // W )) * uWobbleStrength; } \ No newline at end of file diff --git a/packages/use-shader-fx/src/misc/useDomSyncer/index.ts b/packages/use-shader-fx/src/misc/useDomSyncer/index.ts index 1a7e13ab..d6fcb7a7 100644 --- a/packages/use-shader-fx/src/misc/useDomSyncer/index.ts +++ b/packages/use-shader-fx/src/misc/useDomSyncer/index.ts @@ -61,7 +61,7 @@ export const DOMSYNCER_PARAMS: DomSyncerParams = { * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array. */ export const useDomSyncer = ( - { size, dpr, samples, isSizeUpdate }: HooksProps, + { size, dpr, samples, isSizeUpdate, onBeforeCompile }: HooksProps, dependencies: React.DependencyList = [] ): HooksReturn => { const _dpr = getDpr(dpr); @@ -129,6 +129,7 @@ export const useDomSyncer = ( params, size, scene, + onBeforeCompile, }); intersectionHandler({ @@ -155,6 +156,7 @@ export const useDomSyncer = ( setParams, intersectionHandler, updateDomRects, + onBeforeCompile, refreshTrigger, scene, params, diff --git a/packages/use-shader-fx/src/misc/useDomSyncer/utils/createMesh.ts b/packages/use-shader-fx/src/misc/useDomSyncer/utils/createMesh.ts index dda730d4..9c0d11d1 100644 --- a/packages/use-shader-fx/src/misc/useDomSyncer/utils/createMesh.ts +++ b/packages/use-shader-fx/src/misc/useDomSyncer/utils/createMesh.ts @@ -3,6 +3,7 @@ import { DomSyncerParams } from "../"; import { Size } from "@react-three/fiber"; import vertexShader from "../shader/main.vert"; import fragmentShader from "../shader/main.frag"; +import { MaterialProps } from "../../../fxs/types"; export class DomSyncerMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -17,11 +18,12 @@ export const createMesh = ({ params, size, scene, + onBeforeCompile, }: { params: DomSyncerParams; size: Size; scene: THREE.Scene; -}) => { +} & MaterialProps) => { if (scene.children.length > 0) { scene.children.forEach((child) => { if (child instanceof THREE.Mesh) { @@ -33,24 +35,25 @@ export const createMesh = ({ } params.texture!.forEach((texture, i) => { - const mesh = new THREE.Mesh( - new THREE.PlaneGeometry(1, 1), - new THREE.ShaderMaterial({ - vertexShader: vertexShader, - fragmentShader: fragmentShader, - transparent: true, - uniforms: { - u_texture: { value: texture }, - u_textureResolution: { - value: new THREE.Vector2(0, 0), - }, - u_resolution: { value: new THREE.Vector2(0, 0) }, - u_borderRadius: { - value: params.boderRadius![i] ? params.boderRadius![i] : 0.0, - }, + const mat = new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + transparent: true, + uniforms: { + u_texture: { value: texture }, + u_textureResolution: { + value: new THREE.Vector2(0, 0), }, - }) - ); + u_resolution: { value: new THREE.Vector2(0, 0) }, + u_borderRadius: { + value: params.boderRadius![i] ? params.boderRadius![i] : 0.0, + }, + }, + }); + if (onBeforeCompile) { + mat.onBeforeCompile = onBeforeCompile; + } + const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat); scene.add(mesh); }); }; diff --git a/packages/use-shader-fx/src/misc/useDomSyncer/utils/useUpdateDomRect.ts b/packages/use-shader-fx/src/misc/useDomSyncer/utils/useUpdateDomRect.ts index 4a7c46bc..64c2d72d 100644 --- a/packages/use-shader-fx/src/misc/useDomSyncer/utils/useUpdateDomRect.ts +++ b/packages/use-shader-fx/src/misc/useDomSyncer/utils/useUpdateDomRect.ts @@ -56,18 +56,17 @@ export const useUpdateDomRect = (): UseUpdateDomRectReturn => { if (mesh instanceof THREE.Mesh) { const material: DomSyncerMaterial = mesh.material; - setUniform(material, "u_texture", params.texture![i]); - setUniform(material, "u_textureResolution", [ + const updateValue = setUniform(material); + updateValue("u_texture", params.texture![i]); + updateValue("u_textureResolution", [ params.texture![i]?.source?.data?.width || 0, params.texture![i]?.source?.data?.height || 0, ]); - setUniform( - material, + updateValue( "u_resolution", resolutionRef.current.set(rect.width, rect.height) ); - setUniform( - material, + updateValue( "u_borderRadius", params.boderRadius![i] ? params.boderRadius![i] : 0.0 ); diff --git a/packages/use-shader-fx/src/utils/getDpr.ts b/packages/use-shader-fx/src/utils/getDpr.ts index 9a91d246..88caeef8 100644 --- a/packages/use-shader-fx/src/utils/getDpr.ts +++ b/packages/use-shader-fx/src/utils/getDpr.ts @@ -6,9 +6,8 @@ export const getDpr = ( if (typeof dpr === "number") { return { shader: dpr, fbo: dpr }; } - // use dpr if `shader` and `fbo` are undefined return { - shader: (dpr.effect?.shader ?? true) && dpr.dpr, - fbo: (dpr.effect?.fbo ?? true) && dpr.dpr, + shader: dpr.shader ?? false, + fbo: dpr.fbo ?? false, }; }; diff --git a/packages/use-shader-fx/src/utils/setUniforms.ts b/packages/use-shader-fx/src/utils/setUniforms.ts index c0afeb89..da706521 100644 --- a/packages/use-shader-fx/src/utils/setUniforms.ts +++ b/packages/use-shader-fx/src/utils/setUniforms.ts @@ -17,16 +17,14 @@ type UniformValue = | undefined; type UniformObject = { [key: string]: { value: UniformValue } }; -export const setUniform = ( - material: { uniforms: T }, - key: keyof T, - value: UniformValue -) => { - if (value === undefined) { - return; - } - // By design, I don't want to pass null to uniform - if (material.uniforms && material.uniforms[key] && value !== null) { - material.uniforms[key].value = value; - } -}; +export const setUniform = + (material: { uniforms: T }) => + (key: keyof T, value: UniformValue) => { + if (value === undefined) { + return; + } + // By design, I don't want to pass null to uniform + if (material.uniforms[key] && value !== null) { + material.uniforms[key].value = value; + } + }; diff --git a/packages/use-shader-fx/types/fxs/3D/types/index.d.ts b/packages/use-shader-fx/types/fxs/3D/types/index.d.ts index 0426010e..1af2ca28 100644 --- a/packages/use-shader-fx/types/fxs/3D/types/index.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/types/index.d.ts @@ -1,10 +1,10 @@ import * as THREE from "three"; -import { HooksProps } from "../../types"; +import { HooksProps, MaterialProps } from "../../types"; export interface HooksProps3D extends HooksProps { /** For 3D series, you should use the r3f camera as it is as the camera passed to renderTarget. */ camera: THREE.Camera; } -export type Create3DHooksProps = { - /** r3fのシーンを入れてもいいし、どのシーンにもaddしたくない場合は何も渡さないとシーンに入れずにオブジェクトだけ返すよ , default : false*/ +export interface Create3DHooksProps extends MaterialProps { + /** You can put the r3f scene in, or if you don't want to add to any scene, you can pass nothing and it will just return the object without putting it in the scene, default : `false` */ scene?: THREE.Scene | false; -}; +} diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts index 50d0036d..08111eec 100644 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts @@ -62,4 +62,4 @@ export declare const MORPHPARTICLES_PARAMS: MorphParticlesParams; /** * @link https://github.com/FunTechInc/use-shader-fx */ -export declare const useMorphParticles: ({ size, dpr, samples, isSizeUpdate, camera, geometry, positions, uvs, }: HooksProps3D & UseCreateMorphParticlesProps) => HooksReturn; +export declare const useMorphParticles: ({ size, dpr, samples, isSizeUpdate, camera, geometry, positions, uvs, onBeforeCompile, }: HooksProps3D & UseCreateMorphParticlesProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts index 2862a671..60a7b5db 100644 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts @@ -24,5 +24,5 @@ type UseCreateMorphParticlesReturn = [ uvs: Float32Array[]; } ]; -export declare const useCreateMorphParticles: ({ size, dpr, scene, geometry, positions, uvs, mapArray, }: Create3DHooksProps & UseCreateMorphParticlesProps) => UseCreateMorphParticlesReturn; +export declare const useCreateMorphParticles: ({ size, dpr, scene, geometry, positions, uvs, mapArray, onBeforeCompile, }: Create3DHooksProps & UseCreateMorphParticlesProps) => UseCreateMorphParticlesReturn; export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts index b1d400f5..ad6c4c6b 100644 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../../types"; export declare class MorphParticlesMaterial extends THREE.ShaderMaterial { uniforms: { uResolution: { @@ -109,14 +110,14 @@ export declare class MorphParticlesMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMaterial: ({ size, dpr, geometry, positions, uvs, mapArray, }: { +export declare const useMaterial: ({ size, dpr, geometry, positions, uvs, mapArray, onBeforeCompile, }: { size: Size; dpr: number | false; geometry: THREE.BufferGeometry; positions?: Float32Array[] | undefined; uvs?: Float32Array[] | undefined; mapArray?: THREE.Texture[] | undefined; -}) => { +} & MaterialProps) => { material: MorphParticlesMaterial; modifiedPositions: Float32Array[]; modifiedUvs: Float32Array[]; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts index 71e49729..a93fc123 100644 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts @@ -4,14 +4,21 @@ import { UseCreateWobble3DProps } from "./useCreateWobble3D"; import { WobbleMaterialProps, WobbleMaterialConstructor } from "./useMaterial"; import { HooksProps3D } from "../types"; export type Wobble3DParams = { + /** default : `0.3` */ wobbleStrength?: number; wobblePositionFrequency?: number; wobbleTimeFrequency?: number; - /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param ,default : `0` */ + /** The roughness is attenuated by the strength of the wobble. It has no meaning if the roughness is set to 0 or if the material does not have a roughness param, default : `0` */ wobbleShine?: number; warpStrength?: number; warpPositionFrequency?: number; warpTimeFrequency?: number; + /** Manipulate the vertices using the color channels of this texture. The strength of the wobble changes depending on the g channel of this texture, default : `false` */ + wobbleMap?: THREE.Texture | false; + /** Strength of wobbleMap, default : `0.03` */ + wobbleMapStrength?: number; + /** Strength of distorting the 'normal' by wobbleMap, default : `0.0` */ + wobbleMapDistortion?: number; /** Refraction samples, default : `6` */ samples?: number; color0?: THREE.Color; @@ -20,15 +27,15 @@ export type Wobble3DParams = { color3?: THREE.Color; /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */ colorMix?: number; - /** valid only for MeshPhysicalMaterial , default : `0.5` */ + /** valid only for MeshPhysicalMaterial , default : `0.1` */ chromaticAberration?: number; /** valid only for MeshPhysicalMaterial , default : `0.1` */ anisotropicBlur?: number; - /** valid only for MeshPhysicalMaterial , default : `0.1` */ + /** valid only for MeshPhysicalMaterial , default : `0.0` */ distortion?: number; /** valid only for MeshPhysicalMaterial , default : `0.1` */ distortionScale?: number; - /** valid only for MeshPhysicalMaterial , default : `0.1` */ + /** valid only for MeshPhysicalMaterial , default : `0.0` */ temporalDistortion?: number; /** you can get into the rhythm ♪ , default : `false` */ beat?: number | false; @@ -44,4 +51,4 @@ export declare const WOBBLE3D_PARAMS: Wobble3DParams; /** * @link https://github.com/FunTechInc/use-shader-fx */ -export declare const useWobble3D: ({ size, dpr, samples, isSizeUpdate, camera, geometry, baseMaterial, materialParameters, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps) => HooksReturn; +export declare const useWobble3D: ({ size, dpr, samples, isSizeUpdate, camera, geometry, baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts index 1abaf0d2..5b7a0995 100644 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts @@ -15,5 +15,5 @@ type UseCreateWobble3DReturn = [ depthMaterial: THREE.MeshDepthMaterial; } ]; -export declare const useCreateWobble3D: ({ scene, geometry, baseMaterial, materialParameters, }: UseCreateWobble3DProps & Create3DHooksProps & WobbleMaterialProps) => UseCreateWobble3DReturn; +export declare const useCreateWobble3D: ({ scene, geometry, baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, }: UseCreateWobble3DProps & Create3DHooksProps & WobbleMaterialProps) => UseCreateWobble3DReturn; export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts index 2ae994f3..9f08a011 100644 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class Wobble3DMaterial extends THREE.Material { uniforms: { uTime: { @@ -25,6 +26,18 @@ export declare class Wobble3DMaterial extends THREE.Material { uWobbleShine: { value: number; }; + uIsWobbleMap: { + value: boolean; + }; + uWobbleMap: { + value: THREE.Texture; + }; + uWobbleMapStrength: { + value: number; + }; + uWobbleMapDistortion: { + value: number; + }; uColor0: { value: THREE.Color; }; @@ -64,12 +77,18 @@ export type WobbleMaterialConstructor = new (opts: { [key: string]: any; }) => THREE.Material; type MaterialParams = ConstructorParameters[0]; -export type WobbleMaterialProps = { +export interface WobbleMaterialProps extends MaterialProps { /** default:THREE.MeshPhysicalMaterial */ baseMaterial?: T; materialParameters?: MaterialParams; -}; -export declare const useMaterial: ({ baseMaterial, materialParameters, }: WobbleMaterialProps) => { + /** + * An optional callback that is executed immediately before the depth shader program is compiled. + * @param shader — Source code of the shader + * @param renderer — WebGLRenderer Context that is initializing the material + */ + depthOnBeforeCompile?: (shader: THREE.Shader, renderer: THREE.WebGLRenderer) => void; +} +export declare const useMaterial: ({ baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, }: WobbleMaterialProps) => { material: Wobble3DMaterial; depthMaterial: THREE.MeshDepthMaterial; }; diff --git a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts index 240f2a7e..d9f922c1 100644 --- a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts @@ -23,4 +23,4 @@ export declare const MOTIONBLUR_PARAMS: MotionBlurParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useMotionBlur: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useMotionBlur: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts index 20186422..20e082c7 100644 --- a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class MotionBlurMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -18,7 +19,9 @@ export declare class MotionBlurMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: MotionBlurMaterial; mesh: THREE.Mesh, MotionBlurMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts index bb7043e9..0d22e268 100644 --- a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts @@ -21,4 +21,4 @@ export declare const SIMPLEBLUR_PARAMS: SimpleBlurParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useSimpleBlur: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useSimpleBlur: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts index 376a1753..7a72c266 100644 --- a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class SampleMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -12,7 +13,9 @@ export declare class SampleMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: SampleMaterial; mesh: THREE.Mesh, SampleMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts index 1f2146a4..d764bd1b 100644 --- a/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts @@ -24,4 +24,4 @@ export declare const WAVE_PARAMS: WaveParams; /** * @link https://github.com/FunTechInc/use-shader-fx */ -export declare const useWave: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useWave: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts index ad1e36fb..0fc35672 100644 --- a/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class WaveMaterial extends THREE.ShaderMaterial { uniforms: { uEpicenter: { @@ -18,7 +19,9 @@ export declare class WaveMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: WaveMaterial; mesh: THREE.Mesh, WaveMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts index 72b9be9b..b28a3793 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts @@ -40,4 +40,4 @@ export declare const BRUSH_PARAMS: BrushParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBrush: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useBrush: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts index d7183913..4afe4e97 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; export declare class BrushMaterial extends THREE.ShaderMaterial { uniforms: { uBuffer: { @@ -61,11 +62,11 @@ export declare class BrushMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: ({ scene, size, dpr, }: { +export declare const useMesh: ({ scene, size, dpr, onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { material: BrushMaterial; mesh: THREE.Mesh, BrushMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts index c9924834..8fc13c00 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/index.d.ts @@ -1,5 +1,5 @@ import * as THREE from "three"; -import { FluidMaterials } from "./useMesh"; +import { FluidMaterials, FluidOnBeforeCompile } from "./useMesh"; import { PointerValues } from "../../../misc/usePointer"; import { HooksProps, HooksReturn } from "../../types"; import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; @@ -41,4 +41,15 @@ export declare const FLUID_PARAMS: FluidParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useFluid: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useFluid: ({ size, dpr, samples, isSizeUpdate, fluidOnBeforeCompile, }: { + /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` + * ```ts + * fluidOnBeforeCompile: { + vorticity: { + onBeforeCompile: (shader) => console.log(shader), + }, + }, + * ``` + */ + fluidOnBeforeCompile?: FluidOnBeforeCompile | undefined; +} & HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useAdvectionMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useAdvectionMaterial.d.ts index 54b0eecd..849cc61a 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useAdvectionMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useAdvectionMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class AdvectionMaterial extends THREE.ShaderMaterial { uniforms: { uVelocity: { @@ -18,4 +19,4 @@ export declare class AdvectionMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useAdvectionMaterial: () => AdvectionMaterial; +export declare const useAdvectionMaterial: ({ onBeforeCompile }: MaterialProps) => AdvectionMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useClearMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useClearMaterial.d.ts index be11109d..bb3dc931 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useClearMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useClearMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class ClearMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -12,4 +13,4 @@ export declare class ClearMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useClearMaterial: () => ClearMaterial; +export declare const useClearMaterial: ({ onBeforeCompile }: MaterialProps) => ClearMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useCurlMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useCurlMaterial.d.ts index 72e61bb3..00024a4e 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useCurlMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useCurlMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class CurlMaterial extends THREE.ShaderMaterial { uniforms: { uVelocity: { @@ -9,4 +10,4 @@ export declare class CurlMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useCurlMaterial: () => CurlMaterial; +export declare const useCurlMaterial: ({ onBeforeCompile }: MaterialProps) => CurlMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useDivergenceMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useDivergenceMaterial.d.ts index 7f4b2bd7..9119cf7c 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useDivergenceMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useDivergenceMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class DivergenceMaterial extends THREE.ShaderMaterial { uniforms: { uVelocity: { @@ -9,4 +10,4 @@ export declare class DivergenceMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useDivergenceMaterial: () => DivergenceMaterial; +export declare const useDivergenceMaterial: ({ onBeforeCompile }: MaterialProps) => DivergenceMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.d.ts index 07061758..d33461c3 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useGradientSubtractMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class GradientSubtractMaterial extends THREE.ShaderMaterial { uniforms: { uPressure: { @@ -12,4 +13,4 @@ export declare class GradientSubtractMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useGradientSubtractMaterial: () => GradientSubtractMaterial; +export declare const useGradientSubtractMaterial: ({ onBeforeCompile, }: MaterialProps) => GradientSubtractMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useInitialMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useInitialMaterial.d.ts index 6322827a..3ce30394 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useInitialMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useInitialMaterial.d.ts @@ -1,2 +1,3 @@ import * as THREE from "three"; -export declare const useInitialMaterial: () => THREE.ShaderMaterial; +import { MaterialProps } from "../../../types"; +export declare const useInitialMaterial: ({ onBeforeCompile }: MaterialProps) => THREE.ShaderMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/usePressureMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/usePressureMaterial.d.ts index 23309d4b..280516f9 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/usePressureMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/usePressureMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class PressureMaterial extends THREE.ShaderMaterial { uniforms: { uPressure: { @@ -12,4 +13,4 @@ export declare class PressureMaterial extends THREE.ShaderMaterial { }; }; } -export declare const usePressureMaterial: () => PressureMaterial; +export declare const usePressureMaterial: ({ onBeforeCompile }: MaterialProps) => PressureMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts index 62734002..6c99d9bf 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useSplatMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class SplatMaterial extends THREE.ShaderMaterial { uniforms: { uTarget: { @@ -21,4 +22,4 @@ export declare class SplatMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useSplateMaterial: () => SplatMaterial; +export declare const useSplatMaterial: ({ onBeforeCompile }: MaterialProps) => SplatMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useVorticityMaterial.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useVorticityMaterial.d.ts index 63c5b16e..d3d02ef7 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useVorticityMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/materials/useVorticityMaterial.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../../types"; export declare class VorticityMaterial extends THREE.ShaderMaterial { uniforms: { uVelocity: { @@ -18,4 +19,4 @@ export declare class VorticityMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useVorticityMaterial: () => VorticityMaterial; +export declare const useVorticityMaterial: ({ onBeforeCompile }: MaterialProps) => VorticityMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useFluid/useMesh.d.ts b/packages/use-shader-fx/types/fxs/interactions/useFluid/useMesh.d.ts index 8fbab1b7..2b02cc3a 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useFluid/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useFluid/useMesh.d.ts @@ -8,6 +8,7 @@ import { ClearMaterial } from "./materials/useClearMaterial"; import { GradientSubtractMaterial } from "./materials/useGradientSubtractMaterial"; import { SplatMaterial } from "./materials/useSplatMaterial"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; type TMaterials = AdvectionMaterial | DivergenceMaterial | CurlMaterial | PressureMaterial | ClearMaterial | GradientSubtractMaterial | SplatMaterial; export type FluidMaterials = { vorticityMaterial: VorticityMaterial; @@ -19,13 +20,25 @@ export type FluidMaterials = { gradientSubtractMaterial: GradientSubtractMaterial; splatMaterial: SplatMaterial; }; +export type FluidOnBeforeCompile = { + initial?: MaterialProps; + curl?: MaterialProps; + vorticity?: MaterialProps; + advection?: MaterialProps; + divergence?: MaterialProps; + pressure?: MaterialProps; + clear?: MaterialProps; + gradientSubtract?: MaterialProps; + splat?: MaterialProps; +}; /** * Returns the material update function in the second argument */ -export declare const useMesh: ({ scene, size, dpr, }: { +export declare const useMesh: ({ scene, size, dpr, fluidOnBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; + fluidOnBeforeCompile?: FluidOnBeforeCompile | undefined; }) => { materials: { vorticityMaterial: VorticityMaterial; diff --git a/packages/use-shader-fx/types/fxs/interactions/useRipple/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useRipple/index.d.ts index 16be48e8..8a42905c 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useRipple/index.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useRipple/index.d.ts @@ -34,5 +34,5 @@ interface UseRippleProps extends HooksProps { /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useRipple: ({ texture, scale, max, size, dpr, samples, isSizeUpdate, }: UseRippleProps) => HooksReturn; +export declare const useRipple: ({ texture, scale, max, size, dpr, samples, isSizeUpdate, onBeforeCompile, }: UseRippleProps) => HooksReturn; export {}; diff --git a/packages/use-shader-fx/types/fxs/interactions/useRipple/useMesh.d.ts b/packages/use-shader-fx/types/fxs/interactions/useRipple/useMesh.d.ts index 23aee107..b371815c 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useRipple/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useRipple/useMesh.d.ts @@ -1,9 +1,10 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; type UseMeshProps = { scale: number; max: number; texture?: THREE.Texture; scene: THREE.Scene; }; -export declare const useMesh: ({ scale, max, texture, scene }: UseMeshProps) => THREE.Mesh, THREE.Material | THREE.Material[]>[]; +export declare const useMesh: ({ scale, max, texture, scene, onBeforeCompile, }: UseMeshProps & MaterialProps) => THREE.Mesh, THREE.Material | THREE.Material[]>[]; export {}; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts new file mode 100644 index 00000000..70047f31 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts @@ -0,0 +1,29 @@ +import * as THREE from "three"; +import { BlankMaterial, CustomUniforms } from "./useMesh"; +import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +import type { HooksProps, HooksReturn } from "../../types"; +export type BlankParams = { + /** texture, default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; +export type BlankObject = { + scene: THREE.Scene; + mesh: THREE.Mesh, BlankMaterial>; + material: BlankMaterial; + camera: THREE.Camera; + renderTarget: DoubleRenderTarget; + output: THREE.Texture; +}; +export declare const BLANK_PARAMS: BlankParams; +/** + * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`. + * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms. + * + * ※ `usf_FragColor` overrides `gl_FragColor` + * + * ※ `usf_Position` overrides `gl_Position` + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useBlank: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, uniforms, }: HooksProps & CustomUniforms) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts new file mode 100644 index 00000000..53113c25 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts @@ -0,0 +1,35 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +import { Size } from "@react-three/fiber"; +export declare class BlankMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uBackbuffer: { + value: THREE.Texture; + }; + uTime: { + value: number; + }; + uPointer: { + value: THREE.Vector2; + }; + uResolution: { + value: THREE.Vector2; + }; + }; +} +export type CustomUniforms = { + uniforms?: { + [uniform: string]: THREE.IUniform; + }; +}; +export declare const useMesh: ({ scene, size, dpr, onBeforeCompile, uniforms, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; +} & MaterialProps & CustomUniforms) => { + material: BlankMaterial; + mesh: THREE.Mesh, BlankMaterial>; +}; diff --git a/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts index e29dc593..4d268f48 100644 --- a/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts +++ b/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts @@ -32,4 +32,4 @@ export declare const CHROMAKEY_PARAMS: ChromaKeyParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useChromaKey: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useChromaKey: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts b/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts index 10e1ea25..c315adec 100644 --- a/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; export declare class ChromaKeyMaterial extends THREE.ShaderMaterial { uniforms: { u_texture: { @@ -34,11 +35,11 @@ export declare class ChromaKeyMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: ({ scene, size, dpr, }: { +export declare const useMesh: ({ scene, size, dpr, onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { material: ChromaKeyMaterial; mesh: THREE.Mesh, ChromaKeyMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts index dd09f91f..a4507ff2 100644 --- a/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts @@ -36,4 +36,4 @@ export declare const COLORSTRATA_PARAMS: ColorStrataParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useColorStrata: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useColorStrata: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts index 7727b453..fc041c80 100644 --- a/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class ColorStrataMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -42,7 +43,9 @@ export declare class ColorStrataMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: ColorStrataMaterial; mesh: THREE.Mesh, ColorStrataMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts index 1b0e6e85..26fb9aee 100644 --- a/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts @@ -26,4 +26,4 @@ export declare const COSPALETTE_PARAMS: CosPaletteParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useCosPalette: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useCosPalette: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts index 84a04d85..3d18f8f8 100644 --- a/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class CosPaletteMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -21,7 +22,9 @@ export declare class CosPaletteMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: CosPaletteMaterial; mesh: THREE.Mesh, CosPaletteMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts index 61aca4b5..65b81638 100644 --- a/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts @@ -28,4 +28,4 @@ export declare const MARBLE_PARAMS: MarbleParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useMarble: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useMarble: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts index 8696a93d..9cf40356 100644 --- a/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class MarbleMaterial extends THREE.ShaderMaterial { uniforms: { u_time: { @@ -24,7 +25,9 @@ export declare class MarbleMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: MarbleMaterial; mesh: THREE.Mesh, MarbleMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts index e05c0615..1d402718 100644 --- a/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts @@ -32,4 +32,4 @@ export declare const NOISE_PARAMS: NoiseParams; * * It is a basic value noise with `fbm` and `domain warping` */ -export declare const useNoise: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useNoise: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts index 8e209fd9..c22f55c4 100644 --- a/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class NoiseMaterial extends THREE.ShaderMaterial { uniforms: { uTime: { @@ -27,7 +28,9 @@ export declare class NoiseMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: NoiseMaterial; mesh: THREE.Mesh, NoiseMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/types/index.d.ts b/packages/use-shader-fx/types/fxs/types/index.d.ts index 21697c97..4847cbf3 100644 --- a/packages/use-shader-fx/types/fxs/types/index.d.ts +++ b/packages/use-shader-fx/types/fxs/types/index.d.ts @@ -1,23 +1,27 @@ import * as THREE from "three"; import { RootState, Size } from "@react-three/fiber"; export type Dpr = number | { - dpr: number; - /** you can set whether `dpr` affects `shader` and `fbo`. default is `true` for both */ - effect?: { - /** default : `true` */ - shader?: boolean; - /** default : `true` */ - fbo?: boolean; - }; + /** you can set whether `dpr` affects `shader`. default : `false` */ + shader?: false | number; + /** you can set whether `dpr` affects `fbo`. default : `false` */ + fbo?: false | number; }; -export type HooksProps = { +export type MaterialProps = { + /** + * An optional callback that is executed immediately before the shader program is compiled. + * @param shader — Source code of the shader + * @param renderer — WebGLRenderer Context that is initializing the material + */ + onBeforeCompile?: (shader: THREE.Shader, renderer: THREE.WebGLRenderer) => void; +}; +export interface HooksProps extends MaterialProps { size: Size; dpr: Dpr; /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0` */ samples?: number; /** Whether to `setSize` the FBO when updating size or dpr. default : `false` */ isSizeUpdate?: boolean; -}; +} /** * @returns {HooksReturn} * updateFx - A function to be called inside `useFrame` that returns a `THREE.Texture`. diff --git a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts index 658be376..02978b1c 100644 --- a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts @@ -18,4 +18,4 @@ export declare const ALPHABLENDING_PARAMS: AlphaBlendingParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useAlphaBlending: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useAlphaBlending: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts index 73e99e29..f62553dc 100644 --- a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; export declare class AlphaBlendingMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -10,10 +11,10 @@ export declare class AlphaBlendingMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: ({ scene, size, }: { +export declare const useMesh: ({ scene, size, onBeforeCompile, }: { scene: THREE.Scene; size: Size; -}) => { +} & MaterialProps) => { material: AlphaBlendingMaterial; mesh: THREE.Mesh, AlphaBlendingMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts index ceb452b1..0874da9b 100644 --- a/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts @@ -32,4 +32,4 @@ export declare const BLENDING_PARAMS: BlendingParams; If you don't want to reflect the map's color, you can use useFxBlending instead. * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBlending: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useBlending: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts index e80d58f3..04d51c61 100644 --- a/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class BlendingMaterial extends THREE.ShaderMaterial { uniforms: { u_texture: { @@ -33,7 +34,9 @@ export declare class BlendingMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: BlendingMaterial; mesh: THREE.Mesh, BlendingMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts index 48ca6a80..118d28e0 100644 --- a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts @@ -22,4 +22,4 @@ export declare const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBrightnessPicker: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useBrightnessPicker: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts index bbe24f1f..1339eb0f 100644 --- a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class BrightnessPickerMaterial extends THREE.ShaderMaterial { uniforms: { u_texture: { @@ -15,7 +16,9 @@ export declare class BrightnessPickerMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: BrightnessPickerMaterial; mesh: THREE.Mesh, BrightnessPickerMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts index 1992db3a..f42aeb74 100644 --- a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts @@ -16,4 +16,4 @@ export declare const COVERTEXTURE_PARAMS: CoverTextureParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useCoverTexture: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useCoverTexture: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts index 9179c817..d5c0f752 100644 --- a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; export declare class FxTextureMaterial extends THREE.ShaderMaterial { uniforms: { uResolution: { @@ -13,11 +14,11 @@ export declare class FxTextureMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: ({ scene, size, dpr, }: { +export declare const useMesh: ({ scene, size, dpr, onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { material: FxTextureMaterial; mesh: THREE.Mesh, FxTextureMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts index 35d1b0ae..d6176532 100644 --- a/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts @@ -21,4 +21,4 @@ export declare const DUOTONE_PARAMS: DuoToneParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useDuoTone: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useDuoTone: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts index 6f08e0da..c68d607b 100644 --- a/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class DuoToneMaterial extends THREE.ShaderMaterial { uniforms: { uTexture: { @@ -12,7 +13,9 @@ export declare class DuoToneMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: DuoToneMaterial; mesh: THREE.Mesh, DuoToneMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts index 792df3bc..9ebf95cb 100644 --- a/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts @@ -21,4 +21,4 @@ export declare const FXBLENDING_PARAMS: FxBlendingParams; * 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. * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useFxBlending: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useFxBlending: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts index 36ea3cd5..e3a4d954 100644 --- a/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts @@ -1,4 +1,5 @@ import * as THREE from "three"; +import { MaterialProps } from "../../types"; export declare class FxBlendingMaterial extends THREE.ShaderMaterial { uniforms: { u_texture: { @@ -12,7 +13,9 @@ export declare class FxBlendingMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: (scene: THREE.Scene) => { +export declare const useMesh: ({ scene, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { material: FxBlendingMaterial; mesh: THREE.Mesh, FxBlendingMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts index 0a0acd33..723cf655 100644 --- a/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts @@ -32,4 +32,4 @@ export declare const FXTEXTURE_PARAMS: FxTextureParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useFxTexture: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useFxTexture: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts index 01895cb2..9c02dbf9 100644 --- a/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; export declare class FxTextureMaterial extends THREE.ShaderMaterial { uniforms: { uResolution: { @@ -40,11 +41,11 @@ export declare class FxTextureMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: ({ scene, size, dpr, }: { +export declare const useMesh: ({ scene, size, dpr, onBeforeCompile, }: { scene: THREE.Scene; size: Size; dpr: number | false; -}) => { +} & MaterialProps) => { material: FxTextureMaterial; mesh: THREE.Mesh, FxTextureMaterial>; }; diff --git a/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts index 052ab922..017dacd3 100644 --- a/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts @@ -20,4 +20,4 @@ export declare const HSV_PARAMS: HSVParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useHSV: ({ size, dpr, samples, isSizeUpdate, }: HooksProps) => HooksReturn; +export declare const useHSV: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts index 62c69912..2b71fbdd 100644 --- a/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts @@ -1,5 +1,6 @@ import * as THREE from "three"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; export declare class HSVMaterial extends THREE.ShaderMaterial { uniforms: { u_texture: { @@ -13,10 +14,10 @@ export declare class HSVMaterial extends THREE.ShaderMaterial { }; }; } -export declare const useMesh: ({ scene, size, }: { +export declare const useMesh: ({ scene, size, onBeforeCompile, }: { scene: THREE.Scene; size: Size; -}) => { +} & MaterialProps) => { material: HSVMaterial; mesh: THREE.Mesh, HSVMaterial>; }; diff --git a/packages/use-shader-fx/types/index.d.ts b/packages/use-shader-fx/types/index.d.ts index 523e144d..af9e9461 100644 --- a/packages/use-shader-fx/types/index.d.ts +++ b/packages/use-shader-fx/types/index.d.ts @@ -17,6 +17,7 @@ export * from "./fxs/effects/useSimpleBlur"; export * from "./fxs/effects/useMotionBlur"; export * from "./fxs/effects/useWave"; export * from "./fxs/misc/useChromaKey"; +export * from "./fxs/misc/useBlank"; export * from "./fxs/3D/useMorphParticles"; export * from "./fxs/3D/useMorphParticles/useCreateMorphParticles"; export * from "./fxs/3D/useWobble3D"; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts index c5a99d72..0441beeb 100644 --- a/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts +++ b/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts @@ -41,4 +41,4 @@ export declare const DOMSYNCER_PARAMS: DomSyncerParams; * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array. */ -export declare const useDomSyncer: ({ size, dpr, samples, isSizeUpdate }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; +export declare const useDomSyncer: ({ size, dpr, samples, isSizeUpdate, onBeforeCompile }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts index caf33aa5..10654f43 100644 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts @@ -1,6 +1,7 @@ import * as THREE from "three"; import { DomSyncerParams } from "../"; import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../../fxs/types"; export declare class DomSyncerMaterial extends THREE.ShaderMaterial { uniforms: { u_texture: { @@ -17,8 +18,8 @@ export declare class DomSyncerMaterial extends THREE.ShaderMaterial { }; }; } -export declare const createMesh: ({ params, size, scene, }: { +export declare const createMesh: ({ params, size, scene, onBeforeCompile, }: { params: DomSyncerParams; size: Size; scene: THREE.Scene; -}) => void; +} & MaterialProps) => void; diff --git a/packages/use-shader-fx/types/utils/setUniforms.d.ts b/packages/use-shader-fx/types/utils/setUniforms.d.ts index 3b970f68..6dd952d8 100644 --- a/packages/use-shader-fx/types/utils/setUniforms.d.ts +++ b/packages/use-shader-fx/types/utils/setUniforms.d.ts @@ -6,5 +6,5 @@ type UniformObject = { }; export declare const setUniform: (material: { uniforms: T; -}, key: keyof T, value: UniformValue) => void; +}) => (key: keyof T, value: UniformValue) => void; export {};