From 08385808f762fa9d75a0a3e5ec3214f208566801 Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Sun, 17 Mar 2024 17:51:27 +0900 Subject: [PATCH 1/4] init --- app/ShaderFx.tsx | 6 +- app/playground/CanvasConfig.ts | 146 ++ app/playground/CustomSineCurve.tsx | 71 + app/playground/Playground.tsx | 186 ++ app/playground/page.tsx | 18 + app/useMorphParticles/Playground.tsx | 5 + app/useWobble3D/Playground.tsx | 2 +- app/useWobble3D/page.tsx | 2 +- packages/use-shader-fx/build/use-shader-fx.js | 2056 +++++++++-------- .../use-shader-fx/build/use-shader-fx.js.map | 2 +- .../use-shader-fx/build/use-shader-fx.umd.cjs | 138 +- .../build/use-shader-fx.umd.cjs.map | 2 +- packages/use-shader-fx/package-lock.json | 4 +- packages/use-shader-fx/package.json | 2 +- .../src/fxs/3D/useMorphParticles/index.ts | 23 +- .../3D/useMorphParticles/shaders/main.frag | 13 +- .../3D/useMorphParticles/shaders/main.vert | 31 +- .../useCreateMorphParticles.ts | 29 +- .../utils/rewriteFragmentShader.ts | 36 + .../3D/useMorphParticles/utils/useMaterial.ts | 39 +- .../src/libs/shaders/getWobble.glsl | 2 +- .../types/fxs/3D/useMorphParticles/index.d.ts | 14 +- .../useCreateMorphParticles.d.ts | 4 +- .../utils/rewriteFragmentShader.d.ts | 5 + .../useMorphParticles/utils/useMaterial.d.ts | 24 +- public/playground/alphaMap.jpg | Bin 0 -> 25897 bytes public/playground/points/antenna-y.png | Bin 0 -> 3995 bytes public/playground/points/arrows-o.png | Bin 0 -> 1440 bytes public/playground/points/cell-b.png | Bin 0 -> 1513 bytes public/playground/points/cell-g.png | Bin 0 -> 1322 bytes public/playground/points/cell-p.png | Bin 0 -> 1695 bytes public/playground/points/cell-r.png | Bin 0 -> 1514 bytes public/playground/points/circle-grey.png | Bin 0 -> 1805 bytes public/playground/points/circle-r.png | Bin 0 -> 1933 bytes public/playground/points/circles.png | Bin 0 -> 4074 bytes public/playground/points/donut-b.png | Bin 0 -> 2356 bytes public/playground/points/donut-y.png | Bin 0 -> 2251 bytes public/playground/points/grid-g.png | Bin 0 -> 1084 bytes public/playground/points/grid-p.png | Bin 0 -> 1039 bytes public/playground/points/grid-r.png | Bin 0 -> 1020 bytes public/playground/points/rhombus-b.png | Bin 0 -> 952 bytes public/playground/points/square-grey.png | Bin 0 -> 474 bytes public/playground/points/square-o.png | Bin 0 -> 576 bytes public/playground/points/star-grey.png | Bin 0 -> 1599 bytes 44 files changed, 1798 insertions(+), 1062 deletions(-) create mode 100644 app/playground/CanvasConfig.ts create mode 100644 app/playground/CustomSineCurve.tsx create mode 100644 app/playground/Playground.tsx create mode 100644 app/playground/page.tsx create mode 100644 packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts create mode 100644 public/playground/alphaMap.jpg create mode 100755 public/playground/points/antenna-y.png create mode 100755 public/playground/points/arrows-o.png create mode 100755 public/playground/points/cell-b.png create mode 100755 public/playground/points/cell-g.png create mode 100755 public/playground/points/cell-p.png create mode 100755 public/playground/points/cell-r.png create mode 100755 public/playground/points/circle-grey.png create mode 100755 public/playground/points/circle-r.png create mode 100755 public/playground/points/circles.png create mode 100755 public/playground/points/donut-b.png create mode 100755 public/playground/points/donut-y.png create mode 100755 public/playground/points/grid-g.png create mode 100755 public/playground/points/grid-p.png create mode 100755 public/playground/points/grid-r.png create mode 100755 public/playground/points/rhombus-b.png create mode 100755 public/playground/points/square-grey.png create mode 100755 public/playground/points/square-o.png create mode 100755 public/playground/points/star-grey.png diff --git a/app/ShaderFx.tsx b/app/ShaderFx.tsx index 8881af49..7d8c5bda 100644 --- a/app/ShaderFx.tsx +++ b/app/ShaderFx.tsx @@ -8,16 +8,18 @@ import { PerformanceMonitor } from "@react-three/drei"; export const ShaderFx = ({ children, preserveDrawingBuffer = false, + shadows = false, }: { children: React.ReactNode; preserveDrawingBuffer?: boolean; + shadows?: boolean; }) => { const [dpr, setDpr] = useState(1.5); return ( + shadows={shadows}> { @@ -28,7 +30,7 @@ export const ShaderFx = ({ setDpr(Math.round((1.0 + 1.0 * factor) * 10) / 10); }}> {children} - {/* */} + ); diff --git a/app/playground/CanvasConfig.ts b/app/playground/CanvasConfig.ts new file mode 100644 index 00000000..85cfc6b6 --- /dev/null +++ b/app/playground/CanvasConfig.ts @@ -0,0 +1,146 @@ +import { MorphParticlesParams } from "@/packages/use-shader-fx/src"; +import gsap from "gsap"; +import * as THREE from "three"; + +export class CanvasConfig { + private static instance: CanvasConfig; + public texturesPath: { + alphaMap: string[]; + bgPoints: string[]; + points: string[]; + } = { + alphaMap: ["/playground/alphaMap.jpg"], + bgPoints: [ + "/playground/points/circle-grey.png", + "/playground/points/star-grey.png", + "/playground/points/square-grey.png", + ], + points: [ + "/playground/points/donut-y.png", + "/playground/points/circle-r.png", + "/playground/points/circles.png", + "/playground/points/rhombus-b.png", + "/playground/points/grid-r.png", + "/playground/points/cell-p.png", + "/playground/points/cell-g.png", + "/playground/points/antenna-y.png", + "/playground/points/cell-r.png", + "/playground/points/cell-b.png", + "/playground/points/grid-g.png", + "/playground/points/square-o.png", + "/playground/points/grid-p.png", + "/playground/points/arrows-o.png", + "/playground/points/donut-b.png", + ], + }; + public bgPointsOffset: THREE.Vector3 = new THREE.Vector3(0.4, -0.3, -0.4); + public pointsConstantParams: MorphParticlesParams = { + blurAlpha: 1, + blurRadius: 1, + pointSize: 0.12, + sizeRandomIntensity: 1.5, + sizeRandomTimeFrequency: 0.3, + sizeRandomMin: 0.5, + sizeRandomMax: 1.5, + }; + public bgPointsConstantParams: MorphParticlesParams = { + blurAlpha: 1, + blurRadius: 1, + pointSize: 0.13, + sizeRandomIntensity: 1, + sizeRandomTimeFrequency: 0.3, + sizeRandomMin: 0.5, + sizeRandomMax: 1.5, + }; + + public fxParmas: { + morphProgress: number; + yOffset: number; + divergence: number; + cameraZ: number; + } = { + yOffset: -10, + morphProgress: 0.3, + divergence: 0, + cameraZ: 0, + }; + + private constructor() {} + + public static getInstance(): CanvasConfig { + if (!CanvasConfig.instance) { + CanvasConfig.instance = new CanvasConfig(); + } + return CanvasConfig.instance; + } + + /** オープニング */ + public openingAnimate() { + gsap.to(this.fxParmas, { + yOffset: -5, + morphProgress: 0, + divergence: 0, + duration: 2, + ease: "power3.out", + }); + } + + /** スクロール連動 最初にYを0にする */ + public scrollY(y: number) { + if (this.fxParmas.yOffset >= 0) { + return; + } + // this.fxParmas.scrollY = this.fxParmas.scrollY + y; + // 一旦サンプル + gsap.to(this.fxParmas, { + yOffset: 0, + duration: 2, + ease: "power3.out", + }); + } + /** 真ん中に集める */ + public gather() { + gsap.to(this.fxParmas, { + morphProgress: 0.8, + divergence: -1, + duration: 2, + ease: "power3.out", + }); + } + /** 発散 */ + public diverge() { + gsap.to(this.fxParmas, { + divergence: 2, + duration: 2, + ease: "power3.out", + }); + } + public frameOut() { + gsap.to(this.fxParmas, { + cameraZ: -18, + duration: 3, + ease: "power2.out", + }); + } + public frameIn() { + gsap.to(this.fxParmas, { + cameraZ: 0, + duration: 3, + ease: "power2.out", + }); + gsap.to(this.fxParmas, { + divergence: -1, + duration: 3, + ease: "power2.inOut", + }); + } + public positionBottom() { + gsap.to(this.fxParmas, { + yOffset: -5, + morphProgress: 0, + divergence: 0, + duration: 3, + ease: "power2.out", + }); + } +} diff --git a/app/playground/CustomSineCurve.tsx b/app/playground/CustomSineCurve.tsx new file mode 100644 index 00000000..4aa714fc --- /dev/null +++ b/app/playground/CustomSineCurve.tsx @@ -0,0 +1,71 @@ +import * as THREE from "three"; +import { useRef } from "react"; +import { useFrame } from "@react-three/fiber"; +import { useBeat } from "@/packages/use-shader-fx/src"; +import { QuadraticBezierLine } from "@react-three/drei"; + +export const CustomSineCurve = ({ + start, + color, +}: { + start: THREE.Vector3; + color: THREE.ColorRepresentation; +}) => { + const ref = useRef(); + const getNormalizeRand = () => Math.random() * 2 - 1; + const curveRef = useRef({ + start: start, + mid: new THREE.Vector3( + getNormalizeRand(), + getNormalizeRand(), + getNormalizeRand() + ).add(start), + end: new THREE.Vector3( + getNormalizeRand(), + getNormalizeRand(), + getNormalizeRand() + ).add(start), + hash: 0, + destination: new THREE.Vector3(0, 0, 0), + }); + const pointerVec = useRef(new THREE.Vector2(0, 0)); + const beat = useBeat(60, "easeInOutSine"); + useFrame(({ pointer, clock }) => { + const currentPointer = pointerVec.current + .lerp(pointer, 0.05) + .multiplyScalar(1); + const { hash, fract } = beat(clock); + if (hash !== curveRef.current.hash) { + curveRef.current.hash = hash; + curveRef.current.destination + .set(getNormalizeRand(), getNormalizeRand(), getNormalizeRand()) + .add(start); + return; + } + ref.current.setPoints( + [ + curveRef.current.start.x + currentPointer.x, + curveRef.current.start.y + currentPointer.y, + curveRef.current.start.z, + ], + [ + curveRef.current.end.x - currentPointer.x, + curveRef.current.end.y - currentPointer.y, + curveRef.current.end.z, + ], + curveRef.current.mid.lerp(curveRef.current.destination, fract) + ); + }); + return ( + + + + ); +}; diff --git a/app/playground/Playground.tsx b/app/playground/Playground.tsx new file mode 100644 index 00000000..e7747c73 --- /dev/null +++ b/app/playground/Playground.tsx @@ -0,0 +1,186 @@ +"use client"; + +import * as THREE from "three"; +import { useEffect, useMemo, useRef } from "react"; +import { useFrame, useThree, useLoader } from "@react-three/fiber"; +import { + useCreateMorphParticles, + MorphParticlesParams, + useBeat, +} from "@/packages/use-shader-fx/src"; +import GUI from "lil-gui"; +import { useGUI } from "@/utils/useGUI"; +import { OrbitControls } from "@react-three/drei"; +import { CustomSineCurve } from "./CustomSineCurve"; +import { CanvasConfig } from "./CanvasConfig"; + +const setGUI = (gui: GUI) => { + gui.add(CanvasConfig.getInstance(), "openingAnimate"); + gui.add(CanvasConfig.getInstance(), "scrollY"); + gui.add(CanvasConfig.getInstance(), "gather"); + gui.add(CanvasConfig.getInstance(), "diverge"); + gui.add(CanvasConfig.getInstance(), "frameOut"); + gui.add(CanvasConfig.getInstance(), "frameIn"); + gui.add(CanvasConfig.getInstance(), "positionBottom"); +}; + +const DEFAULT_GEOMETRY = new THREE.PlaneGeometry(10, 10, 40, 40); +const MORPH_LSIT = [ + new THREE.IcosahedronGeometry(3, 1).attributes.position + .array as Float32Array, +]; +const UV_LIST = [ + new THREE.IcosahedronGeometry(3, 1).attributes.uv.array as Float32Array, +]; + +export const Playground = () => { + const config = CanvasConfig.getInstance(); + const { size, viewport, gl } = useThree(); + + useEffect(() => { + document.documentElement.style.backgroundColor = "#FAF6F0"; + }, []); + + const updateGUI = useGUI(setGUI); + + const [alphaMap] = useLoader( + THREE.TextureLoader, + config.texturesPath.alphaMap + ); + const bgPointsTextures = useLoader( + THREE.TextureLoader, + config.texturesPath.bgPoints + ); + const pointsTextures = useLoader( + THREE.TextureLoader, + config.texturesPath.points + ); + + const capablePointsTextures = useMemo(() => { + // bgの3枚ととalphamap(alphamapはbgと表面で2枚使ってる)を引いた数が、1ドローコール最大数 + const minusLength = + config.texturesPath.alphaMap.length * 2 + + config.texturesPath.bgPoints.length; + const maxLength = gl.capabilities.maxTextures - minusLength; + const textures = []; + for (let i = 0; i < maxLength; i++) { + if (pointsTextures[i]) { + textures.push(pointsTextures[i]); + } + } + return textures; + }, [ + pointsTextures, + gl.capabilities.maxTextures, + config.texturesPath.bgPoints, + config.texturesPath.alphaMap, + ]); + + const particlesInitProps = { + size, + dpr: viewport.dpr, + geometry: DEFAULT_GEOMETRY, + positions: MORPH_LSIT, + uvs: UV_LIST, + }; + const [updatePoints, points] = useCreateMorphParticles({ + ...particlesInitProps, + mapArray: capablePointsTextures, + }); + const [updatePointsBg, pointsBg] = useCreateMorphParticles({ + ...particlesInitProps, + mapArray: bgPointsTextures, + }); + + useEffect(() => { + [points.points.material, pointsBg.points.material].forEach((mat) => { + const material = mat as THREE.ShaderMaterial; + material.blending = THREE.NormalBlending; + material.depthTest = true; + }); + // bgの背景オフセット + pointsBg.points.position.set( + config.bgPointsOffset.x, + config.bgPointsOffset.y, + config.bgPointsOffset.z + ); + updatePoints(null, { + ...config.pointsConstantParams, + alphaPicture: alphaMap, + }); + updatePointsBg(null, { + ...config.bgPointsConstantParams, + alphaPicture: alphaMap, + }); + }, [points, updatePoints, alphaMap, pointsBg, updatePointsBg, config]); + + const updateBeat = useBeat(80, "easeInOutSine"); + const pointerVec = useRef(new THREE.Vector2(0, 0)); + const divergencePointVec = useRef(new THREE.Vector3(0, 0, 0)); + const cameraVec = useRef(new THREE.Vector3(0, 0, 0)); + const divergenceVec = useRef(new THREE.Vector2(0, 0)); + + const lerpV = 0.05; + + useFrame((props) => { + const { pointer, clock, camera } = props; + const currentPointer = pointerVec.current.lerp(pointer, lerpV); + const beat = updateBeat(clock); + const divergenceStrength = divergenceVec.current + .set(currentPointer.x, currentPointer.y) + .length(); + const divergencePoint = divergencePointVec.current.set( + currentPointer.x * 2, + currentPointer.y * 2, + Math.abs(currentPointer.length()) + ); + + /*=============================================== + points 更新 + ===============================================*/ + const morphP = config.fxParmas.morphProgress; + const updatePointsProps: MorphParticlesParams = { + divergence: divergenceStrength + config.fxParmas.divergence, + divergencePoint: divergencePoint, + beat: beat.beat, + morphProgress: morphP, + }; + updatePoints(props, updatePointsProps); + updatePointsBg(props, updatePointsProps); + + /*=============================================== + スクロールでy軸移動 + ===============================================*/ + const posY = config.fxParmas.yOffset; + points.points.position.y = posY; + pointsBg.points.position.y = posY + config.bgPointsOffset.y; + + /*=============================================== + camera + ===============================================*/ + camera.position.lerp( + cameraVec.current.set( + currentPointer.y * 0.3, + currentPointer.x * 0.3, + 5 + config.fxParmas.cameraZ + ), + lerpV + ); + camera.lookAt(0, 0, config.fxParmas.cameraZ); + + updateGUI(); + }); + + return ( + + {/* */} + + + {/* + */} + + ); +}; diff --git a/app/playground/page.tsx b/app/playground/page.tsx new file mode 100644 index 00000000..4afc0060 --- /dev/null +++ b/app/playground/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 9be0b52b..0e029710 100644 --- a/app/useMorphParticles/Playground.tsx +++ b/app/useMorphParticles/Playground.tsx @@ -42,6 +42,11 @@ const setGUI = (gui: GUI) => { gui.add(CONFIG, "warpTimeFrequency", 0, 10, 0.01); gui.add(CONFIG, "displacementIntensity", 0, 10, 0.01); gui.add(CONFIG, "displacementColorIntensity", 0, 40, 0.01); + gui.add(CONFIG, "sizeRandomIntensity", 0, 10, 0.01); + gui.add(CONFIG, "sizeRandomTimeFrequency", 0, 3, 0.01); + gui.add(CONFIG, "sizeRandomMin", 0, 1, 0.01); + gui.add(CONFIG, "sizeRandomMax", 1, 2, 0.01); + gui.add(CONFIG, "divergence", -2, 2, 0.1); }; const setConfig = () => { return { diff --git a/app/useWobble3D/Playground.tsx b/app/useWobble3D/Playground.tsx index 45e16ea0..de219e5e 100644 --- a/app/useWobble3D/Playground.tsx +++ b/app/useWobble3D/Playground.tsx @@ -134,7 +134,7 @@ export const Playground = () => { castShadow /> - + diff --git a/app/useWobble3D/page.tsx b/app/useWobble3D/page.tsx index 4afc0060..3c37279c 100644 --- a/app/useWobble3D/page.tsx +++ b/app/useWobble3D/page.tsx @@ -10,7 +10,7 @@ export default function Page() { height: "100svh", pointerEvents: "none", }}> - + diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js index 61720534..bbcd0210 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 ae } from "three"; -import { useMemo as g, useEffect as F, useRef as D, useCallback as M, useLayoutEffect as J, useState as de } from "react"; -var xe = `varying vec2 vUv; +import { useMemo as h, useEffect as F, useRef as D, useCallback as b, useLayoutEffect as J, useState as de } from "react"; +var ge = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, ge = `precision highp float; +}`, xe = `precision highp float; uniform sampler2D uBuffer; uniform sampler2D uTexture; @@ -116,27 +116,27 @@ void main() { gl_FragColor = finalColor; }`; -const $ = (e, i = !1) => { - const a = i ? e.width * i : e.width, r = i ? e.height * i : e.height; - return g( - () => new t.Vector2(a, r), - [a, r] +const $ = (e, u = !1) => { + const o = u ? e.width * u : e.width, r = u ? e.height * u : e.height; + return h( + () => new t.Vector2(o, r), + [o, r] ); -}, u = (e, i, a) => { - a !== void 0 && e.uniforms && e.uniforms[i] && a !== null && (e.uniforms[i].value = a); -}, I = (e, i, a, r) => { - const n = g(() => new r(i, a), [i, a, r]); +}, a = (e, u, o) => { + o !== void 0 && e.uniforms && e.uniforms[u] && o !== null && (e.uniforms[u].value = o); +}, I = (e, u, o, r) => { + const n = h(() => new r(u, o), [u, o, r]); return F(() => { e && e.add(n); }, [e, n]), F(() => () => { - e && e.remove(n), i.dispose(), a.dispose(); - }, [e, i, a, n]), n; + e && e.remove(n), u.dispose(), o.dispose(); + }, [e, u, o, n]), n; }, he = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ uniforms: { uBuffer: { value: new t.Texture() }, @@ -159,62 +159,62 @@ const $ = (e, i = !1) => { uPressureStart: { value: 1 }, uPressureEnd: { value: 1 } }, - vertexShader: xe, - fragmentShader: ge + vertexShader: ge, + fragmentShader: xe }), [] - ), v = $(i, a); + ), c = $(u, o); F(() => { - u(n, "uResolution", v.clone()); - }, [v, n]); + a(n, "uResolution", c.clone()); + }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; -}, ye = (e, i) => { - const a = i, r = e / i, [n, v] = [a * r / 2, a / 2]; - return { width: n, height: v, near: -1e3, far: 1e3 }; -}, A = (e, i = "OrthographicCamera") => { - const a = $(e), { width: r, height: n, near: v, far: m } = ye( - a.x, - a.y +}, ye = (e, u) => { + const o = u, r = e / u, [n, c] = [o * r / 2, o / 2]; + return { width: n, height: c, near: -1e3, far: 1e3 }; +}, z = (e, u = "OrthographicCamera") => { + const o = $(e), { width: r, height: n, near: c, far: m } = ye( + o.x, + o.y ); - return g(() => i === "OrthographicCamera" ? new t.OrthographicCamera( + return h(() => u === "OrthographicCamera" ? new t.OrthographicCamera( -r, r, n, -n, - v, + c, m - ) : new t.PerspectiveCamera(50, r / n), [r, n, v, m, i]); + ) : new t.PerspectiveCamera(50, r / n), [r, n, c, m, u]); }, ee = (e = 0) => { - const i = D(new t.Vector2(0, 0)), a = D(new t.Vector2(0, 0)), r = D(new t.Vector2(0, 0)), n = D(0), v = D(new t.Vector2(0, 0)), m = D(!1); - return M( - (c) => { - const o = performance.now(); + const u = D(new t.Vector2(0, 0)), o = D(new t.Vector2(0, 0)), r = D(new t.Vector2(0, 0)), n = D(0), c = D(new t.Vector2(0, 0)), m = D(!1); + return b( + (s) => { + const i = performance.now(); let l; m.current && e ? (r.current = r.current.lerp( - c, + s, 1 - e - ), l = r.current.clone()) : (l = c.clone(), r.current = l), n.current === 0 && (n.current = o, i.current = l); - const x = Math.max(1, o - n.current); - n.current = o, v.current.copy(l).sub(i.current).divideScalar(x); - const f = v.current.length() > 0, d = m.current ? i.current.clone() : l; - return !m.current && f && (m.current = !0), i.current = l, { + ), l = r.current.clone()) : (l = s.clone(), r.current = l), n.current === 0 && (n.current = i, u.current = l); + const g = Math.max(1, i - n.current); + n.current = i, c.current.copy(l).sub(u.current).divideScalar(g); + const f = c.current.length() > 0, d = m.current ? u.current.clone() : l; + return !m.current && f && (m.current = !0), u.current = l, { currentPointer: l, prevPointer: d, - diffPointer: a.current.subVectors(l, d), - velocity: v.current, + diffPointer: o.current.subVectors(l, d), + velocity: c.current, isVelocityUpdate: f }; }, [e] ); }, V = (e) => { - const a = D( - ((n) => Object.values(n).some((v) => typeof v == "function"))(e) ? e : structuredClone(e) - ), r = M((n) => { - for (const v in n) { - const m = v; - m in a.current && n[m] !== void 0 && n[m] !== null ? a.current[m] = n[m] : console.error( + const o = D( + ((n) => Object.values(n).some((c) => typeof c == "function"))(e) ? e : structuredClone(e) + ), r = b((n) => { + for (const c in n) { + const m = c; + m in o.current && n[m] !== void 0 && n[m] !== null ? o.current[m] = n[m] : console.error( `"${String( m )}" does not exist in the params. or "${String( @@ -223,7 +223,7 @@ const $ = (e, i = !1) => { ); } }, []); - return [a.current, r]; + return [o.current, r]; }, Y = { minFilter: t.LinearFilter, magFilter: t.LinearFilter, @@ -231,134 +231,134 @@ const $ = (e, i = !1) => { stencilBuffer: !1 }, ne = ({ gl: e, - fbo: i, - scene: a, + fbo: u, + scene: o, camera: r, onBeforeRender: n, - onSwap: v + onSwap: c }) => { - e.setRenderTarget(i), n(), e.clear(), e.render(a, r), v && v(), e.setRenderTarget(null), e.clear(); -}, R = ({ + e.setRenderTarget(u), n(), e.clear(), e.render(o, r), c && c(), e.setRenderTarget(null), e.clear(); +}, A = ({ scene: e, - camera: i, - size: a, + camera: u, + size: o, dpr: r = !1, isSizeUpdate: n = !1, - samples: v = 0, + samples: c = 0, depthBuffer: m = !1, - depthTexture: s = !1 + depthTexture: v = !1 }) => { - const c = D(), o = $(a, r); - c.current = g( + const s = D(), i = $(o, r); + s.current = h( () => { - const x = new t.WebGLRenderTarget( - o.x, - o.y, + const g = new t.WebGLRenderTarget( + i.x, + i.y, { ...Y, - samples: v, + samples: c, depthBuffer: m } ); - return s && (x.depthTexture = new t.DepthTexture( - o.x, - o.y, + return v && (g.depthTexture = new t.DepthTexture( + i.x, + i.y, t.FloatType - )), x; + )), g; }, // eslint-disable-next-line react-hooks/exhaustive-deps [] ), J(() => { - var x; - n && ((x = c.current) == null || x.setSize(o.x, o.y)); - }, [o, n]), F(() => { - const x = c.current; + var g; + n && ((g = s.current) == null || g.setSize(i.x, i.y)); + }, [i, n]), F(() => { + const g = s.current; return () => { - x == null || x.dispose(); + g == null || g.dispose(); }; }, []); - const l = M( - (x, f) => { - const d = c.current; + const l = b( + (g, f) => { + const d = s.current; return ne({ - gl: x, + gl: g, fbo: d, scene: e, - camera: i, + camera: u, onBeforeRender: () => f && f({ read: d.texture }) }), d.texture; }, - [e, i] + [e, u] ); - return [c.current, l]; + return [s.current, l]; }, G = ({ scene: e, - camera: i, - size: a, + camera: u, + size: o, dpr: r = !1, isSizeUpdate: n = !1, - samples: v = 0, + samples: c = 0, depthBuffer: m = !1, - depthTexture: s = !1 + depthTexture: v = !1 }) => { - const c = D({ + const s = D({ read: null, write: null, swap: function() { let f = this.read; this.read = this.write, this.write = f; } - }), o = $(a, r), l = g(() => { - const f = new t.WebGLRenderTarget(o.x, o.y, { + }), i = $(o, r), l = h(() => { + const f = new t.WebGLRenderTarget(i.x, i.y, { ...Y, - samples: v, + samples: c, depthBuffer: m - }), d = new t.WebGLRenderTarget(o.x, o.y, { + }), d = new t.WebGLRenderTarget(i.x, i.y, { ...Y, - samples: v, + samples: c, depthBuffer: m }); - return s && (f.depthTexture = new t.DepthTexture( - o.x, - o.y, + return v && (f.depthTexture = new t.DepthTexture( + i.x, + i.y, t.FloatType ), d.depthTexture = new t.DepthTexture( - o.x, - o.y, + i.x, + i.y, t.FloatType )), { read: f, write: d }; }, []); - c.current.read = l.read, c.current.write = l.write, J(() => { + s.current.read = l.read, s.current.write = l.write, J(() => { var f, d; - n && ((f = c.current.read) == null || f.setSize(o.x, o.y), (d = c.current.write) == null || d.setSize(o.x, o.y)); - }, [o, n]), F(() => { - const f = c.current; + n && ((f = s.current.read) == null || f.setSize(i.x, i.y), (d = s.current.write) == null || d.setSize(i.x, i.y)); + }, [i, n]), F(() => { + const f = s.current; return () => { - var d, p; - (d = f.read) == null || d.dispose(), (p = f.write) == null || p.dispose(); + var d, x; + (d = f.read) == null || d.dispose(), (x = f.write) == null || x.dispose(); }; }, []); - const x = M( + const g = b( (f, d) => { - var h; - const p = c.current; + var p; + const x = s.current; return ne({ gl: f, scene: e, - camera: i, - fbo: p.write, + camera: u, + fbo: x.write, onBeforeRender: () => d && d({ - read: p.read.texture, - write: p.write.texture + read: x.read.texture, + write: x.write.texture }), - onSwap: () => p.swap() - }), (h = p.read) == null ? void 0 : h.texture; + onSwap: () => x.swap() + }), (p = x.read) == null ? void 0 : p.texture; }, - [e, i] + [e, u] ); return [ - { read: c.current.read, write: c.current.write }, - x + { read: s.current.read, write: s.current.write }, + g ]; }, we = Object.freeze({ texture: !1, @@ -373,40 +373,40 @@ const $ = (e, i = !1) => { isCursor: !1, pressure: 1, pointerValues: !1 -}), gt = ({ +}), ht = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = he({ scene: r, size: e, dpr: i }), m = A(e), s = ee(), [c, o] = G({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = he({ scene: r, size: e, dpr: u }), m = z(e), v = ee(), [s, i] = G({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [l, x] = V(we), f = D(null); + dpr: u, + samples: o + }), [l, g] = V(we), f = D(null); return [ - M( - (p, h) => { - const { gl: b, pointer: y } = p; - h && x(h), l.texture ? (u(n, "uIsTexture", !0), u(n, "uTexture", l.texture)) : u(n, "uIsTexture", !1), l.map ? (u(n, "uIsMap", !0), u(n, "uMap", l.map), u(n, "uMapIntensity", l.mapIntensity)) : u(n, "uIsMap", !1), u(n, "uRadius", l.radius), u(n, "uSmudge", l.smudge), u(n, "uDissipation", l.dissipation), u(n, "uMotionBlur", l.motionBlur), u(n, "uMotionSample", l.motionSample); - const w = l.pointerValues || s(y); - w.isVelocityUpdate && (u(n, "uMouse", w.currentPointer), u(n, "uPrevMouse", w.prevPointer)), u(n, "uVelocity", w.velocity); + b( + (x, p) => { + const { gl: M, pointer: y } = x; + p && g(p), l.texture ? (a(n, "uIsTexture", !0), a(n, "uTexture", l.texture)) : a(n, "uIsTexture", !1), l.map ? (a(n, "uIsMap", !0), a(n, "uMap", l.map), a(n, "uMapIntensity", l.mapIntensity)) : a(n, "uIsMap", !1), a(n, "uRadius", l.radius), a(n, "uSmudge", l.smudge), a(n, "uDissipation", l.dissipation), a(n, "uMotionBlur", l.motionBlur), a(n, "uMotionSample", l.motionSample); + const w = l.pointerValues || v(y); + w.isVelocityUpdate && (a(n, "uMouse", w.currentPointer), a(n, "uPrevMouse", w.prevPointer)), a(n, "uVelocity", w.velocity); const C = typeof l.color == "function" ? l.color(w.velocity) : l.color; - return u(n, "uColor", C), u(n, "uIsCursor", l.isCursor), u(n, "uPressureEnd", l.pressure), f.current === null && (f.current = l.pressure), u(n, "uPressureStart", f.current), f.current = l.pressure, o(b, ({ read: T }) => { - u(n, "uBuffer", T); + return a(n, "uColor", C), a(n, "uIsCursor", l.isCursor), a(n, "uPressureEnd", l.pressure), f.current === null && (f.current = l.pressure), a(n, "uPressureStart", f.current), f.current = l.pressure, i(M, ({ read: T }) => { + a(n, "uBuffer", T); }); }, - [n, s, o, l, x] + [n, v, i, l, g] ), - x, + g, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: c, - output: c.read.texture + renderTarget: s, + output: s.read.texture } ]; }; @@ -424,15 +424,15 @@ void main () { vT = vUv + vec2(0.0, texelSize.y); vB = vUv - vec2(0.0, texelSize.y); gl_Position = vec4(position, 1.0); -}`, be = `precision highp float; +}`, Me = `precision highp float; void main(){ gl_FragColor = vec4(0.0); }`; -const Me = () => g( +const be = () => h( () => new t.ShaderMaterial({ vertexShader: q, - fragmentShader: be, + fragmentShader: Me, depthTest: !1, depthWrite: !1 }), @@ -452,7 +452,7 @@ void main () { gl_FragColor = dissipation * texture2D(uSource, coord); gl_FragColor.a = 1.0; }`; -const _e = () => g( +const _e = () => h( () => new t.ShaderMaterial({ uniforms: { uVelocity: { value: new t.Texture() }, @@ -492,7 +492,7 @@ void main () { float div = 0.5 * (R - L + T - B); gl_FragColor = vec4(div, 0.0, 0.0, 1.0); }`; -const Ce = () => g( +const Ce = () => h( () => new t.ShaderMaterial({ uniforms: { uVelocity: { value: null }, @@ -528,7 +528,7 @@ void main () { float pressure = (L + R + B + T - divergence) * 0.25; gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); }`; -const De = () => g( +const De = () => h( () => new t.ShaderMaterial({ uniforms: { uPressure: { value: null }, @@ -557,7 +557,7 @@ void main () { float vorticity = R - L - T + B; gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); }`; -const Ie = () => g( +const Ae = () => h( () => new t.ShaderMaterial({ uniforms: { uVelocity: { value: null }, @@ -568,7 +568,7 @@ const Ie = () => g( }), [] ); -var Fe = `precision highp float; +var Ie = `precision highp float; varying vec2 vUv; varying vec2 vT; @@ -587,7 +587,7 @@ void main () { vec2 vel = texture2D(uVelocity, vUv).xy; gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); }`; -const Ae = () => g( +const Fe = () => h( () => new t.ShaderMaterial({ uniforms: { uVelocity: { value: null }, @@ -597,11 +597,11 @@ const Ae = () => g( texelSize: { value: new t.Vector2() } }, vertexShader: q, - fragmentShader: Fe + fragmentShader: Ie }), [] ); -var Ve = `precision highp float; +var ze = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -610,7 +610,7 @@ uniform float value; void main () { gl_FragColor = value * texture2D(uTexture, vUv); }`; -const Ue = () => g( +const Ve = () => h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -618,11 +618,11 @@ const Ue = () => g( texelSize: { value: new t.Vector2() } }, vertexShader: q, - fragmentShader: Ve + fragmentShader: ze }), [] ); -var ze = `precision highp float; +var Ue = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -646,7 +646,7 @@ void main () { velocity.xy -= vec2(R - L, T - B); gl_FragColor = vec4(velocity, 0.0, 1.0); }`; -const Be = () => g( +const Be = () => h( () => new t.ShaderMaterial({ uniforms: { uPressure: { value: new t.Texture() }, @@ -654,7 +654,7 @@ const Be = () => g( texelSize: { value: new t.Vector2() } }, vertexShader: q, - fragmentShader: ze + fragmentShader: Ue }), [] ); @@ -675,7 +675,7 @@ void main () { vec3 base = texture2D(uTarget, vUv).xyz; gl_FragColor = vec4(base + splat, 1.0); }`; -const Le = () => g( +const Le = () => h( () => new t.ShaderMaterial({ uniforms: { uTarget: { value: new t.Texture() }, @@ -691,58 +691,58 @@ const Le = () => g( [] ), We = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = Me(), v = n.clone(), m = Ie(), s = Ae(), c = _e(), o = Ce(), l = De(), x = Ue(), f = Be(), d = Le(), p = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = be(), c = n.clone(), m = Ae(), v = Fe(), s = _e(), i = Ce(), l = De(), g = Ve(), f = Be(), d = Le(), x = h( () => ({ - vorticityMaterial: s, + vorticityMaterial: v, curlMaterial: m, - advectionMaterial: c, - divergenceMaterial: o, + advectionMaterial: s, + divergenceMaterial: i, pressureMaterial: l, - clearMaterial: x, + clearMaterial: g, gradientSubtractMaterial: f, splatMaterial: d }), [ - s, + v, m, - c, - o, + s, + i, l, - x, + g, f, d ] - ), h = $(i, a); + ), p = $(u, o); F(() => { - u( - p.splatMaterial, + a( + x.splatMaterial, "aspectRatio", - h.x / h.y + p.x / p.y ); - for (const w of Object.values(p)) - u( + for (const w of Object.values(x)) + a( w, "texelSize", - new t.Vector2(1 / h.x, 1 / h.y) + new t.Vector2(1 / p.x, 1 / p.y) ); - }, [h, p]); - const b = I(e, r, n, t.Mesh); + }, [p, x]); + const M = I(e, r, n, t.Mesh); F(() => { - n.dispose(), b.material = v; - }, [n, b, v]), F(() => () => { - for (const w of Object.values(p)) + n.dispose(), M.material = c; + }, [n, M, c]), F(() => () => { + for (const w of Object.values(x)) w.dispose(); - }, [p]); - const y = M( + }, [x]); + const y = b( (w) => { - b.material = w, b.material.needsUpdate = !0; + M.material = w, M.material.needsUpdate = !0; }, - [b] + [M] ); - return { materials: p, setMeshMaterial: y, mesh: b }; + return { materials: x, setMeshMaterial: y, mesh: M }; }, Ee = Object.freeze({ density_dissipation: 0.98, velocity_dissipation: 0.99, @@ -753,45 +753,45 @@ const Le = () => g( splat_radius: 2e-3, fluid_color: new t.Vector3(1, 1, 1), pointerValues: !1 -}), ht = ({ +}), yt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { materials: n, setMeshMaterial: v, mesh: m } = We({ scene: r, size: e, dpr: i }), s = A(e), c = ee(), o = g( + const r = h(() => new t.Scene(), []), { materials: n, setMeshMaterial: c, mesh: m } = We({ scene: r, size: e, dpr: u }), v = z(e), s = ee(), i = h( () => ({ scene: r, - camera: s, + camera: v, size: e, - samples: a + samples: o }), - [r, s, e, a] - ), [l, x] = G(o), [f, d] = G(o), [p, h] = R(o), [b, y] = R(o), [w, C] = G(o), T = D(0), P = D(new t.Vector2(0, 0)), S = D(new t.Vector3(0, 0, 0)), [_, B] = V(Ee); + [r, v, e, o] + ), [l, g] = G(i), [f, d] = G(i), [x, p] = A(i), [M, y] = A(i), [w, C] = G(i), T = D(0), P = D(new t.Vector2(0, 0)), S = D(new t.Vector3(0, 0, 0)), [_, O] = V(Ee); return [ - M( + b( (W, j) => { const { gl: L, pointer: H, clock: Q, size: te } = W; - j && B(j), T.current === 0 && (T.current = Q.getElapsedTime()); + j && O(j), T.current === 0 && (T.current = Q.getElapsedTime()); const re = Math.min( (Q.getElapsedTime() - T.current) / 3, 0.02 ); T.current = Q.getElapsedTime(); - const Z = x(L, ({ read: z }) => { - v(n.advectionMaterial), u(n.advectionMaterial, "uVelocity", z), u(n.advectionMaterial, "uSource", z), u(n.advectionMaterial, "dt", re), u( + const Z = g(L, ({ read: B }) => { + c(n.advectionMaterial), a(n.advectionMaterial, "uVelocity", B), a(n.advectionMaterial, "uSource", B), a(n.advectionMaterial, "dt", re), a( n.advectionMaterial, "dissipation", _.velocity_dissipation ); - }), me = d(L, ({ read: z }) => { - v(n.advectionMaterial), u(n.advectionMaterial, "uVelocity", Z), u(n.advectionMaterial, "uSource", z), u( + }), me = d(L, ({ read: B }) => { + c(n.advectionMaterial), a(n.advectionMaterial, "uVelocity", Z), a(n.advectionMaterial, "uSource", B), a( n.advectionMaterial, "dissipation", _.density_dissipation ); - }), K = _.pointerValues || c(H); - K.isVelocityUpdate && (x(L, ({ read: z }) => { - v(n.splatMaterial), u(n.splatMaterial, "uTarget", z), u( + }), K = _.pointerValues || s(H); + K.isVelocityUpdate && (g(L, ({ read: B }) => { + c(n.splatMaterial), a(n.splatMaterial, "uTarget", B), a( n.splatMaterial, "point", K.currentPointer @@ -799,104 +799,104 @@ const Le = () => g( const N = K.diffPointer.multiply( P.current.set(te.width, te.height).multiplyScalar(_.velocity_acceleration) ); - u( + a( n.splatMaterial, "color", S.current.set(N.x, N.y, 1) - ), u( + ), a( n.splatMaterial, "radius", _.splat_radius ); - }), d(L, ({ read: z }) => { - v(n.splatMaterial), u(n.splatMaterial, "uTarget", z); + }), d(L, ({ read: B }) => { + c(n.splatMaterial), a(n.splatMaterial, "uTarget", B); const N = typeof _.fluid_color == "function" ? _.fluid_color(K.velocity) : _.fluid_color; - u(n.splatMaterial, "color", N); + a(n.splatMaterial, "color", N); })); - const pe = h(L, () => { - v(n.curlMaterial), u(n.curlMaterial, "uVelocity", Z); + const fe = p(L, () => { + c(n.curlMaterial), a(n.curlMaterial, "uVelocity", Z); }); - x(L, ({ read: z }) => { - v(n.vorticityMaterial), u(n.vorticityMaterial, "uVelocity", z), u(n.vorticityMaterial, "uCurl", pe), u( + g(L, ({ read: B }) => { + c(n.vorticityMaterial), a(n.vorticityMaterial, "uVelocity", B), a(n.vorticityMaterial, "uCurl", fe), a( n.vorticityMaterial, "curl", _.curl_strength - ), u(n.vorticityMaterial, "dt", re); + ), a(n.vorticityMaterial, "dt", re); }); - const fe = y(L, () => { - v(n.divergenceMaterial), u(n.divergenceMaterial, "uVelocity", Z); + const pe = y(L, () => { + c(n.divergenceMaterial), a(n.divergenceMaterial, "uVelocity", Z); }); - C(L, ({ read: z }) => { - v(n.clearMaterial), u(n.clearMaterial, "uTexture", z), u( + C(L, ({ read: B }) => { + c(n.clearMaterial), a(n.clearMaterial, "uTexture", B), a( n.clearMaterial, "value", _.pressure_dissipation ); - }), v(n.pressureMaterial), u(n.pressureMaterial, "uDivergence", fe); + }), c(n.pressureMaterial), a(n.pressureMaterial, "uDivergence", pe); let oe; - for (let z = 0; z < _.pressure_iterations; z++) + for (let B = 0; B < _.pressure_iterations; B++) oe = C(L, ({ read: N }) => { - u(n.pressureMaterial, "uPressure", N); + a(n.pressureMaterial, "uPressure", N); }); - return x(L, ({ read: z }) => { - v(n.gradientSubtractMaterial), u( + return g(L, ({ read: B }) => { + c(n.gradientSubtractMaterial), a( n.gradientSubtractMaterial, "uPressure", oe - ), u(n.gradientSubtractMaterial, "uVelocity", z); + ), a(n.gradientSubtractMaterial, "uVelocity", B); }), me; }, [ n, - v, - h, + c, + p, d, y, - c, + s, C, - x, - B, + g, + O, _ ] ), - B, + O, { scene: r, mesh: m, materials: n, - camera: s, + camera: v, renderTarget: { velocity: l, density: f, - curl: p, - divergence: b, + curl: x, + divergence: M, pressure: w }, output: f.read.texture } ]; -}, $e = ({ scale: e, max: i, texture: a, scene: r }) => { - const n = D([]), v = g( +}, $e = ({ scale: e, max: u, texture: o, scene: r }) => { + const n = D([]), c = h( () => new t.PlaneGeometry(e, e), [e] - ), m = g( + ), m = h( () => new t.MeshBasicMaterial({ - map: a, + map: o, transparent: !0, blending: t.AdditiveBlending, depthTest: !1, depthWrite: !1 }), - [a] + [o] ); return F(() => { - for (let s = 0; s < i; s++) { - const c = new t.Mesh(v.clone(), m.clone()); - c.rotateZ(2 * Math.PI * Math.random()), c.visible = !1, r.add(c), n.current.push(c); + for (let v = 0; v < u; v++) { + const s = new t.Mesh(c.clone(), m.clone()); + s.rotateZ(2 * Math.PI * Math.random()), s.visible = !1, r.add(s), n.current.push(s); } - }, [v, m, r, i]), F(() => () => { - n.current.forEach((s) => { - s.geometry.dispose(), Array.isArray(s.material) ? s.material.forEach((c) => c.dispose()) : s.material.dispose(), r.remove(s); + }, [c, m, r, u]), F(() => () => { + n.current.forEach((v) => { + v.geometry.dispose(), Array.isArray(v.material) ? v.material.forEach((s) => s.dispose()) : v.material.dispose(), r.remove(v); }), n.current = []; }, [r]), n.current; }, qe = Object.freeze({ @@ -906,54 +906,54 @@ const Le = () => g( scale: 0.3, alpha: 0.6, pointerValues: !1 -}), yt = ({ +}), wt = ({ texture: e = new t.Texture(), - scale: i = 64, - max: a = 100, + scale: u = 64, + max: o = 100, size: r, dpr: n, - samples: v = 0 + samples: c = 0 }) => { - const m = g(() => new t.Scene(), []), s = $e({ - scale: i, - max: a, + const m = h(() => new t.Scene(), []), v = $e({ + scale: u, + max: o, texture: e, scene: m - }), c = A(r), o = ee(), [l, x] = R({ + }), s = z(r), i = ee(), [l, g] = A({ scene: m, - camera: c, + camera: s, size: r, dpr: n, - samples: v - }), [f, d] = V(qe), p = D(0); + samples: c + }), [f, d] = V(qe), x = D(0); return [ - M( - (b, y) => { - const { gl: w, pointer: C, size: T } = b; + b( + (M, y) => { + const { gl: w, pointer: C, size: T } = M; y && d(y); - const P = f.pointerValues || o(C); + const P = f.pointerValues || i(C); if (f.frequency < P.diffPointer.length()) { - const S = s[p.current]; + const S = v[x.current]; S.visible = !0, S.position.set( P.currentPointer.x * (T.width / 2), P.currentPointer.y * (T.height / 2), 0 - ), S.scale.x = S.scale.y = 0, S.material.opacity = f.alpha, p.current = (p.current + 1) % a; + ), S.scale.x = S.scale.y = 0, S.material.opacity = f.alpha, x.current = (x.current + 1) % o; } - return s.forEach((S) => { + return v.forEach((S) => { if (S.visible) { const _ = S.material; S.rotation.z += f.rotation, _.opacity *= f.fadeout_speed, S.scale.x = f.fadeout_speed * S.scale.x + f.scale, S.scale.y = S.scale.x, _.opacity < 2e-3 && (S.visible = !1); } - }), x(w); + }), g(w); }, - [x, s, o, a, f, d] + [g, v, i, o, f, d] ), d, { scene: m, - camera: c, - meshArr: s, + camera: s, + meshArr: v, renderTarget: l, output: l.texture } @@ -1039,7 +1039,7 @@ void main() { gl_FragColor = vec4(vec3(noise),1.0); }`; const ke = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { uTime: { value: 0 }, @@ -1055,8 +1055,8 @@ const ke = (e) => { fragmentShader: Ne }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, Ge = Object.freeze({ scale: 4e-3, timeStrength: 0.3, @@ -1066,34 +1066,34 @@ const ke = (e) => { warpDirection: new t.Vector2(2, 2), warpStrength: 8, beat: !1 -}), wt = ({ +}), Mt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = ke(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = ke(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(Ge); + dpr: u, + samples: o + }), [i, l] = V(Ge); return [ - M( + b( (f, d) => { - const { gl: p, clock: h } = f; - return d && l(d), u(n, "scale", o.scale), u(n, "timeStrength", o.timeStrength), u(n, "noiseOctaves", o.noiseOctaves), u(n, "fbmOctaves", o.fbmOctaves), u(n, "warpOctaves", o.warpOctaves), u(n, "warpDirection", o.warpDirection), u(n, "warpStrength", o.warpStrength), u(n, "uTime", o.beat || h.getElapsedTime()), c(p); + const { gl: x, clock: p } = f; + return d && l(d), a(n, "scale", i.scale), a(n, "timeStrength", i.timeStrength), a(n, "noiseOctaves", i.noiseOctaves), a(n, "fbmOctaves", i.fbmOctaves), a(n, "warpOctaves", i.warpOctaves), a(n, "warpDirection", i.warpDirection), a(n, "warpStrength", i.warpStrength), a(n, "uTime", i.beat || p.getElapsedTime()), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1146,7 +1146,7 @@ void main() { gl_FragColor = vec4(col, alpha); }`; const Ye = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1167,8 +1167,8 @@ const Ye = (e) => { fragmentShader: Xe }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, He = Object.freeze({ texture: !1, scale: 1, @@ -1183,32 +1183,32 @@ const Ye = (e) => { beat: !1 }), bt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = Ye(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Ye(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(He); + dpr: u, + samples: o + }), [i, l] = V(He); return [ - M( + b( (f, d) => { - const { gl: p, clock: h } = f; - return d && l(d), o.texture ? (u(n, "uTexture", o.texture), u(n, "isTexture", !0)) : (u(n, "isTexture", !1), u(n, "scale", o.scale)), o.noise ? (u(n, "noise", o.noise), u(n, "isNoise", !0), u(n, "noiseStrength", o.noiseStrength)) : u(n, "isNoise", !1), u(n, "uTime", o.beat || h.getElapsedTime()), u(n, "laminateLayer", o.laminateLayer), u(n, "laminateInterval", o.laminateInterval), u(n, "laminateDetail", o.laminateDetail), u(n, "distortion", o.distortion), u(n, "colorFactor", o.colorFactor), u(n, "timeStrength", o.timeStrength), c(p); + const { gl: x, clock: p } = f; + return d && l(d), i.texture ? (a(n, "uTexture", i.texture), a(n, "isTexture", !0)) : (a(n, "isTexture", !1), a(n, "scale", i.scale)), i.noise ? (a(n, "noise", i.noise), a(n, "isNoise", !0), a(n, "noiseStrength", i.noiseStrength)) : a(n, "isNoise", !1), a(n, "uTime", i.beat || p.getElapsedTime()), a(n, "laminateLayer", i.laminateLayer), a(n, "laminateInterval", i.laminateInterval), a(n, "laminateDetail", i.laminateDetail), a(n, "distortion", i.distortion), a(n, "colorFactor", i.colorFactor), a(n, "timeStrength", i.timeStrength), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1244,7 +1244,7 @@ void main() { gl_FragColor = vec4(color,1.); }`; const Je = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { u_time: { value: 0 }, @@ -1259,8 +1259,8 @@ const Je = (e) => { fragmentShader: Ze }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, en = Object.freeze({ pattern: 0, complexity: 2, @@ -1269,38 +1269,38 @@ const Je = (e) => { timeStrength: 0.2, scale: 2e-3, beat: !1 -}), Mt = ({ +}), St = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = Je(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Je(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(en); + dpr: u, + samples: o + }), [i, l] = V(en); return [ - M( + b( (f, d) => { - const { gl: p, clock: h } = f; - return d && l(d), u(n, "u_pattern", o.pattern), u(n, "u_complexity", o.complexity), u( + const { gl: x, clock: p } = f; + return d && l(d), a(n, "u_pattern", i.pattern), a(n, "u_complexity", i.complexity), a( n, "u_complexityAttenuation", - o.complexityAttenuation - ), u(n, "u_iterations", o.iterations), u(n, "u_timeStrength", o.timeStrength), u(n, "u_scale", o.scale), u(n, "u_time", o.beat || h.getElapsedTime()), c(p); + i.complexityAttenuation + ), a(n, "u_iterations", i.iterations), a(n, "u_timeStrength", i.timeStrength), a(n, "u_scale", i.scale), a(n, "u_time", i.beat || p.getElapsedTime()), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1340,7 +1340,7 @@ void main() { gl_FragColor = vec4(outColor, tex.a); }`; const rn = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1354,8 +1354,8 @@ const rn = (e) => { fragmentShader: tn }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, on = Object.freeze({ texture: new t.Texture(), color1: new t.Color().set(0.5, 0.5, 0.5), @@ -1363,34 +1363,34 @@ const rn = (e) => { 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) -}), St = ({ +}), _t = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = rn(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = rn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(on); + dpr: u, + samples: o + }), [i, l] = V(on); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "uTexture", o.texture), u(n, "uColor1", o.color1), u(n, "uColor2", o.color2), u(n, "uColor3", o.color3), u(n, "uColor4", o.color4), u(n, "uRgbWeight", o.rgbWeight), c(p); + const { gl: x } = f; + return d && l(d), a(n, "uTexture", i.texture), a(n, "uColor1", i.color1), a(n, "uColor2", i.color2), a(n, "uColor3", i.color3), a(n, "uColor4", i.color4), a(n, "uRgbWeight", i.rgbWeight), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1415,7 +1415,7 @@ void main() { gl_FragColor = vec4(duotone, texColor.a); }`; const sn = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1426,40 +1426,40 @@ const sn = (e) => { fragmentShader: un }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, ln = { texture: new t.Texture(), color0: new t.Color(16777215), color1: new t.Color(0) -}, _t = ({ +}, Tt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = sn(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = sn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(ln); + dpr: u, + samples: o + }), [i, l] = V(ln); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "uTexture", o.texture), u(n, "uColor0", o.color0), u(n, "uColor1", o.color1), c(p); + const { gl: x } = f; + return d && l(d), a(n, "uTexture", i.texture), a(n, "uColor0", i.color0), a(n, "uColor1", i.color1), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1510,7 +1510,7 @@ void main() { gl_FragColor = vec4(alphColor, alpha); }`; const mn = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -1528,9 +1528,9 @@ const mn = (e) => { fragmentShader: vn }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; -}, pn = { + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; +}, fn = { texture: new t.Texture(), map: new t.Texture(), alphaMap: !1, @@ -1539,38 +1539,38 @@ const mn = (e) => { min: 0, max: 1, dodgeColor: !1 -}, Tt = ({ +}, Ct = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = mn(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = mn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(pn); + dpr: u, + samples: o + }), [i, l] = V(fn); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "u_texture", o.texture), u(n, "u_map", o.map), u(n, "u_mapIntensity", o.mapIntensity), o.alphaMap ? (u(n, "u_alphaMap", o.alphaMap), u(n, "u_isAlphaMap", !0)) : u(n, "u_isAlphaMap", !1), u(n, "u_brightness", o.brightness), u(n, "u_min", o.min), u(n, "u_max", o.max), o.dodgeColor ? (u(n, "u_dodgeColor", o.dodgeColor), u(n, "u_isDodgeColor", !0)) : u(n, "u_isDodgeColor", !1), c(p); + const { gl: x } = f; + return d && l(d), a(n, "u_texture", i.texture), a(n, "u_map", i.map), a(n, "u_mapIntensity", i.mapIntensity), i.alphaMap ? (a(n, "u_alphaMap", i.alphaMap), a(n, "u_isAlphaMap", !0)) : a(n, "u_isAlphaMap", !1), a(n, "u_brightness", i.brightness), a(n, "u_min", i.min), a(n, "u_max", i.max), i.dodgeColor ? (a(n, "u_dodgeColor", i.dodgeColor), a(n, "u_isDodgeColor", !0)) : a(n, "u_isDodgeColor", !1), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; -var fn = `varying vec2 vUv; +var pn = `varying vec2 vUv; void main() { vUv = uv; @@ -1642,12 +1642,12 @@ void main() { gl_FragColor = mix(color0, color1, progress); }`; -const xn = ({ +const gn = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ uniforms: { uResolution: { value: new t.Vector2() }, @@ -1663,17 +1663,17 @@ const xn = ({ dirX: { value: 0 }, dirY: { value: 0 } }, - vertexShader: fn, + vertexShader: pn, fragmentShader: dn }), [] - ), v = $(i, a); + ), c = $(u, o); F(() => { - u(n, "uResolution", v.clone()); - }, [v, n]); + a(n, "uResolution", c.clone()); + }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; -}, gn = { +}, xn = { texture0: new t.Texture(), texture1: new t.Texture(), padding: 0, @@ -1683,44 +1683,44 @@ const xn = ({ epicenter: new t.Vector2(0, 0), progress: 0, dir: new t.Vector2(0, 0) -}, Ct = ({ +}, Pt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = xn({ scene: r, size: e, dpr: i }), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = gn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, - dpr: i, + dpr: u, size: e, - samples: a, + samples: o, isSizeUpdate: !0 - }), [o, l] = V(gn); + }), [i, l] = V(xn); return [ - M( + b( (f, d) => { - var w, C, T, P, S, _, B, E; - const { gl: p } = f; - d && l(d), u(n, "uTexture0", o.texture0), u(n, "uTexture1", o.texture1), u(n, "progress", o.progress); - const h = [ - ((C = (w = o.texture0) == null ? void 0 : w.image) == null ? void 0 : C.width) || 0, - ((P = (T = o.texture0) == null ? void 0 : T.image) == null ? void 0 : P.height) || 0 - ], b = [ - ((_ = (S = o.texture1) == null ? void 0 : S.image) == null ? void 0 : _.width) || 0, - ((E = (B = o.texture1) == null ? void 0 : B.image) == null ? void 0 : E.height) || 0 - ], y = h.map((W, j) => W + (b[j] - W) * o.progress); - return u(n, "uTextureResolution", y), u(n, "padding", o.padding), u(n, "uMap", o.map), u(n, "mapIntensity", o.mapIntensity), u(n, "edgeIntensity", o.edgeIntensity), u(n, "epicenter", o.epicenter), u(n, "dirX", o.dir.x), u(n, "dirY", o.dir.y), c(p); + var w, C, T, P, S, _, O, E; + const { gl: x } = f; + d && l(d), a(n, "uTexture0", i.texture0), a(n, "uTexture1", i.texture1), a(n, "progress", i.progress); + const p = [ + ((C = (w = i.texture0) == null ? void 0 : w.image) == null ? void 0 : C.width) || 0, + ((P = (T = i.texture0) == null ? void 0 : T.image) == null ? void 0 : P.height) || 0 + ], M = [ + ((_ = (S = i.texture1) == null ? void 0 : S.image) == null ? void 0 : _.width) || 0, + ((E = (O = i.texture1) == null ? void 0 : O.image) == null ? void 0 : E.height) || 0 + ], y = p.map((W, j) => W + (M[j] - W) * i.progress); + return a(n, "uTextureResolution", y), a(n, "padding", i.padding), a(n, "uMap", i.map), a(n, "mapIntensity", i.mapIntensity), a(n, "edgeIntensity", i.edgeIntensity), a(n, "epicenter", i.epicenter), a(n, "dirX", i.dir.x), a(n, "dirY", i.dir.y), s(x); }, - [c, n, o, l] + [s, n, i, l] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1745,7 +1745,7 @@ void main() { gl_FragColor = vec4(color, alpha); }`; const wn = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -1757,47 +1757,47 @@ const wn = (e) => { fragmentShader: yn }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; -}, bn = { + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; +}, Mn = { texture: new t.Texture(), brightness: new t.Vector3(0.5, 0.5, 0.5), min: 0, max: 1 -}, Pt = ({ +}, Dt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = wn(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = wn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V( - bn + dpr: u, + samples: o + }), [i, l] = V( + Mn ); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "u_texture", o.texture), u(n, "u_brightness", o.brightness), u(n, "u_min", o.min), u(n, "u_max", o.max), c(p); + const { gl: x } = f; + return d && l(d), a(n, "u_texture", i.texture), a(n, "u_brightness", i.brightness), a(n, "u_min", i.min), a(n, "u_max", i.max), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; -var Mn = `varying vec2 vUv; +var bn = `varying vec2 vUv; void main() { vUv = uv; @@ -1822,51 +1822,51 @@ void main() { gl_FragColor = texture2D(u_texture, uv); }`; const _n = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, u_map: { value: new t.Texture() }, u_mapIntensity: { value: 0 } }, - vertexShader: Mn, + vertexShader: bn, fragmentShader: Sn }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, Tn = { texture: new t.Texture(), map: new t.Texture(), mapIntensity: 0.3 -}, Dt = ({ +}, Rt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = _n(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = _n(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(Tn); + dpr: u, + samples: o + }), [i, l] = V(Tn); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "u_texture", o.texture), u(n, "u_map", o.map), u(n, "u_mapIntensity", o.mapIntensity), c(p); + const { gl: x } = f; + return d && l(d), a(n, "u_texture", i.texture), a(n, "u_map", i.map), a(n, "u_mapIntensity", i.mapIntensity), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -1890,10 +1890,10 @@ void main() { }`; const Dn = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1903,48 +1903,48 @@ const Dn = ({ fragmentShader: Pn }), [] - ), v = I(e, r, n, t.Mesh); - return { material: n, mesh: v }; + ), c = I(e, r, n, t.Mesh); + return { material: n, mesh: c }; }, Rn = { texture: new t.Texture(), map: new t.Texture() -}, Rt = ({ +}, At = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = Dn({ scene: r, size: e, dpr: i }), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Dn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(Rn); + dpr: u, + samples: o + }), [i, l] = V(Rn); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "uTexture", o.texture), u(n, "uMap", o.map), c(p); + const { gl: x } = f; + return d && l(d), a(n, "uTexture", i.texture), a(n, "uMap", i.map), s(x); }, - [n, c, o, l] + [n, s, i, l] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; -var In = `varying vec2 vUv; +var An = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Fn = `precision highp float; +}`, In = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1977,65 +1977,65 @@ void main() { vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); }`; -const An = ({ +const Fn = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, u_brightness: { value: 1 }, u_saturation: { value: 1 } }, - vertexShader: In, - fragmentShader: Fn + vertexShader: An, + fragmentShader: In }), [] - ), v = I(e, r, n, t.Mesh); - return { material: n, mesh: v }; -}, Vn = { + ), c = I(e, r, n, t.Mesh); + return { material: n, mesh: c }; +}, zn = { texture: new t.Texture(), brightness: 1, saturation: 1 }, It = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = An({ scene: r, size: e, dpr: i }), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Fn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(Vn); + dpr: u, + samples: o + }), [i, l] = V(zn); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "u_texture", o.texture), u(n, "u_brightness", o.brightness), u(n, "u_saturation", o.saturation), c(p); + const { gl: x } = f; + return d && l(d), a(n, "u_texture", i.texture), a(n, "u_brightness", i.brightness), a(n, "u_saturation", i.saturation), s(x); }, - [n, c, o, l] + [n, s, i, l] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; -var Un = `varying vec2 vUv; +var Vn = `varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, zn = `precision highp float; +}`, Un = `precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -2056,61 +2056,61 @@ void main() { }`; const Bn = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ uniforms: { uResolution: { value: new t.Vector2() }, uTextureResolution: { value: new t.Vector2() }, uTexture: { value: new t.Texture() } }, - vertexShader: Un, - fragmentShader: zn + vertexShader: Vn, + fragmentShader: Un }), [] - ), v = $(i, a); + ), c = $(u, o); F(() => { - u(n, "uResolution", v.clone()); - }, [v, n]); + a(n, "uResolution", c.clone()); + }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; }, On = { texture: new t.Texture() }, Ft = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = Bn({ scene: r, size: e, dpr: i }), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Bn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, - dpr: i, + dpr: u, size: e, - samples: a, + samples: o, isSizeUpdate: !0 - }), [o, l] = V(On); + }), [i, l] = V(On); return [ - M( + b( (f, d) => { - var h, b, y, w, C, T; - const { gl: p } = f; - return d && l(d), u(n, "uTexture", o.texture), u(n, "uTextureResolution", [ - ((y = (b = (h = o.texture) == null ? void 0 : h.source) == null ? void 0 : b.data) == null ? void 0 : y.width) || 0, - ((T = (C = (w = o.texture) == null ? void 0 : w.source) == null ? void 0 : C.data) == null ? void 0 : T.height) || 0 - ]), c(p); + var p, M, y, w, C, T; + const { gl: x } = f; + return d && l(d), a(n, "uTexture", i.texture), a(n, "uTextureResolution", [ + ((y = (M = (p = i.texture) == null ? void 0 : p.source) == null ? void 0 : M.data) == null ? void 0 : y.width) || 0, + ((T = (C = (w = i.texture) == null ? void 0 : w.source) == null ? void 0 : C.data) == null ? void 0 : T.height) || 0 + ]), s(x); }, - [c, n, o, l] + [s, n, i, l] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -2148,7 +2148,7 @@ void main() { gl_FragColor = outColor; }`; const En = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -2159,52 +2159,52 @@ const En = (e) => { fragmentShader: Wn }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, le = Object.freeze({ texture: new t.Texture(), blurSize: 3, blurPower: 5 -}), At = ({ +}), zt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = En(r), m = A(e), s = g( + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = En(r), m = z(e), v = h( () => ({ scene: r, camera: m, size: e, - dpr: i, - samples: a + dpr: u, + samples: o }), - [r, m, e, i, a] - ), [c, o] = R(s), [l, x] = G(s), [f, d] = V(le); + [r, m, e, u, o] + ), [s, i] = A(v), [l, g] = G(v), [f, d] = V(le); return [ - M( - (h, b) => { - var T, P, S, _, B, E; - const { gl: y } = h; - b && d(b), u(n, "uTexture", f.texture), u(n, "uResolution", [ + b( + (p, M) => { + var T, P, S, _, O, E; + const { gl: y } = p; + M && d(M), a(n, "uTexture", f.texture), a(n, "uResolution", [ ((S = (P = (T = f.texture) == null ? void 0 : T.source) == null ? void 0 : P.data) == null ? void 0 : S.width) || 0, - ((E = (B = (_ = f.texture) == null ? void 0 : _.source) == null ? void 0 : B.data) == null ? void 0 : E.height) || 0 - ]), u(n, "uBlurSize", f.blurSize); - let w = x(y); + ((E = (O = (_ = f.texture) == null ? void 0 : _.source) == null ? void 0 : O.data) == null ? void 0 : E.height) || 0 + ]), a(n, "uBlurSize", f.blurSize); + let w = g(y); const C = f.blurPower; for (let W = 0; W < C; W++) - u(n, "uTexture", w), w = x(y); - return o(y); + a(n, "uTexture", w), w = g(y); + return i(y); }, - [o, x, n, d, f] + [i, g, n, d, f] ), d, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: c, - output: c.texture + renderTarget: s, + output: s.texture } ]; }; @@ -2264,7 +2264,7 @@ void main() { gl_FragColor = vec4(color, 1.0); }`; const jn = (e) => { - const i = g(() => new t.PlaneGeometry(2, 2), []), a = g( + const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( () => new t.ShaderMaterial({ uniforms: { uEpicenter: { value: k.epicenter }, @@ -2277,8 +2277,8 @@ const jn = (e) => { fragmentShader: qn }), [] - ), r = I(e, i, a, t.Mesh); - return { material: a, mesh: r }; + ), r = I(e, u, o, t.Mesh); + return { material: o, mesh: r }; }, k = Object.freeze({ epicenter: new t.Vector2(0, 0), progress: 0, @@ -2287,37 +2287,37 @@ const jn = (e) => { mode: "center" }), Vt = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = jn(r), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = jn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a, + dpr: u, + samples: o, isSizeUpdate: !0 - }), [o, l] = V(k); + }), [i, l] = V(k); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "uEpicenter", o.epicenter), u(n, "uProgress", o.progress), u(n, "uWidth", o.width), u(n, "uStrength", o.strength), u( + const { gl: x } = f; + return d && l(d), a(n, "uEpicenter", i.epicenter), a(n, "uProgress", i.progress), a(n, "uWidth", i.width), a(n, "uStrength", i.strength), a( n, "uMode", - o.mode === "center" ? 0 : o.mode === "horizontal" ? 1 : 2 - ), c(p); + i.mode === "center" ? 0 : i.mode === "horizontal" ? 1 : 2 + ), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }; @@ -2397,10 +2397,10 @@ void main() { }`; const Gn = ({ scene: e, - size: i, - dpr: a + size: u, + dpr: o }) => { - const r = g(() => new t.PlaneGeometry(2, 2), []), n = g( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -2418,10 +2418,10 @@ const Gn = ({ fragmentShader: kn }), [] - ), v = $(i, a); + ), c = $(u, o); F(() => { - u(n, "u_resolution", v.clone()); - }, [v, n]); + a(n, "u_resolution", c.clone()); + }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; }, Kn = Object.freeze({ @@ -2436,43 +2436,43 @@ const Gn = ({ gamma: 1 }), Ut = ({ size: e, - dpr: i, - samples: a = 0 + dpr: u, + samples: o = 0 }) => { - const r = g(() => new t.Scene(), []), { material: n, mesh: v } = Gn({ scene: r, size: e, dpr: i }), m = A(e), [s, c] = R({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Gn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, - dpr: i, - samples: a - }), [o, l] = V(Kn); + dpr: u, + samples: o + }), [i, l] = V(Kn); return [ - M( + b( (f, d) => { - const { gl: p } = f; - return d && l(d), u(n, "u_texture", o.texture), u(n, "u_keyColor", o.keyColor), u(n, "u_similarity", o.similarity), u(n, "u_smoothness", o.smoothness), u(n, "u_spill", o.spill), u(n, "u_color", o.color), u(n, "u_contrast", o.contrast), u(n, "u_brightness", o.brightness), u(n, "u_gamma", o.gamma), c(p); + const { gl: x } = f; + return d && l(d), a(n, "u_texture", i.texture), a(n, "u_keyColor", i.keyColor), a(n, "u_similarity", i.similarity), a(n, "u_smoothness", i.smoothness), a(n, "u_spill", i.spill), a(n, "u_color", i.color), a(n, "u_contrast", i.contrast), a(n, "u_brightness", i.brightness), a(n, "u_gamma", i.gamma), s(x); }, - [c, n, l, o] + [s, n, l, i] ), l, { scene: r, - mesh: v, + mesh: c, material: n, camera: m, - renderTarget: s, - output: s.texture + renderTarget: v, + output: v.texture } ]; }, Xn = ({ scene: e, - geometry: i, - material: a + geometry: u, + material: o }) => { - const r = I(e, i, a, t.Points), n = I( + const r = I(e, u, o, t.Points), n = I( e, - g(() => i.clone(), [i]), - g(() => a.clone(), [a]), + h(() => u.clone(), [u]), + h(() => o.clone(), [o]), t.Mesh ); return n.visible = !1, { @@ -2507,10 +2507,21 @@ uniform sampler2D uDisplacement; uniform bool uIsDisplacement; uniform float uDisplacementIntensity; +uniform float uSizeRandomIntensity; +uniform float uSizeRandomTimeFrequency; +uniform float uSizeRandomMin; +uniform float uSizeRandomMax; + +uniform float uMapArrayLength; + +uniform float uDivergence; +uniform vec3 uDivergencePoint; + varying vec3 vColor; varying float vPictureAlpha; varying vec3 vDisplacementColor; varying float vDisplacementIntensity; +varying float vMapArrayIndex; #usf @@ -2518,6 +2529,10 @@ varying float vDisplacementIntensity; #usf +float random3D(vec3 co) { + return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); +} + void main() { vec3 newPosition = position; vec2 newUv = uv; @@ -2536,6 +2551,14 @@ void main() { newPosition += displacement; + vec3 divergenceDir = newPosition - uDivergencePoint; + if (uDivergence > 0.0) { + newPosition += normalize(divergenceDir) * uDivergence; + } else if (uDivergence < 0.0) { + newPosition -= normalize(divergenceDir) * abs(uDivergence); + } + + vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); vec4 viewPosition = viewMatrix * modelPosition; vec4 projectedPosition = projectionMatrix * viewPosition; @@ -2551,8 +2574,13 @@ void main() { vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; - gl_PointSize = uPointSize * vPictureAlpha * uResolution.y; + + float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; + gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; gl_PointSize *= (1.0 / - viewPosition.z); + + + vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; }`, Hn = `precision highp float; precision highp int; @@ -2560,6 +2588,7 @@ varying vec3 vColor; varying float vPictureAlpha; varying vec3 vDisplacementColor; varying float vDisplacementIntensity; +varying float vMapArrayIndex; uniform float uBlurAlpha; uniform float uBlurRadius; @@ -2568,6 +2597,9 @@ uniform bool uIsMap; uniform sampler2D uAlphaMap; uniform bool uIsAlphaMap; uniform float uDisplacementColorIntensity; +uniform float uPointAlpha; + +#usf void main() { vec2 uv = gl_PointCoord; @@ -2578,7 +2610,10 @@ void main() { float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); - vec3 finalColor = uIsMap ? texture2D(uMap,uv).rgb : vColor; + vec4 mapArrayColor; + #usf + vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); + vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); @@ -2587,7 +2622,7 @@ void main() { float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; - gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap); + gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); }`, ce = `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;} @@ -2696,9 +2731,9 @@ float getWobble(vec3 position) uTime * uWobbleTimeFrequency )) * uWobbleStrength; }`; -const ve = process.env.NODE_ENV === "development", ie = (e, i, a, r, n) => { +const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { var l; - const v = a === "position" ? "positionTarget" : "uvTarget", m = a === "position" ? "#usf " : "#usf ", s = a === "position" ? "#usf " : "#usf ", c = a === "position" ? "positionsList" : "uvsList", o = a === "position" ? ` + const c = o === "position" ? "positionTarget" : "uvTarget", m = o === "position" ? "#usf " : "#usf ", v = o === "position" ? "#usf " : "#usf ", s = o === "position" ? "positionsList" : "uvsList", i = o === "position" ? ` float scaledProgress = uMorphProgress * ${e.length - 1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length - 1}); @@ -2707,200 +2742,243 @@ const ve = process.env.NODE_ENV === "development", ie = (e, i, a, r, n) => { newPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress); ` : "newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);"; if (e.length > 0) { - i.deleteAttribute(a), i.setAttribute( - a, + u.deleteAttribute(o), u.setAttribute( + o, new t.BufferAttribute(e[0], n) ); - let x = "", f = ""; - e.forEach((d, p) => { - i.setAttribute( - `${v}${p}`, + let g = "", f = ""; + e.forEach((d, x) => { + u.setAttribute( + `${c}${x}`, new t.BufferAttribute(d, n) - ), x += `attribute vec${n} ${v}${p}; -`, p === 0 ? f += `${v}${p}` : f += `,${v}${p}`; + ), g += `attribute vec${n} ${c}${x}; +`, x === 0 ? f += `${c}${x}` : f += `,${c}${x}`; }), r = r.replace( `${m}`, - x + g ), r = r.replace( - `${s}`, - `vec${n} ${c}[${e.length}] = vec${n}[](${f}); - ${o} + `${v}`, + `vec${n} ${s}[${e.length}] = vec${n}[](${f}); + ${i} ` ); } else - r = r.replace(`${m}`, ""), r = r.replace(`${s}`, ""), (l = i == null ? void 0 : i.attributes[a]) != null && l.array || ve && console.error( - `use-shader-fx:geometry.attributes.${a}.array is not found` + r = r.replace(`${m}`, ""), r = r.replace(`${v}`, ""), (l = u == null ? void 0 : u.attributes[o]) != null && l.array || ve && console.error( + `use-shader-fx:geometry.attributes.${o}.array is not found` ); return r; -}, ue = (e, i, a, r) => { - var v; +}, ue = (e, u, o, r) => { + var c; let n = []; if (e && e.length > 0) { - (v = i == null ? void 0 : i.attributes[a]) != null && v.array ? n = [ - i.attributes[a].array, + (c = u == null ? void 0 : u.attributes[o]) != null && c.array ? n = [ + u.attributes[o].array, ...e ] : n = e; - const m = Math.max(...n.map((s) => s.length)); - n.forEach((s, c) => { - if (s.length < m) { - const o = (m - s.length) / r, l = [], x = Array.from(s); - for (let f = 0; f < o; f++) { - const d = Math.floor(s.length / r * Math.random()) * r; - for (let p = 0; p < r; p++) - l.push(x[d + p]); + const m = Math.max(...n.map((v) => v.length)); + n.forEach((v, s) => { + if (v.length < m) { + const i = (m - v.length) / r, l = [], g = Array.from(v); + for (let f = 0; f < i; f++) { + const d = Math.floor(v.length / r * Math.random()) * r; + for (let x = 0; x < r; x++) + l.push(g[d + x]); } - n[c] = new Float32Array([...x, ...l]); + n[s] = new Float32Array([...g, ...l]); } }); } return n; -}, Qn = ({ +}, Qn = (e, u) => { + let o = ""; + const r = {}; + let n = ""; + return e && e.length > 0 ? (n += "if (false) {}", e.forEach((m, v) => { + n += ` else if (vMapArrayIndex == ${v}.0) { +`, n += ` mapArrayColor = texture2D(uMapArray${v}, uv); +`, n += "}", o += ` + uniform sampler2D uMapArray${v}; + `, r[`uMapArray${v}`] = { value: m }; + }), n += ` else { +`, n += ` mapArrayColor = vec4(1.0); +`, n += "}", o += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (n += `mapArrayColor = vec4(1.0); +`, o += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: u.replace("#usf ", n).replace("#usf ", o), mapArrayUniforms: r }; +}, Zn = ({ size: e, - dpr: i, - geometry: a, + dpr: u, + geometry: o, positions: r, - uvs: n + uvs: n, + mapArray: c }) => { - const v = g( - () => ue(r, a, "position", 3), - [r, a] - ), m = g( - () => ue(n, a, "uv", 2), - [n, a] - ), s = g(() => { - v.length !== m.length && ve && console.log("use-shader-fx:positions and uvs are not matched"); - const o = ie( - m, - a, + const m = h( + () => ue(r, o, "position", 3), + [r, o] + ), v = h( + () => ue(n, o, "uv", 2), + [n, o] + ), s = h(() => { + m.length !== v.length && ve && console.log("use-shader-fx:positions and uvs are not matched"); + const l = ie( + v, + o, "uv", ie( - v, - a, + m, + o, "position", Yn, 3 ), 2 - ).replace("#usf ", ce); + ).replace("#usf ", ce), g = Qn(c, Hn); return new t.ShaderMaterial({ - vertexShader: o, - fragmentShader: Hn, + vertexShader: l, + fragmentShader: g.rewritedFragmentShader, depthTest: !1, depthWrite: !1, transparent: !0, blending: t.AdditiveBlending, uniforms: { uResolution: { value: new t.Vector2(0, 0) }, - uMorphProgress: { value: O.morphProgress }, - uBlurAlpha: { value: O.blurAlpha }, - uBlurRadius: { value: O.blurRadius }, - uPointSize: { value: O.pointSize }, + uMorphProgress: { value: R.morphProgress }, + uBlurAlpha: { value: R.blurAlpha }, + uBlurRadius: { value: R.blurRadius }, + uPointSize: { value: R.pointSize }, + uPointAlpha: { value: R.pointAlpha }, uPicture: { value: new t.Texture() }, uIsPicture: { value: !1 }, uAlphaPicture: { value: new t.Texture() }, uIsAlphaPicture: { value: !1 }, - uColor0: { value: O.color0 }, - uColor1: { value: O.color1 }, - uColor2: { value: O.color2 }, - uColor3: { value: O.color3 }, + uColor0: { value: R.color0 }, + uColor1: { value: R.color1 }, + uColor2: { value: R.color2 }, + uColor3: { value: R.color3 }, uMap: { value: new t.Texture() }, uIsMap: { value: !1 }, uAlphaMap: { value: new t.Texture() }, uIsAlphaMap: { value: !1 }, uTime: { value: 0 }, uWobblePositionFrequency: { - value: O.wobblePositionFrequency + value: R.wobblePositionFrequency }, uWobbleTimeFrequency: { - value: O.wobbleTimeFrequency + value: R.wobbleTimeFrequency }, - uWobbleStrength: { value: O.wobbleStrength }, + uWobbleStrength: { value: R.wobbleStrength }, uWarpPositionFrequency: { - value: O.warpPositionFrequency + value: R.warpPositionFrequency }, uWarpTimeFrequency: { - value: O.warpTimeFrequency + value: R.warpTimeFrequency }, - uWarpStrength: { value: O.warpStrength }, + uWarpStrength: { value: R.warpStrength }, uDisplacement: { value: new t.Texture() }, uIsDisplacement: { value: !1 }, uDisplacementIntensity: { - value: O.displacementIntensity + value: R.displacementIntensity }, uDisplacementColorIntensity: { - value: O.displacementColorIntensity - } + value: R.displacementColorIntensity + }, + uSizeRandomIntensity: { + value: R.sizeRandomIntensity + }, + uSizeRandomTimeFrequency: { + value: R.sizeRandomTimeFrequency + }, + uSizeRandomMin: { value: R.sizeRandomMin }, + uSizeRandomMax: { value: R.sizeRandomMax }, + uDivergence: { value: R.divergence }, + uDivergencePoint: { value: R.divergencePoint }, + ...g.mapArrayUniforms } }); - }, [a, v, m]), c = $(e, i); + }, [ + o, + m, + v, + c + ]), i = $(e, u); return F(() => { - u(s, "uResolution", c.clone()); - }, [c, s]), { material: s, modifiedPositions: v, modifiedUvs: m }; -}, Zn = ({ + a(s, "uResolution", i.clone()); + }, [i, s]), { material: s, modifiedPositions: m, modifiedUvs: v }; +}, Jn = ({ size: e, - dpr: i, - scene: a = !1, + dpr: u, + scene: o = !1, geometry: r, positions: n, - uvs: v + uvs: c, + mapArray: m }) => { - const m = g(() => { - const d = r || new t.SphereGeometry(1, 32, 32); - return d.setIndex(null), d.deleteAttribute("normal"), d; - }, [r]), { material: s, modifiedPositions: c, modifiedUvs: o } = Qn({ + const v = h(() => { + const x = r || new t.SphereGeometry(1, 32, 32); + return x.setIndex(null), x.deleteAttribute("normal"), x; + }, [r]), { material: s, modifiedPositions: i, modifiedUvs: l } = Zn({ size: e, - dpr: i, - geometry: m, + dpr: u, + geometry: v, positions: n, - uvs: v - }), { points: l, interactiveMesh: x } = Xn({ - scene: a, - geometry: m, + uvs: c, + mapArray: m + }), { points: g, interactiveMesh: f } = Xn({ + scene: o, + geometry: v, material: s }); return [ - M( - (d, p) => { - d && u( + b( + (x, p) => { + x && a( s, "uTime", - (p == null ? void 0 : p.beat) || d.clock.getElapsedTime() - ), p !== void 0 && (u(s, "uMorphProgress", p.morphProgress), u(s, "uBlurAlpha", p.blurAlpha), u(s, "uBlurRadius", p.blurRadius), u(s, "uPointSize", p.pointSize), p.picture ? (u(s, "uPicture", p.picture), u(s, "uIsPicture", !0)) : u(s, "uIsPicture", !1), p.alphaPicture ? (u(s, "uAlphaPicture", p.alphaPicture), u(s, "uIsAlphaPicture", !0)) : u(s, "uIsAlphaPicture", !1), u(s, "uColor0", p.color0), u(s, "uColor1", p.color1), u(s, "uColor2", p.color2), u(s, "uColor3", p.color3), p.map ? (u(s, "uMap", p.map), u(s, "uIsMap", !0)) : u(s, "uIsMap", !1), p.alphaMap ? (u(s, "uAlphaMap", p.alphaMap), u(s, "uIsAlphaMap", !0)) : u(s, "uIsAlphaMap", !1), u(s, "uWobbleStrength", p.wobbleStrength), u( + (p == null ? void 0 : p.beat) || x.clock.getElapsedTime() + ), p !== void 0 && (a(s, "uMorphProgress", p.morphProgress), a(s, "uBlurAlpha", p.blurAlpha), a(s, "uBlurRadius", p.blurRadius), a(s, "uPointSize", p.pointSize), a(s, "uPointAlpha", p.pointAlpha), p.picture ? (a(s, "uPicture", p.picture), a(s, "uIsPicture", !0)) : p.picture === !1 && a(s, "uIsPicture", !1), p.alphaPicture ? (a(s, "uAlphaPicture", p.alphaPicture), a(s, "uIsAlphaPicture", !0)) : p.alphaPicture === !1 && a(s, "uIsAlphaPicture", !1), a(s, "uColor0", p.color0), a(s, "uColor1", p.color1), a(s, "uColor2", p.color2), a(s, "uColor3", p.color3), p.map ? (a(s, "uMap", p.map), a(s, "uIsMap", !0)) : p.map === !1 && a(s, "uIsMap", !1), p.alphaMap ? (a(s, "uAlphaMap", p.alphaMap), a(s, "uIsAlphaMap", !0)) : p.alphaMap === !1 && a(s, "uIsAlphaMap", !1), a(s, "uWobbleStrength", p.wobbleStrength), a( s, "uWobblePositionFrequency", p.wobblePositionFrequency - ), u( + ), a( s, "uWobbleTimeFrequency", p.wobbleTimeFrequency - ), u(s, "uWarpStrength", p.warpStrength), u( + ), a(s, "uWarpStrength", p.warpStrength), a( s, "uWarpPositionFrequency", p.warpPositionFrequency - ), u(s, "uWarpTimeFrequency", p.warpTimeFrequency), p.displacement ? (u(s, "uDisplacement", p.displacement), u(s, "uIsDisplacement", !0)) : u(s, "uIsDisplacement", !1), u( + ), a(s, "uWarpTimeFrequency", p.warpTimeFrequency), p.displacement ? (a(s, "uDisplacement", p.displacement), a(s, "uIsDisplacement", !0)) : p.displacement === !1 && a(s, "uIsDisplacement", !1), a( s, "uDisplacementIntensity", p.displacementIntensity - ), u( + ), a( s, "uDisplacementColorIntensity", p.displacementColorIntensity - )); + ), a( + s, + "uSizeRandomIntensity", + p.sizeRandomIntensity + ), a( + s, + "uSizeRandomTimeFrequency", + p.sizeRandomTimeFrequency + ), a(s, "uSizeRandomMin", p.sizeRandomMin), a(s, "uSizeRandomMax", p.sizeRandomMax), a(s, "uDivergence", p.divergence), a(s, "uDivergencePoint", p.divergencePoint)); }, [s] ), { - points: l, - interactiveMesh: x, - positions: c, - uvs: o + points: g, + interactiveMesh: f, + positions: i, + uvs: l } ]; -}, O = Object.freeze({ +}, R = Object.freeze({ morphProgress: 0, blurAlpha: 0.9, blurRadius: 0.05, pointSize: 0.05, + pointAlpha: 1, picture: !1, alphaPicture: !1, color0: new t.Color(16711680), @@ -2912,107 +2990,113 @@ const ve = process.env.NODE_ENV === "development", ie = (e, i, a, r, n) => { wobbleStrength: 0, wobblePositionFrequency: 0.5, wobbleTimeFrequency: 0.5, - warpStrength: 0.5, + warpStrength: 0, warpPositionFrequency: 0.5, warpTimeFrequency: 0.5, displacement: !1, displacementIntensity: 1, displacementColorIntensity: 0, + sizeRandomIntensity: 0, + sizeRandomTimeFrequency: 0.2, + sizeRandomMin: 0.5, + sizeRandomMax: 1.5, + divergence: 0, + divergencePoint: new t.Vector3(0), beat: !1 -}), zt = ({ +}), Bt = ({ size: e, - dpr: i, - samples: a = 0, + dpr: u, + samples: o = 0, camera: r, geometry: n, - positions: v, + positions: c, uvs: m }) => { - const s = g(() => new t.Scene(), []), [ - c, + const v = h(() => new t.Scene(), []), [ + s, { - points: o, + points: i, interactiveMesh: l, - positions: x, + positions: g, uvs: f } - ] = Zn({ scene: s, size: e, dpr: i, geometry: n, positions: v, uvs: m }), [d, p] = R({ - scene: s, + ] = Jn({ scene: v, size: e, dpr: u, geometry: n, positions: c, uvs: m }), [d, x] = A({ + scene: v, camera: r, size: e, - dpr: i, - samples: a, + dpr: u, + samples: o, depthBuffer: !0 - }), h = M( - (y, w) => (c(y, w), p(y.gl)), - [p, c] - ), b = M( + }), p = b( + (y, w) => (s(y, w), x(y.gl)), + [x, s] + ), M = b( (y) => { - c(null, y); + s(null, y); }, - [c] + [s] ); return [ - h, - b, + p, + M, { - scene: s, - points: o, + scene: v, + points: i, interactiveMesh: l, renderTarget: d, output: d.texture, - positions: x, + positions: g, uvs: f } ]; }; -function Jn(e, i = 1e-4) { - i = Math.max(i, Number.EPSILON); - const a = {}, r = e.getIndex(), n = e.getAttribute("position"), v = r ? r.count : n.count; +function et(e, u = 1e-4) { + u = Math.max(u, Number.EPSILON); + const o = {}, r = e.getIndex(), n = e.getAttribute("position"), c = r ? r.count : n.count; let m = 0; - const s = Object.keys(e.attributes), c = {}, o = {}, l = [], x = ["getX", "getY", "getZ", "getW"]; - for (let h = 0, b = s.length; h < b; h++) { - const y = s[h]; - c[y] = []; + const v = Object.keys(e.attributes), s = {}, i = {}, l = [], g = ["getX", "getY", "getZ", "getW"]; + for (let p = 0, M = v.length; p < M; p++) { + const y = v[p]; + s[y] = []; const w = e.morphAttributes[y]; - w && (o[y] = new Array(w.length).fill(0).map(() => [])); + w && (i[y] = new Array(w.length).fill(0).map(() => [])); } - const f = Math.log10(1 / i), d = Math.pow(10, f); - for (let h = 0; h < v; h++) { - const b = r ? r.getX(h) : h; + const f = Math.log10(1 / u), d = Math.pow(10, f); + for (let p = 0; p < c; p++) { + const M = r ? r.getX(p) : p; let y = ""; - for (let w = 0, C = s.length; w < C; w++) { - const T = s[w], P = e.getAttribute(T), S = P.itemSize; + for (let w = 0, C = v.length; w < C; w++) { + const T = v[w], P = e.getAttribute(T), S = P.itemSize; for (let _ = 0; _ < S; _++) - y += `${~~(P[x[_]](b) * d)},`; + y += `${~~(P[g[_]](M) * d)},`; } - if (y in a) - l.push(a[y]); + if (y in o) + l.push(o[y]); else { - for (let w = 0, C = s.length; w < C; w++) { - const T = s[w], P = e.getAttribute(T), S = e.morphAttributes[T], _ = P.itemSize, B = c[T], E = o[T]; + for (let w = 0, C = v.length; w < C; w++) { + const T = v[w], P = e.getAttribute(T), S = e.morphAttributes[T], _ = P.itemSize, O = s[T], E = i[T]; for (let W = 0; W < _; W++) { - const j = x[W]; - if (B.push(P[j](b)), S) + const j = g[W]; + if (O.push(P[j](M)), S) for (let L = 0, H = S.length; L < H; L++) - E[L].push(S[L][j](b)); + E[L].push(S[L][j](M)); } } - a[y] = m, l.push(m), m++; + o[y] = m, l.push(m), m++; } } - const p = e.clone(); - for (let h = 0, b = s.length; h < b; h++) { - const y = s[h], w = e.getAttribute(y), C = new w.array.constructor(c[y]), T = new ae(C, w.itemSize, w.normalized); - if (p.setAttribute(y, T), y in o) - for (let P = 0; P < o[y].length; P++) { - const S = e.morphAttributes[y][P], _ = new S.array.constructor(o[y][P]), B = new ae(_, S.itemSize, S.normalized); - p.morphAttributes[y][P] = B; + const x = e.clone(); + for (let p = 0, M = v.length; p < M; p++) { + const y = v[p], w = e.getAttribute(y), C = new w.array.constructor(s[y]), T = new ae(C, w.itemSize, w.normalized); + if (x.setAttribute(y, T), y in i) + for (let P = 0; P < i[y].length; P++) { + const S = e.morphAttributes[y][P], _ = new S.array.constructor(i[y][P]), O = new ae(_, S.itemSize, S.normalized); + x.morphAttributes[y][P] = O; } } - return p.setIndex(l), p; + return x.setIndex(l), x; } -var et = `vec3 random3(vec3 c) { +var nt = `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); @@ -3064,7 +3148,7 @@ float snoiseFractal(vec3 m) { +0.2666667* snoise(2.0*m) +0.1333333* snoise(4.0*m) +0.0666667* snoise(8.0*m); -}`, nt = `#ifdef USE_TRANSMISSION +}`, tt = `#ifdef USE_TRANSMISSION @@ -3262,7 +3346,7 @@ float snoiseFractal(vec3 m) { return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`, tt = `#ifdef USE_TRANSMISSION +#endif`, rt = `#ifdef USE_TRANSMISSION material.transmission = _transmission; material.transmissionAlpha = 1.0; @@ -3335,19 +3419,19 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); #endif`; const se = (e) => { - let i = e; - return i = i.replace( + let u = e; + return u = u.replace( "#include ", ` vec3 objectNormal = usf_Normal; #ifdef USE_TANGENT vec3 objectTangent = vec3( tangent.xyz ); #endif` - ), i = i.replace( + ), u = u.replace( "#include ", ` vec3 transformed = usf_Position;` - ), i = i.replace( + ), u = u.replace( "void main() {", ` uniform float uTime; @@ -3362,7 +3446,7 @@ const se = (e) => { varying vec2 vPosition; // #usf void main() {` - ), i = i.replace("// #usf ", `${ce}`), i = i.replace( + ), u = u.replace("// #usf ", `${ce}`), u = u.replace( "void main() {", ` void main() { @@ -3386,15 +3470,15 @@ const se = (e) => { // Varying vPosition = usf_Position.xy; vWobble = wobble / uWobbleStrength;` - ), i; -}, rt = ({ + ), u; +}, ot = ({ baseMaterial: e, - materialParameters: i + materialParameters: u }) => { - const { material: a, depthMaterial: r } = g(() => { + const { material: o, depthMaterial: r } = h(() => { const n = new (e || t.MeshPhysicalMaterial)( - i || {} - ), v = n.type === "MeshPhysicalMaterial" || n.type === "MeshStandardMaterial", m = n.type === "MeshPhysicalMaterial"; + u || {} + ), c = n.type === "MeshPhysicalMaterial" || n.type === "MeshStandardMaterial", m = n.type === "MeshPhysicalMaterial"; Object.assign(n.userData, { uniforms: { uTime: { value: 0 }, @@ -3428,18 +3512,18 @@ const se = (e) => { _transmission: { value: 1 }, transmissionMap: { value: null } } - }), n.onBeforeCompile = (c) => { - Object.assign(c.uniforms, n.userData.uniforms), c.vertexShader = se(c.vertexShader), c.fragmentShader = c.fragmentShader.replace( + }), n.onBeforeCompile = (s) => { + Object.assign(s.uniforms, n.userData.uniforms), s.vertexShader = se(s.vertexShader), s.fragmentShader = s.fragmentShader.replace( "#include ", ` #include diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);` - ), v && (c.fragmentShader = c.fragmentShader.replace( + ), c && (s.fragmentShader = s.fragmentShader.replace( "#include ", ` #include roughnessFactor = usf_Roughness;` - )), c.fragmentShader = c.fragmentShader.replace( + )), s.fragmentShader = s.fragmentShader.replace( "void main() {", ` uniform vec3 uColor0; @@ -3459,81 +3543,81 @@ const se = (e) => { uniform float uSamples; float rand(float n){return fract(sin(n) * 43758.5453123);} - ${et} + ${nt} varying float vWobble; varying vec2 vPosition; void main(){ vec4 usf_DiffuseColor = vec4(1.0); - ${v ? "float usf_Roughness = roughness;" : ""} + ${c ? "float usf_Roughness = roughness;" : ""} float colorWobbleMix = smoothstep(-1.,1.,vWobble); vec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y)); usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); - ${v ? "usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);" : ""}` - ), m && (c.fragmentShader = c.fragmentShader.replace( + ${c ? "usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);" : ""}` + ), m && (s.fragmentShader = s.fragmentShader.replace( "#include ", - `${nt}` - ), c.fragmentShader = c.fragmentShader.replace( - "#include ", `${tt}` + ), s.fragmentShader = s.fragmentShader.replace( + "#include ", + `${rt}` )); }, n.needsUpdate = !0; - const s = new t.MeshDepthMaterial({ + const v = new t.MeshDepthMaterial({ depthPacking: t.RGBADepthPacking }); - return s.onBeforeCompile = (c) => { - Object.assign(c.uniforms, n.userData.uniforms), c.vertexShader = se(c.vertexShader); - }, s.needsUpdate = !0, { material: n, depthMaterial: s }; - }, [i, e]); + return v.onBeforeCompile = (s) => { + Object.assign(s.uniforms, n.userData.uniforms), s.vertexShader = se(s.vertexShader); + }, v.needsUpdate = !0, { material: n, depthMaterial: v }; + }, [u, e]); return { - material: a, + material: o, depthMaterial: r }; -}, ot = ({ +}, at = ({ scene: e = !1, - geometry: i, - baseMaterial: a, + geometry: u, + baseMaterial: o, materialParameters: r }) => { - const n = g(() => { - let o = i || new t.IcosahedronGeometry(2, 50); - return o = Jn(o), o.computeTangents(), o; - }, [i]), { material: v, depthMaterial: m } = rt({ - baseMaterial: a, + const n = h(() => { + let i = u || new t.IcosahedronGeometry(2, 50); + return i = et(i), i.computeTangents(), i; + }, [u]), { material: c, depthMaterial: m } = ot({ + baseMaterial: o, materialParameters: r - }), s = I(e, n, v, t.Mesh); + }), v = I(e, n, c, t.Mesh); return [ - M( - (o, l) => { - const x = v.userData; - o && u( - x, + b( + (i, l) => { + const g = c.userData; + i && a( + g, "uTime", - (l == null ? void 0 : l.beat) || o.clock.getElapsedTime() - ), l !== void 0 && (u(x, "uWobbleStrength", l.wobbleStrength), u( - x, + (l == null ? void 0 : l.beat) || i.clock.getElapsedTime() + ), l !== void 0 && (a(g, "uWobbleStrength", l.wobbleStrength), a( + g, "uWobblePositionFrequency", l.wobblePositionFrequency - ), u( - x, + ), a( + g, "uWobbleTimeFrequency", l.wobbleTimeFrequency - ), u(x, "uWarpStrength", l.warpStrength), u( - x, + ), a(g, "uWarpStrength", l.warpStrength), a( + g, "uWarpPositionFrequency", l.warpPositionFrequency - ), u(x, "uWarpTimeFrequency", l.warpTimeFrequency), u(x, "uWobbleShine", l.wobbleShine), u(x, "uSamples", l.samples), u(x, "uColor0", l.color0), u(x, "uColor1", l.color1), u(x, "uColor2", l.color2), u(x, "uColor3", l.color3), u(x, "uColorMix", l.colorMix), u( - x, + ), a(g, "uWarpTimeFrequency", l.warpTimeFrequency), a(g, "uWobbleShine", l.wobbleShine), a(g, "uSamples", l.samples), a(g, "uColor0", l.color0), a(g, "uColor1", l.color1), a(g, "uColor2", l.color2), a(g, "uColor3", l.color3), a(g, "uColorMix", l.colorMix), a( + g, "uChromaticAberration", l.chromaticAberration - ), u(x, "uAnisotropicBlur", l.anisotropicBlur), u(x, "uDistortion", l.distortion), u(x, "uDistortionScale", l.distortionScale), u(x, "uTemporalDistortion", l.temporalDistortion)); + ), a(g, "uAnisotropicBlur", l.anisotropicBlur), a(g, "uDistortion", l.distortion), a(g, "uDistortionScale", l.distortionScale), a(g, "uTemporalDistortion", l.temporalDistortion)); }, - [v] + [c] ), { - mesh: s, + mesh: v, depthMaterial: m } ]; @@ -3557,57 +3641,57 @@ const se = (e) => { distortion: 0.1, distortionScale: 0.1, temporalDistortion: 0.1 -}), Bt = ({ +}), Ot = ({ size: e, - dpr: i, - samples: a = 0, + dpr: u, + samples: o = 0, camera: r, geometry: n, - baseMaterial: v, + baseMaterial: c, materialParameters: m }) => { - const s = g(() => new t.Scene(), []), [c, { mesh: o, depthMaterial: l }] = ot({ - baseMaterial: v, + const v = h(() => new t.Scene(), []), [s, { mesh: i, depthMaterial: l }] = at({ + baseMaterial: c, materialParameters: m, - scene: s, + scene: v, geometry: n - }), [x, f] = R({ - scene: s, + }), [g, f] = A({ + scene: v, camera: r, size: e, - dpr: i, - samples: a, + dpr: u, + samples: o, depthBuffer: !0 - }), d = M( - (h, b) => (c(h, b), f(h.gl)), - [f, c] - ), p = M( - (h) => { - c(null, h); + }), d = b( + (p, M) => (s(p, M), f(p.gl)), + [f, s] + ), x = b( + (p) => { + s(null, p); }, - [c] + [s] ); return [ d, - p, + x, { - scene: s, - mesh: o, + scene: v, + mesh: i, depthMaterial: l, - renderTarget: x, - output: x.texture + renderTarget: g, + output: g.texture } ]; -}, Ot = (e, i, a) => { - const r = g( - () => new t.Mesh(i, a), - [i, a] +}, Lt = (e, u, o) => { + const r = h( + () => new t.Mesh(u, o), + [u, o] ); return F(() => { e.add(r); }, [e, r]), F(() => () => { - e.remove(r), i.dispose(), a.dispose(); - }, [e, i, a, r]), r; + e.remove(r), u.dispose(), o.dispose(); + }, [e, u, o, r]), r; }, X = Object.freeze({ easeInSine(e) { return 1 - Math.cos(e * Math.PI / 2); @@ -3679,20 +3763,20 @@ const se = (e) => { return 1 + 2.70158 * Math.pow(e - 1, 3) + 1.70158 * Math.pow(e - 1, 2); }, easeInOutBack(e) { - const a = 2.5949095; - return e < 0.5 ? Math.pow(2 * e, 2) * ((a + 1) * 2 * e - a) / 2 : (Math.pow(2 * e - 2, 2) * ((a + 1) * (e * 2 - 2) + a) + 2) / 2; + const o = 2.5949095; + return e < 0.5 ? Math.pow(2 * e, 2) * ((o + 1) * 2 * e - o) / 2 : (Math.pow(2 * e - 2, 2) * ((o + 1) * (e * 2 - 2) + o) + 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); + const u = 2 * Math.PI / 3; + return e === 0 ? 0 : e === 1 ? 1 : -Math.pow(2, 10 * e - 10) * Math.sin((e * 10 - 10.75) * u); }, easeOutElastic(e) { - const i = 2 * Math.PI / 3; - return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e * 10 - 0.75) * i) + 1; + const u = 2 * Math.PI / 3; + return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e * 10 - 0.75) * u) + 1; }, easeInOutElastic(e) { - const i = 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) * i)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * i) / 2 + 1; + const u = 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) * u)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * u) / 2 + 1; }, easeInBounce(e) { return 1 - X.easeOutBounce(1 - e); @@ -3704,47 +3788,47 @@ const se = (e) => { return e < 0.5 ? (1 - X.easeOutBounce(1 - 2 * e)) / 2 : (1 + X.easeOutBounce(2 * e - 1)) / 2; } }); -function at(e) { - let i = Math.sin(e * 12.9898) * 43758.5453; - return i - Math.floor(i); +function it(e) { + let u = Math.sin(e * 12.9898) * 43758.5453; + return u - Math.floor(u); } -const Lt = (e, i = "easeOutQuart") => { - const a = e / 60, r = X[i]; - return M( - (v) => { - let m = v.getElapsedTime() * a; - const s = Math.floor(m), c = r(m - s); - m = c + s; - const o = at(s); +const Wt = (e, u = "easeOutQuart") => { + const o = e / 60, r = X[u]; + return b( + (c) => { + let m = c.getElapsedTime() * o; + const v = Math.floor(m), s = r(m - v); + m = s + v; + const i = it(v); return { beat: m, - floor: s, - fract: c, - hash: o + floor: v, + fract: s, + hash: i }; }, - [a, r] + [o, r] ); -}, Wt = (e = 60) => { - const i = g(() => 1 / Math.max(Math.min(e, 60), 1), [e]), a = D(null); - return M( +}, Et = (e = 60) => { + const u = h(() => 1 / Math.max(Math.min(e, 60), 1), [e]), o = D(null); + return b( (n) => { - const v = n.getElapsedTime(); - return a.current === null || v - a.current >= i ? (a.current = v, !0) : !1; + const c = n.getElapsedTime(); + return o.current === null || c - o.current >= u ? (o.current = c, !0) : !1; }, - [i] + [u] ); -}, it = (e) => { +}, ut = (e) => { var r, n; - const i = (r = e.dom) == null ? void 0 : r.length, a = (n = e.texture) == null ? void 0 : n.length; - return !i || !a || i !== a; + const u = (r = e.dom) == null ? void 0 : r.length, o = (n = e.texture) == null ? void 0 : n.length; + return !u || !o || u !== o; }; -var ut = `varying vec2 vUv; +var st = `varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`, st = `precision highp float; +}`, lt = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -3788,19 +3872,19 @@ void main() { gl_FragColor = vec4(textureColor, alpha); }`; -const lt = ({ +const ct = ({ params: e, - size: i, - scene: a + size: u, + scene: o }) => { - a.children.length > 0 && (a.children.forEach((r) => { + o.children.length > 0 && (o.children.forEach((r) => { r instanceof t.Mesh && (r.geometry.dispose(), r.material.dispose()); - }), a.remove(...a.children)), e.texture.forEach((r, n) => { - const v = new t.Mesh( + }), o.remove(...o.children)), e.texture.forEach((r, n) => { + const c = new t.Mesh( new t.PlaneGeometry(1, 1), new t.ShaderMaterial({ - vertexShader: ut, - fragmentShader: st, + vertexShader: st, + fragmentShader: lt, transparent: !0, uniforms: { u_texture: { value: r }, @@ -3814,157 +3898,157 @@ const lt = ({ } }) ); - a.add(v); + o.add(c); }); -}, ct = () => { - const e = D([]), i = D([]); - return M( +}, vt = () => { + const e = D([]), u = D([]); + return b( ({ isIntersectingRef: r, isIntersectingOnceRef: n, - params: v + params: c }) => { - e.current.length > 0 && e.current.forEach((s, c) => { - s.unobserve(i.current[c]); - }), i.current = [], e.current = []; - const m = new Array(v.dom.length).fill(!1); - r.current = [...m], n.current = [...m], v.dom.forEach((s, c) => { - const o = (x) => { - x.forEach((f) => { - v.onIntersect[c] && v.onIntersect[c](f), r.current[c] = f.isIntersecting; + e.current.length > 0 && e.current.forEach((v, s) => { + v.unobserve(u.current[s]); + }), u.current = [], e.current = []; + const m = new Array(c.dom.length).fill(!1); + r.current = [...m], n.current = [...m], c.dom.forEach((v, s) => { + const i = (g) => { + g.forEach((f) => { + c.onIntersect[s] && c.onIntersect[s](f), r.current[s] = f.isIntersecting; }); - }, l = new IntersectionObserver(o, { + }, l = new IntersectionObserver(i, { rootMargin: "0px", threshold: 0 }); - l.observe(s), e.current.push(l), i.current.push(s); + l.observe(v), e.current.push(l), u.current.push(v); }); }, [] ); -}, vt = () => { - const e = D([]), i = M( - ({ params: a, size: r, resolutionRef: n, scene: v, isIntersectingRef: m }) => { - v.children.length !== e.current.length && (e.current = new Array(v.children.length)), v.children.forEach((s, c) => { - var x, f, d, p, h, b; - const o = a.dom[c]; - if (!o) +}, mt = () => { + const e = D([]), u = b( + ({ params: o, size: r, resolutionRef: n, scene: c, isIntersectingRef: m }) => { + c.children.length !== e.current.length && (e.current = new Array(c.children.length)), c.children.forEach((v, s) => { + var g, f, d, x, p, M; + const i = o.dom[s]; + if (!i) return; - const l = o.getBoundingClientRect(); - if (e.current[c] = l, s.scale.set(l.width, l.height, 1), s.position.set( + const l = i.getBoundingClientRect(); + if (e.current[s] = l, v.scale.set(l.width, l.height, 1), v.position.set( l.left + l.width * 0.5 - r.width * 0.5, -l.top - l.height * 0.5 + r.height * 0.5, 0 - ), m.current[c] && (a.rotation[c] && s.rotation.copy(a.rotation[c]), s instanceof t.Mesh)) { - const y = s.material; - u(y, "u_texture", a.texture[c]), u(y, "u_textureResolution", [ - ((d = (f = (x = a.texture[c]) == null ? void 0 : x.source) == null ? void 0 : f.data) == null ? void 0 : d.width) || 0, - ((b = (h = (p = a.texture[c]) == null ? void 0 : p.source) == null ? void 0 : h.data) == null ? void 0 : b.height) || 0 - ]), u( + ), m.current[s] && (o.rotation[s] && v.rotation.copy(o.rotation[s]), v instanceof t.Mesh)) { + const y = v.material; + a(y, "u_texture", o.texture[s]), a(y, "u_textureResolution", [ + ((d = (f = (g = o.texture[s]) == null ? void 0 : g.source) == null ? void 0 : f.data) == null ? void 0 : d.width) || 0, + ((M = (p = (x = o.texture[s]) == null ? void 0 : x.source) == null ? void 0 : p.data) == null ? void 0 : M.height) || 0 + ]), a( y, "u_resolution", n.current.set(l.width, l.height) - ), u( + ), a( y, "u_borderRadius", - a.boderRadius[c] ? a.boderRadius[c] : 0 + o.boderRadius[s] ? o.boderRadius[s] : 0 ); } }); }, [] ); - return [e.current, i]; -}, mt = () => { - const e = D([]), i = D([]), a = M((r, n = !1) => { - e.current.forEach((m, s) => { - m && (i.current[s] = !0); + return [e.current, u]; +}, ft = () => { + const e = D([]), u = D([]), o = b((r, n = !1) => { + e.current.forEach((m, v) => { + m && (u.current[v] = !0); }); - const v = n ? [...i.current] : [...e.current]; - return r < 0 ? v : v[r]; + const c = n ? [...u.current] : [...e.current]; + return r < 0 ? c : c[r]; }, []); return { isIntersectingRef: e, - isIntersectingOnceRef: i, - isIntersecting: a + isIntersectingOnceRef: u, + isIntersecting: o }; -}, pt = (e) => ({ onView: a, onHidden: r }) => { +}, pt = (e) => ({ onView: o, onHidden: r }) => { const n = D(!1); F(() => { - let v; + let c; const m = () => { - e.current.some((s) => s) ? n.current || (a && a(), n.current = !0) : n.current && (r && r(), n.current = !1), v = requestAnimationFrame(m); + e.current.some((v) => v) ? n.current || (o && o(), n.current = !0) : n.current && (r && r(), n.current = !1), c = requestAnimationFrame(m); }; - return v = requestAnimationFrame(m), () => { - cancelAnimationFrame(v); + return c = requestAnimationFrame(m), () => { + cancelAnimationFrame(c); }; - }, [a, r]); -}, ft = { + }, [o, r]); +}, dt = { texture: [], dom: [], boderRadius: [], rotation: [], onIntersect: [] -}, Et = ({ size: e, dpr: i, samples: a = 0 }, r = []) => { - const n = g(() => new t.Scene(), []), v = A(e), [m, s] = R({ +}, $t = ({ size: e, dpr: u, samples: o = 0 }, r = []) => { + const n = h(() => new t.Scene(), []), c = z(e), [m, v] = A({ scene: n, - camera: v, + camera: c, size: e, - dpr: i, - samples: a, + dpr: u, + samples: o, isSizeUpdate: !0 - }), [c, o] = V({ - ...ft, + }), [s, i] = V({ + ...dt, updateKey: performance.now() - }), [l, x] = vt(), f = D(new t.Vector2(0, 0)), [d, p] = de(!0); + }), [l, g] = mt(), f = D(new t.Vector2(0, 0)), [d, x] = de(!0); F(() => { - p(!0); + x(!0); }, r); - const h = D(null), b = g(() => new t.Texture(), []), y = ct(), { isIntersectingOnceRef: w, isIntersectingRef: C, isIntersecting: T } = mt(), P = pt(C); + const p = D(null), M = h(() => new t.Texture(), []), y = vt(), { isIntersectingOnceRef: w, isIntersectingRef: C, isIntersecting: T } = ft(), P = pt(C); return [ - M( - (_, B) => { + b( + (_, O) => { const { gl: E, size: W } = _; - if (B && o(B), it(c)) - return b; + if (O && i(O), ut(s)) + return M; if (d) { - if (h.current === c.updateKey) - return b; - h.current = c.updateKey; + if (p.current === s.updateKey) + return M; + p.current = s.updateKey; } - return d && (lt({ - params: c, + return d && (ct({ + params: s, size: W, scene: n }), y({ isIntersectingRef: C, isIntersectingOnceRef: w, - params: c - }), p(!1)), x({ - params: c, + params: s + }), x(!1)), g({ + params: s, size: W, resolutionRef: f, scene: n, isIntersectingRef: C - }), s(E); + }), v(E); }, [ - s, - o, + v, + i, y, - x, + g, d, n, - c, + s, w, C, - b + M ] ), - o, + i, { scene: n, - camera: v, + camera: c, renderTarget: m, output: m.texture, isIntersecting: T, @@ -3973,115 +4057,115 @@ const lt = ({ useDomView: P } ]; -}, $t = ({ +}, qt = ({ scene: e, - camera: i, - size: a, + camera: u, + size: o, dpr: r = !1, isSizeUpdate: n = !1, - samples: v = 0, + samples: c = 0, depthBuffer: m = !1, - depthTexture: s = !1 -}, c) => { - const o = D([]), l = $(a, r); - o.current = g(() => Array.from({ length: c }, () => { + depthTexture: v = !1 +}, s) => { + const i = D([]), l = $(o, r); + i.current = h(() => Array.from({ length: s }, () => { const f = new t.WebGLRenderTarget( l.x, l.y, { ...Y, - samples: v, + samples: c, depthBuffer: m } ); - return s && (f.depthTexture = new t.DepthTexture( + return v && (f.depthTexture = new t.DepthTexture( l.x, l.y, t.FloatType )), f; - }), [c]), J(() => { - n && o.current.forEach( + }), [s]), J(() => { + n && i.current.forEach( (f) => f.setSize(l.x, l.y) ); }, [l, n]), F(() => { - const f = o.current; + const f = i.current; return () => { f.forEach((d) => d.dispose()); }; - }, [c]); - const x = M( - (f, d, p) => { - const h = o.current[d]; + }, [s]); + const g = b( + (f, d, x) => { + const p = i.current[d]; return ne({ gl: f, scene: e, - camera: i, - fbo: h, - onBeforeRender: () => p && p({ read: h.texture }) - }), h.texture; + camera: u, + fbo: p, + onBeforeRender: () => x && x({ read: p.texture }) + }), p.texture; }, - [e, i] + [e, u] ); - return [o.current, x]; + return [i.current, g]; }; export { Rn as ALPHABLENDING_PARAMS, - pn as BLENDING_PARAMS, - bn as BRIGHTNESSPICKER_PARAMS, + fn as BLENDING_PARAMS, + Mn as BRIGHTNESSPICKER_PARAMS, we as BRUSH_PARAMS, Kn as CHROMAKEY_PARAMS, He as COLORSTRATA_PARAMS, on as COSPALETTE_PARAMS, On as COVERTEXTURE_PARAMS, - ft as DOMSYNCER_PARAMS, + dt as DOMSYNCER_PARAMS, ln as DUOTONE_PARAMS, X as Easing, Y as FBO_OPTION, Ee as FLUID_PARAMS, Tn as FXBLENDING_PARAMS, - gn as FXTEXTURE_PARAMS, - Vn as HSV_PARAMS, + xn as FXTEXTURE_PARAMS, + zn as HSV_PARAMS, en as MARBLE_PARAMS, - O as MORPHPARTICLES_PARAMS, + R as MORPHPARTICLES_PARAMS, Ge as NOISE_PARAMS, qe as RIPPLE_PARAMS, le as SIMPLEBLUR_PARAMS, k as WAVE_PARAMS, U as WOBBLE3D_PARAMS, ne as renderFBO, - u as setUniform, - Ot as useAddMesh, - Rt as useAlphaBlending, - Lt as useBeat, - Tt as useBlending, - Pt as useBrightnessPicker, - gt as useBrush, - A as useCamera, + a as setUniform, + Lt as useAddMesh, + At as useAlphaBlending, + Wt as useBeat, + Ct as useBlending, + Dt as useBrightnessPicker, + ht as useBrush, + z as useCamera, Ut as useChromaKey, bt as useColorStrata, - $t as useCopyTexture, - St as useCosPalette, + qt as useCopyTexture, + _t as useCosPalette, Ft as useCoverTexture, - Zn as useCreateMorphParticles, - ot as useCreateWobble3D, - Et as useDomSyncer, + Jn as useCreateMorphParticles, + at as useCreateWobble3D, + $t as useDomSyncer, G as useDoubleFBO, - _t as useDuoTone, - Wt as useFPSLimiter, - ht as useFluid, - Dt as useFxBlending, - Ct as useFxTexture, + Tt as useDuoTone, + Et as useFPSLimiter, + yt as useFluid, + Rt as useFxBlending, + Pt as useFxTexture, It as useHSV, - Mt as useMarble, - zt as useMorphParticles, - wt as useNoise, + St as useMarble, + Bt as useMorphParticles, + Mt as useNoise, V as useParams, ee as usePointer, $ as useResolution, - yt as useRipple, - At as useSimpleBlur, - R as useSingleFBO, + wt as useRipple, + zt as useSimpleBlur, + A as useSingleFBO, Vt as useWave, - Bt as useWobble3D + Ot 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 dc95627c..bb4bd387 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/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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\n\n#usf \n\n#usf \n\n#usf \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// 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\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\tgl_PointSize = uPointSize * vPictureAlpha * uResolution.y;\n\tgl_PointSize *= (1.0 / - viewPosition.z);\n}","precision highp float;\nprecision highp int;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\n\nuniform float uBlurAlpha;\nuniform float uBlurRadius;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform sampler2D uAlphaMap;\nuniform bool uIsAlphaMap;\nuniform float uDisplacementColorIntensity;\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\n\tvec3 finalColor = uIsMap ? texture2D(uMap,uv).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);\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}\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\";\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\";\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 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 };\n}\n\nexport const useMaterial = ({\n size,\n dpr,\n geometry,\n positions,\n uvs,\n}: {\n size: Size;\n dpr: number;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\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 const rewritedShader = 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 return new THREE.ShaderMaterial({\n vertexShader: rewritedShader,\n fragmentShader,\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 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 },\n });\n }, [geometry, modifiedPositions, modifiedUvs]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\n /** default : THREE.SphereGeometry(1, 32, 32) */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n};\n\ntype UpdateUniform = (\n props: RootState | null,\n params?: MorphParticlesParams\n) => void;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\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,\n geometry: morphGeometry,\n positions,\n uvs,\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 if (params.picture) {\n setUniform(material, \"uPicture\", params.picture);\n setUniform(material, \"uIsPicture\", true);\n } else {\n setUniform(material, \"uIsPicture\", false);\n }\n if (params.alphaPicture) {\n setUniform(material, \"uAlphaPicture\", params.alphaPicture);\n setUniform(material, \"uIsAlphaPicture\", true);\n } else {\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 {\n setUniform(material, \"uIsMap\", false);\n }\n if (params.alphaMap) {\n setUniform(material, \"uAlphaMap\", params.alphaMap);\n setUniform(material, \"uIsAlphaMap\", true);\n } else {\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 {\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 },\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\";\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 /** 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 is 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 is false. */\n alphaMap?: THREE.Texture | false;\n /** `If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: 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 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 /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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.5,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","useMaterial","positions","uvs","modifiedPositions","modifiedUvs","rewritedShader","getWobble","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","object","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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RA,IAAAO,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,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;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","x_google_ignoreList":[105]} \ 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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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\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 = \"\";\n if (mapArray && mapArray.length > 0) {\n textureSwitcherCode += \"if (false) {}\"; // Dummy conditions for initialisation.\n mapArray.forEach((map, index) => {\n textureSwitcherCode += ` else if (vMapArrayIndex == ${index}.0) {\\n`;\n textureSwitcherCode += ` mapArrayColor = texture2D(uMapArray${index}, uv);\\n`;\n textureSwitcherCode += `}`;\n mapArrayShader += `\n \t\t\tuniform sampler2D uMapArray${index};\n \t\t`;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \" else {\\n\";\n textureSwitcherCode += \" mapArrayColor = vec4(1.0);\\n\";\n textureSwitcherCode += \"}\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"mapArrayColor = vec4(1.0);\\n\";\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\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;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\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\";\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 is 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 is 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: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","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","object","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":[106]} \ 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 1b12b2f3..a4ab33eb 100644 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs @@ -1,4 +1,4 @@ -(function(x,k){typeof exports=="object"&&typeof module<"u"?k(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],k):(x=typeof globalThis<"u"?globalThis:x||self,k(x["use-shader-fx"]={},x.THREE,x.React))})(this,function(x,k,l){"use strict";function De(e){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(i,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return i.default=e,Object.freeze(i)}const t=De(k);var Re=`varying vec2 vUv; +(function(y,$){typeof exports=="object"&&typeof module<"u"?$(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],$):(y=typeof globalThis<"u"?globalThis:y||self,$(y["use-shader-fx"]={},y.THREE,y.React))})(this,function(y,$,l){"use strict";function Re(e){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(a,o,r.get?r:{enumerable:!0,get:()=>e[o]})}}return a.default=e,Object.freeze(a)}const t=Re($);var De=`varying vec2 vUv; void main() { vUv = uv; @@ -112,7 +112,7 @@ void main() { vec4 finalColor = mix(bufferColor, brushColor, isOnLine); gl_FragColor = finalColor; -}`;const E=(e,i=!1)=>{const r=i?e.width*i:e.width,o=i?e.height*i:e.height;return l.useMemo(()=>new t.Vector2(r,o),[r,o])},u=(e,i,r)=>{r!==void 0&&e.uniforms&&e.uniforms[i]&&r!==null&&(e.uniforms[i].value=r)},R=(e,i,r,o)=>{const n=l.useMemo(()=>new o(i,r),[i,r,o]);return l.useEffect(()=>{e&&e.add(n)},[e,n]),l.useEffect(()=>()=>{e&&e.remove(n),i.dispose(),r.dispose()},[e,i,r,n]),n},Ie=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:Re,fragmentShader:Ae}),[]),m=E(i,r);l.useEffect(()=>{u(n,"uResolution",m.clone())},[m,n]);const f=R(e,o,n,t.Mesh);return{material:n,mesh:f}},Fe=(e,i)=>{const r=i,o=e/i,[n,m]=[r*o/2,r/2];return{width:n,height:m,near:-1e3,far:1e3}},A=(e,i="OrthographicCamera")=>{const r=E(e),{width:o,height:n,near:m,far:f}=Fe(r.x,r.y);return l.useMemo(()=>i==="OrthographicCamera"?new t.OrthographicCamera(-o,o,n,-n,m,f):new t.PerspectiveCamera(50,o/n),[o,n,m,f,i])},X=(e=0)=>{const i=l.useRef(new t.Vector2(0,0)),r=l.useRef(new t.Vector2(0,0)),o=l.useRef(new t.Vector2(0,0)),n=l.useRef(0),m=l.useRef(new t.Vector2(0,0)),f=l.useRef(!1);return l.useCallback(v=>{const a=performance.now();let c;f.current&&e?(o.current=o.current.lerp(v,1-e),c=o.current.clone()):(c=v.clone(),o.current=c),n.current===0&&(n.current=a,i.current=c);const h=Math.max(1,a-n.current);n.current=a,m.current.copy(c).sub(i.current).divideScalar(h);const d=m.current.length()>0,g=f.current?i.current.clone():c;return!f.current&&d&&(f.current=!0),i.current=c,{currentPointer:c,prevPointer:g,diffPointer:r.current.subVectors(c,g),velocity:m.current,isVelocityUpdate:d}},[e])},I=e=>{const i=n=>Object.values(n).some(m=>typeof m=="function"),r=l.useRef(i(e)?e:structuredClone(e)),o=l.useCallback(n=>{for(const m in n){const f=m;f in r.current&&n[f]!==void 0&&n[f]!==null?r.current[f]=n[f]:console.error(`"${String(f)}" does not exist in the params. or "${String(f)}" is null | undefined`)}},[]);return[r.current,o]},G={minFilter:t.LinearFilter,magFilter:t.LinearFilter,type:t.HalfFloatType,stencilBuffer:!1},H=({gl:e,fbo:i,scene:r,camera:o,onBeforeRender:n,onSwap:m})=>{e.setRenderTarget(i),n(),e.clear(),e.render(r,o),m&&m(),e.setRenderTarget(null),e.clear()},D=({scene:e,camera:i,size:r,dpr:o=!1,isSizeUpdate:n=!1,samples:m=0,depthBuffer:f=!1,depthTexture:s=!1})=>{const v=l.useRef(),a=E(r,o);v.current=l.useMemo(()=>{const h=new t.WebGLRenderTarget(a.x,a.y,{...G,samples:m,depthBuffer:f});return s&&(h.depthTexture=new t.DepthTexture(a.x,a.y,t.FloatType)),h},[]),l.useLayoutEffect(()=>{var h;n&&((h=v.current)==null||h.setSize(a.x,a.y))},[a,n]),l.useEffect(()=>{const h=v.current;return()=>{h==null||h.dispose()}},[]);const c=l.useCallback((h,d)=>{const g=v.current;return H({gl:h,fbo:g,scene:e,camera:i,onBeforeRender:()=>d&&d({read:g.texture})}),g.texture},[e,i]);return[v.current,c]},q=({scene:e,camera:i,size:r,dpr:o=!1,isSizeUpdate:n=!1,samples:m=0,depthBuffer:f=!1,depthTexture:s=!1})=>{const v=l.useRef({read:null,write:null,swap:function(){let d=this.read;this.read=this.write,this.write=d}}),a=E(r,o),c=l.useMemo(()=>{const d=new t.WebGLRenderTarget(a.x,a.y,{...G,samples:m,depthBuffer:f}),g=new t.WebGLRenderTarget(a.x,a.y,{...G,samples:m,depthBuffer:f});return s&&(d.depthTexture=new t.DepthTexture(a.x,a.y,t.FloatType),g.depthTexture=new t.DepthTexture(a.x,a.y,t.FloatType)),{read:d,write:g}},[]);v.current.read=c.read,v.current.write=c.write,l.useLayoutEffect(()=>{var d,g;n&&((d=v.current.read)==null||d.setSize(a.x,a.y),(g=v.current.write)==null||g.setSize(a.x,a.y))},[a,n]),l.useEffect(()=>{const d=v.current;return()=>{var g,p;(g=d.read)==null||g.dispose(),(p=d.write)==null||p.dispose()}},[]);const h=l.useCallback((d,g)=>{var y;const p=v.current;return H({gl:d,scene:e,camera:i,fbo:p.write,onBeforeRender:()=>g&&g({read:p.read.texture,write:p.write.texture}),onSwap:()=>p.swap()}),(y=p.read)==null?void 0:y.texture},[e,i]);return[{read:v.current.read,write:v.current.write},h]},ne=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}),Ue=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Ie({scene:o,size:e,dpr:i}),f=A(e),s=X(),[v,a]=q({scene:o,camera:f,size:e,dpr:i,samples:r}),[c,h]=I(ne),d=l.useRef(null);return[l.useCallback((p,y)=>{const{gl:w,pointer:M}=p;y&&h(y),c.texture?(u(n,"uIsTexture",!0),u(n,"uTexture",c.texture)):u(n,"uIsTexture",!1),c.map?(u(n,"uIsMap",!0),u(n,"uMap",c.map),u(n,"uMapIntensity",c.mapIntensity)):u(n,"uIsMap",!1),u(n,"uRadius",c.radius),u(n,"uSmudge",c.smudge),u(n,"uDissipation",c.dissipation),u(n,"uMotionBlur",c.motionBlur),u(n,"uMotionSample",c.motionSample);const b=c.pointerValues||s(M);b.isVelocityUpdate&&(u(n,"uMouse",b.currentPointer),u(n,"uPrevMouse",b.prevPointer)),u(n,"uVelocity",b.velocity);const T=typeof c.color=="function"?c.color(b.velocity):c.color;return u(n,"uColor",T),u(n,"uIsCursor",c.isCursor),u(n,"uPressureEnd",c.pressure),d.current===null&&(d.current=c.pressure),u(n,"uPressureStart",d.current),d.current=c.pressure,a(w,({read:C})=>{u(n,"uBuffer",C)})},[n,s,a,c,h]),h,{scene:o,mesh:m,material:n,camera:f,renderTarget:v,output:v.read.texture}]};var W=`varying vec2 vUv; +}`;const E=(e,a=!1)=>{const o=a?e.width*a:e.width,r=a?e.height*a:e.height;return l.useMemo(()=>new t.Vector2(o,r),[o,r])},i=(e,a,o)=>{o!==void 0&&e.uniforms&&e.uniforms[a]&&o!==null&&(e.uniforms[a].value=o)},A=(e,a,o,r)=>{const n=l.useMemo(()=>new r(a,o),[a,o,r]);return l.useEffect(()=>{e&&e.add(n)},[e,n]),l.useEffect(()=>()=>{e&&e.remove(n),a.dispose(),o.dispose()},[e,a,o,n]),n},Ie=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:De,fragmentShader:Ae}),[]),v=E(a,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},Fe=(e,a)=>{const o=a,r=e/a,[n,v]=[o*r/2,o/2];return{width:n,height:v,near:-1e3,far:1e3}},I=(e,a="OrthographicCamera")=>{const o=E(e),{width:r,height:n,near:v,far:f}=Fe(o.x,o.y);return l.useMemo(()=>a==="OrthographicCamera"?new t.OrthographicCamera(-r,r,n,-n,v,f):new t.PerspectiveCamera(50,r/n),[r,n,v,f,a])},X=(e=0)=>{const a=l.useRef(new t.Vector2(0,0)),o=l.useRef(new t.Vector2(0,0)),r=l.useRef(new t.Vector2(0,0)),n=l.useRef(0),v=l.useRef(new t.Vector2(0,0)),f=l.useRef(!1);return l.useCallback(s=>{const u=performance.now();let c;f.current&&e?(r.current=r.current.lerp(s,1-e),c=r.current.clone()):(c=s.clone(),r.current=c),n.current===0&&(n.current=u,a.current=c);const h=Math.max(1,u-n.current);n.current=u,v.current.copy(c).sub(a.current).divideScalar(h);const p=v.current.length()>0,g=f.current?a.current.clone():c;return!f.current&&p&&(f.current=!0),a.current=c,{currentPointer:c,prevPointer:g,diffPointer:o.current.subVectors(c,g),velocity:v.current,isVelocityUpdate:p}},[e])},F=e=>{const a=n=>Object.values(n).some(v=>typeof v=="function"),o=l.useRef(a(e)?e:structuredClone(e)),r=l.useCallback(n=>{for(const v in n){const f=v;f in o.current&&n[f]!==void 0&&n[f]!==null?o.current[f]=n[f]:console.error(`"${String(f)}" does not exist in the params. or "${String(f)}" is null | undefined`)}},[]);return[o.current,r]},G={minFilter:t.LinearFilter,magFilter:t.LinearFilter,type:t.HalfFloatType,stencilBuffer:!1},H=({gl:e,fbo:a,scene:o,camera:r,onBeforeRender:n,onSwap:v})=>{e.setRenderTarget(a),n(),e.clear(),e.render(o,r),v&&v(),e.setRenderTarget(null),e.clear()},D=({scene:e,camera:a,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1})=>{const s=l.useRef(),u=E(o,r);s.current=l.useMemo(()=>{const h=new t.WebGLRenderTarget(u.x,u.y,{...G,samples:v,depthBuffer:f});return m&&(h.depthTexture=new t.DepthTexture(u.x,u.y,t.FloatType)),h},[]),l.useLayoutEffect(()=>{var h;n&&((h=s.current)==null||h.setSize(u.x,u.y))},[u,n]),l.useEffect(()=>{const h=s.current;return()=>{h==null||h.dispose()}},[]);const c=l.useCallback((h,p)=>{const g=s.current;return H({gl:h,fbo:g,scene:e,camera:a,onBeforeRender:()=>p&&p({read:g.texture})}),g.texture},[e,a]);return[s.current,c]},q=({scene:e,camera:a,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1})=>{const s=l.useRef({read:null,write:null,swap:function(){let p=this.read;this.read=this.write,this.write=p}}),u=E(o,r),c=l.useMemo(()=>{const p=new t.WebGLRenderTarget(u.x,u.y,{...G,samples:v,depthBuffer:f}),g=new t.WebGLRenderTarget(u.x,u.y,{...G,samples:v,depthBuffer:f});return m&&(p.depthTexture=new t.DepthTexture(u.x,u.y,t.FloatType),g.depthTexture=new t.DepthTexture(u.x,u.y,t.FloatType)),{read:p,write:g}},[]);s.current.read=c.read,s.current.write=c.write,l.useLayoutEffect(()=>{var p,g;n&&((p=s.current.read)==null||p.setSize(u.x,u.y),(g=s.current.write)==null||g.setSize(u.x,u.y))},[u,n]),l.useEffect(()=>{const p=s.current;return()=>{var g,x;(g=p.read)==null||g.dispose(),(x=p.write)==null||x.dispose()}},[]);const h=l.useCallback((p,g)=>{var d;const x=s.current;return H({gl:p,scene:e,camera:a,fbo:x.write,onBeforeRender:()=>g&&g({read:x.read.texture,write:x.write.texture}),onSwap:()=>x.swap()}),(d=x.read)==null?void 0:d.texture},[e,a]);return[{read:s.current.read,write:s.current.write},h]},ne=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}),ze=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Ie({scene:r,size:e,dpr:a}),f=I(e),m=X(),[s,u]=q({scene:r,camera:f,size:e,dpr:a,samples:o}),[c,h]=F(ne),p=l.useRef(null);return[l.useCallback((x,d)=>{const{gl:w,pointer:M}=x;d&&h(d),c.texture?(i(n,"uIsTexture",!0),i(n,"uTexture",c.texture)):i(n,"uIsTexture",!1),c.map?(i(n,"uIsMap",!0),i(n,"uMap",c.map),i(n,"uMapIntensity",c.mapIntensity)):i(n,"uIsMap",!1),i(n,"uRadius",c.radius),i(n,"uSmudge",c.smudge),i(n,"uDissipation",c.dissipation),i(n,"uMotionBlur",c.motionBlur),i(n,"uMotionSample",c.motionSample);const b=c.pointerValues||m(M);b.isVelocityUpdate&&(i(n,"uMouse",b.currentPointer),i(n,"uPrevMouse",b.prevPointer)),i(n,"uVelocity",b.velocity);const T=typeof c.color=="function"?c.color(b.velocity):c.color;return i(n,"uColor",T),i(n,"uIsCursor",c.isCursor),i(n,"uPressureEnd",c.pressure),p.current===null&&(p.current=c.pressure),i(n,"uPressureStart",p.current),p.current=c.pressure,u(w,({read:C})=>{i(n,"uBuffer",C)})},[n,m,u,c,h]),h,{scene:r,mesh:v,material:n,camera:f,renderTarget:s,output:s.read.texture}]};var W=`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); -}`,Ve=`precision highp float; +}`,Ue=`precision highp float; void main(){ gl_FragColor = vec4(0.0); -}`;const Be=()=>l.useMemo(()=>new t.ShaderMaterial({vertexShader:W,fragmentShader:Ve,depthTest:!1,depthWrite:!1}),[]);var ze=`precision highp float; +}`;const Ve=()=>l.useMemo(()=>new t.ShaderMaterial({vertexShader:W,fragmentShader:Ue,depthTest:!1,depthWrite:!1}),[]);var Be=`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 Oe=()=>l.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:W,fragmentShader:ze}),[]);var Ee=`precision highp float; +}`;const Oe=()=>l.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:W,fragmentShader:Be}),[]);var Ee=`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 ke=()=>l.useMemo(()=>new t.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new t.Vector2}},vertexShader:W,fragmentShader:We}),[]);var $e=`precision highp float; +}`;const $e=()=>l.useMemo(()=>new t.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new t.Vector2}},vertexShader:W,fragmentShader:We}),[]);var ke=`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 qe=()=>l.useMemo(()=>new t.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new t.Vector2}},vertexShader:W,fragmentShader:$e}),[]);var je=`precision highp float; +}`;const qe=()=>l.useMemo(()=>new t.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new t.Vector2}},vertexShader:W,fragmentShader:ke}),[]);var je=`precision highp float; varying vec2 vUv; varying vec2 vT; @@ -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 Qe=()=>l.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:W,fragmentShader:Ye}),[]),Ze=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=Be(),m=n.clone(),f=qe(),s=Ne(),v=Oe(),a=Le(),c=ke(),h=Ke(),d=He(),g=Qe(),p=l.useMemo(()=>({vorticityMaterial:s,curlMaterial:f,advectionMaterial:v,divergenceMaterial:a,pressureMaterial:c,clearMaterial:h,gradientSubtractMaterial:d,splatMaterial:g}),[s,f,v,a,c,h,d,g]),y=E(i,r);l.useEffect(()=>{u(p.splatMaterial,"aspectRatio",y.x/y.y);for(const b of Object.values(p))u(b,"texelSize",new t.Vector2(1/y.x,1/y.y))},[y,p]);const w=R(e,o,n,t.Mesh);l.useEffect(()=>{n.dispose(),w.material=m},[n,w,m]),l.useEffect(()=>()=>{for(const b of Object.values(p))b.dispose()},[p]);const M=l.useCallback(b=>{w.material=b,w.material.needsUpdate=!0},[w]);return{materials:p,setMeshMaterial:M,mesh:w}},te=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}),Je=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{materials:n,setMeshMaterial:m,mesh:f}=Ze({scene:o,size:e,dpr:i}),s=A(e),v=X(),a=l.useMemo(()=>({scene:o,camera:s,size:e,samples:r}),[o,s,e,r]),[c,h]=q(a),[d,g]=q(a),[p,y]=D(a),[w,M]=D(a),[b,T]=q(a),C=l.useRef(0),P=l.useRef(new t.Vector2(0,0)),S=l.useRef(new t.Vector3(0,0,0)),[_,B]=I(te);return[l.useCallback((O,$)=>{const{gl:z,pointer:Z,clock:J,size:Ce}=O;$&&B($),C.current===0&&(C.current=J.getElapsedTime());const Te=Math.min((J.getElapsedTime()-C.current)/3,.02);C.current=J.getElapsedTime();const ee=h(z,({read:V})=>{m(n.advectionMaterial),u(n.advectionMaterial,"uVelocity",V),u(n.advectionMaterial,"uSource",V),u(n.advectionMaterial,"dt",Te),u(n.advectionMaterial,"dissipation",_.velocity_dissipation)}),Vt=g(z,({read:V})=>{m(n.advectionMaterial),u(n.advectionMaterial,"uVelocity",ee),u(n.advectionMaterial,"uSource",V),u(n.advectionMaterial,"dissipation",_.density_dissipation)}),Y=_.pointerValues||v(Z);Y.isVelocityUpdate&&(h(z,({read:V})=>{m(n.splatMaterial),u(n.splatMaterial,"uTarget",V),u(n.splatMaterial,"point",Y.currentPointer);const N=Y.diffPointer.multiply(P.current.set(Ce.width,Ce.height).multiplyScalar(_.velocity_acceleration));u(n.splatMaterial,"color",S.current.set(N.x,N.y,1)),u(n.splatMaterial,"radius",_.splat_radius)}),g(z,({read:V})=>{m(n.splatMaterial),u(n.splatMaterial,"uTarget",V);const N=typeof _.fluid_color=="function"?_.fluid_color(Y.velocity):_.fluid_color;u(n.splatMaterial,"color",N)}));const Bt=y(z,()=>{m(n.curlMaterial),u(n.curlMaterial,"uVelocity",ee)});h(z,({read:V})=>{m(n.vorticityMaterial),u(n.vorticityMaterial,"uVelocity",V),u(n.vorticityMaterial,"uCurl",Bt),u(n.vorticityMaterial,"curl",_.curl_strength),u(n.vorticityMaterial,"dt",Te)});const zt=M(z,()=>{m(n.divergenceMaterial),u(n.divergenceMaterial,"uVelocity",ee)});T(z,({read:V})=>{m(n.clearMaterial),u(n.clearMaterial,"uTexture",V),u(n.clearMaterial,"value",_.pressure_dissipation)}),m(n.pressureMaterial),u(n.pressureMaterial,"uDivergence",zt);let Pe;for(let V=0;V<_.pressure_iterations;V++)Pe=T(z,({read:N})=>{u(n.pressureMaterial,"uPressure",N)});return h(z,({read:V})=>{m(n.gradientSubtractMaterial),u(n.gradientSubtractMaterial,"uPressure",Pe),u(n.gradientSubtractMaterial,"uVelocity",V)}),Vt},[n,m,y,g,M,v,T,h,B,_]),B,{scene:o,mesh:f,materials:n,camera:s,renderTarget:{velocity:c,density:d,curl:p,divergence:w,pressure:b},output:d.read.texture}]},en=({scale:e,max:i,texture:r,scene:o})=>{const n=l.useRef([]),m=l.useMemo(()=>new t.PlaneGeometry(e,e),[e]),f=l.useMemo(()=>new t.MeshBasicMaterial({map:r,transparent:!0,blending:t.AdditiveBlending,depthTest:!1,depthWrite:!1}),[r]);return l.useEffect(()=>{for(let s=0;s()=>{n.current.forEach(s=>{s.geometry.dispose(),Array.isArray(s.material)?s.material.forEach(v=>v.dispose()):s.material.dispose(),o.remove(s)}),n.current=[]},[o]),n.current},oe=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),nn=({texture:e=new t.Texture,scale:i=64,max:r=100,size:o,dpr:n,samples:m=0})=>{const f=l.useMemo(()=>new t.Scene,[]),s=en({scale:i,max:r,texture:e,scene:f}),v=A(o),a=X(),[c,h]=D({scene:f,camera:v,size:o,dpr:n,samples:m}),[d,g]=I(oe),p=l.useRef(0);return[l.useCallback((w,M)=>{const{gl:b,pointer:T,size:C}=w;M&&g(M);const P=d.pointerValues||a(T);if(d.frequency{if(S.visible){const _=S.material;S.rotation.z+=d.rotation,_.opacity*=d.fadeout_speed,S.scale.x=d.fadeout_speed*S.scale.x+d.scale,S.scale.y=S.scale.x,_.opacity<.002&&(S.visible=!1)}}),h(b)},[h,s,a,r,d,g]),g,{scene:f,camera:v,meshArr:s,renderTarget:c,output:c.texture}]};var tn=`varying vec2 vUv; +}`;const Qe=()=>l.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:W,fragmentShader:Ye}),[]),Ze=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=Ve(),v=n.clone(),f=qe(),m=Ne(),s=Oe(),u=Le(),c=$e(),h=Ke(),p=He(),g=Qe(),x=l.useMemo(()=>({vorticityMaterial:m,curlMaterial:f,advectionMaterial:s,divergenceMaterial:u,pressureMaterial:c,clearMaterial:h,gradientSubtractMaterial:p,splatMaterial:g}),[m,f,s,u,c,h,p,g]),d=E(a,o);l.useEffect(()=>{i(x.splatMaterial,"aspectRatio",d.x/d.y);for(const b of Object.values(x))i(b,"texelSize",new t.Vector2(1/d.x,1/d.y))},[d,x]);const w=A(e,r,n,t.Mesh);l.useEffect(()=>{n.dispose(),w.material=v},[n,w,v]),l.useEffect(()=>()=>{for(const b of Object.values(x))b.dispose()},[x]);const M=l.useCallback(b=>{w.material=b,w.material.needsUpdate=!0},[w]);return{materials:x,setMeshMaterial:M,mesh:w}},te=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}),Je=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{materials:n,setMeshMaterial:v,mesh:f}=Ze({scene:r,size:e,dpr:a}),m=I(e),s=X(),u=l.useMemo(()=>({scene:r,camera:m,size:e,samples:o}),[r,m,e,o]),[c,h]=q(u),[p,g]=q(u),[x,d]=D(u),[w,M]=D(u),[b,T]=q(u),C=l.useRef(0),P=l.useRef(new t.Vector2(0,0)),S=l.useRef(new t.Vector3(0,0,0)),[_,V]=F(te);return[l.useCallback((O,k)=>{const{gl:B,pointer:Z,clock:J,size:Ce}=O;k&&V(k),C.current===0&&(C.current=J.getElapsedTime());const Te=Math.min((J.getElapsedTime()-C.current)/3,.02);C.current=J.getElapsedTime();const ee=h(B,({read:U})=>{v(n.advectionMaterial),i(n.advectionMaterial,"uVelocity",U),i(n.advectionMaterial,"uSource",U),i(n.advectionMaterial,"dt",Te),i(n.advectionMaterial,"dissipation",_.velocity_dissipation)}),Vt=g(B,({read:U})=>{v(n.advectionMaterial),i(n.advectionMaterial,"uVelocity",ee),i(n.advectionMaterial,"uSource",U),i(n.advectionMaterial,"dissipation",_.density_dissipation)}),Y=_.pointerValues||s(Z);Y.isVelocityUpdate&&(h(B,({read:U})=>{v(n.splatMaterial),i(n.splatMaterial,"uTarget",U),i(n.splatMaterial,"point",Y.currentPointer);const N=Y.diffPointer.multiply(P.current.set(Ce.width,Ce.height).multiplyScalar(_.velocity_acceleration));i(n.splatMaterial,"color",S.current.set(N.x,N.y,1)),i(n.splatMaterial,"radius",_.splat_radius)}),g(B,({read:U})=>{v(n.splatMaterial),i(n.splatMaterial,"uTarget",U);const N=typeof _.fluid_color=="function"?_.fluid_color(Y.velocity):_.fluid_color;i(n.splatMaterial,"color",N)}));const Bt=d(B,()=>{v(n.curlMaterial),i(n.curlMaterial,"uVelocity",ee)});h(B,({read:U})=>{v(n.vorticityMaterial),i(n.vorticityMaterial,"uVelocity",U),i(n.vorticityMaterial,"uCurl",Bt),i(n.vorticityMaterial,"curl",_.curl_strength),i(n.vorticityMaterial,"dt",Te)});const Ot=M(B,()=>{v(n.divergenceMaterial),i(n.divergenceMaterial,"uVelocity",ee)});T(B,({read:U})=>{v(n.clearMaterial),i(n.clearMaterial,"uTexture",U),i(n.clearMaterial,"value",_.pressure_dissipation)}),v(n.pressureMaterial),i(n.pressureMaterial,"uDivergence",Ot);let Pe;for(let U=0;U<_.pressure_iterations;U++)Pe=T(B,({read:N})=>{i(n.pressureMaterial,"uPressure",N)});return h(B,({read:U})=>{v(n.gradientSubtractMaterial),i(n.gradientSubtractMaterial,"uPressure",Pe),i(n.gradientSubtractMaterial,"uVelocity",U)}),Vt},[n,v,d,g,M,s,T,h,V,_]),V,{scene:r,mesh:f,materials:n,camera:m,renderTarget:{velocity:c,density:p,curl:x,divergence:w,pressure:b},output:p.read.texture}]},en=({scale:e,max:a,texture:o,scene:r})=>{const n=l.useRef([]),v=l.useMemo(()=>new t.PlaneGeometry(e,e),[e]),f=l.useMemo(()=>new t.MeshBasicMaterial({map:o,transparent:!0,blending:t.AdditiveBlending,depthTest:!1,depthWrite:!1}),[o]);return l.useEffect(()=>{for(let m=0;m()=>{n.current.forEach(m=>{m.geometry.dispose(),Array.isArray(m.material)?m.material.forEach(s=>s.dispose()):m.material.dispose(),r.remove(m)}),n.current=[]},[r]),n.current},re=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),nn=({texture:e=new t.Texture,scale:a=64,max:o=100,size:r,dpr:n,samples:v=0})=>{const f=l.useMemo(()=>new t.Scene,[]),m=en({scale:a,max:o,texture:e,scene:f}),s=I(r),u=X(),[c,h]=D({scene:f,camera:s,size:r,dpr:n,samples:v}),[p,g]=F(re),x=l.useRef(0);return[l.useCallback((w,M)=>{const{gl:b,pointer:T,size:C}=w;M&&g(M);const P=p.pointerValues||u(T);if(p.frequency{if(S.visible){const _=S.material;S.rotation.z+=p.rotation,_.opacity*=p.fadeout_speed,S.scale.x=p.fadeout_speed*S.scale.x+p.scale,S.scale.y=S.scale.x,_.opacity<.002&&(S.visible=!1)}}),h(b)},[h,m,u,o,p,g]),g,{scene:f,camera:s,meshArr:m,renderTarget:c,output:c.texture}]};var tn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,on=`precision highp float; +}`,rn=`precision highp float; precision highp int; varying vec2 vUv; @@ -351,7 +351,7 @@ 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 rn=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.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:tn,fragmentShader:on}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},re=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new t.Vector2(2,2),warpStrength:8,beat:!1}),an=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=rn(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(re);return[l.useCallback((d,g)=>{const{gl:p,clock:y}=d;return g&&c(g),u(n,"scale",a.scale),u(n,"timeStrength",a.timeStrength),u(n,"noiseOctaves",a.noiseOctaves),u(n,"fbmOctaves",a.fbmOctaves),u(n,"warpOctaves",a.warpOctaves),u(n,"warpDirection",a.warpDirection),u(n,"warpStrength",a.warpStrength),u(n,"uTime",a.beat||y.getElapsedTime()),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var un=`varying vec2 vUv; +}`;const on=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:tn,fragmentShader:rn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},oe=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new t.Vector2(2,2),warpStrength:8,beat:!1}),an=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=on(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(oe);return[l.useCallback((p,g)=>{const{gl:x,clock:d}=p;return g&&c(g),i(n,"scale",u.scale),i(n,"timeStrength",u.timeStrength),i(n,"noiseOctaves",u.noiseOctaves),i(n,"fbmOctaves",u.fbmOctaves),i(n,"warpOctaves",u.warpOctaves),i(n,"warpDirection",u.warpDirection),i(n,"warpStrength",u.warpStrength),i(n,"uTime",u.beat||d.getElapsedTime()),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var un=`varying vec2 vUv; void main() { vUv = uv; @@ -398,7 +398,7 @@ void main() { col = clamp(col, 0.0, 1.0); gl_FragColor = vec4(col, alpha); -}`;const ln=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.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:un,fragmentShader:sn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},ie=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}),cn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=ln(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(ie);return[l.useCallback((d,g)=>{const{gl:p,clock:y}=d;return g&&c(g),a.texture?(u(n,"uTexture",a.texture),u(n,"isTexture",!0)):(u(n,"isTexture",!1),u(n,"scale",a.scale)),a.noise?(u(n,"noise",a.noise),u(n,"isNoise",!0),u(n,"noiseStrength",a.noiseStrength)):u(n,"isNoise",!1),u(n,"uTime",a.beat||y.getElapsedTime()),u(n,"laminateLayer",a.laminateLayer),u(n,"laminateInterval",a.laminateInterval),u(n,"laminateDetail",a.laminateDetail),u(n,"distortion",a.distortion),u(n,"colorFactor",a.colorFactor),u(n,"timeStrength",a.timeStrength),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var vn=`varying vec2 vUv; +}`;const ln=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:un,fragmentShader:sn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ie=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}),cn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=ln(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ie);return[l.useCallback((p,g)=>{const{gl:x,clock:d}=p;return g&&c(g),u.texture?(i(n,"uTexture",u.texture),i(n,"isTexture",!0)):(i(n,"isTexture",!1),i(n,"scale",u.scale)),u.noise?(i(n,"noise",u.noise),i(n,"isNoise",!0),i(n,"noiseStrength",u.noiseStrength)):i(n,"isNoise",!1),i(n,"uTime",u.beat||d.getElapsedTime()),i(n,"laminateLayer",u.laminateLayer),i(n,"laminateInterval",u.laminateInterval),i(n,"laminateDetail",u.laminateDetail),i(n,"distortion",u.distortion),i(n,"colorFactor",u.colorFactor),i(n,"timeStrength",u.timeStrength),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var vn=`varying vec2 vUv; void main() { vUv = uv; @@ -428,7 +428,7 @@ 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 fn=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.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:vn,fragmentShader:mn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},ae=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),pn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=fn(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(ae);return[l.useCallback((d,g)=>{const{gl:p,clock:y}=d;return g&&c(g),u(n,"u_pattern",a.pattern),u(n,"u_complexity",a.complexity),u(n,"u_complexityAttenuation",a.complexityAttenuation),u(n,"u_iterations",a.iterations),u(n,"u_timeStrength",a.timeStrength),u(n,"u_scale",a.scale),u(n,"u_time",a.beat||y.getElapsedTime()),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var dn=`varying vec2 vUv; +}`;const fn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:vn,fragmentShader:mn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ae=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),pn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=fn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ae);return[l.useCallback((p,g)=>{const{gl:x,clock:d}=p;return g&&c(g),i(n,"u_pattern",u.pattern),i(n,"u_complexity",u.complexity),i(n,"u_complexityAttenuation",u.complexityAttenuation),i(n,"u_iterations",u.iterations),i(n,"u_timeStrength",u.timeStrength),i(n,"u_scale",u.scale),i(n,"u_time",u.beat||d.getElapsedTime()),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var dn=`varying vec2 vUv; void main() { vUv = uv; @@ -462,7 +462,7 @@ void main() { ); gl_FragColor = vec4(outColor, tex.a); -}`;const hn=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.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:dn,fragmentShader:gn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},ue=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)}),xn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=hn(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(ue);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"uTexture",a.texture),u(n,"uColor1",a.color1),u(n,"uColor2",a.color2),u(n,"uColor3",a.color3),u(n,"uColor4",a.color4),u(n,"uRgbWeight",a.rgbWeight),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var yn=`varying vec2 vUv; +}`;const hn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:dn,fragmentShader:gn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ue=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)}),xn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=hn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ue);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uColor1",u.color1),i(n,"uColor2",u.color2),i(n,"uColor3",u.color3),i(n,"uColor4",u.color4),i(n,"uRgbWeight",u.rgbWeight),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var yn=`varying vec2 vUv; void main() { vUv = uv; @@ -481,7 +481,7 @@ 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 bn=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uColor0:{value:new t.Color(16777215)},uColor1:{value:new t.Color(0)}},vertexShader:yn,fragmentShader:Mn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},se={texture:new t.Texture,color0:new t.Color(16777215),color1:new t.Color(0)},wn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=bn(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(se);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"uTexture",a.texture),u(n,"uColor0",a.color0),u(n,"uColor1",a.color1),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var Sn=`varying vec2 vUv; +}`;const bn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uColor0:{value:new t.Color(16777215)},uColor1:{value:new t.Color(0)}},vertexShader:yn,fragmentShader:Mn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},se={texture:new t.Texture,color0:new t.Color(16777215),color1:new t.Color(0)},wn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=bn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(se);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uColor0",u.color0),i(n,"uColor1",u.color1),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Sn=`varying vec2 vUv; void main() { vUv = uv; @@ -526,12 +526,12 @@ void main() { vec3 alphColor = mix(outputColor,mapColor,mixValue); gl_FragColor = vec4(alphColor, alpha); -}`;const Cn=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.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:Sn,fragmentShader:_n}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},le={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},Tn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Cn(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(le);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"u_texture",a.texture),u(n,"u_map",a.map),u(n,"u_mapIntensity",a.mapIntensity),a.alphaMap?(u(n,"u_alphaMap",a.alphaMap),u(n,"u_isAlphaMap",!0)):u(n,"u_isAlphaMap",!1),u(n,"u_brightness",a.brightness),u(n,"u_min",a.min),u(n,"u_max",a.max),a.dodgeColor?(u(n,"u_dodgeColor",a.dodgeColor),u(n,"u_isDodgeColor",!0)):u(n,"u_isDodgeColor",!1),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var Pn=`varying vec2 vUv; +}`;const Cn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:Sn,fragmentShader:_n}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},le={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},Tn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Cn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(le);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_map",u.map),i(n,"u_mapIntensity",u.mapIntensity),u.alphaMap?(i(n,"u_alphaMap",u.alphaMap),i(n,"u_isAlphaMap",!0)):i(n,"u_isAlphaMap",!1),i(n,"u_brightness",u.brightness),i(n,"u_min",u.min),i(n,"u_max",u.max),u.dodgeColor?(i(n,"u_dodgeColor",u.dodgeColor),i(n,"u_isDodgeColor",!0)):i(n,"u_isDodgeColor",!1),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Pn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Dn=`precision highp float; +}`,Rn=`precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -597,7 +597,7 @@ void main() { gl_FragColor = mix(color0, color1, progress); -}`;const Rn=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:Pn,fragmentShader:Dn}),[]),m=E(i,r);l.useEffect(()=>{u(n,"uResolution",m.clone())},[m,n]);const f=R(e,o,n,t.Mesh);return{material:n,mesh:f}},ce={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)},An=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Rn({scene:o,size:e,dpr:i}),f=A(e),[s,v]=D({scene:o,camera:f,dpr:i,size:e,samples:r,isSizeUpdate:!0}),[a,c]=I(ce);return[l.useCallback((d,g)=>{var b,T,C,P,S,_,B,L;const{gl:p}=d;g&&c(g),u(n,"uTexture0",a.texture0),u(n,"uTexture1",a.texture1),u(n,"progress",a.progress);const y=[((T=(b=a.texture0)==null?void 0:b.image)==null?void 0:T.width)||0,((P=(C=a.texture0)==null?void 0:C.image)==null?void 0:P.height)||0],w=[((_=(S=a.texture1)==null?void 0:S.image)==null?void 0:_.width)||0,((L=(B=a.texture1)==null?void 0:B.image)==null?void 0:L.height)||0],M=y.map((O,$)=>O+(w[$]-O)*a.progress);return u(n,"uTextureResolution",M),u(n,"padding",a.padding),u(n,"uMap",a.map),u(n,"mapIntensity",a.mapIntensity),u(n,"edgeIntensity",a.edgeIntensity),u(n,"epicenter",a.epicenter),u(n,"dirX",a.dir.x),u(n,"dirY",a.dir.y),v(p)},[v,n,a,c]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var In=`varying vec2 vUv; +}`;const Dn=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:Pn,fragmentShader:Rn}),[]),v=E(a,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},ce={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)},An=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Dn({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,dpr:a,size:e,samples:o,isSizeUpdate:!0}),[u,c]=F(ce);return[l.useCallback((p,g)=>{var b,T,C,P,S,_,V,L;const{gl:x}=p;g&&c(g),i(n,"uTexture0",u.texture0),i(n,"uTexture1",u.texture1),i(n,"progress",u.progress);const d=[((T=(b=u.texture0)==null?void 0:b.image)==null?void 0:T.width)||0,((P=(C=u.texture0)==null?void 0:C.image)==null?void 0:P.height)||0],w=[((_=(S=u.texture1)==null?void 0:S.image)==null?void 0:_.width)||0,((L=(V=u.texture1)==null?void 0:V.image)==null?void 0:L.height)||0],M=d.map((O,k)=>O+(w[k]-O)*u.progress);return i(n,"uTextureResolution",M),i(n,"padding",u.padding),i(n,"uMap",u.map),i(n,"mapIntensity",u.mapIntensity),i(n,"edgeIntensity",u.edgeIntensity),i(n,"epicenter",u.epicenter),i(n,"dirX",u.dir.x),i(n,"dirY",u.dir.y),s(x)},[s,n,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var In=`varying vec2 vUv; void main() { vUv = uv; @@ -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 Un=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.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:In,fragmentShader:Fn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},ve={texture:new t.Texture,brightness:new t.Vector3(.5,.5,.5),min:0,max:1},Vn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Un(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(ve);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"u_texture",a.texture),u(n,"u_brightness",a.brightness),u(n,"u_min",a.min),u(n,"u_max",a.max),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var Bn=`varying vec2 vUv; +}`;const zn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:In,fragmentShader:Fn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ve={texture:new t.Texture,brightness:new t.Vector3(.5,.5,.5),min:0,max:1},Un=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=zn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ve);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_brightness",u.brightness),i(n,"u_min",u.min),i(n,"u_max",u.max),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Vn=`varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,zn=`precision highp float; +}`,Bn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -639,7 +639,7 @@ void main() { uv = (uv + 1.0) / 2.0; gl_FragColor = texture2D(u_texture, uv); -}`;const On=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_map:{value:new t.Texture},u_mapIntensity:{value:0}},vertexShader:Bn,fragmentShader:zn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},me={texture:new t.Texture,map:new t.Texture,mapIntensity:.3},En=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=On(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(me);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"u_texture",a.texture),u(n,"u_map",a.map),u(n,"u_mapIntensity",a.mapIntensity),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var Ln=`varying vec2 vUv; +}`;const On=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_map:{value:new t.Texture},u_mapIntensity:{value:0}},vertexShader:Vn,fragmentShader:Bn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},me={texture:new t.Texture,map:new t.Texture,mapIntensity:.3},En=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=On(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(me);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_map",u.map),i(n,"u_mapIntensity",u.mapIntensity),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Ln=`varying vec2 vUv; void main() { vUv = uv; @@ -656,7 +656,7 @@ void main() { vec4 tex = texture2D(uTexture, uv); vec4 map = texture2D(uMap, uv); gl_FragColor = mix(tex,map,map.a); -}`;const kn=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uMap:{value:new t.Texture}},vertexShader:Ln,fragmentShader:Wn}),[]),m=R(e,o,n,t.Mesh);return{material:n,mesh:m}},fe={texture:new t.Texture,map:new t.Texture},$n=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=kn({scene:o,size:e,dpr:i}),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(fe);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"uTexture",a.texture),u(n,"uMap",a.map),v(p)},[n,v,a,c]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var qn=`varying vec2 vUv; +}`;const $n=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uMap:{value:new t.Texture}},vertexShader:Ln,fragmentShader:Wn}),[]),v=A(e,r,n,t.Mesh);return{material:n,mesh:v}},fe={texture:new t.Texture,map:new t.Texture},kn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=$n({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(fe);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uMap",u.map),s(x)},[n,s,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var qn=`varying vec2 vUv; void main() { vUv = uv; @@ -693,7 +693,7 @@ void main() { hsv.z *= u_brightness; vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); -}`;const Nn=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_brightness:{value:1},u_saturation:{value:1}},vertexShader:qn,fragmentShader:jn}),[]),m=R(e,o,n,t.Mesh);return{material:n,mesh:m}},pe={texture:new t.Texture,brightness:1,saturation:1},Gn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Nn({scene:o,size:e,dpr:i}),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(pe);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"u_texture",a.texture),u(n,"u_brightness",a.brightness),u(n,"u_saturation",a.saturation),v(p)},[n,v,a,c]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var Kn=`varying vec2 vUv; +}`;const Nn=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_brightness:{value:1},u_saturation:{value:1}},vertexShader:qn,fragmentShader:jn}),[]),v=A(e,r,n,t.Mesh);return{material:n,mesh:v}},pe={texture:new t.Texture,brightness:1,saturation:1},Gn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Nn({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(pe);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_brightness",u.brightness),i(n,"u_saturation",u.saturation),s(x)},[n,s,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Kn=`varying vec2 vUv; void main() { vUv = uv; @@ -716,7 +716,7 @@ void main() { gl_FragColor = texture2D(uTexture, uv); -}`;const Hn=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uResolution:{value:new t.Vector2},uTextureResolution:{value:new t.Vector2},uTexture:{value:new t.Texture}},vertexShader:Kn,fragmentShader:Xn}),[]),m=E(i,r);l.useEffect(()=>{u(n,"uResolution",m.clone())},[m,n]);const f=R(e,o,n,t.Mesh);return{material:n,mesh:f}},de={texture:new t.Texture},Yn=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Hn({scene:o,size:e,dpr:i}),f=A(e),[s,v]=D({scene:o,camera:f,dpr:i,size:e,samples:r,isSizeUpdate:!0}),[a,c]=I(de);return[l.useCallback((d,g)=>{var y,w,M,b,T,C;const{gl:p}=d;return g&&c(g),u(n,"uTexture",a.texture),u(n,"uTextureResolution",[((M=(w=(y=a.texture)==null?void 0:y.source)==null?void 0:w.data)==null?void 0:M.width)||0,((C=(T=(b=a.texture)==null?void 0:b.source)==null?void 0:T.data)==null?void 0:C.height)||0]),v(p)},[v,n,a,c]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var Qn=`precision mediump float; +}`;const Hn=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uResolution:{value:new t.Vector2},uTextureResolution:{value:new t.Vector2},uTexture:{value:new t.Texture}},vertexShader:Kn,fragmentShader:Xn}),[]),v=E(a,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},de={texture:new t.Texture},Yn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Hn({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,dpr:a,size:e,samples:o,isSizeUpdate:!0}),[u,c]=F(de);return[l.useCallback((p,g)=>{var d,w,M,b,T,C;const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uTextureResolution",[((M=(w=(d=u.texture)==null?void 0:d.source)==null?void 0:w.data)==null?void 0:M.width)||0,((C=(T=(b=u.texture)==null?void 0:b.source)==null?void 0:T.data)==null?void 0:C.height)||0]),s(x)},[s,n,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Qn=`precision mediump float; varying vec2 vUv; @@ -748,7 +748,7 @@ void main() { ) / 9.0; gl_FragColor = outColor; -}`;const Jn=e=>{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uResolution:{value:new t.Vector2(0,0)},uBlurSize:{value:Q.blurSize}},vertexShader:Qn,fragmentShader:Zn}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},Q=Object.freeze({texture:new t.Texture,blurSize:3,blurPower:5}),et=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=Jn(o),f=A(e),s=l.useMemo(()=>({scene:o,camera:f,size:e,dpr:i,samples:r}),[o,f,e,i,r]),[v,a]=D(s),[c,h]=q(s),[d,g]=I(Q);return[l.useCallback((y,w)=>{var C,P,S,_,B,L;const{gl:M}=y;w&&g(w),u(n,"uTexture",d.texture),u(n,"uResolution",[((S=(P=(C=d.texture)==null?void 0:C.source)==null?void 0:P.data)==null?void 0:S.width)||0,((L=(B=(_=d.texture)==null?void 0:_.source)==null?void 0:B.data)==null?void 0:L.height)||0]),u(n,"uBlurSize",d.blurSize);let b=h(M);const T=d.blurPower;for(let O=0;O{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uResolution:{value:new t.Vector2(0,0)},uBlurSize:{value:Q.blurSize}},vertexShader:Qn,fragmentShader:Zn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},Q=Object.freeze({texture:new t.Texture,blurSize:3,blurPower:5}),et=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Jn(r),f=I(e),m=l.useMemo(()=>({scene:r,camera:f,size:e,dpr:a,samples:o}),[r,f,e,a,o]),[s,u]=D(m),[c,h]=q(m),[p,g]=F(Q);return[l.useCallback((d,w)=>{var C,P,S,_,V,L;const{gl:M}=d;w&&g(w),i(n,"uTexture",p.texture),i(n,"uResolution",[((S=(P=(C=p.texture)==null?void 0:C.source)==null?void 0:P.data)==null?void 0:S.width)||0,((L=(V=(_=p.texture)==null?void 0:_.source)==null?void 0:V.data)==null?void 0:L.height)||0]),i(n,"uBlurSize",p.blurSize);let b=h(M);const T=p.blurPower;for(let O=0;O{const i=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),r=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uEpicenter:{value:j.epicenter},uProgress:{value:j.progress},uStrength:{value:j.strength},uWidth:{value:j.width},uMode:{value:0}},vertexShader:nt,fragmentShader:tt}),[]),o=R(e,i,r,t.Mesh);return{material:r,mesh:o}},j=Object.freeze({epicenter:new t.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),rt=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=ot(o),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r,isSizeUpdate:!0}),[a,c]=I(j);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"uEpicenter",a.epicenter),u(n,"uProgress",a.progress),u(n,"uWidth",a.width),u(n,"uStrength",a.strength),u(n,"uMode",a.mode==="center"?0:a.mode==="horizontal"?1:2),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]};var it=`varying vec2 vUv; +}`;const rt=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uEpicenter:{value:j.epicenter},uProgress:{value:j.progress},uStrength:{value:j.strength},uWidth:{value:j.width},uMode:{value:0}},vertexShader:nt,fragmentShader:tt}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},j=Object.freeze({epicenter:new t.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),ot=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=rt(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o,isSizeUpdate:!0}),[u,c]=F(j);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uEpicenter",u.epicenter),i(n,"uProgress",u.progress),i(n,"uWidth",u.width),i(n,"uStrength",u.strength),i(n,"uMode",u.mode==="center"?0:u.mode==="horizontal"?1:2),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var it=`varying vec2 vUv; void main() { vUv = uv; @@ -875,7 +875,7 @@ void main() { vec4 finColor = CalcColor(texColor); gl_FragColor = finColor; -}`;const ut=({scene:e,size:i,dpr:r})=>{const o=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:it,fragmentShader:at}),[]),m=E(i,r);l.useEffect(()=>{u(n,"u_resolution",m.clone())},[m,n]);const f=R(e,o,n,t.Mesh);return{material:n,mesh:f}},ge=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}),st=({size:e,dpr:i,samples:r=0})=>{const o=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:m}=ut({scene:o,size:e,dpr:i}),f=A(e),[s,v]=D({scene:o,camera:f,size:e,dpr:i,samples:r}),[a,c]=I(ge);return[l.useCallback((d,g)=>{const{gl:p}=d;return g&&c(g),u(n,"u_texture",a.texture),u(n,"u_keyColor",a.keyColor),u(n,"u_similarity",a.similarity),u(n,"u_smoothness",a.smoothness),u(n,"u_spill",a.spill),u(n,"u_color",a.color),u(n,"u_contrast",a.contrast),u(n,"u_brightness",a.brightness),u(n,"u_gamma",a.gamma),v(p)},[v,n,c,a]),c,{scene:o,mesh:m,material:n,camera:f,renderTarget:s,output:s.texture}]},lt=({scene:e,geometry:i,material:r})=>{const o=R(e,i,r,t.Points),n=R(e,l.useMemo(()=>i.clone(),[i]),l.useMemo(()=>r.clone(),[r]),t.Mesh);return n.visible=!1,{points:o,interactiveMesh:n}};var ct=`uniform vec2 uResolution; +}`;const ut=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:it,fragmentShader:at}),[]),v=E(a,o);l.useEffect(()=>{i(n,"u_resolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},ge=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}),st=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=ut({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ge);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_keyColor",u.keyColor),i(n,"u_similarity",u.similarity),i(n,"u_smoothness",u.smoothness),i(n,"u_spill",u.spill),i(n,"u_color",u.color),i(n,"u_contrast",u.contrast),i(n,"u_brightness",u.brightness),i(n,"u_gamma",u.gamma),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]},lt=({scene:e,geometry:a,material:o})=>{const r=A(e,a,o,t.Points),n=A(e,l.useMemo(()=>a.clone(),[a]),l.useMemo(()=>o.clone(),[o]),t.Mesh);return n.visible=!1,{points:r,interactiveMesh:n}};var ct=`uniform vec2 uResolution; uniform float uMorphProgress; uniform float uPointSize; @@ -902,10 +902,21 @@ uniform sampler2D uDisplacement; uniform bool uIsDisplacement; uniform float uDisplacementIntensity; +uniform float uSizeRandomIntensity; +uniform float uSizeRandomTimeFrequency; +uniform float uSizeRandomMin; +uniform float uSizeRandomMax; + +uniform float uMapArrayLength; + +uniform float uDivergence; +uniform vec3 uDivergencePoint; + varying vec3 vColor; varying float vPictureAlpha; varying vec3 vDisplacementColor; varying float vDisplacementIntensity; +varying float vMapArrayIndex; #usf @@ -913,6 +924,10 @@ varying float vDisplacementIntensity; #usf +float random3D(vec3 co) { + return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); +} + void main() { vec3 newPosition = position; vec2 newUv = uv; @@ -931,6 +946,14 @@ void main() { newPosition += displacement; + vec3 divergenceDir = newPosition - uDivergencePoint; + if (uDivergence > 0.0) { + newPosition += normalize(divergenceDir) * uDivergence; + } else if (uDivergence < 0.0) { + newPosition -= normalize(divergenceDir) * abs(uDivergence); + } + + vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); vec4 viewPosition = viewMatrix * modelPosition; vec4 projectedPosition = projectionMatrix * viewPosition; @@ -946,8 +969,13 @@ void main() { vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; - gl_PointSize = uPointSize * vPictureAlpha * uResolution.y; + + float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; + gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; gl_PointSize *= (1.0 / - viewPosition.z); + + + vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; }`,vt=`precision highp float; precision highp int; @@ -955,6 +983,7 @@ varying vec3 vColor; varying float vPictureAlpha; varying vec3 vDisplacementColor; varying float vDisplacementIntensity; +varying float vMapArrayIndex; uniform float uBlurAlpha; uniform float uBlurRadius; @@ -963,6 +992,9 @@ uniform bool uIsMap; uniform sampler2D uAlphaMap; uniform bool uIsAlphaMap; uniform float uDisplacementColorIntensity; +uniform float uPointAlpha; + +#usf void main() { vec2 uv = gl_PointCoord; @@ -973,7 +1005,10 @@ void main() { float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); - vec3 finalColor = uIsMap ? texture2D(uMap,uv).rgb : vColor; + vec4 mapArrayColor; + #usf + vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); + vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); @@ -982,7 +1017,7 @@ void main() { float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; - gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap); + gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); }`,he=`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;} @@ -1090,17 +1125,24 @@ float getWobble(vec3 position) warpedPosition * uWobblePositionFrequency, uTime * uWobbleTimeFrequency )) * uWobbleStrength; -}`;const xe=process.env.NODE_ENV==="development",ye=(e,i,r,o,n)=>{var c;const m=r==="position"?"positionTarget":"uvTarget",f=r==="position"?"#usf ":"#usf ",s=r==="position"?"#usf ":"#usf ",v=r==="position"?"positionsList":"uvsList",a=r==="position"?` +}`;const xe=process.env.NODE_ENV==="development",ye=(e,a,o,r,n)=>{var c;const v=o==="position"?"positionTarget":"uvTarget",f=o==="position"?"#usf ":"#usf ",m=o==="position"?"#usf ":"#usf ",s=o==="position"?"positionsList":"uvsList",u=o==="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],n));let h="",d="";e.forEach((g,p)=>{i.setAttribute(`${m}${p}`,new t.BufferAttribute(g,n)),h+=`attribute vec${n} ${m}${p}; -`,p===0?d+=`${m}${p}`:d+=`,${m}${p}`}),o=o.replace(`${f}`,h),o=o.replace(`${s}`,`vec${n} ${v}[${e.length}] = vec${n}[](${d}); - ${a} - `)}else o=o.replace(`${f}`,""),o=o.replace(`${s}`,""),(c=i==null?void 0:i.attributes[r])!=null&&c.array||xe&&console.error(`use-shader-fx:geometry.attributes.${r}.array is not found`);return o},Me=(e,i,r,o)=>{var m;let n=[];if(e&&e.length>0){(m=i==null?void 0:i.attributes[r])!=null&&m.array?n=[i.attributes[r].array,...e]:n=e;const f=Math.max(...n.map(s=>s.length));n.forEach((s,v)=>{if(s.length{const m=l.useMemo(()=>Me(o,r,"position",3),[o,r]),f=l.useMemo(()=>Me(n,r,"uv",2),[n,r]),s=l.useMemo(()=>{m.length!==f.length&&xe&&console.log("use-shader-fx:positions and uvs are not matched");const a=ye(f,r,"uv",ye(m,r,"position",ct,3),2).replace("#usf ",he);return new t.ShaderMaterial({vertexShader:a,fragmentShader:vt,depthTest:!1,depthWrite:!1,transparent:!0,blending:t.AdditiveBlending,uniforms:{uResolution:{value:new t.Vector2(0,0)},uMorphProgress:{value:U.morphProgress},uBlurAlpha:{value:U.blurAlpha},uBlurRadius:{value:U.blurRadius},uPointSize:{value:U.pointSize},uPicture:{value:new t.Texture},uIsPicture:{value:!1},uAlphaPicture:{value:new t.Texture},uIsAlphaPicture:{value:!1},uColor0:{value:U.color0},uColor1:{value:U.color1},uColor2:{value:U.color2},uColor3:{value:U.color3},uMap:{value:new t.Texture},uIsMap:{value:!1},uAlphaMap:{value:new t.Texture},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:U.wobblePositionFrequency},uWobbleTimeFrequency:{value:U.wobbleTimeFrequency},uWobbleStrength:{value:U.wobbleStrength},uWarpPositionFrequency:{value:U.warpPositionFrequency},uWarpTimeFrequency:{value:U.warpTimeFrequency},uWarpStrength:{value:U.warpStrength},uDisplacement:{value:new t.Texture},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:U.displacementIntensity},uDisplacementColorIntensity:{value:U.displacementColorIntensity}}})},[r,m,f]),v=E(e,i);return l.useEffect(()=>{u(s,"uResolution",v.clone())},[v,s]),{material:s,modifiedPositions:m,modifiedUvs:f}},be=({size:e,dpr:i,scene:r=!1,geometry:o,positions:n,uvs:m})=>{const f=l.useMemo(()=>{const g=o||new t.SphereGeometry(1,32,32);return g.setIndex(null),g.deleteAttribute("normal"),g},[o]),{material:s,modifiedPositions:v,modifiedUvs:a}=mt({size:e,dpr:i,geometry:f,positions:n,uvs:m}),{points:c,interactiveMesh:h}=lt({scene:r,geometry:f,material:s});return[l.useCallback((g,p)=>{g&&u(s,"uTime",(p==null?void 0:p.beat)||g.clock.getElapsedTime()),p!==void 0&&(u(s,"uMorphProgress",p.morphProgress),u(s,"uBlurAlpha",p.blurAlpha),u(s,"uBlurRadius",p.blurRadius),u(s,"uPointSize",p.pointSize),p.picture?(u(s,"uPicture",p.picture),u(s,"uIsPicture",!0)):u(s,"uIsPicture",!1),p.alphaPicture?(u(s,"uAlphaPicture",p.alphaPicture),u(s,"uIsAlphaPicture",!0)):u(s,"uIsAlphaPicture",!1),u(s,"uColor0",p.color0),u(s,"uColor1",p.color1),u(s,"uColor2",p.color2),u(s,"uColor3",p.color3),p.map?(u(s,"uMap",p.map),u(s,"uIsMap",!0)):u(s,"uIsMap",!1),p.alphaMap?(u(s,"uAlphaMap",p.alphaMap),u(s,"uIsAlphaMap",!0)):u(s,"uIsAlphaMap",!1),u(s,"uWobbleStrength",p.wobbleStrength),u(s,"uWobblePositionFrequency",p.wobblePositionFrequency),u(s,"uWobbleTimeFrequency",p.wobbleTimeFrequency),u(s,"uWarpStrength",p.warpStrength),u(s,"uWarpPositionFrequency",p.warpPositionFrequency),u(s,"uWarpTimeFrequency",p.warpTimeFrequency),p.displacement?(u(s,"uDisplacement",p.displacement),u(s,"uIsDisplacement",!0)):u(s,"uIsDisplacement",!1),u(s,"uDisplacementIntensity",p.displacementIntensity),u(s,"uDisplacementColorIntensity",p.displacementColorIntensity))},[s]),{points:c,interactiveMesh:h,positions:v,uvs:a}]},U=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,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:.5,warpPositionFrequency:.5,warpTimeFrequency:.5,displacement:!1,displacementIntensity:1,displacementColorIntensity:0,beat:!1}),ft=({size:e,dpr:i,samples:r=0,camera:o,geometry:n,positions:m,uvs:f})=>{const s=l.useMemo(()=>new t.Scene,[]),[v,{points:a,interactiveMesh:c,positions:h,uvs:d}]=be({scene:s,size:e,dpr:i,geometry:n,positions:m,uvs:f}),[g,p]=D({scene:s,camera:o,size:e,dpr:i,samples:r,depthBuffer:!0}),y=l.useCallback((M,b)=>(v(M,b),p(M.gl)),[p,v]),w=l.useCallback(M=>{v(null,M)},[v]);return[y,w,{scene:s,points:a,interactiveMesh:c,renderTarget:g,output:g.texture,positions:h,uvs:d}]};function pt(e,i=1e-4){i=Math.max(i,Number.EPSILON);const r={},o=e.getIndex(),n=e.getAttribute("position"),m=o?o.count:n.count;let f=0;const s=Object.keys(e.attributes),v={},a={},c=[],h=["getX","getY","getZ","getW"];for(let y=0,w=s.length;y[]))}const d=Math.log10(1/i),g=Math.pow(10,d);for(let y=0;y0){a.deleteAttribute(o),a.setAttribute(o,new t.BufferAttribute(e[0],n));let h="",p="";e.forEach((g,x)=>{a.setAttribute(`${v}${x}`,new t.BufferAttribute(g,n)),h+=`attribute vec${n} ${v}${x}; +`,x===0?p+=`${v}${x}`:p+=`,${v}${x}`}),r=r.replace(`${f}`,h),r=r.replace(`${m}`,`vec${n} ${s}[${e.length}] = vec${n}[](${p}); + ${u} + `)}else r=r.replace(`${f}`,""),r=r.replace(`${m}`,""),(c=a==null?void 0:a.attributes[o])!=null&&c.array||xe&&console.error(`use-shader-fx:geometry.attributes.${o}.array is not found`);return r},Me=(e,a,o,r)=>{var v;let n=[];if(e&&e.length>0){(v=a==null?void 0:a.attributes[o])!=null&&v.array?n=[a.attributes[o].array,...e]:n=e;const f=Math.max(...n.map(m=>m.length));n.forEach((m,s)=>{if(m.length{let o="";const r={};let n="";return e&&e.length>0?(n+="if (false) {}",e.forEach((f,m)=>{n+=` else if (vMapArrayIndex == ${m}.0) { +`,n+=` mapArrayColor = texture2D(uMapArray${m}, uv); +`,n+="}",o+=` + uniform sampler2D uMapArray${m}; + `,r[`uMapArray${m}`]={value:f}}),n+=` else { +`,n+=` mapArrayColor = vec4(1.0); +`,n+="}",o+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(n+=`mapArrayColor = vec4(1.0); +`,o+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:a.replace("#usf ",n).replace("#usf ",o),mapArrayUniforms:r}},ft=({size:e,dpr:a,geometry:o,positions:r,uvs:n,mapArray:v})=>{const f=l.useMemo(()=>Me(r,o,"position",3),[r,o]),m=l.useMemo(()=>Me(n,o,"uv",2),[n,o]),s=l.useMemo(()=>{f.length!==m.length&&xe&&console.log("use-shader-fx:positions and uvs are not matched");const c=ye(m,o,"uv",ye(f,o,"position",ct,3),2).replace("#usf ",he),h=mt(v,vt);return new t.ShaderMaterial({vertexShader:c,fragmentShader:h.rewritedFragmentShader,depthTest:!1,depthWrite:!1,transparent:!0,blending:t.AdditiveBlending,uniforms:{uResolution:{value:new t.Vector2(0,0)},uMorphProgress:{value:R.morphProgress},uBlurAlpha:{value:R.blurAlpha},uBlurRadius:{value:R.blurRadius},uPointSize:{value:R.pointSize},uPointAlpha:{value:R.pointAlpha},uPicture:{value:new t.Texture},uIsPicture:{value:!1},uAlphaPicture:{value:new t.Texture},uIsAlphaPicture:{value:!1},uColor0:{value:R.color0},uColor1:{value:R.color1},uColor2:{value:R.color2},uColor3:{value:R.color3},uMap:{value:new t.Texture},uIsMap:{value:!1},uAlphaMap:{value:new t.Texture},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:R.wobblePositionFrequency},uWobbleTimeFrequency:{value:R.wobbleTimeFrequency},uWobbleStrength:{value:R.wobbleStrength},uWarpPositionFrequency:{value:R.warpPositionFrequency},uWarpTimeFrequency:{value:R.warpTimeFrequency},uWarpStrength:{value:R.warpStrength},uDisplacement:{value:new t.Texture},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:R.displacementIntensity},uDisplacementColorIntensity:{value:R.displacementColorIntensity},uSizeRandomIntensity:{value:R.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:R.sizeRandomTimeFrequency},uSizeRandomMin:{value:R.sizeRandomMin},uSizeRandomMax:{value:R.sizeRandomMax},uDivergence:{value:R.divergence},uDivergencePoint:{value:R.divergencePoint},...h.mapArrayUniforms}})},[o,f,m,v]),u=E(e,a);return l.useEffect(()=>{i(s,"uResolution",u.clone())},[u,s]),{material:s,modifiedPositions:f,modifiedUvs:m}},be=({size:e,dpr:a,scene:o=!1,geometry:r,positions:n,uvs:v,mapArray:f})=>{const m=l.useMemo(()=>{const x=r||new t.SphereGeometry(1,32,32);return x.setIndex(null),x.deleteAttribute("normal"),x},[r]),{material:s,modifiedPositions:u,modifiedUvs:c}=ft({size:e,dpr:a,geometry:m,positions:n,uvs:v,mapArray:f}),{points:h,interactiveMesh:p}=lt({scene:o,geometry:m,material:s});return[l.useCallback((x,d)=>{x&&i(s,"uTime",(d==null?void 0:d.beat)||x.clock.getElapsedTime()),d!==void 0&&(i(s,"uMorphProgress",d.morphProgress),i(s,"uBlurAlpha",d.blurAlpha),i(s,"uBlurRadius",d.blurRadius),i(s,"uPointSize",d.pointSize),i(s,"uPointAlpha",d.pointAlpha),d.picture?(i(s,"uPicture",d.picture),i(s,"uIsPicture",!0)):d.picture===!1&&i(s,"uIsPicture",!1),d.alphaPicture?(i(s,"uAlphaPicture",d.alphaPicture),i(s,"uIsAlphaPicture",!0)):d.alphaPicture===!1&&i(s,"uIsAlphaPicture",!1),i(s,"uColor0",d.color0),i(s,"uColor1",d.color1),i(s,"uColor2",d.color2),i(s,"uColor3",d.color3),d.map?(i(s,"uMap",d.map),i(s,"uIsMap",!0)):d.map===!1&&i(s,"uIsMap",!1),d.alphaMap?(i(s,"uAlphaMap",d.alphaMap),i(s,"uIsAlphaMap",!0)):d.alphaMap===!1&&i(s,"uIsAlphaMap",!1),i(s,"uWobbleStrength",d.wobbleStrength),i(s,"uWobblePositionFrequency",d.wobblePositionFrequency),i(s,"uWobbleTimeFrequency",d.wobbleTimeFrequency),i(s,"uWarpStrength",d.warpStrength),i(s,"uWarpPositionFrequency",d.warpPositionFrequency),i(s,"uWarpTimeFrequency",d.warpTimeFrequency),d.displacement?(i(s,"uDisplacement",d.displacement),i(s,"uIsDisplacement",!0)):d.displacement===!1&&i(s,"uIsDisplacement",!1),i(s,"uDisplacementIntensity",d.displacementIntensity),i(s,"uDisplacementColorIntensity",d.displacementColorIntensity),i(s,"uSizeRandomIntensity",d.sizeRandomIntensity),i(s,"uSizeRandomTimeFrequency",d.sizeRandomTimeFrequency),i(s,"uSizeRandomMin",d.sizeRandomMin),i(s,"uSizeRandomMax",d.sizeRandomMax),i(s,"uDivergence",d.divergence),i(s,"uDivergencePoint",d.divergencePoint))},[s]),{points:h,interactiveMesh:p,positions:u,uvs:c}]},R=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}),pt=({size:e,dpr:a,samples:o=0,camera:r,geometry:n,positions:v,uvs:f})=>{const m=l.useMemo(()=>new t.Scene,[]),[s,{points:u,interactiveMesh:c,positions:h,uvs:p}]=be({scene:m,size:e,dpr:a,geometry:n,positions:v,uvs:f}),[g,x]=D({scene:m,camera:r,size:e,dpr:a,samples:o,depthBuffer:!0}),d=l.useCallback((M,b)=>(s(M,b),x(M.gl)),[x,s]),w=l.useCallback(M=>{s(null,M)},[s]);return[d,w,{scene:m,points:u,interactiveMesh:c,renderTarget:g,output:g.texture,positions:h,uvs:p}]};function dt(e,a=1e-4){a=Math.max(a,Number.EPSILON);const o={},r=e.getIndex(),n=e.getAttribute("position"),v=r?r.count:n.count;let f=0;const m=Object.keys(e.attributes),s={},u={},c=[],h=["getX","getY","getZ","getW"];for(let d=0,w=m.length;d[]))}const p=Math.log10(1/a),g=Math.pow(10,p);for(let d=0;d{let i=e;return i=i.replace("#include ",` +#endif`;const we=e=>{let a=e;return a=a.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`),a=a.replace("#include ",` + vec3 transformed = usf_Position;`),a=a.replace("void main() {",` uniform float uTime; uniform float uWobblePositionFrequency; uniform float uWobbleTimeFrequency; @@ -1438,7 +1480,7 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); varying float vWobble; varying vec2 vPosition; // #usf - void main() {`),i=i.replace("// #usf ",`${he}`),i=i.replace("void main() {",` + void main() {`),a=a.replace("// #usf ",`${he}`),a=a.replace("void main() {",` void main() { vec3 usf_Position = position; vec3 usf_Normal = normal; @@ -1459,11 +1501,11 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); usf_Normal = cross(toA, toB); // Varying vPosition = usf_Position.xy; - vWobble = wobble / uWobbleStrength;`),i},xt=({baseMaterial:e,materialParameters:i})=>{const{material:r,depthMaterial:o}=l.useMemo(()=>{const n=new(e||t.MeshPhysicalMaterial)(i||{}),m=n.type==="MeshPhysicalMaterial"||n.type==="MeshStandardMaterial",f=n.type==="MeshPhysicalMaterial";Object.assign(n.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:F.wobblePositionFrequency},uWobbleTimeFrequency:{value:F.wobbleTimeFrequency},uWobbleStrength:{value:F.wobbleStrength},uWarpPositionFrequency:{value:F.warpPositionFrequency},uWarpTimeFrequency:{value:F.warpTimeFrequency},uWarpStrength:{value:F.warpStrength},uWobbleShine:{value:F.wobbleShine},uColor0:{value:F.color0},uColor1:{value:F.color1},uColor2:{value:F.color2},uColor3:{value:F.color3},uColorMix:{value:F.colorMix},uChromaticAberration:{value:F.chromaticAberration},uAnisotropicBlur:{value:F.anisotropicBlur},uDistortion:{value:F.distortion},uDistortionScale:{value:F.distortionScale},uTemporalDistortion:{value:F.temporalDistortion},uSamples:{value:F.samples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),n.onBeforeCompile=v=>{Object.assign(v.uniforms,n.userData.uniforms),v.vertexShader=we(v.vertexShader),v.fragmentShader=v.fragmentShader.replace("#include ",` + vWobble = wobble / uWobbleStrength;`),a},yt=({baseMaterial:e,materialParameters:a})=>{const{material:o,depthMaterial:r}=l.useMemo(()=>{const n=new(e||t.MeshPhysicalMaterial)(a||{}),v=n.type==="MeshPhysicalMaterial"||n.type==="MeshStandardMaterial",f=n.type==="MeshPhysicalMaterial";Object.assign(n.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:z.wobblePositionFrequency},uWobbleTimeFrequency:{value:z.wobbleTimeFrequency},uWobbleStrength:{value:z.wobbleStrength},uWarpPositionFrequency:{value:z.warpPositionFrequency},uWarpTimeFrequency:{value:z.warpTimeFrequency},uWarpStrength:{value:z.warpStrength},uWobbleShine:{value:z.wobbleShine},uColor0:{value:z.color0},uColor1:{value:z.color1},uColor2:{value:z.color2},uColor3:{value:z.color3},uColorMix:{value:z.colorMix},uChromaticAberration:{value:z.chromaticAberration},uAnisotropicBlur:{value:z.anisotropicBlur},uDistortion:{value:z.distortion},uDistortionScale:{value:z.distortionScale},uTemporalDistortion:{value:z.temporalDistortion},uSamples:{value:z.samples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),n.onBeforeCompile=s=>{Object.assign(s.uniforms,n.userData.uniforms),s.vertexShader=we(s.vertexShader),s.fragmentShader=s.fragmentShader.replace("#include ",` #include - diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`),m&&(v.fragmentShader=v.fragmentShader.replace("#include ",` + diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`),v&&(s.fragmentShader=s.fragmentShader.replace("#include ",` #include - roughnessFactor = usf_Roughness;`)),v.fragmentShader=v.fragmentShader.replace("void main() {",` + roughnessFactor = usf_Roughness;`)),s.fragmentShader=s.fragmentShader.replace("void main() {",` uniform vec3 uColor0; uniform vec3 uColor1; uniform vec3 uColor2; @@ -1481,24 +1523,24 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); uniform float uSamples; float rand(float n){return fract(sin(n) * 43758.5453123);} - ${dt} + ${gt} varying float vWobble; varying vec2 vPosition; void main(){ vec4 usf_DiffuseColor = vec4(1.0); - ${m?"float usf_Roughness = roughness;":""} + ${v?"float usf_Roughness = roughness;":""} float colorWobbleMix = smoothstep(-1.,1.,vWobble); vec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y)); usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); - ${m?"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);":""}`),f&&(v.fragmentShader=v.fragmentShader.replace("#include ",`${gt}`),v.fragmentShader=v.fragmentShader.replace("#include ",`${ht}`))},n.needsUpdate=!0;const s=new t.MeshDepthMaterial({depthPacking:t.RGBADepthPacking});return s.onBeforeCompile=v=>{Object.assign(v.uniforms,n.userData.uniforms),v.vertexShader=we(v.vertexShader)},s.needsUpdate=!0,{material:n,depthMaterial:s}},[i,e]);return{material:r,depthMaterial:o}},Se=({scene:e=!1,geometry:i,baseMaterial:r,materialParameters:o})=>{const n=l.useMemo(()=>{let a=i||new t.IcosahedronGeometry(2,50);return a=pt(a),a.computeTangents(),a},[i]),{material:m,depthMaterial:f}=xt({baseMaterial:r,materialParameters:o}),s=R(e,n,m,t.Mesh);return[l.useCallback((a,c)=>{const h=m.userData;a&&u(h,"uTime",(c==null?void 0:c.beat)||a.clock.getElapsedTime()),c!==void 0&&(u(h,"uWobbleStrength",c.wobbleStrength),u(h,"uWobblePositionFrequency",c.wobblePositionFrequency),u(h,"uWobbleTimeFrequency",c.wobbleTimeFrequency),u(h,"uWarpStrength",c.warpStrength),u(h,"uWarpPositionFrequency",c.warpPositionFrequency),u(h,"uWarpTimeFrequency",c.warpTimeFrequency),u(h,"uWobbleShine",c.wobbleShine),u(h,"uSamples",c.samples),u(h,"uColor0",c.color0),u(h,"uColor1",c.color1),u(h,"uColor2",c.color2),u(h,"uColor3",c.color3),u(h,"uColorMix",c.colorMix),u(h,"uChromaticAberration",c.chromaticAberration),u(h,"uAnisotropicBlur",c.anisotropicBlur),u(h,"uDistortion",c.distortion),u(h,"uDistortionScale",c.distortionScale),u(h,"uTemporalDistortion",c.temporalDistortion))},[m]),{mesh:s,depthMaterial:f}]},F=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}),yt=({size:e,dpr:i,samples:r=0,camera:o,geometry:n,baseMaterial:m,materialParameters:f})=>{const s=l.useMemo(()=>new t.Scene,[]),[v,{mesh:a,depthMaterial:c}]=Se({baseMaterial:m,materialParameters:f,scene:s,geometry:n}),[h,d]=D({scene:s,camera:o,size:e,dpr:i,samples:r,depthBuffer:!0}),g=l.useCallback((y,w)=>(v(y,w),d(y.gl)),[d,v]),p=l.useCallback(y=>{v(null,y)},[v]);return[g,p,{scene:s,mesh:a,depthMaterial:c,renderTarget:h,output:h.texture}]},Mt=(e,i,r)=>{const o=l.useMemo(()=>new t.Mesh(i,r),[i,r]);return l.useEffect(()=>{e.add(o)},[e,o]),l.useEffect(()=>()=>{e.remove(o),i.dispose(),r.dispose()},[e,i,r,o]),o},K=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-K.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-K.easeOutBounce(1-2*e))/2:(1+K.easeOutBounce(2*e-1))/2}});function bt(e){let i=Math.sin(e*12.9898)*43758.5453;return i-Math.floor(i)}const wt=(e,i="easeOutQuart")=>{const r=e/60,o=K[i];return l.useCallback(m=>{let f=m.getElapsedTime()*r;const s=Math.floor(f),v=o(f-s);f=v+s;const a=bt(s);return{beat:f,floor:s,fract:v,hash:a}},[r,o])},St=(e=60)=>{const i=l.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),r=l.useRef(null);return l.useCallback(n=>{const m=n.getElapsedTime();return r.current===null||m-r.current>=i?(r.current=m,!0):!1},[i])},_t=e=>{var o,n;const i=(o=e.dom)==null?void 0:o.length,r=(n=e.texture)==null?void 0:n.length;return!i||!r||i!==r};var Ct=`varying vec2 vUv; + ${v?"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);":""}`),f&&(s.fragmentShader=s.fragmentShader.replace("#include ",`${ht}`),s.fragmentShader=s.fragmentShader.replace("#include ",`${xt}`))},n.needsUpdate=!0;const m=new t.MeshDepthMaterial({depthPacking:t.RGBADepthPacking});return m.onBeforeCompile=s=>{Object.assign(s.uniforms,n.userData.uniforms),s.vertexShader=we(s.vertexShader)},m.needsUpdate=!0,{material:n,depthMaterial:m}},[a,e]);return{material:o,depthMaterial:r}},Se=({scene:e=!1,geometry:a,baseMaterial:o,materialParameters:r})=>{const n=l.useMemo(()=>{let u=a||new t.IcosahedronGeometry(2,50);return u=dt(u),u.computeTangents(),u},[a]),{material:v,depthMaterial:f}=yt({baseMaterial:o,materialParameters:r}),m=A(e,n,v,t.Mesh);return[l.useCallback((u,c)=>{const h=v.userData;u&&i(h,"uTime",(c==null?void 0:c.beat)||u.clock.getElapsedTime()),c!==void 0&&(i(h,"uWobbleStrength",c.wobbleStrength),i(h,"uWobblePositionFrequency",c.wobblePositionFrequency),i(h,"uWobbleTimeFrequency",c.wobbleTimeFrequency),i(h,"uWarpStrength",c.warpStrength),i(h,"uWarpPositionFrequency",c.warpPositionFrequency),i(h,"uWarpTimeFrequency",c.warpTimeFrequency),i(h,"uWobbleShine",c.wobbleShine),i(h,"uSamples",c.samples),i(h,"uColor0",c.color0),i(h,"uColor1",c.color1),i(h,"uColor2",c.color2),i(h,"uColor3",c.color3),i(h,"uColorMix",c.colorMix),i(h,"uChromaticAberration",c.chromaticAberration),i(h,"uAnisotropicBlur",c.anisotropicBlur),i(h,"uDistortion",c.distortion),i(h,"uDistortionScale",c.distortionScale),i(h,"uTemporalDistortion",c.temporalDistortion))},[v]),{mesh:m,depthMaterial:f}]},z=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}),Mt=({size:e,dpr:a,samples:o=0,camera:r,geometry:n,baseMaterial:v,materialParameters:f})=>{const m=l.useMemo(()=>new t.Scene,[]),[s,{mesh:u,depthMaterial:c}]=Se({baseMaterial:v,materialParameters:f,scene:m,geometry:n}),[h,p]=D({scene:m,camera:r,size:e,dpr:a,samples:o,depthBuffer:!0}),g=l.useCallback((d,w)=>(s(d,w),p(d.gl)),[p,s]),x=l.useCallback(d=>{s(null,d)},[s]);return[g,x,{scene:m,mesh:u,depthMaterial:c,renderTarget:h,output:h.texture}]},bt=(e,a,o)=>{const r=l.useMemo(()=>new t.Mesh(a,o),[a,o]);return l.useEffect(()=>{e.add(r)},[e,r]),l.useEffect(()=>()=>{e.remove(r),a.dispose(),o.dispose()},[e,a,o,r]),r},K=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 o=2.5949095;return e<.5?Math.pow(2*e,2)*((o+1)*2*e-o)/2:(Math.pow(2*e-2,2)*((o+1)*(e*2-2)+o)+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)},easeOutElastic(e){const a=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*a)+1},easeInOutElastic(e){const a=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)*a))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*a)/2+1},easeInBounce(e){return 1-K.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-K.easeOutBounce(1-2*e))/2:(1+K.easeOutBounce(2*e-1))/2}});function wt(e){let a=Math.sin(e*12.9898)*43758.5453;return a-Math.floor(a)}const St=(e,a="easeOutQuart")=>{const o=e/60,r=K[a];return l.useCallback(v=>{let f=v.getElapsedTime()*o;const m=Math.floor(f),s=r(f-m);f=s+m;const u=wt(m);return{beat:f,floor:m,fract:s,hash:u}},[o,r])},_t=(e=60)=>{const a=l.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),o=l.useRef(null);return l.useCallback(n=>{const v=n.getElapsedTime();return o.current===null||v-o.current>=a?(o.current=v,!0):!1},[a])},Ct=e=>{var r,n;const a=(r=e.dom)==null?void 0:r.length,o=(n=e.texture)==null?void 0:n.length;return!a||!o||a!==o};var Tt=`varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`,Tt=`precision highp float; +}`,Pt=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1541,5 +1583,5 @@ void main() { alpha *= textureAlpha; gl_FragColor = vec4(textureColor, alpha); -}`;const Pt=({params:e,size:i,scene:r})=>{r.children.length>0&&(r.children.forEach(o=>{o instanceof t.Mesh&&(o.geometry.dispose(),o.material.dispose())}),r.remove(...r.children)),e.texture.forEach((o,n)=>{const m=new t.Mesh(new t.PlaneGeometry(1,1),new t.ShaderMaterial({vertexShader:Ct,fragmentShader:Tt,transparent:!0,uniforms:{u_texture:{value:o},u_textureResolution:{value:new t.Vector2(0,0)},u_resolution:{value:new t.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[n]?e.boderRadius[n]:0}}}));r.add(m)})},Dt=()=>{const e=l.useRef([]),i=l.useRef([]);return l.useCallback(({isIntersectingRef:o,isIntersectingOnceRef:n,params:m})=>{e.current.length>0&&e.current.forEach((s,v)=>{s.unobserve(i.current[v])}),i.current=[],e.current=[];const f=new Array(m.dom.length).fill(!1);o.current=[...f],n.current=[...f],m.dom.forEach((s,v)=>{const a=h=>{h.forEach(d=>{m.onIntersect[v]&&m.onIntersect[v](d),o.current[v]=d.isIntersecting})},c=new IntersectionObserver(a,{rootMargin:"0px",threshold:0});c.observe(s),e.current.push(c),i.current.push(s)})},[])},Rt=()=>{const e=l.useRef([]),i=l.useCallback(({params:r,size:o,resolutionRef:n,scene:m,isIntersectingRef:f})=>{m.children.length!==e.current.length&&(e.current=new Array(m.children.length)),m.children.forEach((s,v)=>{var h,d,g,p,y,w;const a=r.dom[v];if(!a)return;const c=a.getBoundingClientRect();if(e.current[v]=c,s.scale.set(c.width,c.height,1),s.position.set(c.left+c.width*.5-o.width*.5,-c.top-c.height*.5+o.height*.5,0),f.current[v]&&(r.rotation[v]&&s.rotation.copy(r.rotation[v]),s instanceof t.Mesh)){const M=s.material;u(M,"u_texture",r.texture[v]),u(M,"u_textureResolution",[((g=(d=(h=r.texture[v])==null?void 0:h.source)==null?void 0:d.data)==null?void 0:g.width)||0,((w=(y=(p=r.texture[v])==null?void 0:p.source)==null?void 0:y.data)==null?void 0:w.height)||0]),u(M,"u_resolution",n.current.set(c.width,c.height)),u(M,"u_borderRadius",r.boderRadius[v]?r.boderRadius[v]:0)}})},[]);return[e.current,i]},At=()=>{const e=l.useRef([]),i=l.useRef([]),r=l.useCallback((o,n=!1)=>{e.current.forEach((f,s)=>{f&&(i.current[s]=!0)});const m=n?[...i.current]:[...e.current];return o<0?m:m[o]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:i,isIntersecting:r}},It=e=>({onView:r,onHidden:o})=>{const n=l.useRef(!1);l.useEffect(()=>{let m;const f=()=>{e.current.some(s=>s)?n.current||(r&&r(),n.current=!0):n.current&&(o&&o(),n.current=!1),m=requestAnimationFrame(f)};return m=requestAnimationFrame(f),()=>{cancelAnimationFrame(m)}},[r,o])},_e={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},Ft=({size:e,dpr:i,samples:r=0},o=[])=>{const n=l.useMemo(()=>new t.Scene,[]),m=A(e),[f,s]=D({scene:n,camera:m,size:e,dpr:i,samples:r,isSizeUpdate:!0}),[v,a]=I({..._e,updateKey:performance.now()}),[c,h]=Rt(),d=l.useRef(new t.Vector2(0,0)),[g,p]=l.useState(!0);l.useEffect(()=>{p(!0)},o);const y=l.useRef(null),w=l.useMemo(()=>new t.Texture,[]),M=Dt(),{isIntersectingOnceRef:b,isIntersectingRef:T,isIntersecting:C}=At(),P=It(T);return[l.useCallback((_,B)=>{const{gl:L,size:O}=_;if(B&&a(B),_t(v))return w;if(g){if(y.current===v.updateKey)return w;y.current=v.updateKey}return g&&(Pt({params:v,size:O,scene:n}),M({isIntersectingRef:T,isIntersectingOnceRef:b,params:v}),p(!1)),h({params:v,size:O,resolutionRef:d,scene:n,isIntersectingRef:T}),s(L)},[s,a,M,h,g,n,v,b,T,w]),a,{scene:n,camera:m,renderTarget:f,output:f.texture,isIntersecting:C,DOMRects:c,intersections:T.current,useDomView:P}]},Ut=({scene:e,camera:i,size:r,dpr:o=!1,isSizeUpdate:n=!1,samples:m=0,depthBuffer:f=!1,depthTexture:s=!1},v)=>{const a=l.useRef([]),c=E(r,o);a.current=l.useMemo(()=>Array.from({length:v},()=>{const d=new t.WebGLRenderTarget(c.x,c.y,{...G,samples:m,depthBuffer:f});return s&&(d.depthTexture=new t.DepthTexture(c.x,c.y,t.FloatType)),d}),[v]),l.useLayoutEffect(()=>{n&&a.current.forEach(d=>d.setSize(c.x,c.y))},[c,n]),l.useEffect(()=>{const d=a.current;return()=>{d.forEach(g=>g.dispose())}},[v]);const h=l.useCallback((d,g,p)=>{const y=a.current[g];return H({gl:d,scene:e,camera:i,fbo:y,onBeforeRender:()=>p&&p({read:y.texture})}),y.texture},[e,i]);return[a.current,h]};x.ALPHABLENDING_PARAMS=fe,x.BLENDING_PARAMS=le,x.BRIGHTNESSPICKER_PARAMS=ve,x.BRUSH_PARAMS=ne,x.CHROMAKEY_PARAMS=ge,x.COLORSTRATA_PARAMS=ie,x.COSPALETTE_PARAMS=ue,x.COVERTEXTURE_PARAMS=de,x.DOMSYNCER_PARAMS=_e,x.DUOTONE_PARAMS=se,x.Easing=K,x.FBO_OPTION=G,x.FLUID_PARAMS=te,x.FXBLENDING_PARAMS=me,x.FXTEXTURE_PARAMS=ce,x.HSV_PARAMS=pe,x.MARBLE_PARAMS=ae,x.MORPHPARTICLES_PARAMS=U,x.NOISE_PARAMS=re,x.RIPPLE_PARAMS=oe,x.SIMPLEBLUR_PARAMS=Q,x.WAVE_PARAMS=j,x.WOBBLE3D_PARAMS=F,x.renderFBO=H,x.setUniform=u,x.useAddMesh=Mt,x.useAlphaBlending=$n,x.useBeat=wt,x.useBlending=Tn,x.useBrightnessPicker=Vn,x.useBrush=Ue,x.useCamera=A,x.useChromaKey=st,x.useColorStrata=cn,x.useCopyTexture=Ut,x.useCosPalette=xn,x.useCoverTexture=Yn,x.useCreateMorphParticles=be,x.useCreateWobble3D=Se,x.useDomSyncer=Ft,x.useDoubleFBO=q,x.useDuoTone=wn,x.useFPSLimiter=St,x.useFluid=Je,x.useFxBlending=En,x.useFxTexture=An,x.useHSV=Gn,x.useMarble=pn,x.useMorphParticles=ft,x.useNoise=an,x.useParams=I,x.usePointer=X,x.useResolution=E,x.useRipple=nn,x.useSimpleBlur=et,x.useSingleFBO=D,x.useWave=rt,x.useWobble3D=yt,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})}); +}`;const Rt=({params:e,size:a,scene:o})=>{o.children.length>0&&(o.children.forEach(r=>{r instanceof t.Mesh&&(r.geometry.dispose(),r.material.dispose())}),o.remove(...o.children)),e.texture.forEach((r,n)=>{const v=new t.Mesh(new t.PlaneGeometry(1,1),new t.ShaderMaterial({vertexShader:Tt,fragmentShader:Pt,transparent:!0,uniforms:{u_texture:{value:r},u_textureResolution:{value:new t.Vector2(0,0)},u_resolution:{value:new t.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[n]?e.boderRadius[n]:0}}}));o.add(v)})},Dt=()=>{const e=l.useRef([]),a=l.useRef([]);return l.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:n,params:v})=>{e.current.length>0&&e.current.forEach((m,s)=>{m.unobserve(a.current[s])}),a.current=[],e.current=[];const f=new Array(v.dom.length).fill(!1);r.current=[...f],n.current=[...f],v.dom.forEach((m,s)=>{const u=h=>{h.forEach(p=>{v.onIntersect[s]&&v.onIntersect[s](p),r.current[s]=p.isIntersecting})},c=new IntersectionObserver(u,{rootMargin:"0px",threshold:0});c.observe(m),e.current.push(c),a.current.push(m)})},[])},At=()=>{const e=l.useRef([]),a=l.useCallback(({params:o,size:r,resolutionRef:n,scene:v,isIntersectingRef:f})=>{v.children.length!==e.current.length&&(e.current=new Array(v.children.length)),v.children.forEach((m,s)=>{var h,p,g,x,d,w;const u=o.dom[s];if(!u)return;const c=u.getBoundingClientRect();if(e.current[s]=c,m.scale.set(c.width,c.height,1),m.position.set(c.left+c.width*.5-r.width*.5,-c.top-c.height*.5+r.height*.5,0),f.current[s]&&(o.rotation[s]&&m.rotation.copy(o.rotation[s]),m instanceof t.Mesh)){const M=m.material;i(M,"u_texture",o.texture[s]),i(M,"u_textureResolution",[((g=(p=(h=o.texture[s])==null?void 0:h.source)==null?void 0:p.data)==null?void 0:g.width)||0,((w=(d=(x=o.texture[s])==null?void 0:x.source)==null?void 0:d.data)==null?void 0:w.height)||0]),i(M,"u_resolution",n.current.set(c.width,c.height)),i(M,"u_borderRadius",o.boderRadius[s]?o.boderRadius[s]:0)}})},[]);return[e.current,a]},It=()=>{const e=l.useRef([]),a=l.useRef([]),o=l.useCallback((r,n=!1)=>{e.current.forEach((f,m)=>{f&&(a.current[m]=!0)});const v=n?[...a.current]:[...e.current];return r<0?v:v[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:a,isIntersecting:o}},Ft=e=>({onView:o,onHidden:r})=>{const n=l.useRef(!1);l.useEffect(()=>{let v;const f=()=>{e.current.some(m=>m)?n.current||(o&&o(),n.current=!0):n.current&&(r&&r(),n.current=!1),v=requestAnimationFrame(f)};return v=requestAnimationFrame(f),()=>{cancelAnimationFrame(v)}},[o,r])},_e={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},zt=({size:e,dpr:a,samples:o=0},r=[])=>{const n=l.useMemo(()=>new t.Scene,[]),v=I(e),[f,m]=D({scene:n,camera:v,size:e,dpr:a,samples:o,isSizeUpdate:!0}),[s,u]=F({..._e,updateKey:performance.now()}),[c,h]=At(),p=l.useRef(new t.Vector2(0,0)),[g,x]=l.useState(!0);l.useEffect(()=>{x(!0)},r);const d=l.useRef(null),w=l.useMemo(()=>new t.Texture,[]),M=Dt(),{isIntersectingOnceRef:b,isIntersectingRef:T,isIntersecting:C}=It(),P=Ft(T);return[l.useCallback((_,V)=>{const{gl:L,size:O}=_;if(V&&u(V),Ct(s))return w;if(g){if(d.current===s.updateKey)return w;d.current=s.updateKey}return g&&(Rt({params:s,size:O,scene:n}),M({isIntersectingRef:T,isIntersectingOnceRef:b,params:s}),x(!1)),h({params:s,size:O,resolutionRef:p,scene:n,isIntersectingRef:T}),m(L)},[m,u,M,h,g,n,s,b,T,w]),u,{scene:n,camera:v,renderTarget:f,output:f.texture,isIntersecting:C,DOMRects:c,intersections:T.current,useDomView:P}]},Ut=({scene:e,camera:a,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1},s)=>{const u=l.useRef([]),c=E(o,r);u.current=l.useMemo(()=>Array.from({length:s},()=>{const p=new t.WebGLRenderTarget(c.x,c.y,{...G,samples:v,depthBuffer:f});return m&&(p.depthTexture=new t.DepthTexture(c.x,c.y,t.FloatType)),p}),[s]),l.useLayoutEffect(()=>{n&&u.current.forEach(p=>p.setSize(c.x,c.y))},[c,n]),l.useEffect(()=>{const p=u.current;return()=>{p.forEach(g=>g.dispose())}},[s]);const h=l.useCallback((p,g,x)=>{const d=u.current[g];return H({gl:p,scene:e,camera:a,fbo:d,onBeforeRender:()=>x&&x({read:d.texture})}),d.texture},[e,a]);return[u.current,h]};y.ALPHABLENDING_PARAMS=fe,y.BLENDING_PARAMS=le,y.BRIGHTNESSPICKER_PARAMS=ve,y.BRUSH_PARAMS=ne,y.CHROMAKEY_PARAMS=ge,y.COLORSTRATA_PARAMS=ie,y.COSPALETTE_PARAMS=ue,y.COVERTEXTURE_PARAMS=de,y.DOMSYNCER_PARAMS=_e,y.DUOTONE_PARAMS=se,y.Easing=K,y.FBO_OPTION=G,y.FLUID_PARAMS=te,y.FXBLENDING_PARAMS=me,y.FXTEXTURE_PARAMS=ce,y.HSV_PARAMS=pe,y.MARBLE_PARAMS=ae,y.MORPHPARTICLES_PARAMS=R,y.NOISE_PARAMS=oe,y.RIPPLE_PARAMS=re,y.SIMPLEBLUR_PARAMS=Q,y.WAVE_PARAMS=j,y.WOBBLE3D_PARAMS=z,y.renderFBO=H,y.setUniform=i,y.useAddMesh=bt,y.useAlphaBlending=kn,y.useBeat=St,y.useBlending=Tn,y.useBrightnessPicker=Un,y.useBrush=ze,y.useCamera=I,y.useChromaKey=st,y.useColorStrata=cn,y.useCopyTexture=Ut,y.useCosPalette=xn,y.useCoverTexture=Yn,y.useCreateMorphParticles=be,y.useCreateWobble3D=Se,y.useDomSyncer=zt,y.useDoubleFBO=q,y.useDuoTone=wn,y.useFPSLimiter=_t,y.useFluid=Je,y.useFxBlending=En,y.useFxTexture=An,y.useHSV=Gn,y.useMarble=pn,y.useMorphParticles=pt,y.useNoise=an,y.useParams=F,y.usePointer=X,y.useResolution=E,y.useRipple=nn,y.useSimpleBlur=et,y.useSingleFBO=D,y.useWave=ot,y.useWobble3D=Mt,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 7389895c..fe43fa4b 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/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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\n\n#usf \n\n#usf \n\n#usf \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// 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\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\tgl_PointSize = uPointSize * vPictureAlpha * uResolution.y;\n\tgl_PointSize *= (1.0 / - viewPosition.z);\n}","precision highp float;\nprecision highp int;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\n\nuniform float uBlurAlpha;\nuniform float uBlurRadius;\nuniform sampler2D uMap;\nuniform bool uIsMap;\nuniform sampler2D uAlphaMap;\nuniform bool uIsAlphaMap;\nuniform float uDisplacementColorIntensity;\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\n\tvec3 finalColor = uIsMap ? texture2D(uMap,uv).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);\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}\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\";\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\";\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 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 };\n}\n\nexport const useMaterial = ({\n size,\n dpr,\n geometry,\n positions,\n uvs,\n}: {\n size: Size;\n dpr: number;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\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 const rewritedShader = 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 return new THREE.ShaderMaterial({\n vertexShader: rewritedShader,\n fragmentShader,\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 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 },\n });\n }, [geometry, modifiedPositions, modifiedUvs]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\n /** default : THREE.SphereGeometry(1, 32, 32) */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n};\n\ntype UpdateUniform = (\n props: RootState | null,\n params?: MorphParticlesParams\n) => void;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\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,\n geometry: morphGeometry,\n positions,\n uvs,\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 if (params.picture) {\n setUniform(material, \"uPicture\", params.picture);\n setUniform(material, \"uIsPicture\", true);\n } else {\n setUniform(material, \"uIsPicture\", false);\n }\n if (params.alphaPicture) {\n setUniform(material, \"uAlphaPicture\", params.alphaPicture);\n setUniform(material, \"uIsAlphaPicture\", true);\n } else {\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 {\n setUniform(material, \"uIsMap\", false);\n }\n if (params.alphaMap) {\n setUniform(material, \"uAlphaMap\", params.alphaMap);\n setUniform(material, \"uIsAlphaMap\", true);\n } else {\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 {\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 },\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\";\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 /** 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 is 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 is false. */\n alphaMap?: THREE.Texture | false;\n /** `If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: 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 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 /** you can get into the rhythm ♪ , default:false */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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.5,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","useMaterial","positions","uvs","modifiedPositions","modifiedUvs","rewritedShader","getWobble","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","object","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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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAAC,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QCAAC,GAAA;AAA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","x_google_ignoreList":[105]} \ 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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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\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 = \"\";\n if (mapArray && mapArray.length > 0) {\n textureSwitcherCode += \"if (false) {}\"; // Dummy conditions for initialisation.\n mapArray.forEach((map, index) => {\n textureSwitcherCode += ` else if (vMapArrayIndex == ${index}.0) {\\n`;\n textureSwitcherCode += ` mapArrayColor = texture2D(uMapArray${index}, uv);\\n`;\n textureSwitcherCode += `}`;\n mapArrayShader += `\n \t\t\tuniform sampler2D uMapArray${index};\n \t\t`;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \" else {\\n\";\n textureSwitcherCode += \" mapArrayColor = vec4(1.0);\\n\";\n textureSwitcherCode += \"}\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"mapArrayColor = vec4(1.0);\\n\";\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\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;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\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\";\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 is 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 is 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: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","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","object","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":[106]} \ 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 ba9ab9cd..012c684c 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hmng8/use-shader-fx", - "version": "1.1.5", + "version": "1.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hmng8/use-shader-fx", - "version": "1.1.5", + "version": "1.1.7", "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 e84e1d28..2fa4e47b 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.5", + "version": "1.1.7", "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/useMorphParticles/index.ts b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts index 51e2d733..5ac5adb8 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts @@ -15,6 +15,8 @@ export type MorphParticlesParams = { blurAlpha?: number; blurRadius?: number; pointSize?: number; + /** default:1 */ + pointAlpha?: number; /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */ picture?: THREE.Texture | false; /** 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 is false. */ @@ -27,10 +29,11 @@ export type MorphParticlesParams = { map?: THREE.Texture | false; /** 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 is false. */ alphaMap?: THREE.Texture | false; - /** `If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation` */ + /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default:0 */ wobbleStrength?: number; wobblePositionFrequency?: number; wobbleTimeFrequency?: number; + /** default:0 */ warpStrength?: number; warpPositionFrequency?: number; warpTimeFrequency?: number; @@ -40,6 +43,15 @@ export type MorphParticlesParams = { displacementIntensity?: number; /** Strength to reflect color ch of displacement texture */ displacementColorIntensity?: number; + /** If set to 0, noise calculation stops, default:0 */ + sizeRandomIntensity?: number; + sizeRandomTimeFrequency?: number; + sizeRandomMin?: number; + sizeRandomMax?: number; + /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default:0 */ + divergence?: number; + /** Divergence centre point, default:THREE.Vector3(0) */ + divergencePoint?: THREE.Vector3; /** you can get into the rhythm ♪ , default:false */ beat?: number | false; }; @@ -59,6 +71,7 @@ export const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({ blurAlpha: 0.9, blurRadius: 0.05, pointSize: 0.05, + pointAlpha: 1, picture: false, alphaPicture: false, color0: new THREE.Color(0xff0000), @@ -70,12 +83,18 @@ export const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({ wobbleStrength: 0.0, wobblePositionFrequency: 0.5, wobbleTimeFrequency: 0.5, - warpStrength: 0.5, + warpStrength: 0.0, warpPositionFrequency: 0.5, warpTimeFrequency: 0.5, displacement: false, displacementIntensity: 1, displacementColorIntensity: 0, + sizeRandomIntensity: 0, + sizeRandomTimeFrequency: 0.2, + sizeRandomMin: 0.5, + sizeRandomMax: 1.5, + divergence: 0, + divergencePoint: new THREE.Vector3(0), beat: false, }); diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.frag b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.frag index 1e9814d8..5cfb445f 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.frag +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.frag @@ -5,6 +5,7 @@ varying vec3 vColor; varying float vPictureAlpha; varying vec3 vDisplacementColor; varying float vDisplacementIntensity; +varying float vMapArrayIndex; uniform float uBlurAlpha; uniform float uBlurRadius; @@ -13,6 +14,9 @@ uniform bool uIsMap; uniform sampler2D uAlphaMap; uniform bool uIsAlphaMap; uniform float uDisplacementColorIntensity; +uniform float uPointAlpha; + +#usf void main() { vec2 uv = gl_PointCoord; @@ -22,8 +26,11 @@ void main() { float distanceToCenter = length(uv - .5); float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); - // Map if there is a map - vec3 finalColor = uIsMap ? texture2D(uMap,uv).rgb : vColor; + // Map if there is a map + vec4 mapArrayColor; + #usf + vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); + vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; // Mix with finalColor if displacement is true float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); @@ -32,5 +39,5 @@ void main() { // get alpha map float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; - gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap); + gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); } diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert index ab76ad16..bce8ff70 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert @@ -25,10 +25,21 @@ uniform sampler2D uDisplacement; uniform bool uIsDisplacement; uniform float uDisplacementIntensity; +uniform float uSizeRandomIntensity; +uniform float uSizeRandomTimeFrequency; +uniform float uSizeRandomMin; +uniform float uSizeRandomMax; + +uniform float uMapArrayLength; + +uniform float uDivergence; +uniform vec3 uDivergencePoint; + varying vec3 vColor; varying float vPictureAlpha; varying vec3 vDisplacementColor; varying float vDisplacementIntensity; +varying float vMapArrayIndex; #usf @@ -36,6 +47,11 @@ varying float vDisplacementIntensity; #usf + +float random3D(vec3 co) { + return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); +} + void main() { vec3 newPosition = position; vec2 newUv = uv; @@ -53,6 +69,14 @@ void main() { displacement *= displacementIntensity * uDisplacementIntensity; newPosition += displacement; + // divergence + vec3 divergenceDir = newPosition - uDivergencePoint; + if (uDivergence > 0.0) { + newPosition += normalize(divergenceDir) * uDivergence; + } else if (uDivergence < 0.0) { + newPosition -= normalize(divergenceDir) * abs(uDivergence); + } + // Final position vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); vec4 viewPosition = viewMatrix * modelPosition; @@ -69,6 +93,11 @@ void main() { vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; // Multiply the point size by picturAalpha. The size can also be adjusted with alphaMap. - gl_PointSize = uPointSize * vPictureAlpha * uResolution.y; + // If uSizeRandomTimeFrequency is greater than 0, the size will be randomly changed + float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; + gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; gl_PointSize *= (1.0 / - viewPosition.z); + + // mapArrayIndex + vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; } \ No newline at end of file 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 64822249..c9685131 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/useCreateMorphParticles.ts @@ -14,6 +14,8 @@ export type UseCreateMorphParticlesProps = { geometry?: THREE.BufferGeometry; positions?: Float32Array[]; uvs?: Float32Array[]; + /** Array of textures to map to points. Mapped at random. */ + mapArray?: THREE.Texture[]; }; type UpdateUniform = ( @@ -37,6 +39,7 @@ export const useCreateMorphParticles = ({ geometry, positions, uvs, + mapArray, }: Create3DHooksProps & UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => { const morphGeometry = useMemo(() => { @@ -53,6 +56,7 @@ export const useCreateMorphParticles = ({ geometry: morphGeometry, positions, uvs, + mapArray, }); const { points, interactiveMesh } = useCreateObject({ scene, @@ -76,16 +80,17 @@ export const useCreateMorphParticles = ({ setUniform(material, "uBlurAlpha", params.blurAlpha); setUniform(material, "uBlurRadius", params.blurRadius); setUniform(material, "uPointSize", params.pointSize); + setUniform(material, "uPointAlpha", params.pointAlpha); if (params.picture) { setUniform(material, "uPicture", params.picture); setUniform(material, "uIsPicture", true); - } else { + } else if (params.picture === false) { setUniform(material, "uIsPicture", false); } if (params.alphaPicture) { setUniform(material, "uAlphaPicture", params.alphaPicture); setUniform(material, "uIsAlphaPicture", true); - } else { + } else if (params.alphaPicture === false) { setUniform(material, "uIsAlphaPicture", false); } setUniform(material, "uColor0", params.color0); @@ -95,13 +100,13 @@ export const useCreateMorphParticles = ({ if (params.map) { setUniform(material, "uMap", params.map); setUniform(material, "uIsMap", true); - } else { + } else if (params.map === false) { setUniform(material, "uIsMap", false); } if (params.alphaMap) { setUniform(material, "uAlphaMap", params.alphaMap); setUniform(material, "uIsAlphaMap", true); - } else { + } else if (params.alphaMap === false) { setUniform(material, "uIsAlphaMap", false); } setUniform(material, "uWobbleStrength", params.wobbleStrength); @@ -125,7 +130,7 @@ export const useCreateMorphParticles = ({ if (params.displacement) { setUniform(material, "uDisplacement", params.displacement); setUniform(material, "uIsDisplacement", true); - } else { + } else if (params.displacement === false) { setUniform(material, "uIsDisplacement", false); } setUniform( @@ -138,6 +143,20 @@ export const useCreateMorphParticles = ({ "uDisplacementColorIntensity", params.displacementColorIntensity ); + setUniform( + material, + "uSizeRandomIntensity", + params.sizeRandomIntensity + ); + setUniform( + material, + "uSizeRandomTimeFrequency", + params.sizeRandomTimeFrequency + ); + setUniform(material, "uSizeRandomMin", params.sizeRandomMin); + setUniform(material, "uSizeRandomMax", params.sizeRandomMax); + setUniform(material, "uDivergence", params.divergence); + setUniform(material, "uDivergencePoint", params.divergencePoint); }, [material] ); diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts new file mode 100644 index 00000000..8ee41e7f --- /dev/null +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts @@ -0,0 +1,36 @@ +import * as THREE from "three"; + +export const rewriteFragmentShader = ( + mapArray: THREE.Texture[] | undefined, + fragmentShader: string +) => { + let mapArrayShader = ""; + const mapArrayUniforms: any = {}; + let textureSwitcherCode = ""; + if (mapArray && mapArray.length > 0) { + textureSwitcherCode += "if (false) {}"; // Dummy conditions for initialisation. + mapArray.forEach((map, index) => { + textureSwitcherCode += ` else if (vMapArrayIndex == ${index}.0) {\n`; + textureSwitcherCode += ` mapArrayColor = texture2D(uMapArray${index}, uv);\n`; + textureSwitcherCode += `}`; + mapArrayShader += ` + uniform sampler2D uMapArray${index}; + `; + mapArrayUniforms[`uMapArray${index}`] = { value: map }; + }); + textureSwitcherCode += " else {\n"; + textureSwitcherCode += " mapArrayColor = vec4(1.0);\n"; + textureSwitcherCode += "}"; + mapArrayShader += `bool isMapArray = true;`; + mapArrayUniforms["uMapArrayLength"] = { value: mapArray.length }; + } else { + textureSwitcherCode += "mapArrayColor = vec4(1.0);\n"; + mapArrayShader += `bool isMapArray = false;`; + mapArrayUniforms["uMapArrayLength"] = { value: 0 }; + } + const rewritedFragmentShader = fragmentShader + .replace(`#usf `, textureSwitcherCode) + .replace(`#usf `, mapArrayShader); + + return { rewritedFragmentShader, mapArrayUniforms }; +}; 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 636ae158..d2f0ede8 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 @@ -10,6 +10,7 @@ import { MORPHPARTICLES_PARAMS } from ".."; import { ISDEV } from "../../../../libs/constants"; import { rewriteVertexShader } from "./rewriteVertexShader"; import { modifyAttributes } from "./modifyAttributes"; +import { rewriteFragmentShader } from "./rewriteFragmentShader"; export class MorphParticlesMaterial extends THREE.ShaderMaterial { uniforms!: { @@ -18,6 +19,7 @@ export class MorphParticlesMaterial extends THREE.ShaderMaterial { uBlurAlpha: { value: number }; uBlurRadius: { value: number }; uPointSize: { value: number }; + uPointAlpha: { value: number }; uPicture: { value: THREE.Texture }; uIsPicture: { value: boolean }; uAlphaPicture: { value: THREE.Texture }; @@ -41,6 +43,12 @@ export class MorphParticlesMaterial extends THREE.ShaderMaterial { uIsDisplacement: { value: boolean }; uDisplacementIntensity: { value: number }; uDisplacementColorIntensity: { value: number }; + uSizeRandomIntensity: { value: number }; + uSizeRandomTimeFrequency: { value: number }; + uSizeRandomMin: { value: number }; + uSizeRandomMax: { value: number }; + uDivergence: { value: number }; + uDivergencePoint: { value: THREE.Vector3 }; }; } @@ -50,12 +58,14 @@ export const useMaterial = ({ geometry, positions, uvs, + mapArray, }: { size: Size; dpr: number; geometry: THREE.BufferGeometry; positions?: Float32Array[]; uvs?: Float32Array[]; + mapArray?: THREE.Texture[]; }) => { const modifiedPositions = useMemo( () => modifyAttributes(positions, geometry, "position", 3), @@ -73,7 +83,8 @@ export const useMaterial = ({ console.log("use-shader-fx:positions and uvs are not matched"); } - const rewritedShader = rewriteVertexShader( + // vertex + const rewritedVertexShader = rewriteVertexShader( modifiedUvs, geometry, "uv", @@ -87,9 +98,12 @@ export const useMaterial = ({ 2 ).replace(`#usf `, getWobble); + // fragment + const mapArraySwitch = rewriteFragmentShader(mapArray, fragmentShader); + return new THREE.ShaderMaterial({ - vertexShader: rewritedShader, - fragmentShader, + vertexShader: rewritedVertexShader, + fragmentShader: mapArraySwitch.rewritedFragmentShader, depthTest: false, depthWrite: false, transparent: true, @@ -100,6 +114,7 @@ export const useMaterial = ({ uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha }, uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius }, uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize }, + uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha }, uPicture: { value: new THREE.Texture() }, uIsPicture: { value: false }, uAlphaPicture: { value: new THREE.Texture() }, @@ -135,9 +150,25 @@ export const useMaterial = ({ uDisplacementColorIntensity: { value: MORPHPARTICLES_PARAMS.displacementColorIntensity, }, + uSizeRandomIntensity: { + value: MORPHPARTICLES_PARAMS.sizeRandomIntensity, + }, + uSizeRandomTimeFrequency: { + value: MORPHPARTICLES_PARAMS.sizeRandomTimeFrequency, + }, + uSizeRandomMin: { value: MORPHPARTICLES_PARAMS.sizeRandomMin }, + uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax }, + uDivergence: { value: MORPHPARTICLES_PARAMS.divergence }, + uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint }, + ...mapArraySwitch.mapArrayUniforms, }, }); - }, [geometry, modifiedPositions, modifiedUvs]) as MorphParticlesMaterial; + }, [ + geometry, + modifiedPositions, + modifiedUvs, + mapArray, + ]) as MorphParticlesMaterial; const resolution = useResolution(size, dpr); useEffect(() => { diff --git a/packages/use-shader-fx/src/libs/shaders/getWobble.glsl b/packages/use-shader-fx/src/libs/shaders/getWobble.glsl index b8754b0c..d863902f 100644 --- a/packages/use-shader-fx/src/libs/shaders/getWobble.glsl +++ b/packages/use-shader-fx/src/libs/shaders/getWobble.glsl @@ -108,4 +108,4 @@ float getWobble(vec3 position) warpedPosition * uWobblePositionFrequency, // XYZ uTime * uWobbleTimeFrequency // W )) * uWobbleStrength; -} +} \ No newline at end of file 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 35cb7ec1..f626a58a 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 @@ -8,6 +8,8 @@ export type MorphParticlesParams = { blurAlpha?: number; blurRadius?: number; pointSize?: number; + /** default:1 */ + pointAlpha?: number; /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */ picture?: THREE.Texture | false; /** 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 is false. */ @@ -20,10 +22,11 @@ export type MorphParticlesParams = { map?: THREE.Texture | false; /** 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 is false. */ alphaMap?: THREE.Texture | false; - /** `If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation` */ + /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default:0 */ wobbleStrength?: number; wobblePositionFrequency?: number; wobbleTimeFrequency?: number; + /** default:0 */ warpStrength?: number; warpPositionFrequency?: number; warpTimeFrequency?: number; @@ -33,6 +36,15 @@ export type MorphParticlesParams = { displacementIntensity?: number; /** Strength to reflect color ch of displacement texture */ displacementColorIntensity?: number; + /** If set to 0, noise calculation stops, default:0 */ + sizeRandomIntensity?: number; + sizeRandomTimeFrequency?: number; + sizeRandomMin?: number; + sizeRandomMax?: number; + /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default:0 */ + divergence?: number; + /** Divergence centre point, default:THREE.Vector3(0) */ + divergencePoint?: THREE.Vector3; /** you can get into the rhythm ♪ , default:false */ beat?: number | false; }; 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 4dcd03c8..4d988ee0 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 @@ -9,6 +9,8 @@ export type UseCreateMorphParticlesProps = { geometry?: THREE.BufferGeometry; positions?: Float32Array[]; uvs?: Float32Array[]; + /** Array of textures to map to points. Mapped at random. */ + mapArray?: THREE.Texture[]; }; type UpdateUniform = (props: RootState | null, params?: MorphParticlesParams) => void; type UseCreateMorphParticlesReturn = [ @@ -20,5 +22,5 @@ type UseCreateMorphParticlesReturn = [ uvs: Float32Array[]; } ]; -export declare const useCreateMorphParticles: ({ size, dpr, scene, geometry, positions, uvs, }: Create3DHooksProps & UseCreateMorphParticlesProps) => UseCreateMorphParticlesReturn; +export declare const useCreateMorphParticles: ({ size, dpr, scene, geometry, positions, uvs, mapArray, }: Create3DHooksProps & UseCreateMorphParticlesProps) => UseCreateMorphParticlesReturn; export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts new file mode 100644 index 00000000..c46d824e --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts @@ -0,0 +1,5 @@ +import * as THREE from "three"; +export declare const rewriteFragmentShader: (mapArray: THREE.Texture[] | undefined, fragmentShader: string) => { + rewritedFragmentShader: string; + mapArrayUniforms: any; +}; 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 d9b71a06..48d870a8 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 @@ -17,6 +17,9 @@ export declare class MorphParticlesMaterial extends THREE.ShaderMaterial { uPointSize: { value: number; }; + uPointAlpha: { + value: number; + }; uPicture: { value: THREE.Texture; }; @@ -86,14 +89,33 @@ export declare class MorphParticlesMaterial extends THREE.ShaderMaterial { uDisplacementColorIntensity: { value: number; }; + uSizeRandomIntensity: { + value: number; + }; + uSizeRandomTimeFrequency: { + value: number; + }; + uSizeRandomMin: { + value: number; + }; + uSizeRandomMax: { + value: number; + }; + uDivergence: { + value: number; + }; + uDivergencePoint: { + value: THREE.Vector3; + }; }; } -export declare const useMaterial: ({ size, dpr, geometry, positions, uvs, }: { +export declare const useMaterial: ({ size, dpr, geometry, positions, uvs, mapArray, }: { size: Size; dpr: number; geometry: THREE.BufferGeometry; positions?: Float32Array[] | undefined; uvs?: Float32Array[] | undefined; + mapArray?: THREE.Texture[] | undefined; }) => { material: MorphParticlesMaterial; modifiedPositions: Float32Array[]; diff --git a/public/playground/alphaMap.jpg b/public/playground/alphaMap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db5f2d3ed10ef123d271bd7f644da94d8a63d12c GIT binary patch literal 25897 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 WOfG=&=v@C_0cuLxia2>2%>Mxt39B;z literal 0 HcmV?d00001 diff --git a/public/playground/points/arrows-o.png b/public/playground/points/arrows-o.png new file mode 100755 index 0000000000000000000000000000000000000000..e7146c87306841899b6b106afcc03e689d04e860 GIT binary patch literal 1440 zcmX|BdsxzE6sE)rmf<~f^Cy`@bef5?i2?=!%H}1_yv$~5UaHMUyais0f<5Ie0kH%{ zRCL-_lCDh6H8t}-)H1V`X(@SuQZh(O&Ee|V^PKa&=e*~A&-eZH`9*tIlKM3cseyinK$^zRdOCZfztq+DYYufW+nKwJMJ*n(J5rqvSlJwV_A{AH z=s){X(#EeJdBYwawF7~`JTd_nbbR7Ry|pW zph_!CL)siHGYuEHHd{1QGWxNUq>}FatOUS)%vmUq5OG57-&R8auQ2urxHOEja~H~8 z>*_47jPN7*L_@}ou6aHSo+h$ZRP&+1IC_9+^q%9b%EI<|Q!4JxWIp`rUasqv8jq4c z>>gmb*Pdi-Aj=VbQ``GHGuy(7(RaJ^;7I+UUQ^ElIiiW#yZa#!N+9MkDp3} zOJfJF*Y4rL5PzzI3p-4ti3>6KiCbOhBJzda;czkr9RV<7@SMzzxI!Kr*Zj^$l0t>-?vwN17TW{0iV_?m#^J#Z5 z(rl=;+d2s22O+n7>ub#rYHgZPLX#-}WbqEBxc2GqE0TLT%RGb*<}18WZf}g@q!res zdwQw5FFrkD!6W+gb@mAO*Z4w$k8o&VEzBq>zpbnTY~_ulg$%0_Cn;jsGPI5yH;&?f z1Cq7w(8owSMCTz4w)J4zg8qGKovUxb1-FTMp7M5qzGjHNul>h;_OW*{?G`WXg)M^> zBl8cQmy+Q69d4vSK02l0U3<%@%Sxr~PyFNE7UZPXR8xPG)JKHzkr*4JBQD(Q!DX2!;XRi3+X2o@sF~y?mcTp#3moCmo zG_$f=HESWn$3STu9b(BHAyECQPM2ek-Yc(Jp4iWKIFt}vm0()@W)ZU%7aH$pMRLz_ zqF=L)rmk%*$fd9-oSjEI8@&qsUvrArl~!1-p2OT0|7`p7ovq)m&=QtP*ROja!(*Hr zo77jKCmY9?uB66Wn4_xd?Z!+kgKoTNd|_~Ft!9Wx4W6+c=o_9&H=LL-10X0&sKE?@ z2!(3tE-7KP+C(0=8}1lbY}-4+6aa<|$r&r7mlzbV4tLMSsRGNR=|VK(ZiX@?hn7K@ z60(?wIa9_%XNGFupLFIn0lIGVRMXm?`G7K$sJ4eQbzV)qBX0~qf@xbkG-&&mI0dMO zmOET5D6f)uLzBhZh;x;>p>O-_H19J7stTReoD{6Cn;9SlfD$M9mVm#`2Mo_t_0+5M zSs$g_Xa~S5kQc^G>1rRcR56EtE6p>1q+xQ-h9TvkD6MJ>1|iC5W?8+}L$~We!F?J6 zRir+qcfJGm(v?Dk=>SsY^9S|7xTi8^c=`v&bL}nuwv6|9@DYa(CO6YnlxJDnp+x{{ zU4Xkl0%lie;#JmeQCb6vDLckSBbL^s1~UPZZQ*tFzlF_c1Ty2S_R9P?EjA~H*>Y)` z5h6a_UorX)r*Rb$y90Orags1#d1ZZ7k9lNMW1RGM sdQq%-BEQ*nf0{>USy%Xnw)M1Ch-AzX2fO^CU;Vj($V5Ma7$3>_7eK7D!2kdN literal 0 HcmV?d00001 diff --git a/public/playground/points/cell-b.png b/public/playground/points/cell-b.png new file mode 100755 index 0000000000000000000000000000000000000000..5a3dd0740d0926b9ea33990a6ab6e6e425cf287f GIT binary patch literal 1513 zcmV(e0IuK$uHXQ!-~_PY2&~=#uHXT$-~+GV0j}T;vEl-*-~z7T06N$;RCPX0k7c(uHOKz-~g`R z2e07*uiyc%-~g`R0IuKxt=|By-vO@S0j}QwuHXQ#;sCDTrS=Zw0000lbW%=J00amT z?jiUm6m@tvRSiHnQtQsjn@wIMz$rv8W=20We;l{a8C!ehp@4sBX|}f4wply?00h}d zL_t(|+U=a{cA_v4fSFK<+{6|UX)9=#Uc4>u|8^@PjT)FxvRUIE=kGUzIYBY`&JcqS z*oV;`UT@;Bts>mf`yZpqcweP9!-p+QnH(_jbM?SY#~_QGnN_d|ohTca1Q71l+>onhL56YqIx8;XZ91aEG81rK)>D*=>e)Ex zv;9zT@!-spGPC4PI|sbp5O84QFyrcT_{@*_e$4WmBAneF@CRuS+gu}U5#CLAXua0(<=p0^P2wM@MeEJ^hZp;3q> zhPM4nC7(s~@GXI1wkfc%CKI)MlMN5gn&s%LK;!92E&m!F?u{QuA)fg7sFsIOT;3Z$ z@jmfH%Tmify~Hnnyf5!oan-QiUrZ6mpGGq*@0V?dDtTD_>4}#CYtLKB{LQaBECcF=5jG`nxu@c`x3!l;@O_qBZ~ zH+2UCwLB+m@jP+r$mVk$RN#w`LJqr;lbfbwUnJ zeBHI4h1h?X7?<}eY(Av?21xmnQxPZd7yJ28$cM!Ezx>EH5O9$n$xi*qPSStK)JIg> zk1+nf`H}6_{Rq)%JE6x0>#*eceG2%BWzOTpq$*#?x@SAYNe_(z?p0j|y{^O+H?WZL)9Y`NPvhL2I zyC0zOWkSeuVXp0LcUU?njQw z=5x@@rE?nmx^{yQN;aHCEH2zqRiq{D(_1{_oF8PLW&P?P#JIEy8 zbCBkIfZ*sC5FPCz%lX4>hSgycw literal 0 HcmV?d00001 diff --git a/public/playground/points/cell-g.png b/public/playground/points/cell-g.png new file mode 100755 index 0000000000000000000000000000000000000000..aaae8ea79b250a5ef4f68868c190d767c0604a77 GIT binary patch literal 1322 zcmV+_1=aeAP)tD!5b zqAIJPDyyI>tDq{Ypen1NE2^I=tDq{YpewAPE3BX@tf4Bap(?DPDyyI=tDY*Wpen4P zE3Kg_tD!2Zpj1Mgod5s;CUjCxQvd`A?GYjPC=_@=btPRzRXH~ef6h|MO&Y+rFEpB) z&}nAnp=QCxh`Lb#00cfsL_t(|+U=a{dZQo^KpBD(FR4o6rLD=PZR-0!;zrjN8!Ka^ zB-nNSo*AVQ{ooWJ{eW|j;Q)g08Y2k=3!qf6I)tDUzTrTH(BV|cWg1%-A%8vx4~w;+ z0DbOs`DMM3^%JWDiFp%h~Jm(DB2NHXgBDPVqHOalWpdSw;Qzd3W@JEyHRQx^X z&94O3<*`zQyWb=HpjUq^*UJ%{HAY&lV|G0)ygc-@=yQ)!J}7oqU)OF zuMw{s!k#y7b=Pn=&+K1Asyl~$4Y8wZZ27Sg5!&(k+VerHKk@2kcQ}~k?I#{Yn7^y? z{scj0l4m(*VAC+583#NL=RKuylB#)}>eROnqnCALb+d2t)mcX8qj!$SGF)jbp6m zM^2?}egte87=Z|l`Vq4f<*`jo?0;FBo0g&#@h=SSky5byhulb-)j*2lOX0o;$^e&YxI2*Lb_0j}~Ri2v|3{y{x* zf~D&>H2lhtAK794!xWbR16l(08$`jo_rW;ckg5DI)}P2g{DyIVB17RX!U^j~^!y0& z`r$m#_aks`KSFNkN4#bI$TU9^*f21flONgZ^2LwL*N<2=3Aag0Twl8Q5#vABdHE6Z zA2i3Z^&|Z5>qo@g{78}_{Kx!AiLU=Z{KpC7_xB?K#&7FKxRT3>&6M>clB0eF<2J4z z(Ov(6bN%%rSMkGCe~xd z_z^4j*NpHZJB-g{{m8PvX2yPG*B;V<(e(GTvg zDN(=if9iZA@JJ;Y+L z9^taS8-N`9q00#%96RU)OmcDN6OM*~5l6ph)yshPu$wg#^;G~l>;|qqEC)V0>(x&< gKBx(d1A=?}FX}ttn;v_GU;qFB07*qoM6N<$g3pJYtN;K2 literal 0 HcmV?d00001 diff --git a/public/playground/points/cell-p.png b/public/playground/points/cell-p.png new file mode 100755 index 0000000000000000000000000000000000000000..56d294ea34cbe23f0d3cbca03c5dd54c26474d5e GIT binary patch literal 1695 zcmX|>dpMhU7RN1NFm-P&ni&i$whR$%rKR3w;*uTpsxd{9HhN)7yJ}oUr0R9smS$EE zn$mRQ_G~Xo$E|KdtZUllQG-@X+@qaJrSXQ6kT;uFpLw41JLmg5=X1{a{q@Ta2@WvO zx6;?p&@dnd5<=B6Uw!g)wbWkpU;IgRs0s-R^HayUus3mq$WQw9|0kW^a1#2I~jFp$NtR!*}Efz?3e~SXkQ^HPod#-`j+MW@ITro!>y7Vh_V1GzfgZlcNv1P7XQ|&-G{-(E z=&5s%i97DS%u9Oab*WgyXVcP^FUT4i+Nnf>PZ(`-g(E&*jWy2PYpPjd?pWgMx;u4G zc`_N6TXU_DfD7Y25-&Ajy{d4L#1-1P;*NuyN7sOVkLDT&sVw~+`@FZy>W*8b6v-r$3n{Mbu>$9Vn{pVqx-miOSG*L!griK^okVf<9~I&@Hm z%hzIzUF$r69`+d7hQbFMs=3uL)}L9lVv$VduQHQ#;9YZ#$UI@2$P23m*2;Y7s5!%a z*$Kpg4@6i&@Ku+sznzp!gFk^KJGvL_BHoayI)*errUE35dym+LGmW$&?_Hl!=SKyHIUQYA0 zbNp~!o^)&_h_mT|OB}~>>&kBEZ3r^tEe$_gP7m8}Da!B{-P@g~4AULT?+=&%J^{Wp zwM?7F@yO&g_wE5aPx>`XpCamzwxh+C+Hg@rrNSYL91v=;>B;?RGcax#F%T z#mD2^R|Z&szHML5|gzH^3qVu0I62 z^Va-!lOX1_O=YD={o-!HPe&YN#qHhT^H zYmp1_I@g;GtH!Uhi#w|d1>rQCLlM+2$Hvj9QZ4r)A%0HgE<52z3e&onu`=7%|LhD$ zlM?jrUU_0lMY<&l#vE$W(-I z3F=LeVuC!N)2WDv3i@irjdItR(HLHyuzU=h8 zYUZLvqp2huSGp+2D9qXqw`8E!oU*Gk{B?v>O-0e$WZtNdixqGaYIvws%v)#Zv<=cf zGRV#JDnyF`TdEioeNosf0S9LXxP(bLOLb3GQ%Q|XK}2_e-=nY2taJZ(2R8o!oT6W5 zbRuR)w!mf?hM)!c)&Q}S)a+GIhRJ9`SY0c@=Mj4q9?IS-GQijtGo^iOV=NRZ4shhZ zbn;kk=jgujh>A~d11fvDf<3CN4Q3|dm)NnCvi^(#8>)Pk;nK1S1hs07dhdjm*+n6p z3UGTvZgNG&Tn0|P6OBFy5pn~8-Vvk(^(v~Hqt{w4H{w7ngw-@N8_Qq3xPcUmb@9gJ zX34Jy4oERpUA)C)gm4C0IJXFPY@{BB;9J|oif9#ae1v({LUm^&H35K?N@BgjjL$T# zflwQ+m0Hp!1(*OVj3-sC-Ht-+PdW!|Ena7}tl16GO#k|s5;L@k7*g+2mz-`FY%Yu! z-L*JEZ|k_(4~H3-&OVo-pR$D}6ur<}CB@F>413%VTvIaE-gWTm9;1S#3AlXhhYPLJ z`{NZT5qgg1&H60{H!mT4nV6g8B6a!<&N91{saQ@h(RGN(Y7(ooIV)f6I(V+zRsDx+ N5dDG)^}bQr{|895Yli>; literal 0 HcmV?d00001 diff --git a/public/playground/points/cell-r.png b/public/playground/points/cell-r.png new file mode 100755 index 0000000000000000000000000000000000000000..b1a33458d4bb9950cd67fc621cc3226b02a37d25 GIT binary patch literal 1514 zcmXYxdpOg39LF~sV`VHtr)guNP8Y|i2lWuSZOZM4p2%f9aui{xhMoP8LV8*o2`wgy zR4BJ7skw9^Hf&4ErMYZ&J3n>)_`crn=l%V>KhO8CZ;p=_K^yrS5(0r}yAxe} zLCsz}nlO;-B94$iDe&>|a|QK_sj0xgK!8LFArPU421pSMCO{xWYHA{N^|cTV2fa{D zO#p?06#e8{4u(*uNLza?0b9QkkTBT)S3iwNL*okywYCr({xu02aO|fCi&J113Y`WC zE(dc6g#7!|0{AkkBww#15V$6K)deIOSc<)BQfhY z6{iYLzWKXs^*I|TD>GqPk3%5vL3fvfew5+wtgzJLKXlU)!!}fGBW-6#yOup@ihi=7 zQjNghRWUHp1x5R3XHq}jNf)}0i8RqL>x08EO^*6b^Q)d3OlR?@VHegB$iB);L4O9Z zAJ!)gDa;F>B!wf{ue3PFFNW<3u)f?~?s>U9th>NKUF%$~GwPT~iMHO%kg;9Buy+P%$w=V8;cC!2!P_quTE6eE8Lr1E`*x z7yL^KrG6*A3gpv{c1E+^JFX<#*6nPwyEvMuKNNM{BJvsKe0t?I!-gW=T-Wg)ZlPBO z=~f=0HzU$Xtv$bUltQh{%X-0#9oIFu{iyT3cWgezmpq;SK2FPa=5aERI3-xq3M_`3LX>uqRwkrT`nMmq!sxTR zst~>*w!NFPH_^?zL%G;$3=r@l9~l3hvD}lbuFZ-$aad23*!DDF!sKlE-9?>4Og~1g z!24p?Kn#r26AMGOel~i2XG&%^Z@xdd-m1E?^LRs?z-^4gzHYck5@VW9$0|;V?_GZ> ze;n1K<1K2I@p~J$H5PiI2#EVx^#~lm#jxW`sI4XQRrGv(*gZv)Q7cOQG<7(B%aY0P zjS=JB>1R`HhOkV&n8jP-5WAIfA-ASJHf~EE*+)R$!b+egRwWPm(&NdvoGHV`cusN} zSB9YWwMe44%lyIKN|eAytW%-H+xI8)lpRiwZ-w&3=~C@YSt!<9CW;2v1rBc9hf`(- z6=AjX6-2I#anxbLZM)EBYGkhagW^@thf?Z32WE&eO+B+SCOi#mHLV-VERcu?$LMk_ zEh1PU z!q?Z`%)4Z_b6c?3Bi zARH}J`3S18Wo{Bisks#G#9qO-VW$h?y8LOO;&k#J zd3Nn*deR)Wg*g}9M1!X|49XZ|bgH{UxSNXjMn>>BHqbkdZ&<*`eOlR*qR37?L5sM& zOs7OH(y7J{92vn(IpIE!-QQlDzMF=3StaaWEUj9h>-N%dn7f9%TWkX@zcmXtAo~>f z154%K3N1`u&U76<)E7KM<_-N2W3EVLR{bl1Y7=@&P7BHW(qyjJK(0?X5;tieqS)&= z*3h6I?uEKs2`-q7v8;zeZAK=75&}?x-W5IJGkq4bDs{I1r&AZnM3&sf6d`K>v_4`^Hun4NHkq+fh%m8IXqC1~5*nC)@h? zt@-C^80Z|bXoKw&101D>Bk4EOf*`SZL3s(~csXm4!DGf^Y5_M0e%Mac`0C`C{ssPZ zH*SN0}y@O5p_n;BJ^33`SR2I-lM$q-jb z8OLJ$2Qd&69vvnEVP7~YKOPIXtd*=kp&E0szbqzHM?>lFM9&8+LBss>u-@huW$vMc zDRFr3m0$Tma|Pvkx?xqcj~M%c&b=k3`Usvo_=QBfzX#-4F3wwbOT@wwMp3T*Q&)

KbDv@rM=uh-39oz-+&jbx?js-UZ^$D&6RvDf1 z{K)K%`&QaYa$?6jmktFnFiN+KA^r+QagoF+JgFr!kEAkO zV5!sNX^LfS(x&&KDAStaK}Cg-uuC^#w1+d&I1PO-z+^;4!2RcBntVk`EB0-8VScs! z_r$>pl5`!NgMnX$%4(Yj;>he~2?+-g`jySQYR$kNVO;l#oqb@e3oh;#;45QN8Jhz| zFjPrAPh89XPU73C+@U`kip4)O(hS@-?_ePo04-XL!QDIIib_mQezVt>%`w6e(=+!O z=_3@AlZSCF6aJ)?a5quWNP@cMCsTxaoU-t#*0D=~{=3%K<(^9^QAqHO0XRp2jdG>B zWg-549M4acDIS$jqWWnqw-w=uy3qHdfCTw>>_#&qV`E0%#_$}UYC_btKW(0=tU}bi z#-800yCdS+-jqEonRBWOjjb_=MH?s=QvD7r^L-mc%DGlg+_EvkqLy=EC(PvL$n9nCB!@qC|&#oqa?&CiFC zJ@`XWo0oKPXSjtZPI+W!m5V_Jc4fDJgZHmE6I$YP+KG^oBs0@qnW)u8LfyHn3&K(F zSc=j7ul)}r7Y=*bxLbN#yY7@Y!dj>K9@5j7c}JIeH8kvE8}xv$T2fM^WE?N=F?|>a zmMvZSb#L-_dy6;V?L{MI*4IK`M$;bUf^Tt$0?VG0xm#Nwu#UBdmfkRU%d}&_5KKu zs+Yb=Ghw)&M+Dm>0Usw@Cc6TWU*^v?soZjKc*GzTV z_?Y@t*;3BATV1t&jRSqTPzUu${*blGpik*!GNqyRg5vsZT&84VBD7y3Q(CE?-Kw%IqhOyXHlIB?p$Ebx@Fv1?+BT>5!l`=e1*2xr?BVb6kB zW<&Ce&MjpvdO)u-VLi5AlDscI@vkPkILNQ2={-~kU<5}Z>58Nv*)VGqM5}a>-JCvu z8g&acQqe)-ZY@|4PUl5G5Kb#LLo|Y+Q493U42Sfc?t#-DJqH}kWaF*A^<=H28(25CZW(x4+4qg z!5LlA4lyR*_bM;494EZ`D5Q?pG-Aem;4KP)vKBBH zv~No-$uWnYK(#*rE%Cj`%+XTsKcka<4p4#h!q{T__7k(zW9{hXZ~6B zRD?IA%jdox3W1ApX=(RL5E&s8o74T?BM5xDlbT$Tozb4JitW>QV|=7z{=0M!?l=qX z6pMEV(Y{AT#D(15dPSEaf+w8}wc4^qMHbIq4gXw_^ySI;Si?f*fwy<#8=l-*5cnIb zm&&Ln#}@7ut~f+R$bkdB)5eC<$&(S=fM!cR-)0dzZLXWE%AWF@`8@kQ&0-i_A}%Ld zhxX}w!T!iLv~$P_Gu63a?q(awoGJ8By;(xb6il&M;if2D+@6&o9jb*p*rAT)%1gZo zH&|~S=zD%ms~A=7oqwHZff8seGFg3;gO1laCyd=hQ62 z=VAR>F6RJ7+!Kd_#+)&3}h8 zsN%B!CicHn`=PFQc~yx&dlUA`-t-KTvx4OqN*&efpX_Cj7(mL<`>D=?c!(Dt zlX>Br9x--Y*^NG!Htx+0IjD?obZL7jd&~=Xbfz25_EY4_qR#pi?bx|$GFe+@okQig zDtweXenI5)Q|C!)e_nJ4v!S!iH4*Cd;vxPV@jU&)urPX$SjAIR96sLzovLQY!2bBG;{im!*dt?g4T>nFlG?-&RDY@uT{mf0oCx*sYs2nq*&id`)AP*vJoTWU2S%Bz zDr_hm!WS3sXU|#D4CFixhl&)6gn&yR%g0?N@y~)HrWRYiR?_^Uex0ls87!iI8uNf- z29F<4e6xJg?1T9tccPa%+F=$QFp4^fxhfFitQZ;B6WV)vVlFlY|HD_>N*>trVl{=* z-dLB=Fj)2Z%Cbgq9+zWr_-R_(-=y1bj|9)nU^LeTj9G+_wK=_kmgFe(*y&gO?TN{!5S5aK1t3I8*tGfe489Zz8VHssNm zCi4DBgcr%n_-{Tp`U09@A;q1og5*+s(U3> zp@MBYxQk!6mi24tgiS@{H&a*p_S;HP8h!t>&P#qzRonm_0DR9~sH=xoB}=|50Ey^A JsIm)4{TJ@#eQ*E( literal 0 HcmV?d00001 diff --git a/public/playground/points/circles.png b/public/playground/points/circles.png new file mode 100755 index 0000000000000000000000000000000000000000..c616916eebe4e4199777bb4b4f561b0d781a008b GIT binary patch literal 4074 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 SsR4dx2y`_e8ck}?V*dx1HvdEb literal 0 HcmV?d00001 diff --git a/public/playground/points/donut-b.png b/public/playground/points/donut-b.png new file mode 100755 index 0000000000000000000000000000000000000000..1072e9f9aaf545cc4c0cecb85ab59544ee301886 GIT binary patch literal 2356 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 SP*cYD4=^^sAZdEn;{E|ZXGaeJ literal 0 HcmV?d00001 diff --git a/public/playground/points/grid-g.png b/public/playground/points/grid-g.png new file mode 100755 index 0000000000000000000000000000000000000000..118b8edc0f17b6cd571cafec499ef4ac6bf70508 GIT binary patch literal 1084 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 literal 0 HcmV?d00001 diff --git a/public/playground/points/square-grey.png b/public/playground/points/square-grey.png new file mode 100755 index 0000000000000000000000000000000000000000..bdc46d7a05c790ac74337adbc7fefb7004bfe3d9 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^9U#oY3?$D@*_Q~Uv;urWT!HjW7`CO#g8slX)KbCk+<1M<%T=XW*4qi&m7U$TE&XZxi-MtoJ_-pW@oE9Up=KQRbDc|&~D`OsTmTK_!N z`q-AymQZnMLP%J-gMw6ANkNhl&!R*(_rng4dj7I`a524PI;z5x(jXWi!Qq$1_;oA$ zN0%D{;oJhpCUXe#9-Q?}LLkww^RDANzZRDh$JffvIilZr+x$w8)GF&kMp>DQnVAoA z>U62cO86gfEMVgPG~ZW3B`@?svXZtoLucnX=P90NnniM0G-Wx1k1Sd?{b6>i&otXv z_io=ey|r!ip?RtsdzMChs|=5moj>>1rY#Sa9X)LFb#-c@zrbC_wY%h9Pn?;35E$$X Mp00i_>zopr0Mmul?EnA( literal 0 HcmV?d00001 diff --git a/public/playground/points/square-o.png b/public/playground/points/square-o.png new file mode 100755 index 0000000000000000000000000000000000000000..cc9d285dd9cfbd01a7fde0f6ae8a0feb25d3f995 GIT binary patch literal 576 zcmV-G0>AxW@M4lt%KFM(dD6?UY07kV5N_L+p@4>X1Y0kV0&s@hSiS01b3fPE!Cf z5@TW$2`3I)Pdp#+fpsVV00Fp3L_t(&-rbt9N(3@9o--^H2S!rCXr$Iabs!sHkxlYeI>$(S~@y+2F`p={-$ z?KIgejc{|e@;fYKCmq#JwpQ4ADt~*PMabRvMHM~Wh$6S2Z{F$0jiVFtZuHT+=)CmG zGwN4Hy*^^}J__5F{ur-69%i%s`K_d{+3X%`g}fil=Bif6Yi~CDS|K5|5Yjgia)}T! zV1$HZx)wI+_SMr#l+{5A=^&a2PMRRL9w%xO1lT}tagSLYjA1qIFmTdF6ZNqaP0q=% z0pm~9$1ZMFeFM=5E3SP6d@4UW570W(k)Ct zZ(~@@3kcfpU~mF*kEHEe$ACR3peKq`;)D!PGTdWek2&$<#A42Q?2ste5Fl5;Ik)F% zg1N35IMcx(HuRL;C@2NhB}RY^l?+qPV=?|jg+T6$+t{Q@nM9j{ja_}|$gvc$xLAr; zRvOoCT-tR!p1S_j*CLiS@ns literal 0 HcmV?d00001 diff --git a/public/playground/points/star-grey.png b/public/playground/points/star-grey.png new file mode 100755 index 0000000000000000000000000000000000000000..ab1417f3ba3a94daa6d48dfcb3a8b1347a3d3017 GIT binary patch literal 1599 zcmZWpeKgYx7#{qLsQzTwfdJvoRlqY`5F4Q{bo#UK)?zz3^ywCHT_kEso-oM_IBkqpMN}H7s2!t}l ziR3Bc1X;&okTT3BU#pZ+&JkA{S;oV|!=t04G8`Eh85$ar;kuTgtb{_LY$B`IuV1f= zAGItc+y2+^uk(NAALr}A_3S#@VkDEYvxuOlyB9)Hg)pY%t-Mw9koNwM`edBc*PUWT z-(i^PPwZit+_jD4QNvF+m%kq(Tu5D^H4T@;cnEqGi!ayp}ws0lIrO%<9i z1!$r+;hqGJeO`-y^X%X(_s-^e-RO34fvbRG?ABkkfM$Mr9G~&U#HpX%o!F>jaeDyQP&-uzW^-H2W{rlbuM=qFNN0~i$Ll-9*1$AM!HipkT z>BCsxChwXqLl*8fqK$2bhp}yJ^7fME^XQJlyxeivGvR0(G6iM9+A&x5NF(5t_p!MIT9Ujv&})N+at02=SQA7As$Q%Jxyo-1HtZ{bsEL*UxQyfamDZi4Og;i(%ITMx zyLh=R5QSWnns}wp0HAwj4p+JYy~8zA{_{mN0OVq`Tmk0m6r_z2j4fBUOzUIpHdu)I zm6?t`krHqNWsg<@K>b`B^zFkXxV;vAPMnY^C^@bxx~M01hTBz7ba2p6B7!MgOVTCOMvb}hB8LBE7t zstH179t*Dt&CjT1GaO^khUdl|8{u7ZdlD;H-E!qo!Ip0?ZYB2i^iNR8($HJ$tXXPQ=<$2SGP-FW z5=oeG+r)KM7&Lw%+2WofAx)l;;A8O;+6$>pD}VV-J8scfi9}`XId~Z=)29)1sVNQm zA%)WTmNetu?!0H*FWKKk7of^W$%fAn0q!t|wL!`*Vk;Hr3rzPURqi1~11pmZK&Gu(z8s2Wo77TahXT}b4B!k*P2k@3aw{P02@vL{5mG}3j+Ty8T9hj|o ztbgwfrwWi*k{ogUZK8)A=%6xle*^xnNSlL?Mf*tzCg_xq=B`Ny2P*T5ZQJ%B!izeZy)qMkYQD zfnDNj+`unQ81cvQn4RXy;(9aa^1av{%he8~i9)!n9aQr-5u&1-K!#+cDRp1!gP5h( zVgTNhPyQ`ODG0_qSI=%Z#WpL3lQz0IHS5(vJbQZ|gqpmIlZq8chxBdO-@^b=w4GH? zy6T8l%1!YDt`KwDg3DFjq%6qAslqj{>aBt?d`8kn4$&wk$JxLqt-k-Z&Jp=%97uMR zpVd9`*FfLJh@PtVLa+tyVp5i}n-7$#G(?_kcawBvRB;ZzKVVDk8w-l?XV4u<8YI3h zF*onwu})Pg?(DnkieY-RcZH*Lx+6b2Y?>~L_?|d-KFVTuUch}hwPde`6wT`Hb5rfp zQ=E8%yhXyvH*V!yCi25qq>npS4Lz;t#-6Dczm=P>A*A%HkY0Crq3q=%C}ek1tsOn# EA5KysNB{r; literal 0 HcmV?d00001 From 7700e1a59d8df2c126b33a2a3cff3ab462b70419 Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Thu, 21 Mar 2024 13:12:24 +0900 Subject: [PATCH 2/4] v1.1.8 --- app/obscurus/FxMaterial.tsx | 38 + app/obscurus/Playground.tsx | 176 ++++ app/obscurus/page.tsx | 18 + app/playground/CanvasConfig.ts | 146 --- app/playground/CustomSineCurve.tsx | 71 -- app/playground/FxMaterial.tsx | 30 + app/playground/Playground.tsx | 254 ++--- app/playground/main.frag | 7 + packages/use-shader-fx/build/use-shader-fx.js | 945 +++++++++--------- .../use-shader-fx/build/use-shader-fx.js.map | 2 +- .../use-shader-fx/build/use-shader-fx.umd.cjs | 70 +- .../build/use-shader-fx.umd.cjs.map | 2 +- packages/use-shader-fx/package-lock.json | 4 +- packages/use-shader-fx/package.json | 2 +- .../3D/useMorphParticles/shaders/main.vert | 1 + .../utils/rewriteFragmentShader.ts | 20 +- .../3D/useMorphParticles/utils/useMaterial.ts | 2 + public/alphaMap.jpg | Bin 0 -> 15796 bytes public/alphaMask.jpg | Bin 0 -> 18582 bytes public/dots.png | Bin 0 -> 786 bytes public/noiseTexture.png | Bin 0 -> 47854 bytes public/playground/alphaMap.jpg | Bin 25897 -> 0 bytes public/playground/points/antenna-y.png | Bin 3995 -> 0 bytes public/playground/points/arrows-o.png | Bin 1440 -> 0 bytes public/playground/points/cell-b.png | Bin 1513 -> 0 bytes public/playground/points/cell-g.png | Bin 1322 -> 0 bytes public/playground/points/cell-p.png | Bin 1695 -> 0 bytes public/playground/points/cell-r.png | Bin 1514 -> 0 bytes public/playground/points/circle-grey.png | Bin 1805 -> 0 bytes public/playground/points/circle-r.png | Bin 1933 -> 0 bytes public/playground/points/circles.png | Bin 4074 -> 0 bytes public/playground/points/donut-b.png | Bin 2356 -> 0 bytes public/playground/points/donut-y.png | Bin 2251 -> 0 bytes public/playground/points/grid-g.png | Bin 1084 -> 0 bytes public/playground/points/grid-p.png | Bin 1039 -> 0 bytes public/playground/points/grid-r.png | Bin 1020 -> 0 bytes public/playground/points/rhombus-b.png | Bin 952 -> 0 bytes public/playground/points/square-grey.png | Bin 474 -> 0 bytes public/playground/points/square-o.png | Bin 576 -> 0 bytes public/playground/points/star-grey.png | Bin 1599 -> 0 bytes public/snowpark.exr | Bin 0 -> 16418481 bytes 41 files changed, 897 insertions(+), 891 deletions(-) create mode 100644 app/obscurus/FxMaterial.tsx create mode 100644 app/obscurus/Playground.tsx create mode 100644 app/obscurus/page.tsx delete mode 100644 app/playground/CanvasConfig.ts delete mode 100644 app/playground/CustomSineCurve.tsx create mode 100644 app/playground/FxMaterial.tsx create mode 100644 app/playground/main.frag create mode 100644 public/alphaMap.jpg create mode 100644 public/alphaMask.jpg create mode 100644 public/dots.png create mode 100644 public/noiseTexture.png delete mode 100644 public/playground/alphaMap.jpg delete mode 100755 public/playground/points/antenna-y.png delete mode 100755 public/playground/points/arrows-o.png delete mode 100755 public/playground/points/cell-b.png delete mode 100755 public/playground/points/cell-g.png delete mode 100755 public/playground/points/cell-p.png delete mode 100755 public/playground/points/cell-r.png delete mode 100755 public/playground/points/circle-grey.png delete mode 100755 public/playground/points/circle-r.png delete mode 100755 public/playground/points/circles.png delete mode 100755 public/playground/points/donut-b.png delete mode 100755 public/playground/points/donut-y.png delete mode 100755 public/playground/points/grid-g.png delete mode 100755 public/playground/points/grid-p.png delete mode 100755 public/playground/points/grid-r.png delete mode 100755 public/playground/points/rhombus-b.png delete mode 100755 public/playground/points/square-grey.png delete mode 100755 public/playground/points/square-o.png delete mode 100755 public/playground/points/star-grey.png create mode 100644 public/snowpark.exr diff --git a/app/obscurus/FxMaterial.tsx b/app/obscurus/FxMaterial.tsx new file mode 100644 index 00000000..d1a9c743 --- /dev/null +++ b/app/obscurus/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() { + gl_FragColor = texture2D(u_fx,vUv); + // gl_FragColor = vec4(1.,1.,0.,1.); + } + ` +); diff --git a/app/obscurus/Playground.tsx b/app/obscurus/Playground.tsx new file mode 100644 index 00000000..8598a86c --- /dev/null +++ b/app/obscurus/Playground.tsx @@ -0,0 +1,176 @@ +"use client"; + +import * as THREE from "three"; +import { useEffect, useMemo } from "react"; +import { useFrame, useThree, extend, useLoader } from "@react-three/fiber"; +import { + useBeat, + useCreateWobble3D, + Wobble3DParams, + WOBBLE3D_PARAMS, + useWobble3D, + useMorphParticles, + useCreateMorphParticles, + MorphParticlesParams, + MORPHPARTICLES_PARAMS, + useNoise, + useFPSLimiter, +} from "@/packages/use-shader-fx/src"; +import { FxMaterial } from "./FxMaterial"; +import GUI from "lil-gui"; +import { useGUI } from "@/utils/useGUI"; +import { OrbitControls, Environment } from "@react-three/drei"; + +extend({ FxMaterial }); + +const CONFIG: Wobble3DParams = { + ...structuredClone(WOBBLE3D_PARAMS), + color0: new THREE.Color(0x1adb91), + color1: new THREE.Color(0xdbff57), + color2: new THREE.Color(0xdf6bff), + color3: new THREE.Color(0x9eaeff), + wobbleStrength: 0.8, + wobbleTimeFrequency: 0.4, + warpStrength: 0.2, + colorMix: 0.6, + chromaticAberration: 0.8, + anisotropicBlur: 0.2, + distortion: 2, + distortionScale: 0.8, + temporalDistortion: 0.3, +}; + +const MATERIAL_CONFIG: THREE.MeshPhysicalMaterialParameters = { + iridescence: 1, + metalness: 0.0, + roughness: 0.0, + transmission: 2, + thickness: 1, + transparent: true, +}; + +const PARTICLE_CONFIG: MorphParticlesParams = { + ...structuredClone(MORPHPARTICLES_PARAMS), + blurAlpha: 0.86, + blurRadius: 0.07, + pointSize: 0.9, + color0: new THREE.Color(0x000000), + color1: new THREE.Color(0x000000), + color2: new THREE.Color(0x000000), + color3: new THREE.Color(0x080808), + wobbleStrength: 0.8, + warpStrength: 0.7, + wobblePositionFrequency: 0.4, + wobbleTimeFrequency: 0.4, +}; + +const setGUI = (gui: GUI) => { + // gui.addColor(CONFIG, "color0"); + // gui.addColor(CONFIG, "color1"); + // gui.addColor(CONFIG, "color2"); + // gui.addColor(CONFIG, "color3"); + // gui.add(CONFIG, "wobbleStrength", 0, 10, 0.01); + // gui.add(CONFIG, "wobblePositionFrequency", 0, 10, 0.01); + // gui.add(CONFIG, "wobbleTimeFrequency", 0, 10, 0.01); + // gui.add(CONFIG, "warpStrength", 0, 10, 0.01); + // gui.add(CONFIG, "warpPositionFrequency", 0, 10, 0.01); + // gui.add(CONFIG, "warpTimeFrequency", 0, 10, 0.01); + // gui.add(CONFIG, "wobbleShine", 0, 5, 0.01); + // gui.add(CONFIG, "samples", 0, 10, 1); + // gui.add(CONFIG, "colorMix", 0, 1, 0.01); + // gui.add(CONFIG, "chromaticAberration", 0, 10, 0.01); + // gui.add(CONFIG, "anisotropicBlur", 0, 10, 0.01); + // gui.add(CONFIG, "distortion", 0, 10, 0.01); + // gui.add(CONFIG, "distortionScale", 0, 10, 0.01); + // gui.add(CONFIG, "temporalDistortion", 0, 10, 0.01); + // const mpm = gui.addFolder("MeshPhysicalMaterial"); + // mpm.add(MATERIAL_CONFIG, "iridescence", 0, 1, 0.01); + // mpm.add(MATERIAL_CONFIG, "metalness", 0, 1, 0.01); + // mpm.add(MATERIAL_CONFIG, "roughness", 0, 1, 0.01); + // mpm.add(MATERIAL_CONFIG, "transmission", 0, 10, 0.01); + // mpm.add(MATERIAL_CONFIG, "thickness", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "blurAlpha", 0, 1, 0.01); + gui.add(PARTICLE_CONFIG, "blurRadius", 0, 2, 0.01); + gui.add(PARTICLE_CONFIG, "pointSize", 0.01, 2, 0.01); + gui.addColor(PARTICLE_CONFIG, "color0"); + gui.addColor(PARTICLE_CONFIG, "color1"); + gui.addColor(PARTICLE_CONFIG, "color2"); + gui.addColor(PARTICLE_CONFIG, "color3"); + gui.add(PARTICLE_CONFIG, "wobbleStrength", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "wobblePositionFrequency", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "wobbleTimeFrequency", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "warpStrength", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "warpPositionFrequency", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "warpTimeFrequency", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "displacementIntensity", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "displacementColorIntensity", 0, 40, 0.01); + gui.add(PARTICLE_CONFIG, "sizeRandomIntensity", 0, 10, 0.01); + gui.add(PARTICLE_CONFIG, "sizeRandomTimeFrequency", 0, 3, 0.01); + gui.add(PARTICLE_CONFIG, "sizeRandomMin", 0, 1, 0.01); + gui.add(PARTICLE_CONFIG, "sizeRandomMax", 1, 2, 0.01); + gui.add(PARTICLE_CONFIG, "divergence", -2, 2, 0.1); + return gui; +}; +const setParticleConfig = () => { + return { + ...PARTICLE_CONFIG, + } as MorphParticlesParams; +}; + +export const Playground = () => { + const updateGUI = useGUI(setGUI); + const [noise] = useLoader(THREE.TextureLoader, ["/alphaMap.jpg"]); + + const { size, viewport, camera } = useThree(); + + const [updateWobble, wobble] = useCreateWobble3D({ + baseMaterial: THREE.MeshPhysicalMaterial, + materialParameters: { ...MATERIAL_CONFIG }, + }); + + const [updateParticle, particles] = useCreateMorphParticles({ + size, + dpr: viewport.dpr, + geometry: useMemo(() => new THREE.IcosahedronGeometry(2, 10), []), + }); + + useEffect(() => { + particles.points.material.blending = THREE.NormalBlending; + }, []); + + const beat = useBeat(140, "easeInOutBack"); + const limiter = useFPSLimiter(5); + + useFrame((props) => { + // updateWobble(props, { + // ...setConfig(), + // beat: beat(props.clock).beat, + // }); + // const mat = wobble.mesh.material as THREE.MeshPhysicalMaterial; + // mat.iridescence = MATERIAL_CONFIG.iridescence!; + // mat.metalness = MATERIAL_CONFIG.metalness!; + // mat.roughness = MATERIAL_CONFIG.roughness!; + // mat.transmission = MATERIAL_CONFIG.transmission!; + // mat.thickness = MATERIAL_CONFIG.thickness!; + + updateParticle(props, { + ...setParticleConfig(), + alphaMap: noise, + }); + + updateGUI(); + }); + + return ( + + + + {/* */} + + {/* + + + */} + + ); +}; diff --git a/app/obscurus/page.tsx b/app/obscurus/page.tsx new file mode 100644 index 00000000..4afc0060 --- /dev/null +++ b/app/obscurus/page.tsx @@ -0,0 +1,18 @@ +import { ShaderFx } from "../ShaderFx"; +import { Playground } from "./Playground"; + +export default function Page() { + return ( +

+ + + +
+ ); +} diff --git a/app/playground/CanvasConfig.ts b/app/playground/CanvasConfig.ts deleted file mode 100644 index 85cfc6b6..00000000 --- a/app/playground/CanvasConfig.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { MorphParticlesParams } from "@/packages/use-shader-fx/src"; -import gsap from "gsap"; -import * as THREE from "three"; - -export class CanvasConfig { - private static instance: CanvasConfig; - public texturesPath: { - alphaMap: string[]; - bgPoints: string[]; - points: string[]; - } = { - alphaMap: ["/playground/alphaMap.jpg"], - bgPoints: [ - "/playground/points/circle-grey.png", - "/playground/points/star-grey.png", - "/playground/points/square-grey.png", - ], - points: [ - "/playground/points/donut-y.png", - "/playground/points/circle-r.png", - "/playground/points/circles.png", - "/playground/points/rhombus-b.png", - "/playground/points/grid-r.png", - "/playground/points/cell-p.png", - "/playground/points/cell-g.png", - "/playground/points/antenna-y.png", - "/playground/points/cell-r.png", - "/playground/points/cell-b.png", - "/playground/points/grid-g.png", - "/playground/points/square-o.png", - "/playground/points/grid-p.png", - "/playground/points/arrows-o.png", - "/playground/points/donut-b.png", - ], - }; - public bgPointsOffset: THREE.Vector3 = new THREE.Vector3(0.4, -0.3, -0.4); - public pointsConstantParams: MorphParticlesParams = { - blurAlpha: 1, - blurRadius: 1, - pointSize: 0.12, - sizeRandomIntensity: 1.5, - sizeRandomTimeFrequency: 0.3, - sizeRandomMin: 0.5, - sizeRandomMax: 1.5, - }; - public bgPointsConstantParams: MorphParticlesParams = { - blurAlpha: 1, - blurRadius: 1, - pointSize: 0.13, - sizeRandomIntensity: 1, - sizeRandomTimeFrequency: 0.3, - sizeRandomMin: 0.5, - sizeRandomMax: 1.5, - }; - - public fxParmas: { - morphProgress: number; - yOffset: number; - divergence: number; - cameraZ: number; - } = { - yOffset: -10, - morphProgress: 0.3, - divergence: 0, - cameraZ: 0, - }; - - private constructor() {} - - public static getInstance(): CanvasConfig { - if (!CanvasConfig.instance) { - CanvasConfig.instance = new CanvasConfig(); - } - return CanvasConfig.instance; - } - - /** オープニング */ - public openingAnimate() { - gsap.to(this.fxParmas, { - yOffset: -5, - morphProgress: 0, - divergence: 0, - duration: 2, - ease: "power3.out", - }); - } - - /** スクロール連動 最初にYを0にする */ - public scrollY(y: number) { - if (this.fxParmas.yOffset >= 0) { - return; - } - // this.fxParmas.scrollY = this.fxParmas.scrollY + y; - // 一旦サンプル - gsap.to(this.fxParmas, { - yOffset: 0, - duration: 2, - ease: "power3.out", - }); - } - /** 真ん中に集める */ - public gather() { - gsap.to(this.fxParmas, { - morphProgress: 0.8, - divergence: -1, - duration: 2, - ease: "power3.out", - }); - } - /** 発散 */ - public diverge() { - gsap.to(this.fxParmas, { - divergence: 2, - duration: 2, - ease: "power3.out", - }); - } - public frameOut() { - gsap.to(this.fxParmas, { - cameraZ: -18, - duration: 3, - ease: "power2.out", - }); - } - public frameIn() { - gsap.to(this.fxParmas, { - cameraZ: 0, - duration: 3, - ease: "power2.out", - }); - gsap.to(this.fxParmas, { - divergence: -1, - duration: 3, - ease: "power2.inOut", - }); - } - public positionBottom() { - gsap.to(this.fxParmas, { - yOffset: -5, - morphProgress: 0, - divergence: 0, - duration: 3, - ease: "power2.out", - }); - } -} diff --git a/app/playground/CustomSineCurve.tsx b/app/playground/CustomSineCurve.tsx deleted file mode 100644 index 4aa714fc..00000000 --- a/app/playground/CustomSineCurve.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as THREE from "three"; -import { useRef } from "react"; -import { useFrame } from "@react-three/fiber"; -import { useBeat } from "@/packages/use-shader-fx/src"; -import { QuadraticBezierLine } from "@react-three/drei"; - -export const CustomSineCurve = ({ - start, - color, -}: { - start: THREE.Vector3; - color: THREE.ColorRepresentation; -}) => { - const ref = useRef(); - const getNormalizeRand = () => Math.random() * 2 - 1; - const curveRef = useRef({ - start: start, - mid: new THREE.Vector3( - getNormalizeRand(), - getNormalizeRand(), - getNormalizeRand() - ).add(start), - end: new THREE.Vector3( - getNormalizeRand(), - getNormalizeRand(), - getNormalizeRand() - ).add(start), - hash: 0, - destination: new THREE.Vector3(0, 0, 0), - }); - const pointerVec = useRef(new THREE.Vector2(0, 0)); - const beat = useBeat(60, "easeInOutSine"); - useFrame(({ pointer, clock }) => { - const currentPointer = pointerVec.current - .lerp(pointer, 0.05) - .multiplyScalar(1); - const { hash, fract } = beat(clock); - if (hash !== curveRef.current.hash) { - curveRef.current.hash = hash; - curveRef.current.destination - .set(getNormalizeRand(), getNormalizeRand(), getNormalizeRand()) - .add(start); - return; - } - ref.current.setPoints( - [ - curveRef.current.start.x + currentPointer.x, - curveRef.current.start.y + currentPointer.y, - curveRef.current.start.z, - ], - [ - curveRef.current.end.x - currentPointer.x, - curveRef.current.end.y - currentPointer.y, - curveRef.current.end.z, - ], - curveRef.current.mid.lerp(curveRef.current.destination, fract) - ); - }); - return ( - - - - ); -}; diff --git a/app/playground/FxMaterial.tsx b/app/playground/FxMaterial.tsx new file mode 100644 index 00000000..2f49a508 --- /dev/null +++ b/app/playground/FxMaterial.tsx @@ -0,0 +1,30 @@ +import * as THREE from "three"; +import { shaderMaterial } from "@react-three/drei"; +import fragment from "./main.frag"; + +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); + } + `, + fragment +); diff --git a/app/playground/Playground.tsx b/app/playground/Playground.tsx index e7747c73..9b3ddbad 100644 --- a/app/playground/Playground.tsx +++ b/app/playground/Playground.tsx @@ -1,186 +1,146 @@ "use client"; import * as THREE from "three"; -import { useEffect, useMemo, useRef } from "react"; -import { useFrame, useThree, useLoader } from "@react-three/fiber"; +import { use, useCallback, useEffect, useMemo, useRef } from "react"; import { + useFrame, + useThree, + extend, + useLoader, + Size, +} from "@react-three/fiber"; +import { + useMorphParticles, useCreateMorphParticles, + MORPHPARTICLES_PARAMS, MorphParticlesParams, useBeat, + useFluid, + usePointer, } from "@/packages/use-shader-fx/src"; +import { FxMaterial, FxMaterialProps } from "./FxMaterial"; import GUI from "lil-gui"; import { useGUI } from "@/utils/useGUI"; import { OrbitControls } from "@react-three/drei"; -import { CustomSineCurve } from "./CustomSineCurve"; -import { CanvasConfig } from "./CanvasConfig"; +extend({ FxMaterial }); + +const CONFIG: MorphParticlesParams = structuredClone(MORPHPARTICLES_PARAMS); const setGUI = (gui: GUI) => { - gui.add(CanvasConfig.getInstance(), "openingAnimate"); - gui.add(CanvasConfig.getInstance(), "scrollY"); - gui.add(CanvasConfig.getInstance(), "gather"); - gui.add(CanvasConfig.getInstance(), "diverge"); - gui.add(CanvasConfig.getInstance(), "frameOut"); - gui.add(CanvasConfig.getInstance(), "frameIn"); - gui.add(CanvasConfig.getInstance(), "positionBottom"); + gui.add(CONFIG, "blurAlpha", 0, 1, 0.01); + gui.add(CONFIG, "blurRadius", 0, 2, 0.01); + gui.add(CONFIG, "pointSize", 0.01, 2, 0.01); + // gui.addColor(CONFIG, "color0"); + // gui.addColor(CONFIG, "color1"); + // gui.addColor(CONFIG, "color2"); + // gui.addColor(CONFIG, "color3"); + gui.add(CONFIG, "wobbleStrength", 0, 10, 0.01); + gui.add(CONFIG, "wobblePositionFrequency", 0, 10, 0.01); + gui.add(CONFIG, "wobbleTimeFrequency", 0, 10, 0.01); + gui.add(CONFIG, "warpStrength", 0, 10, 0.01); + gui.add(CONFIG, "warpPositionFrequency", 0, 10, 0.01); + gui.add(CONFIG, "warpTimeFrequency", 0, 10, 0.01); + gui.add(CONFIG, "displacementIntensity", 0, 10, 0.01); + gui.add(CONFIG, "displacementColorIntensity", 0, 40, 0.01); + gui.add(CONFIG, "sizeRandomIntensity", 0, 10, 0.01); + gui.add(CONFIG, "sizeRandomTimeFrequency", 0, 3, 0.01); + gui.add(CONFIG, "sizeRandomMin", 0, 1, 0.01); + gui.add(CONFIG, "sizeRandomMax", 1, 2, 0.01); + gui.add(CONFIG, "divergence", -2, 2, 0.1); }; - -const DEFAULT_GEOMETRY = new THREE.PlaneGeometry(10, 10, 40, 40); -const MORPH_LSIT = [ - new THREE.IcosahedronGeometry(3, 1).attributes.position +const setConfig = () => { + return { + ...CONFIG, + } as MorphParticlesParams; +}; +const morphList = [ + new THREE.PlaneGeometry(5, 5, 100, 100).attributes.position + .array as Float32Array, + new THREE.TorusGeometry(2.5, 1, 50, 30).attributes.position .array as Float32Array, ]; -const UV_LIST = [ - new THREE.IcosahedronGeometry(3, 1).attributes.uv.array as Float32Array, +const uvList = [ + new THREE.PlaneGeometry(5, 5, 100, 100).attributes.uv.array as Float32Array, + new THREE.TorusGeometry(2.5, 1, 50, 30).attributes.uv.array as Float32Array, ]; export const Playground = () => { - const config = CanvasConfig.getInstance(); - const { size, viewport, gl } = useThree(); - - useEffect(() => { - document.documentElement.style.backgroundColor = "#FAF6F0"; - }, []); - const updateGUI = useGUI(setGUI); - - const [alphaMap] = useLoader( - THREE.TextureLoader, - config.texturesPath.alphaMap - ); - const bgPointsTextures = useLoader( - THREE.TextureLoader, - config.texturesPath.bgPoints - ); - const pointsTextures = useLoader( - THREE.TextureLoader, - config.texturesPath.points - ); - - const capablePointsTextures = useMemo(() => { - // bgの3枚ととalphamap(alphamapはbgと表面で2枚使ってる)を引いた数が、1ドローコール最大数 - const minusLength = - config.texturesPath.alphaMap.length * 2 + - config.texturesPath.bgPoints.length; - const maxLength = gl.capabilities.maxTextures - minusLength; - const textures = []; - for (let i = 0; i < maxLength; i++) { - if (pointsTextures[i]) { - textures.push(pointsTextures[i]); - } - } - return textures; - }, [ - pointsTextures, - gl.capabilities.maxTextures, - config.texturesPath.bgPoints, - config.texturesPath.alphaMap, + const [funkun, funkunAlpha, momo] = useLoader(THREE.TextureLoader, [ + "/funkun.jpg", + "/funkun-alpha.jpg", + "/momo.jpg", ]); + const { size, viewport, scene } = useThree(); - const particlesInitProps = { + const [updateFluid, setFluid, { output: fluid }] = useFluid({ size, dpr: viewport.dpr, - geometry: DEFAULT_GEOMETRY, - positions: MORPH_LSIT, - uvs: UV_LIST, - }; - const [updatePoints, points] = useCreateMorphParticles({ - ...particlesInitProps, - mapArray: capablePointsTextures, - }); - const [updatePointsBg, pointsBg] = useCreateMorphParticles({ - ...particlesInitProps, - mapArray: bgPointsTextures, }); - useEffect(() => { - [points.points.material, pointsBg.points.material].forEach((mat) => { - const material = mat as THREE.ShaderMaterial; - material.blending = THREE.NormalBlending; - material.depthTest = true; - }); - // bgの背景オフセット - pointsBg.points.position.set( - config.bgPointsOffset.x, - config.bgPointsOffset.y, - config.bgPointsOffset.z - ); - updatePoints(null, { - ...config.pointsConstantParams, - alphaPicture: alphaMap, - }); - updatePointsBg(null, { - ...config.bgPointsConstantParams, - alphaPicture: alphaMap, - }); - }, [points, updatePoints, alphaMap, pointsBg, updatePointsBg, config]); + const colorVec = new THREE.Vector3(0, 0, 0); + setFluid({ + fluid_color: (velocity: THREE.Vector2) => { + const rCol = Math.max(0.0, Math.abs(velocity.x) * 200); + const gCol = Math.max(0.0, Math.abs(velocity.y) * 100); + const bCol = Math.max(0.0, (rCol + gCol) / 2); + return colorVec.set(rCol, gCol, bCol); + }, + }); - const updateBeat = useBeat(80, "easeInOutSine"); - const pointerVec = useRef(new THREE.Vector2(0, 0)); - const divergencePointVec = useRef(new THREE.Vector3(0, 0, 0)); - const cameraVec = useRef(new THREE.Vector3(0, 0, 0)); - const divergenceVec = useRef(new THREE.Vector2(0, 0)); + const [updatePoints, points] = useCreateMorphParticles({ + scene: false, + size, + dpr: viewport.dpr, + geometry: useMemo(() => new THREE.PlaneGeometry(5, 5, 10, 10), []), + // positions: morphList, + // uvs: uvList, + // geometry: new THREE.PlaneGeometry(5, 5, 100, 100), + mapArray: useMemo( + () => [momo, funkun, funkunAlpha], + [momo, funkun, funkunAlpha] + ), + }); - const lerpV = 0.05; + const beat = useBeat(140, "easeOutCubic"); + const updatePointer = usePointer(); + const refPointer = useRef(new THREE.Vector2(0, 0)); + const handlePointerMove = (e: any) => { + if (!e?.pointer) { + return; + } + refPointer.current = e.pointer; + }; useFrame((props) => { - const { pointer, clock, camera } = props; - const currentPointer = pointerVec.current.lerp(pointer, lerpV); - const beat = updateBeat(clock); - const divergenceStrength = divergenceVec.current - .set(currentPointer.x, currentPointer.y) - .length(); - const divergencePoint = divergencePointVec.current.set( - currentPointer.x * 2, - currentPointer.y * 2, - Math.abs(currentPointer.length()) - ); - - /*=============================================== - points 更新 - ===============================================*/ - const morphP = config.fxParmas.morphProgress; - const updatePointsProps: MorphParticlesParams = { - divergence: divergenceStrength + config.fxParmas.divergence, - divergencePoint: divergencePoint, - beat: beat.beat, - morphProgress: morphP, - }; - updatePoints(props, updatePointsProps); - updatePointsBg(props, updatePointsProps); - - /*=============================================== - スクロールでy軸移動 - ===============================================*/ - const posY = config.fxParmas.yOffset; - points.points.position.y = posY; - pointsBg.points.position.y = posY + config.bgPointsOffset.y; - - /*=============================================== - camera - ===============================================*/ - camera.position.lerp( - cameraVec.current.set( - currentPointer.y * 0.3, - currentPointer.x * 0.3, - 5 + config.fxParmas.cameraZ - ), - lerpV - ); - camera.lookAt(0, 0, config.fxParmas.cameraZ); - + const b = beat(props.clock); + // updateFluid(props, { + // pointerValues: updatePointer(refPointer.current), + // }); + updatePoints(props, { + ...setConfig(), + blurRadius: 1, + pointSize: 0.3, + // displacement: fluid, + // picture: funkun, + // alphaPicture: funkunAlpha, + // map: funkun, + // alphaMap: funkunAlpha, + // beat: b.beat, + // morphProgress: Math.max(Math.sin(props.clock.getElapsedTime() / 2), 0), + // morphProgress: 0.5, + }); updateGUI(); }); return ( - {/* */} + - - {/* - */} + ); }; diff --git a/app/playground/main.frag b/app/playground/main.frag new file mode 100644 index 00000000..bdaf5c1b --- /dev/null +++ b/app/playground/main.frag @@ -0,0 +1,7 @@ +precision highp float; +varying vec2 vUv; +uniform sampler2D u_fx; + +void main() { + gl_FragColor = texture2D(u_fx,vUv); +} \ No newline at end of file diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js index bbcd0210..96cb4c34 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js +++ b/packages/use-shader-fx/build/use-shader-fx.js @@ -116,25 +116,25 @@ void main() { gl_FragColor = finalColor; }`; -const $ = (e, u = !1) => { - const o = u ? e.width * u : e.width, r = u ? e.height * u : e.height; +const E = (e, u = !1) => { + const a = u ? e.width * u : e.width, r = u ? e.height * u : e.height; return h( - () => new t.Vector2(o, r), - [o, r] + () => new t.Vector2(a, r), + [a, r] ); -}, a = (e, u, o) => { - o !== void 0 && e.uniforms && e.uniforms[u] && o !== null && (e.uniforms[u].value = o); -}, I = (e, u, o, r) => { - const n = h(() => new r(u, o), [u, o, r]); +}, i = (e, u, a) => { + a !== void 0 && e.uniforms && e.uniforms[u] && a !== null && (e.uniforms[u].value = a); +}, I = (e, u, a, r) => { + const n = h(() => new r(u, a), [u, a, r]); return F(() => { e && e.add(n); }, [e, n]), F(() => () => { - e && e.remove(n), u.dispose(), o.dispose(); - }, [e, u, o, n]), n; + e && e.remove(n), u.dispose(), a.dispose(); + }, [e, u, a, n]), n; }, he = ({ scene: e, size: u, - dpr: o + dpr: a }) => { const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ @@ -163,19 +163,19 @@ const $ = (e, u = !1) => { fragmentShader: xe }), [] - ), c = $(u, o); + ), c = E(u, a); F(() => { - a(n, "uResolution", c.clone()); + i(n, "uResolution", c.clone()); }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; }, ye = (e, u) => { - const o = u, r = e / u, [n, c] = [o * r / 2, o / 2]; + const a = u, r = e / u, [n, c] = [a * r / 2, a / 2]; return { width: n, height: c, near: -1e3, far: 1e3 }; }, z = (e, u = "OrthographicCamera") => { - const o = $(e), { width: r, height: n, near: c, far: m } = ye( - o.x, - o.y + const a = E(e), { width: r, height: n, near: c, far: m } = ye( + a.x, + a.y ); return h(() => u === "OrthographicCamera" ? new t.OrthographicCamera( -r, @@ -186,22 +186,22 @@ const $ = (e, u = !1) => { m ) : new t.PerspectiveCamera(50, r / n), [r, n, c, m, u]); }, ee = (e = 0) => { - const u = D(new t.Vector2(0, 0)), o = D(new t.Vector2(0, 0)), r = D(new t.Vector2(0, 0)), n = D(0), c = D(new t.Vector2(0, 0)), m = D(!1); + const u = D(new t.Vector2(0, 0)), a = D(new t.Vector2(0, 0)), r = D(new t.Vector2(0, 0)), n = D(0), c = D(new t.Vector2(0, 0)), m = D(!1); return b( (s) => { - const i = performance.now(); + const o = performance.now(); let l; m.current && e ? (r.current = r.current.lerp( s, 1 - e - ), l = r.current.clone()) : (l = s.clone(), r.current = l), n.current === 0 && (n.current = i, u.current = l); - const g = Math.max(1, i - n.current); - n.current = i, c.current.copy(l).sub(u.current).divideScalar(g); - const f = c.current.length() > 0, d = m.current ? u.current.clone() : l; + ), l = r.current.clone()) : (l = s.clone(), r.current = l), n.current === 0 && (n.current = o, u.current = l); + const d = Math.max(1, o - n.current); + n.current = o, c.current.copy(l).sub(u.current).divideScalar(d); + const f = c.current.length() > 0, g = m.current ? u.current.clone() : l; return !m.current && f && (m.current = !0), u.current = l, { currentPointer: l, - prevPointer: d, - diffPointer: o.current.subVectors(l, d), + prevPointer: g, + diffPointer: a.current.subVectors(l, g), velocity: c.current, isVelocityUpdate: f }; @@ -209,12 +209,12 @@ const $ = (e, u = !1) => { [e] ); }, V = (e) => { - const o = D( + const a = D( ((n) => Object.values(n).some((c) => typeof c == "function"))(e) ? e : structuredClone(e) ), r = b((n) => { for (const c in n) { const m = c; - m in o.current && n[m] !== void 0 && n[m] !== null ? o.current[m] = n[m] : console.error( + m in a.current && n[m] !== void 0 && n[m] !== null ? a.current[m] = n[m] : console.error( `"${String( m )}" does not exist in the params. or "${String( @@ -223,7 +223,7 @@ const $ = (e, u = !1) => { ); } }, []); - return [o.current, r]; + return [a.current, r]; }, Y = { minFilter: t.LinearFilter, magFilter: t.LinearFilter, @@ -232,61 +232,61 @@ const $ = (e, u = !1) => { }, ne = ({ gl: e, fbo: u, - scene: o, + scene: a, camera: r, onBeforeRender: n, onSwap: c }) => { - e.setRenderTarget(u), n(), e.clear(), e.render(o, r), c && c(), e.setRenderTarget(null), e.clear(); + e.setRenderTarget(u), n(), e.clear(), e.render(a, r), c && c(), e.setRenderTarget(null), e.clear(); }, A = ({ scene: e, camera: u, - size: o, + size: a, dpr: r = !1, isSizeUpdate: n = !1, samples: c = 0, depthBuffer: m = !1, depthTexture: v = !1 }) => { - const s = D(), i = $(o, r); + const s = D(), o = E(a, r); s.current = h( () => { - const g = new t.WebGLRenderTarget( - i.x, - i.y, + const d = new t.WebGLRenderTarget( + o.x, + o.y, { ...Y, samples: c, depthBuffer: m } ); - return v && (g.depthTexture = new t.DepthTexture( - i.x, - i.y, + return v && (d.depthTexture = new t.DepthTexture( + o.x, + o.y, t.FloatType - )), g; + )), d; }, // eslint-disable-next-line react-hooks/exhaustive-deps [] ), J(() => { - var g; - n && ((g = s.current) == null || g.setSize(i.x, i.y)); - }, [i, n]), F(() => { - const g = s.current; + var d; + n && ((d = s.current) == null || d.setSize(o.x, o.y)); + }, [o, n]), F(() => { + const d = s.current; return () => { - g == null || g.dispose(); + d == null || d.dispose(); }; }, []); const l = b( - (g, f) => { - const d = s.current; + (d, f) => { + const g = s.current; return ne({ - gl: g, - fbo: d, + gl: d, + fbo: g, scene: e, camera: u, - onBeforeRender: () => f && f({ read: d.texture }) - }), d.texture; + onBeforeRender: () => f && f({ read: g.texture }) + }), g.texture; }, [e, u] ); @@ -294,7 +294,7 @@ const $ = (e, u = !1) => { }, G = ({ scene: e, camera: u, - size: o, + size: a, dpr: r = !1, isSizeUpdate: n = !1, samples: c = 0, @@ -308,38 +308,38 @@ const $ = (e, u = !1) => { let f = this.read; this.read = this.write, this.write = f; } - }), i = $(o, r), l = h(() => { - const f = new t.WebGLRenderTarget(i.x, i.y, { + }), o = E(a, r), l = h(() => { + const f = new t.WebGLRenderTarget(o.x, o.y, { ...Y, samples: c, depthBuffer: m - }), d = new t.WebGLRenderTarget(i.x, i.y, { + }), g = new t.WebGLRenderTarget(o.x, o.y, { ...Y, samples: c, depthBuffer: m }); return v && (f.depthTexture = new t.DepthTexture( - i.x, - i.y, + o.x, + o.y, t.FloatType - ), d.depthTexture = new t.DepthTexture( - i.x, - i.y, + ), g.depthTexture = new t.DepthTexture( + o.x, + o.y, t.FloatType - )), { read: f, write: d }; + )), { read: f, write: g }; }, []); s.current.read = l.read, s.current.write = l.write, J(() => { - var f, d; - n && ((f = s.current.read) == null || f.setSize(i.x, i.y), (d = s.current.write) == null || d.setSize(i.x, i.y)); - }, [i, n]), F(() => { + var f, g; + n && ((f = s.current.read) == null || f.setSize(o.x, o.y), (g = s.current.write) == null || g.setSize(o.x, o.y)); + }, [o, n]), F(() => { const f = s.current; return () => { - var d, x; - (d = f.read) == null || d.dispose(), (x = f.write) == null || x.dispose(); + var g, x; + (g = f.read) == null || g.dispose(), (x = f.write) == null || x.dispose(); }; }, []); - const g = b( - (f, d) => { + const d = b( + (f, g) => { var p; const x = s.current; return ne({ @@ -347,7 +347,7 @@ const $ = (e, u = !1) => { scene: e, camera: u, fbo: x.write, - onBeforeRender: () => d && d({ + onBeforeRender: () => g && g({ read: x.read.texture, write: x.write.texture }), @@ -358,7 +358,7 @@ const $ = (e, u = !1) => { ); return [ { read: s.current.read, write: s.current.write }, - g + d ]; }, we = Object.freeze({ texture: !1, @@ -376,30 +376,30 @@ const $ = (e, u = !1) => { }), ht = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { - const r = h(() => new t.Scene(), []), { material: n, mesh: c } = he({ scene: r, size: e, dpr: u }), m = z(e), v = ee(), [s, i] = G({ + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = he({ scene: r, size: e, dpr: u }), m = z(e), v = ee(), [s, o] = G({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [l, g] = V(we), f = D(null); + samples: a + }), [l, d] = V(we), f = D(null); return [ b( (x, p) => { const { gl: M, pointer: y } = x; - p && g(p), l.texture ? (a(n, "uIsTexture", !0), a(n, "uTexture", l.texture)) : a(n, "uIsTexture", !1), l.map ? (a(n, "uIsMap", !0), a(n, "uMap", l.map), a(n, "uMapIntensity", l.mapIntensity)) : a(n, "uIsMap", !1), a(n, "uRadius", l.radius), a(n, "uSmudge", l.smudge), a(n, "uDissipation", l.dissipation), a(n, "uMotionBlur", l.motionBlur), a(n, "uMotionSample", l.motionSample); + p && d(p), l.texture ? (i(n, "uIsTexture", !0), i(n, "uTexture", l.texture)) : i(n, "uIsTexture", !1), l.map ? (i(n, "uIsMap", !0), i(n, "uMap", l.map), i(n, "uMapIntensity", l.mapIntensity)) : i(n, "uIsMap", !1), i(n, "uRadius", l.radius), i(n, "uSmudge", l.smudge), i(n, "uDissipation", l.dissipation), i(n, "uMotionBlur", l.motionBlur), i(n, "uMotionSample", l.motionSample); const w = l.pointerValues || v(y); - w.isVelocityUpdate && (a(n, "uMouse", w.currentPointer), a(n, "uPrevMouse", w.prevPointer)), a(n, "uVelocity", w.velocity); + w.isVelocityUpdate && (i(n, "uMouse", w.currentPointer), i(n, "uPrevMouse", w.prevPointer)), i(n, "uVelocity", w.velocity); const C = typeof l.color == "function" ? l.color(w.velocity) : l.color; - return a(n, "uColor", C), a(n, "uIsCursor", l.isCursor), a(n, "uPressureEnd", l.pressure), f.current === null && (f.current = l.pressure), a(n, "uPressureStart", f.current), f.current = l.pressure, i(M, ({ read: T }) => { - a(n, "uBuffer", T); + return i(n, "uColor", C), i(n, "uIsCursor", l.isCursor), i(n, "uPressureEnd", l.pressure), f.current === null && (f.current = l.pressure), i(n, "uPressureStart", f.current), f.current = l.pressure, o(M, ({ read: T }) => { + i(n, "uBuffer", T); }); }, - [n, v, i, l, g] + [n, v, o, l, d] ), - g, + d, { scene: r, mesh: c, @@ -692,38 +692,38 @@ const Le = () => h( ), We = ({ scene: e, size: u, - dpr: o + dpr: a }) => { - const r = h(() => new t.PlaneGeometry(2, 2), []), n = be(), c = n.clone(), m = Ae(), v = Fe(), s = _e(), i = Ce(), l = De(), g = Ve(), f = Be(), d = Le(), x = h( + const r = h(() => new t.PlaneGeometry(2, 2), []), n = be(), c = n.clone(), m = Ae(), v = Fe(), s = _e(), o = Ce(), l = De(), d = Ve(), f = Be(), g = Le(), x = h( () => ({ vorticityMaterial: v, curlMaterial: m, advectionMaterial: s, - divergenceMaterial: i, + divergenceMaterial: o, pressureMaterial: l, - clearMaterial: g, + clearMaterial: d, gradientSubtractMaterial: f, - splatMaterial: d + splatMaterial: g }), [ v, m, s, - i, + o, l, - g, + d, f, - d + g ] - ), p = $(u, o); + ), p = E(u, a); F(() => { - a( + i( x.splatMaterial, "aspectRatio", p.x / p.y ); for (const w of Object.values(x)) - a( + i( w, "texelSize", new t.Vector2(1 / p.x, 1 / p.y) @@ -743,7 +743,7 @@ const Le = () => h( [M] ); return { materials: x, setMeshMaterial: y, mesh: M }; -}, Ee = Object.freeze({ +}, $e = Object.freeze({ density_dissipation: 0.98, velocity_dissipation: 0.99, velocity_acceleration: 10, @@ -756,17 +756,17 @@ const Le = () => h( }), yt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { - const r = h(() => new t.Scene(), []), { materials: n, setMeshMaterial: c, mesh: m } = We({ scene: r, size: e, dpr: u }), v = z(e), s = ee(), i = h( + const r = h(() => new t.Scene(), []), { materials: n, setMeshMaterial: c, mesh: m } = We({ scene: r, size: e, dpr: u }), v = z(e), s = ee(), o = h( () => ({ scene: r, camera: v, size: e, - samples: o + samples: a }), - [r, v, e, o] - ), [l, g] = G(i), [f, d] = G(i), [x, p] = A(i), [M, y] = A(i), [w, C] = G(i), T = D(0), P = D(new t.Vector2(0, 0)), S = D(new t.Vector3(0, 0, 0)), [_, O] = V(Ee); + [r, v, e, a] + ), [l, d] = G(o), [f, g] = G(o), [x, p] = A(o), [M, y] = A(o), [w, C] = G(o), T = D(0), P = D(new t.Vector2(0, 0)), S = D(new t.Vector3(0, 0, 0)), [_, O] = V($e); return [ b( (W, j) => { @@ -777,21 +777,21 @@ const Le = () => h( 0.02 ); T.current = Q.getElapsedTime(); - const Z = g(L, ({ read: B }) => { - c(n.advectionMaterial), a(n.advectionMaterial, "uVelocity", B), a(n.advectionMaterial, "uSource", B), a(n.advectionMaterial, "dt", re), a( + const Z = d(L, ({ read: B }) => { + c(n.advectionMaterial), i(n.advectionMaterial, "uVelocity", B), i(n.advectionMaterial, "uSource", B), i(n.advectionMaterial, "dt", re), i( n.advectionMaterial, "dissipation", _.velocity_dissipation ); - }), me = d(L, ({ read: B }) => { - c(n.advectionMaterial), a(n.advectionMaterial, "uVelocity", Z), a(n.advectionMaterial, "uSource", B), a( + }), me = g(L, ({ read: B }) => { + c(n.advectionMaterial), i(n.advectionMaterial, "uVelocity", Z), i(n.advectionMaterial, "uSource", B), i( n.advectionMaterial, "dissipation", _.density_dissipation ); }), K = _.pointerValues || s(H); - K.isVelocityUpdate && (g(L, ({ read: B }) => { - c(n.splatMaterial), a(n.splatMaterial, "uTarget", B), a( + K.isVelocityUpdate && (d(L, ({ read: B }) => { + c(n.splatMaterial), i(n.splatMaterial, "uTarget", B), i( n.splatMaterial, "point", K.currentPointer @@ -799,62 +799,62 @@ const Le = () => h( const N = K.diffPointer.multiply( P.current.set(te.width, te.height).multiplyScalar(_.velocity_acceleration) ); - a( + i( n.splatMaterial, "color", S.current.set(N.x, N.y, 1) - ), a( + ), i( n.splatMaterial, "radius", _.splat_radius ); - }), d(L, ({ read: B }) => { - c(n.splatMaterial), a(n.splatMaterial, "uTarget", B); + }), g(L, ({ read: B }) => { + c(n.splatMaterial), i(n.splatMaterial, "uTarget", B); const N = typeof _.fluid_color == "function" ? _.fluid_color(K.velocity) : _.fluid_color; - a(n.splatMaterial, "color", N); + i(n.splatMaterial, "color", N); })); const fe = p(L, () => { - c(n.curlMaterial), a(n.curlMaterial, "uVelocity", Z); + c(n.curlMaterial), i(n.curlMaterial, "uVelocity", Z); }); - g(L, ({ read: B }) => { - c(n.vorticityMaterial), a(n.vorticityMaterial, "uVelocity", B), a(n.vorticityMaterial, "uCurl", fe), a( + d(L, ({ read: B }) => { + c(n.vorticityMaterial), i(n.vorticityMaterial, "uVelocity", B), i(n.vorticityMaterial, "uCurl", fe), i( n.vorticityMaterial, "curl", _.curl_strength - ), a(n.vorticityMaterial, "dt", re); + ), i(n.vorticityMaterial, "dt", re); }); const pe = y(L, () => { - c(n.divergenceMaterial), a(n.divergenceMaterial, "uVelocity", Z); + c(n.divergenceMaterial), i(n.divergenceMaterial, "uVelocity", Z); }); C(L, ({ read: B }) => { - c(n.clearMaterial), a(n.clearMaterial, "uTexture", B), a( + c(n.clearMaterial), i(n.clearMaterial, "uTexture", B), i( n.clearMaterial, "value", _.pressure_dissipation ); - }), c(n.pressureMaterial), a(n.pressureMaterial, "uDivergence", pe); + }), c(n.pressureMaterial), i(n.pressureMaterial, "uDivergence", pe); let oe; for (let B = 0; B < _.pressure_iterations; B++) oe = C(L, ({ read: N }) => { - a(n.pressureMaterial, "uPressure", N); + i(n.pressureMaterial, "uPressure", N); }); - return g(L, ({ read: B }) => { - c(n.gradientSubtractMaterial), a( + return d(L, ({ read: B }) => { + c(n.gradientSubtractMaterial), i( n.gradientSubtractMaterial, "uPressure", oe - ), a(n.gradientSubtractMaterial, "uVelocity", B); + ), i(n.gradientSubtractMaterial, "uVelocity", B); }), me; }, [ n, c, p, - d, + g, y, s, C, - g, + d, O, _ ] @@ -875,19 +875,19 @@ const Le = () => h( output: f.read.texture } ]; -}, $e = ({ scale: e, max: u, texture: o, scene: r }) => { +}, Ee = ({ scale: e, max: u, texture: a, scene: r }) => { const n = D([]), c = h( () => new t.PlaneGeometry(e, e), [e] ), m = h( () => new t.MeshBasicMaterial({ - map: o, + map: a, transparent: !0, blending: t.AdditiveBlending, depthTest: !1, depthWrite: !1 }), - [o] + [a] ); return F(() => { for (let v = 0; v < u; v++) { @@ -909,47 +909,47 @@ const Le = () => h( }), wt = ({ texture: e = new t.Texture(), scale: u = 64, - max: o = 100, + max: a = 100, size: r, dpr: n, samples: c = 0 }) => { - const m = h(() => new t.Scene(), []), v = $e({ + const m = h(() => new t.Scene(), []), v = Ee({ scale: u, - max: o, + max: a, texture: e, scene: m - }), s = z(r), i = ee(), [l, g] = A({ + }), s = z(r), o = ee(), [l, d] = A({ scene: m, camera: s, size: r, dpr: n, samples: c - }), [f, d] = V(qe), x = D(0); + }), [f, g] = V(qe), x = D(0); return [ b( (M, y) => { const { gl: w, pointer: C, size: T } = M; - y && d(y); - const P = f.pointerValues || i(C); + y && g(y); + const P = f.pointerValues || o(C); if (f.frequency < P.diffPointer.length()) { const S = v[x.current]; S.visible = !0, S.position.set( P.currentPointer.x * (T.width / 2), P.currentPointer.y * (T.height / 2), 0 - ), S.scale.x = S.scale.y = 0, S.material.opacity = f.alpha, x.current = (x.current + 1) % o; + ), S.scale.x = S.scale.y = 0, S.material.opacity = f.alpha, x.current = (x.current + 1) % a; } return v.forEach((S) => { if (S.visible) { const _ = S.material; S.rotation.z += f.rotation, _.opacity *= f.fadeout_speed, S.scale.x = f.fadeout_speed * S.scale.x + f.scale, S.scale.y = S.scale.x, _.opacity < 2e-3 && (S.visible = !1); } - }), g(w); + }), d(w); }, - [g, v, i, o, f, d] + [d, v, o, a, f, g] ), - d, + g, { scene: m, camera: s, @@ -1039,7 +1039,7 @@ void main() { gl_FragColor = vec4(vec3(noise),1.0); }`; const ke = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { uTime: { value: 0 }, @@ -1055,8 +1055,8 @@ const ke = (e) => { fragmentShader: Ne }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, Ge = Object.freeze({ scale: 4e-3, timeStrength: 0.3, @@ -1069,22 +1069,22 @@ const ke = (e) => { }), Mt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = ke(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(Ge); + samples: a + }), [o, l] = V(Ge); return [ b( - (f, d) => { + (f, g) => { const { gl: x, clock: p } = f; - return d && l(d), a(n, "scale", i.scale), a(n, "timeStrength", i.timeStrength), a(n, "noiseOctaves", i.noiseOctaves), a(n, "fbmOctaves", i.fbmOctaves), a(n, "warpOctaves", i.warpOctaves), a(n, "warpDirection", i.warpDirection), a(n, "warpStrength", i.warpStrength), a(n, "uTime", i.beat || p.getElapsedTime()), s(x); + return g && l(g), i(n, "scale", o.scale), i(n, "timeStrength", o.timeStrength), i(n, "noiseOctaves", o.noiseOctaves), i(n, "fbmOctaves", o.fbmOctaves), i(n, "warpOctaves", o.warpOctaves), i(n, "warpDirection", o.warpDirection), i(n, "warpStrength", o.warpStrength), i(n, "uTime", o.beat || p.getElapsedTime()), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1146,7 +1146,7 @@ void main() { gl_FragColor = vec4(col, alpha); }`; const Ye = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1167,8 +1167,8 @@ const Ye = (e) => { fragmentShader: Xe }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, He = Object.freeze({ texture: !1, scale: 1, @@ -1184,22 +1184,22 @@ const Ye = (e) => { }), bt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Ye(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(He); + samples: a + }), [o, l] = V(He); return [ b( - (f, d) => { + (f, g) => { const { gl: x, clock: p } = f; - return d && l(d), i.texture ? (a(n, "uTexture", i.texture), a(n, "isTexture", !0)) : (a(n, "isTexture", !1), a(n, "scale", i.scale)), i.noise ? (a(n, "noise", i.noise), a(n, "isNoise", !0), a(n, "noiseStrength", i.noiseStrength)) : a(n, "isNoise", !1), a(n, "uTime", i.beat || p.getElapsedTime()), a(n, "laminateLayer", i.laminateLayer), a(n, "laminateInterval", i.laminateInterval), a(n, "laminateDetail", i.laminateDetail), a(n, "distortion", i.distortion), a(n, "colorFactor", i.colorFactor), a(n, "timeStrength", i.timeStrength), s(x); + return g && l(g), o.texture ? (i(n, "uTexture", o.texture), i(n, "isTexture", !0)) : (i(n, "isTexture", !1), i(n, "scale", o.scale)), o.noise ? (i(n, "noise", o.noise), i(n, "isNoise", !0), i(n, "noiseStrength", o.noiseStrength)) : i(n, "isNoise", !1), i(n, "uTime", o.beat || p.getElapsedTime()), i(n, "laminateLayer", o.laminateLayer), i(n, "laminateInterval", o.laminateInterval), i(n, "laminateDetail", o.laminateDetail), i(n, "distortion", o.distortion), i(n, "colorFactor", o.colorFactor), i(n, "timeStrength", o.timeStrength), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1244,7 +1244,7 @@ void main() { gl_FragColor = vec4(color,1.); }`; const Je = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { u_time: { value: 0 }, @@ -1259,8 +1259,8 @@ const Je = (e) => { fragmentShader: Ze }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, en = Object.freeze({ pattern: 0, complexity: 2, @@ -1272,26 +1272,26 @@ const Je = (e) => { }), St = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Je(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(en); + samples: a + }), [o, l] = V(en); return [ b( - (f, d) => { + (f, g) => { const { gl: x, clock: p } = f; - return d && l(d), a(n, "u_pattern", i.pattern), a(n, "u_complexity", i.complexity), a( + return g && l(g), i(n, "u_pattern", o.pattern), i(n, "u_complexity", o.complexity), i( n, "u_complexityAttenuation", - i.complexityAttenuation - ), a(n, "u_iterations", i.iterations), a(n, "u_timeStrength", i.timeStrength), a(n, "u_scale", i.scale), a(n, "u_time", i.beat || p.getElapsedTime()), s(x); + o.complexityAttenuation + ), i(n, "u_iterations", o.iterations), i(n, "u_timeStrength", o.timeStrength), i(n, "u_scale", o.scale), i(n, "u_time", o.beat || p.getElapsedTime()), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1340,7 +1340,7 @@ void main() { gl_FragColor = vec4(outColor, tex.a); }`; const rn = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1354,8 +1354,8 @@ const rn = (e) => { fragmentShader: tn }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, on = Object.freeze({ texture: new t.Texture(), color1: new t.Color().set(0.5, 0.5, 0.5), @@ -1366,22 +1366,22 @@ const rn = (e) => { }), _t = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = rn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(on); + samples: a + }), [o, l] = V(on); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "uTexture", i.texture), a(n, "uColor1", i.color1), a(n, "uColor2", i.color2), a(n, "uColor3", i.color3), a(n, "uColor4", i.color4), a(n, "uRgbWeight", i.rgbWeight), s(x); + return g && l(g), i(n, "uTexture", o.texture), i(n, "uColor1", o.color1), i(n, "uColor2", o.color2), i(n, "uColor3", o.color3), i(n, "uColor4", o.color4), i(n, "uRgbWeight", o.rgbWeight), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1415,7 +1415,7 @@ void main() { gl_FragColor = vec4(duotone, texColor.a); }`; const sn = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -1426,8 +1426,8 @@ const sn = (e) => { fragmentShader: un }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, ln = { texture: new t.Texture(), color0: new t.Color(16777215), @@ -1435,22 +1435,22 @@ const sn = (e) => { }, Tt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = sn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(ln); + samples: a + }), [o, l] = V(ln); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "uTexture", i.texture), a(n, "uColor0", i.color0), a(n, "uColor1", i.color1), s(x); + return g && l(g), i(n, "uTexture", o.texture), i(n, "uColor0", o.color0), i(n, "uColor1", o.color1), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1510,7 +1510,7 @@ void main() { gl_FragColor = vec4(alphColor, alpha); }`; const mn = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -1528,8 +1528,8 @@ const mn = (e) => { fragmentShader: vn }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, fn = { texture: new t.Texture(), map: new t.Texture(), @@ -1542,22 +1542,22 @@ const mn = (e) => { }, Ct = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = mn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(fn); + samples: a + }), [o, l] = V(fn); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "u_texture", i.texture), a(n, "u_map", i.map), a(n, "u_mapIntensity", i.mapIntensity), i.alphaMap ? (a(n, "u_alphaMap", i.alphaMap), a(n, "u_isAlphaMap", !0)) : a(n, "u_isAlphaMap", !1), a(n, "u_brightness", i.brightness), a(n, "u_min", i.min), a(n, "u_max", i.max), i.dodgeColor ? (a(n, "u_dodgeColor", i.dodgeColor), a(n, "u_isDodgeColor", !0)) : a(n, "u_isDodgeColor", !1), s(x); + return g && l(g), i(n, "u_texture", o.texture), i(n, "u_map", o.map), i(n, "u_mapIntensity", o.mapIntensity), o.alphaMap ? (i(n, "u_alphaMap", o.alphaMap), i(n, "u_isAlphaMap", !0)) : i(n, "u_isAlphaMap", !1), i(n, "u_brightness", o.brightness), i(n, "u_min", o.min), i(n, "u_max", o.max), o.dodgeColor ? (i(n, "u_dodgeColor", o.dodgeColor), i(n, "u_isDodgeColor", !0)) : i(n, "u_isDodgeColor", !1), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1645,7 +1645,7 @@ void main() { const gn = ({ scene: e, size: u, - dpr: o + dpr: a }) => { const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ @@ -1667,9 +1667,9 @@ const gn = ({ fragmentShader: dn }), [] - ), c = $(u, o); + ), c = E(u, a); F(() => { - a(n, "uResolution", c.clone()); + i(n, "uResolution", c.clone()); }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; @@ -1686,32 +1686,32 @@ const gn = ({ }, Pt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = gn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, dpr: u, size: e, - samples: o, + samples: a, isSizeUpdate: !0 - }), [i, l] = V(xn); + }), [o, l] = V(xn); return [ b( - (f, d) => { - var w, C, T, P, S, _, O, E; + (f, g) => { + var w, C, T, P, S, _, O, $; const { gl: x } = f; - d && l(d), a(n, "uTexture0", i.texture0), a(n, "uTexture1", i.texture1), a(n, "progress", i.progress); + g && l(g), i(n, "uTexture0", o.texture0), i(n, "uTexture1", o.texture1), i(n, "progress", o.progress); const p = [ - ((C = (w = i.texture0) == null ? void 0 : w.image) == null ? void 0 : C.width) || 0, - ((P = (T = i.texture0) == null ? void 0 : T.image) == null ? void 0 : P.height) || 0 + ((C = (w = o.texture0) == null ? void 0 : w.image) == null ? void 0 : C.width) || 0, + ((P = (T = o.texture0) == null ? void 0 : T.image) == null ? void 0 : P.height) || 0 ], M = [ - ((_ = (S = i.texture1) == null ? void 0 : S.image) == null ? void 0 : _.width) || 0, - ((E = (O = i.texture1) == null ? void 0 : O.image) == null ? void 0 : E.height) || 0 - ], y = p.map((W, j) => W + (M[j] - W) * i.progress); - return a(n, "uTextureResolution", y), a(n, "padding", i.padding), a(n, "uMap", i.map), a(n, "mapIntensity", i.mapIntensity), a(n, "edgeIntensity", i.edgeIntensity), a(n, "epicenter", i.epicenter), a(n, "dirX", i.dir.x), a(n, "dirY", i.dir.y), s(x); + ((_ = (S = o.texture1) == null ? void 0 : S.image) == null ? void 0 : _.width) || 0, + (($ = (O = o.texture1) == null ? void 0 : O.image) == null ? void 0 : $.height) || 0 + ], y = p.map((W, j) => W + (M[j] - W) * o.progress); + return i(n, "uTextureResolution", y), i(n, "padding", o.padding), i(n, "uMap", o.map), i(n, "mapIntensity", o.mapIntensity), i(n, "edgeIntensity", o.edgeIntensity), i(n, "epicenter", o.epicenter), i(n, "dirX", o.dir.x), i(n, "dirY", o.dir.y), s(x); }, - [s, n, i, l] + [s, n, o, l] ), l, { @@ -1745,7 +1745,7 @@ void main() { gl_FragColor = vec4(color, alpha); }`; const wn = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -1757,8 +1757,8 @@ const wn = (e) => { fragmentShader: yn }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, Mn = { texture: new t.Texture(), brightness: new t.Vector3(0.5, 0.5, 0.5), @@ -1767,24 +1767,24 @@ const wn = (e) => { }, Dt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = wn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V( + samples: a + }), [o, l] = V( Mn ); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "u_texture", i.texture), a(n, "u_brightness", i.brightness), a(n, "u_min", i.min), a(n, "u_max", i.max), s(x); + return g && l(g), i(n, "u_texture", o.texture), i(n, "u_brightness", o.brightness), i(n, "u_min", o.min), i(n, "u_max", o.max), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1822,7 +1822,7 @@ void main() { gl_FragColor = texture2D(u_texture, uv); }`; const _n = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { u_texture: { value: new t.Texture() }, @@ -1833,8 +1833,8 @@ const _n = (e) => { fragmentShader: Sn }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, Tn = { texture: new t.Texture(), map: new t.Texture(), @@ -1842,22 +1842,22 @@ const _n = (e) => { }, Rt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = _n(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(Tn); + samples: a + }), [o, l] = V(Tn); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "u_texture", i.texture), a(n, "u_map", i.map), a(n, "u_mapIntensity", i.mapIntensity), s(x); + return g && l(g), i(n, "u_texture", o.texture), i(n, "u_map", o.map), i(n, "u_mapIntensity", o.mapIntensity), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -1891,7 +1891,7 @@ void main() { const Dn = ({ scene: e, size: u, - dpr: o + dpr: a }) => { const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ @@ -1911,22 +1911,22 @@ const Dn = ({ }, At = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Dn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(Rn); + samples: a + }), [o, l] = V(Rn); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "uTexture", i.texture), a(n, "uMap", i.map), s(x); + return g && l(g), i(n, "uTexture", o.texture), i(n, "uMap", o.map), s(x); }, - [n, s, i, l] + [n, s, o, l] ), l, { @@ -1980,7 +1980,7 @@ void main() { const Fn = ({ scene: e, size: u, - dpr: o + dpr: a }) => { const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ @@ -2002,22 +2002,22 @@ const Fn = ({ }, It = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Fn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(zn); + samples: a + }), [o, l] = V(zn); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "u_texture", i.texture), a(n, "u_brightness", i.brightness), a(n, "u_saturation", i.saturation), s(x); + return g && l(g), i(n, "u_texture", o.texture), i(n, "u_brightness", o.brightness), i(n, "u_saturation", o.saturation), s(x); }, - [n, s, i, l] + [n, s, o, l] ), l, { @@ -2057,7 +2057,7 @@ void main() { const Bn = ({ scene: e, size: u, - dpr: o + dpr: a }) => { const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ @@ -2070,9 +2070,9 @@ const Bn = ({ fragmentShader: Un }), [] - ), c = $(u, o); + ), c = E(u, a); F(() => { - a(n, "uResolution", c.clone()); + i(n, "uResolution", c.clone()); }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; @@ -2081,27 +2081,27 @@ const Bn = ({ }, Ft = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Bn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, dpr: u, size: e, - samples: o, + samples: a, isSizeUpdate: !0 - }), [i, l] = V(On); + }), [o, l] = V(On); return [ b( - (f, d) => { + (f, g) => { var p, M, y, w, C, T; const { gl: x } = f; - return d && l(d), a(n, "uTexture", i.texture), a(n, "uTextureResolution", [ - ((y = (M = (p = i.texture) == null ? void 0 : p.source) == null ? void 0 : M.data) == null ? void 0 : y.width) || 0, - ((T = (C = (w = i.texture) == null ? void 0 : w.source) == null ? void 0 : C.data) == null ? void 0 : T.height) || 0 + return g && l(g), i(n, "uTexture", o.texture), i(n, "uTextureResolution", [ + ((y = (M = (p = o.texture) == null ? void 0 : p.source) == null ? void 0 : M.data) == null ? void 0 : y.width) || 0, + ((T = (C = (w = o.texture) == null ? void 0 : w.source) == null ? void 0 : C.data) == null ? void 0 : T.height) || 0 ]), s(x); }, - [s, n, i, l] + [s, n, o, l] ), l, { @@ -2147,8 +2147,8 @@ void main() { gl_FragColor = outColor; }`; -const En = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( +const $n = (e) => { + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { uTexture: { value: new t.Texture() }, @@ -2159,8 +2159,8 @@ const En = (e) => { fragmentShader: Wn }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, le = Object.freeze({ texture: new t.Texture(), blurSize: 3, @@ -2168,36 +2168,36 @@ const En = (e) => { }), zt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { - const r = h(() => new t.Scene(), []), { material: n, mesh: c } = En(r), m = z(e), v = h( + const r = h(() => new t.Scene(), []), { material: n, mesh: c } = $n(r), m = z(e), v = h( () => ({ scene: r, camera: m, size: e, dpr: u, - samples: o + samples: a }), - [r, m, e, u, o] - ), [s, i] = A(v), [l, g] = G(v), [f, d] = V(le); + [r, m, e, u, a] + ), [s, o] = A(v), [l, d] = G(v), [f, g] = V(le); return [ b( (p, M) => { - var T, P, S, _, O, E; + var T, P, S, _, O, $; const { gl: y } = p; - M && d(M), a(n, "uTexture", f.texture), a(n, "uResolution", [ + M && g(M), i(n, "uTexture", f.texture), i(n, "uResolution", [ ((S = (P = (T = f.texture) == null ? void 0 : T.source) == null ? void 0 : P.data) == null ? void 0 : S.width) || 0, - ((E = (O = (_ = f.texture) == null ? void 0 : _.source) == null ? void 0 : O.data) == null ? void 0 : E.height) || 0 - ]), a(n, "uBlurSize", f.blurSize); - let w = g(y); + (($ = (O = (_ = f.texture) == null ? void 0 : _.source) == null ? void 0 : O.data) == null ? void 0 : $.height) || 0 + ]), i(n, "uBlurSize", f.blurSize); + let w = d(y); const C = f.blurPower; for (let W = 0; W < C; W++) - a(n, "uTexture", w), w = g(y); - return i(y); + i(n, "uTexture", w), w = d(y); + return o(y); }, - [i, g, n, d, f] + [o, d, n, g, f] ), - d, + g, { scene: r, mesh: c, @@ -2208,7 +2208,7 @@ const En = (e) => { } ]; }; -var $n = `varying vec2 vUv; +var En = `varying vec2 vUv; void main() { vUv = uv; @@ -2264,7 +2264,7 @@ void main() { gl_FragColor = vec4(color, 1.0); }`; const jn = (e) => { - const u = h(() => new t.PlaneGeometry(2, 2), []), o = h( + const u = h(() => new t.PlaneGeometry(2, 2), []), a = h( () => new t.ShaderMaterial({ uniforms: { uEpicenter: { value: k.epicenter }, @@ -2273,12 +2273,12 @@ const jn = (e) => { uWidth: { value: k.width }, uMode: { value: 0 } }, - vertexShader: $n, + vertexShader: En, fragmentShader: qn }), [] - ), r = I(e, u, o, t.Mesh); - return { material: o, mesh: r }; + ), r = I(e, u, a, t.Mesh); + return { material: a, mesh: r }; }, k = Object.freeze({ epicenter: new t.Vector2(0, 0), progress: 0, @@ -2288,27 +2288,27 @@ const jn = (e) => { }), Vt = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = jn(r), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o, + samples: a, isSizeUpdate: !0 - }), [i, l] = V(k); + }), [o, l] = V(k); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "uEpicenter", i.epicenter), a(n, "uProgress", i.progress), a(n, "uWidth", i.width), a(n, "uStrength", i.strength), a( + return g && l(g), i(n, "uEpicenter", o.epicenter), i(n, "uProgress", o.progress), i(n, "uWidth", o.width), i(n, "uStrength", o.strength), i( n, "uMode", - i.mode === "center" ? 0 : i.mode === "horizontal" ? 1 : 2 + o.mode === "center" ? 0 : o.mode === "horizontal" ? 1 : 2 ), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -2398,7 +2398,7 @@ void main() { const Gn = ({ scene: e, size: u, - dpr: o + dpr: a }) => { const r = h(() => new t.PlaneGeometry(2, 2), []), n = h( () => new t.ShaderMaterial({ @@ -2418,9 +2418,9 @@ const Gn = ({ fragmentShader: kn }), [] - ), c = $(u, o); + ), c = E(u, a); F(() => { - a(n, "u_resolution", c.clone()); + i(n, "u_resolution", c.clone()); }, [c, n]); const m = I(e, r, n, t.Mesh); return { material: n, mesh: m }; @@ -2437,22 +2437,22 @@ const Gn = ({ }), Ut = ({ size: e, dpr: u, - samples: o = 0 + samples: a = 0 }) => { const r = h(() => new t.Scene(), []), { material: n, mesh: c } = Gn({ scene: r, size: e, dpr: u }), m = z(e), [v, s] = A({ scene: r, camera: m, size: e, dpr: u, - samples: o - }), [i, l] = V(Kn); + samples: a + }), [o, l] = V(Kn); return [ b( - (f, d) => { + (f, g) => { const { gl: x } = f; - return d && l(d), a(n, "u_texture", i.texture), a(n, "u_keyColor", i.keyColor), a(n, "u_similarity", i.similarity), a(n, "u_smoothness", i.smoothness), a(n, "u_spill", i.spill), a(n, "u_color", i.color), a(n, "u_contrast", i.contrast), a(n, "u_brightness", i.brightness), a(n, "u_gamma", i.gamma), s(x); + return g && l(g), i(n, "u_texture", o.texture), i(n, "u_keyColor", o.keyColor), i(n, "u_similarity", o.similarity), i(n, "u_smoothness", o.smoothness), i(n, "u_spill", o.spill), i(n, "u_color", o.color), i(n, "u_contrast", o.contrast), i(n, "u_brightness", o.brightness), i(n, "u_gamma", o.gamma), s(x); }, - [s, n, l, i] + [s, n, l, o] ), l, { @@ -2467,12 +2467,12 @@ const Gn = ({ }, Xn = ({ scene: e, geometry: u, - material: o + material: a }) => { - const r = I(e, u, o, t.Points), n = I( + const r = I(e, u, a, t.Points), n = I( e, h(() => u.clone(), [u]), - h(() => o.clone(), [o]), + h(() => a.clone(), [a]), t.Mesh ); return n.visible = !1, { @@ -2565,6 +2565,7 @@ void main() { float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; + gl_Position = projectedPosition += wobble; @@ -2731,9 +2732,9 @@ float getWobble(vec3 position) uTime * uWobbleTimeFrequency )) * uWobbleStrength; }`; -const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { +const ve = process.env.NODE_ENV === "development", ie = (e, u, a, r, n) => { var l; - const c = o === "position" ? "positionTarget" : "uvTarget", m = o === "position" ? "#usf " : "#usf ", v = o === "position" ? "#usf " : "#usf ", s = o === "position" ? "positionsList" : "uvsList", i = o === "position" ? ` + const c = a === "position" ? "positionTarget" : "uvTarget", m = a === "position" ? "#usf " : "#usf ", v = a === "position" ? "#usf " : "#usf ", s = a === "position" ? "positionsList" : "uvsList", o = a === "position" ? ` float scaledProgress = uMorphProgress * ${e.length - 1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length - 1}); @@ -2742,99 +2743,95 @@ const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { newPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress); ` : "newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);"; if (e.length > 0) { - u.deleteAttribute(o), u.setAttribute( - o, + u.deleteAttribute(a), u.setAttribute( + a, new t.BufferAttribute(e[0], n) ); - let g = "", f = ""; - e.forEach((d, x) => { + let d = "", f = ""; + e.forEach((g, x) => { u.setAttribute( `${c}${x}`, - new t.BufferAttribute(d, n) - ), g += `attribute vec${n} ${c}${x}; + new t.BufferAttribute(g, n) + ), d += `attribute vec${n} ${c}${x}; `, x === 0 ? f += `${c}${x}` : f += `,${c}${x}`; }), r = r.replace( `${m}`, - g + d ), r = r.replace( `${v}`, `vec${n} ${s}[${e.length}] = vec${n}[](${f}); - ${i} + ${o} ` ); } else - r = r.replace(`${m}`, ""), r = r.replace(`${v}`, ""), (l = u == null ? void 0 : u.attributes[o]) != null && l.array || ve && console.error( - `use-shader-fx:geometry.attributes.${o}.array is not found` + r = r.replace(`${m}`, ""), r = r.replace(`${v}`, ""), (l = u == null ? void 0 : u.attributes[a]) != null && l.array || ve && console.error( + `use-shader-fx:geometry.attributes.${a}.array is not found` ); return r; -}, ue = (e, u, o, r) => { +}, ue = (e, u, a, r) => { var c; let n = []; if (e && e.length > 0) { - (c = u == null ? void 0 : u.attributes[o]) != null && c.array ? n = [ - u.attributes[o].array, + (c = u == null ? void 0 : u.attributes[a]) != null && c.array ? n = [ + u.attributes[a].array, ...e ] : n = e; const m = Math.max(...n.map((v) => v.length)); n.forEach((v, s) => { if (v.length < m) { - const i = (m - v.length) / r, l = [], g = Array.from(v); - for (let f = 0; f < i; f++) { - const d = Math.floor(v.length / r * Math.random()) * r; + const o = (m - v.length) / r, l = [], d = Array.from(v); + for (let f = 0; f < o; f++) { + const g = Math.floor(v.length / r * Math.random()) * r; for (let x = 0; x < r; x++) - l.push(g[d + x]); + l.push(d[g + x]); } - n[s] = new Float32Array([...g, ...l]); + n[s] = new Float32Array([...d, ...l]); } }); } return n; }, Qn = (e, u) => { - let o = ""; + let a = ""; const r = {}; - let n = ""; - return e && e.length > 0 ? (n += "if (false) {}", e.forEach((m, v) => { - n += ` else if (vMapArrayIndex == ${v}.0) { -`, n += ` mapArrayColor = texture2D(uMapArray${v}, uv); -`, n += "}", o += ` - uniform sampler2D uMapArray${v}; - `, r[`uMapArray${v}`] = { value: m }; - }), n += ` else { -`, n += ` mapArrayColor = vec4(1.0); -`, n += "}", o += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (n += `mapArrayColor = vec4(1.0); -`, o += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: u.replace("#usf ", n).replace("#usf ", o), mapArrayUniforms: r }; + let n = "mapArrayColor = "; + return e && e.length > 0 ? (e.forEach((m, v) => { + const s = `vMapArrayIndex < ${v}.1`, o = `texture2D(uMapArray${v}, uv)`; + n += `( ${s} ) ? ${o} : `, a += ` + uniform sampler2D uMapArray${v}; + `, r[`uMapArray${v}`] = { value: m }; + }), n += "vec4(1.);", a += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (n += "vec4(1.0);", a += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: u.replace("#usf ", n).replace("#usf ", a), mapArrayUniforms: r }; }, Zn = ({ size: e, dpr: u, - geometry: o, + geometry: a, positions: r, uvs: n, mapArray: c }) => { const m = h( - () => ue(r, o, "position", 3), - [r, o] + () => ue(r, a, "position", 3), + [r, a] ), v = h( - () => ue(n, o, "uv", 2), - [n, o] + () => ue(n, a, "uv", 2), + [n, a] ), s = h(() => { m.length !== v.length && ve && console.log("use-shader-fx:positions and uvs are not matched"); const l = ie( v, - o, + a, "uv", ie( m, - o, + a, "position", Yn, 3 ), 2 - ).replace("#usf ", ce), g = Qn(c, Hn); - return new t.ShaderMaterial({ + ).replace("#usf ", ce), d = Qn(c, Hn); + return console.log(d.rewritedFragmentShader), new t.ShaderMaterial({ vertexShader: l, - fragmentShader: g.rewritedFragmentShader, + fragmentShader: d.rewritedFragmentShader, depthTest: !1, depthWrite: !1, transparent: !0, @@ -2891,22 +2888,22 @@ const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { uSizeRandomMax: { value: R.sizeRandomMax }, uDivergence: { value: R.divergence }, uDivergencePoint: { value: R.divergencePoint }, - ...g.mapArrayUniforms + ...d.mapArrayUniforms } }); }, [ - o, + a, m, v, c - ]), i = $(e, u); + ]), o = E(e, u); return F(() => { - a(s, "uResolution", i.clone()); - }, [i, s]), { material: s, modifiedPositions: m, modifiedUvs: v }; + i(s, "uResolution", o.clone()); + }, [o, s]), { material: s, modifiedPositions: m, modifiedUvs: v }; }, Jn = ({ size: e, dpr: u, - scene: o = !1, + scene: a = !1, geometry: r, positions: n, uvs: c, @@ -2915,61 +2912,61 @@ const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { const v = h(() => { const x = r || new t.SphereGeometry(1, 32, 32); return x.setIndex(null), x.deleteAttribute("normal"), x; - }, [r]), { material: s, modifiedPositions: i, modifiedUvs: l } = Zn({ + }, [r]), { material: s, modifiedPositions: o, modifiedUvs: l } = Zn({ size: e, dpr: u, geometry: v, positions: n, uvs: c, mapArray: m - }), { points: g, interactiveMesh: f } = Xn({ - scene: o, + }), { points: d, interactiveMesh: f } = Xn({ + scene: a, geometry: v, material: s }); return [ b( (x, p) => { - x && a( + x && i( s, "uTime", (p == null ? void 0 : p.beat) || x.clock.getElapsedTime() - ), p !== void 0 && (a(s, "uMorphProgress", p.morphProgress), a(s, "uBlurAlpha", p.blurAlpha), a(s, "uBlurRadius", p.blurRadius), a(s, "uPointSize", p.pointSize), a(s, "uPointAlpha", p.pointAlpha), p.picture ? (a(s, "uPicture", p.picture), a(s, "uIsPicture", !0)) : p.picture === !1 && a(s, "uIsPicture", !1), p.alphaPicture ? (a(s, "uAlphaPicture", p.alphaPicture), a(s, "uIsAlphaPicture", !0)) : p.alphaPicture === !1 && a(s, "uIsAlphaPicture", !1), a(s, "uColor0", p.color0), a(s, "uColor1", p.color1), a(s, "uColor2", p.color2), a(s, "uColor3", p.color3), p.map ? (a(s, "uMap", p.map), a(s, "uIsMap", !0)) : p.map === !1 && a(s, "uIsMap", !1), p.alphaMap ? (a(s, "uAlphaMap", p.alphaMap), a(s, "uIsAlphaMap", !0)) : p.alphaMap === !1 && a(s, "uIsAlphaMap", !1), a(s, "uWobbleStrength", p.wobbleStrength), a( + ), p !== void 0 && (i(s, "uMorphProgress", p.morphProgress), i(s, "uBlurAlpha", p.blurAlpha), i(s, "uBlurRadius", p.blurRadius), i(s, "uPointSize", p.pointSize), i(s, "uPointAlpha", p.pointAlpha), p.picture ? (i(s, "uPicture", p.picture), i(s, "uIsPicture", !0)) : p.picture === !1 && i(s, "uIsPicture", !1), p.alphaPicture ? (i(s, "uAlphaPicture", p.alphaPicture), i(s, "uIsAlphaPicture", !0)) : p.alphaPicture === !1 && i(s, "uIsAlphaPicture", !1), i(s, "uColor0", p.color0), i(s, "uColor1", p.color1), i(s, "uColor2", p.color2), i(s, "uColor3", p.color3), p.map ? (i(s, "uMap", p.map), i(s, "uIsMap", !0)) : p.map === !1 && i(s, "uIsMap", !1), p.alphaMap ? (i(s, "uAlphaMap", p.alphaMap), i(s, "uIsAlphaMap", !0)) : p.alphaMap === !1 && i(s, "uIsAlphaMap", !1), i(s, "uWobbleStrength", p.wobbleStrength), i( s, "uWobblePositionFrequency", p.wobblePositionFrequency - ), a( + ), i( s, "uWobbleTimeFrequency", p.wobbleTimeFrequency - ), a(s, "uWarpStrength", p.warpStrength), a( + ), i(s, "uWarpStrength", p.warpStrength), i( s, "uWarpPositionFrequency", p.warpPositionFrequency - ), a(s, "uWarpTimeFrequency", p.warpTimeFrequency), p.displacement ? (a(s, "uDisplacement", p.displacement), a(s, "uIsDisplacement", !0)) : p.displacement === !1 && a(s, "uIsDisplacement", !1), a( + ), i(s, "uWarpTimeFrequency", p.warpTimeFrequency), p.displacement ? (i(s, "uDisplacement", p.displacement), i(s, "uIsDisplacement", !0)) : p.displacement === !1 && i(s, "uIsDisplacement", !1), i( s, "uDisplacementIntensity", p.displacementIntensity - ), a( + ), i( s, "uDisplacementColorIntensity", p.displacementColorIntensity - ), a( + ), i( s, "uSizeRandomIntensity", p.sizeRandomIntensity - ), a( + ), i( s, "uSizeRandomTimeFrequency", p.sizeRandomTimeFrequency - ), a(s, "uSizeRandomMin", p.sizeRandomMin), a(s, "uSizeRandomMax", p.sizeRandomMax), a(s, "uDivergence", p.divergence), a(s, "uDivergencePoint", p.divergencePoint)); + ), i(s, "uSizeRandomMin", p.sizeRandomMin), i(s, "uSizeRandomMax", p.sizeRandomMax), i(s, "uDivergence", p.divergence), i(s, "uDivergencePoint", p.divergencePoint)); }, [s] ), { - points: g, + points: d, interactiveMesh: f, - positions: i, + positions: o, uvs: l } ]; @@ -3006,7 +3003,7 @@ const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { }), Bt = ({ size: e, dpr: u, - samples: o = 0, + samples: a = 0, camera: r, geometry: n, positions: c, @@ -3015,17 +3012,17 @@ const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { const v = h(() => new t.Scene(), []), [ s, { - points: i, + points: o, interactiveMesh: l, - positions: g, + positions: d, uvs: f } - ] = Jn({ scene: v, size: e, dpr: u, geometry: n, positions: c, uvs: m }), [d, x] = A({ + ] = Jn({ scene: v, size: e, dpr: u, geometry: n, positions: c, uvs: m }), [g, x] = A({ scene: v, camera: r, size: e, dpr: u, - samples: o, + samples: a, depthBuffer: !0 }), p = b( (y, w) => (s(y, w), x(y.gl)), @@ -3041,56 +3038,56 @@ const ve = process.env.NODE_ENV === "development", ie = (e, u, o, r, n) => { M, { scene: v, - points: i, + points: o, interactiveMesh: l, - renderTarget: d, - output: d.texture, - positions: g, + renderTarget: g, + output: g.texture, + positions: d, uvs: f } ]; }; function et(e, u = 1e-4) { u = Math.max(u, Number.EPSILON); - const o = {}, r = e.getIndex(), n = e.getAttribute("position"), c = r ? r.count : n.count; + const a = {}, r = e.getIndex(), n = e.getAttribute("position"), c = r ? r.count : n.count; let m = 0; - const v = Object.keys(e.attributes), s = {}, i = {}, l = [], g = ["getX", "getY", "getZ", "getW"]; + const v = Object.keys(e.attributes), s = {}, o = {}, l = [], d = ["getX", "getY", "getZ", "getW"]; for (let p = 0, M = v.length; p < M; p++) { const y = v[p]; s[y] = []; const w = e.morphAttributes[y]; - w && (i[y] = new Array(w.length).fill(0).map(() => [])); + w && (o[y] = new Array(w.length).fill(0).map(() => [])); } - const f = Math.log10(1 / u), d = Math.pow(10, f); + const f = Math.log10(1 / u), g = Math.pow(10, f); for (let p = 0; p < c; p++) { const M = r ? r.getX(p) : p; let y = ""; for (let w = 0, C = v.length; w < C; w++) { const T = v[w], P = e.getAttribute(T), S = P.itemSize; for (let _ = 0; _ < S; _++) - y += `${~~(P[g[_]](M) * d)},`; + y += `${~~(P[d[_]](M) * g)},`; } - if (y in o) - l.push(o[y]); + if (y in a) + l.push(a[y]); else { for (let w = 0, C = v.length; w < C; w++) { - const T = v[w], P = e.getAttribute(T), S = e.morphAttributes[T], _ = P.itemSize, O = s[T], E = i[T]; + const T = v[w], P = e.getAttribute(T), S = e.morphAttributes[T], _ = P.itemSize, O = s[T], $ = o[T]; for (let W = 0; W < _; W++) { - const j = g[W]; + const j = d[W]; if (O.push(P[j](M)), S) for (let L = 0, H = S.length; L < H; L++) - E[L].push(S[L][j](M)); + $[L].push(S[L][j](M)); } } - o[y] = m, l.push(m), m++; + a[y] = m, l.push(m), m++; } } const x = e.clone(); for (let p = 0, M = v.length; p < M; p++) { const y = v[p], w = e.getAttribute(y), C = new w.array.constructor(s[y]), T = new ae(C, w.itemSize, w.normalized); - if (x.setAttribute(y, T), y in i) - for (let P = 0; P < i[y].length; P++) { - const S = e.morphAttributes[y][P], _ = new S.array.constructor(i[y][P]), O = new ae(_, S.itemSize, S.normalized); + if (x.setAttribute(y, T), y in o) + for (let P = 0; P < o[y].length; P++) { + const S = e.morphAttributes[y][P], _ = new S.array.constructor(o[y][P]), O = new ae(_, S.itemSize, S.normalized); x.morphAttributes[y][P] = O; } } @@ -3475,7 +3472,7 @@ const se = (e) => { baseMaterial: e, materialParameters: u }) => { - const { material: o, depthMaterial: r } = h(() => { + const { material: a, depthMaterial: r } = h(() => { const n = new (e || t.MeshPhysicalMaterial)( u || {} ), c = n.type === "MeshPhysicalMaterial" || n.type === "MeshStandardMaterial", m = n.type === "MeshPhysicalMaterial"; @@ -3572,47 +3569,47 @@ const se = (e) => { }, v.needsUpdate = !0, { material: n, depthMaterial: v }; }, [u, e]); return { - material: o, + material: a, depthMaterial: r }; }, at = ({ scene: e = !1, geometry: u, - baseMaterial: o, + baseMaterial: a, materialParameters: r }) => { const n = h(() => { - let i = u || new t.IcosahedronGeometry(2, 50); - return i = et(i), i.computeTangents(), i; + let o = u || new t.IcosahedronGeometry(2, 50); + return o = et(o), o.computeTangents(), o; }, [u]), { material: c, depthMaterial: m } = ot({ - baseMaterial: o, + baseMaterial: a, materialParameters: r }), v = I(e, n, c, t.Mesh); return [ b( - (i, l) => { - const g = c.userData; - i && a( - g, + (o, l) => { + const d = c.userData; + o && i( + d, "uTime", - (l == null ? void 0 : l.beat) || i.clock.getElapsedTime() - ), l !== void 0 && (a(g, "uWobbleStrength", l.wobbleStrength), a( - g, + (l == null ? void 0 : l.beat) || o.clock.getElapsedTime() + ), l !== void 0 && (i(d, "uWobbleStrength", l.wobbleStrength), i( + d, "uWobblePositionFrequency", l.wobblePositionFrequency - ), a( - g, + ), i( + d, "uWobbleTimeFrequency", l.wobbleTimeFrequency - ), a(g, "uWarpStrength", l.warpStrength), a( - g, + ), i(d, "uWarpStrength", l.warpStrength), i( + d, "uWarpPositionFrequency", l.warpPositionFrequency - ), a(g, "uWarpTimeFrequency", l.warpTimeFrequency), a(g, "uWobbleShine", l.wobbleShine), a(g, "uSamples", l.samples), a(g, "uColor0", l.color0), a(g, "uColor1", l.color1), a(g, "uColor2", l.color2), a(g, "uColor3", l.color3), a(g, "uColorMix", l.colorMix), a( - g, + ), i(d, "uWarpTimeFrequency", l.warpTimeFrequency), i(d, "uWobbleShine", l.wobbleShine), i(d, "uSamples", l.samples), i(d, "uColor0", l.color0), i(d, "uColor1", l.color1), i(d, "uColor2", l.color2), i(d, "uColor3", l.color3), i(d, "uColorMix", l.colorMix), i( + d, "uChromaticAberration", l.chromaticAberration - ), a(g, "uAnisotropicBlur", l.anisotropicBlur), a(g, "uDistortion", l.distortion), a(g, "uDistortionScale", l.distortionScale), a(g, "uTemporalDistortion", l.temporalDistortion)); + ), i(d, "uAnisotropicBlur", l.anisotropicBlur), i(d, "uDistortion", l.distortion), i(d, "uDistortionScale", l.distortionScale), i(d, "uTemporalDistortion", l.temporalDistortion)); }, [c] ), @@ -3644,25 +3641,25 @@ const se = (e) => { }), Ot = ({ size: e, dpr: u, - samples: o = 0, + samples: a = 0, camera: r, geometry: n, baseMaterial: c, materialParameters: m }) => { - const v = h(() => new t.Scene(), []), [s, { mesh: i, depthMaterial: l }] = at({ + const v = h(() => new t.Scene(), []), [s, { mesh: o, depthMaterial: l }] = at({ baseMaterial: c, materialParameters: m, scene: v, geometry: n - }), [g, f] = A({ + }), [d, f] = A({ scene: v, camera: r, size: e, dpr: u, - samples: o, + samples: a, depthBuffer: !0 - }), d = b( + }), g = b( (p, M) => (s(p, M), f(p.gl)), [f, s] ), x = b( @@ -3672,26 +3669,26 @@ const se = (e) => { [s] ); return [ - d, + g, x, { scene: v, - mesh: i, + mesh: o, depthMaterial: l, - renderTarget: g, - output: g.texture + renderTarget: d, + output: d.texture } ]; -}, Lt = (e, u, o) => { +}, Lt = (e, u, a) => { const r = h( - () => new t.Mesh(u, o), - [u, o] + () => new t.Mesh(u, a), + [u, a] ); return F(() => { e.add(r); }, [e, r]), F(() => () => { - e.remove(r), u.dispose(), o.dispose(); - }, [e, u, o, r]), r; + e.remove(r), u.dispose(), a.dispose(); + }, [e, u, a, r]), r; }, X = Object.freeze({ easeInSine(e) { return 1 - Math.cos(e * Math.PI / 2); @@ -3763,8 +3760,8 @@ const se = (e) => { return 1 + 2.70158 * Math.pow(e - 1, 3) + 1.70158 * Math.pow(e - 1, 2); }, easeInOutBack(e) { - const o = 2.5949095; - return e < 0.5 ? Math.pow(2 * e, 2) * ((o + 1) * 2 * e - o) / 2 : (Math.pow(2 * e - 2, 2) * ((o + 1) * (e * 2 - 2) + o) + 2) / 2; + const a = 2.5949095; + return e < 0.5 ? Math.pow(2 * e, 2) * ((a + 1) * 2 * e - a) / 2 : (Math.pow(2 * e - 2, 2) * ((a + 1) * (e * 2 - 2) + a) + 2) / 2; }, easeInElastic(e) { const u = 2 * Math.PI / 3; @@ -3793,35 +3790,35 @@ function it(e) { return u - Math.floor(u); } const Wt = (e, u = "easeOutQuart") => { - const o = e / 60, r = X[u]; + const a = e / 60, r = X[u]; return b( (c) => { - let m = c.getElapsedTime() * o; + let m = c.getElapsedTime() * a; const v = Math.floor(m), s = r(m - v); m = s + v; - const i = it(v); + const o = it(v); return { beat: m, floor: v, fract: s, - hash: i + hash: o }; }, - [o, r] + [a, r] ); -}, Et = (e = 60) => { - const u = h(() => 1 / Math.max(Math.min(e, 60), 1), [e]), o = D(null); +}, $t = (e = 60) => { + const u = h(() => 1 / Math.max(Math.min(e, 60), 1), [e]), a = D(null); return b( (n) => { const c = n.getElapsedTime(); - return o.current === null || c - o.current >= u ? (o.current = c, !0) : !1; + return a.current === null || c - a.current >= u ? (a.current = c, !0) : !1; }, [u] ); }, ut = (e) => { var r, n; - const u = (r = e.dom) == null ? void 0 : r.length, o = (n = e.texture) == null ? void 0 : n.length; - return !u || !o || u !== o; + const u = (r = e.dom) == null ? void 0 : r.length, a = (n = e.texture) == null ? void 0 : n.length; + return !u || !a || u !== a; }; var st = `varying vec2 vUv; @@ -3875,11 +3872,11 @@ void main() { const ct = ({ params: e, size: u, - scene: o + scene: a }) => { - o.children.length > 0 && (o.children.forEach((r) => { + a.children.length > 0 && (a.children.forEach((r) => { r instanceof t.Mesh && (r.geometry.dispose(), r.material.dispose()); - }), o.remove(...o.children)), e.texture.forEach((r, n) => { + }), a.remove(...a.children)), e.texture.forEach((r, n) => { const c = new t.Mesh( new t.PlaneGeometry(1, 1), new t.ShaderMaterial({ @@ -3898,7 +3895,7 @@ const ct = ({ } }) ); - o.add(c); + a.add(c); }); }, vt = () => { const e = D([]), u = D([]); @@ -3913,11 +3910,11 @@ const ct = ({ }), u.current = [], e.current = []; const m = new Array(c.dom.length).fill(!1); r.current = [...m], n.current = [...m], c.dom.forEach((v, s) => { - const i = (g) => { - g.forEach((f) => { + const o = (d) => { + d.forEach((f) => { c.onIntersect[s] && c.onIntersect[s](f), r.current[s] = f.isIntersecting; }); - }, l = new IntersectionObserver(i, { + }, l = new IntersectionObserver(o, { rootMargin: "0px", threshold: 0 }); @@ -3928,30 +3925,30 @@ const ct = ({ ); }, mt = () => { const e = D([]), u = b( - ({ params: o, size: r, resolutionRef: n, scene: c, isIntersectingRef: m }) => { + ({ params: a, size: r, resolutionRef: n, scene: c, isIntersectingRef: m }) => { c.children.length !== e.current.length && (e.current = new Array(c.children.length)), c.children.forEach((v, s) => { - var g, f, d, x, p, M; - const i = o.dom[s]; - if (!i) + var d, f, g, x, p, M; + const o = a.dom[s]; + if (!o) return; - const l = i.getBoundingClientRect(); + const l = o.getBoundingClientRect(); if (e.current[s] = l, v.scale.set(l.width, l.height, 1), v.position.set( l.left + l.width * 0.5 - r.width * 0.5, -l.top - l.height * 0.5 + r.height * 0.5, 0 - ), m.current[s] && (o.rotation[s] && v.rotation.copy(o.rotation[s]), v instanceof t.Mesh)) { + ), m.current[s] && (a.rotation[s] && v.rotation.copy(a.rotation[s]), v instanceof t.Mesh)) { const y = v.material; - a(y, "u_texture", o.texture[s]), a(y, "u_textureResolution", [ - ((d = (f = (g = o.texture[s]) == null ? void 0 : g.source) == null ? void 0 : f.data) == null ? void 0 : d.width) || 0, - ((M = (p = (x = o.texture[s]) == null ? void 0 : x.source) == null ? void 0 : p.data) == null ? void 0 : M.height) || 0 - ]), a( + i(y, "u_texture", a.texture[s]), i(y, "u_textureResolution", [ + ((g = (f = (d = a.texture[s]) == null ? void 0 : d.source) == null ? void 0 : f.data) == null ? void 0 : g.width) || 0, + ((M = (p = (x = a.texture[s]) == null ? void 0 : x.source) == null ? void 0 : p.data) == null ? void 0 : M.height) || 0 + ]), i( y, "u_resolution", n.current.set(l.width, l.height) - ), a( + ), i( y, "u_borderRadius", - o.boderRadius[s] ? o.boderRadius[s] : 0 + a.boderRadius[s] ? a.boderRadius[s] : 0 ); } }); @@ -3960,7 +3957,7 @@ const ct = ({ ); return [e.current, u]; }, ft = () => { - const e = D([]), u = D([]), o = b((r, n = !1) => { + const e = D([]), u = D([]), a = b((r, n = !1) => { e.current.forEach((m, v) => { m && (u.current[v] = !0); }); @@ -3970,37 +3967,37 @@ const ct = ({ return { isIntersectingRef: e, isIntersectingOnceRef: u, - isIntersecting: o + isIntersecting: a }; -}, pt = (e) => ({ onView: o, onHidden: r }) => { +}, pt = (e) => ({ onView: a, onHidden: r }) => { const n = D(!1); F(() => { let c; const m = () => { - e.current.some((v) => v) ? n.current || (o && o(), n.current = !0) : n.current && (r && r(), n.current = !1), c = requestAnimationFrame(m); + e.current.some((v) => v) ? n.current || (a && a(), n.current = !0) : n.current && (r && r(), n.current = !1), c = requestAnimationFrame(m); }; return c = requestAnimationFrame(m), () => { cancelAnimationFrame(c); }; - }, [o, r]); + }, [a, r]); }, dt = { texture: [], dom: [], boderRadius: [], rotation: [], onIntersect: [] -}, $t = ({ size: e, dpr: u, samples: o = 0 }, r = []) => { +}, Et = ({ size: e, dpr: u, samples: a = 0 }, r = []) => { const n = h(() => new t.Scene(), []), c = z(e), [m, v] = A({ scene: n, camera: c, size: e, dpr: u, - samples: o, + samples: a, isSizeUpdate: !0 - }), [s, i] = V({ + }), [s, o] = V({ ...dt, updateKey: performance.now() - }), [l, g] = mt(), f = D(new t.Vector2(0, 0)), [d, x] = de(!0); + }), [l, d] = mt(), f = D(new t.Vector2(0, 0)), [g, x] = de(!0); F(() => { x(!0); }, r); @@ -4008,15 +4005,15 @@ const ct = ({ return [ b( (_, O) => { - const { gl: E, size: W } = _; - if (O && i(O), ut(s)) + const { gl: $, size: W } = _; + if (O && o(O), ut(s)) return M; - if (d) { + if (g) { if (p.current === s.updateKey) return M; p.current = s.updateKey; } - return d && (ct({ + return g && (ct({ params: s, size: W, scene: n @@ -4024,20 +4021,20 @@ const ct = ({ isIntersectingRef: C, isIntersectingOnceRef: w, params: s - }), x(!1)), g({ + }), x(!1)), d({ params: s, size: W, resolutionRef: f, scene: n, isIntersectingRef: C - }), v(E); + }), v($); }, [ v, - i, + o, y, - g, d, + g, n, s, w, @@ -4045,7 +4042,7 @@ const ct = ({ M ] ), - i, + o, { scene: n, camera: c, @@ -4060,15 +4057,15 @@ const ct = ({ }, qt = ({ scene: e, camera: u, - size: o, + size: a, dpr: r = !1, isSizeUpdate: n = !1, samples: c = 0, depthBuffer: m = !1, depthTexture: v = !1 }, s) => { - const i = D([]), l = $(o, r); - i.current = h(() => Array.from({ length: s }, () => { + const o = D([]), l = E(a, r); + o.current = h(() => Array.from({ length: s }, () => { const f = new t.WebGLRenderTarget( l.x, l.y, @@ -4084,18 +4081,18 @@ const ct = ({ t.FloatType )), f; }), [s]), J(() => { - n && i.current.forEach( + n && o.current.forEach( (f) => f.setSize(l.x, l.y) ); }, [l, n]), F(() => { - const f = i.current; + const f = o.current; return () => { - f.forEach((d) => d.dispose()); + f.forEach((g) => g.dispose()); }; }, [s]); - const g = b( - (f, d, x) => { - const p = i.current[d]; + const d = b( + (f, g, x) => { + const p = o.current[g]; return ne({ gl: f, scene: e, @@ -4106,7 +4103,7 @@ const ct = ({ }, [e, u] ); - return [i.current, g]; + return [o.current, d]; }; export { Rn as ALPHABLENDING_PARAMS, @@ -4121,7 +4118,7 @@ export { ln as DUOTONE_PARAMS, X as Easing, Y as FBO_OPTION, - Ee as FLUID_PARAMS, + $e as FLUID_PARAMS, Tn as FXBLENDING_PARAMS, xn as FXTEXTURE_PARAMS, zn as HSV_PARAMS, @@ -4133,7 +4130,7 @@ export { k as WAVE_PARAMS, U as WOBBLE3D_PARAMS, ne as renderFBO, - a as setUniform, + i as setUniform, Lt as useAddMesh, At as useAlphaBlending, Wt as useBeat, @@ -4148,10 +4145,10 @@ export { Ft as useCoverTexture, Jn as useCreateMorphParticles, at as useCreateWobble3D, - $t as useDomSyncer, + Et as useDomSyncer, G as useDoubleFBO, Tt as useDuoTone, - Et as useFPSLimiter, + $t as useFPSLimiter, yt as useFluid, Rt as useFxBlending, Pt as useFxTexture, @@ -4161,7 +4158,7 @@ export { Mt as useNoise, V as useParams, ee as usePointer, - $ as useResolution, + E as useResolution, wt as useRipple, zt as useSimpleBlur, A as useSingleFBO, 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 bb4bd387..ca1e7551 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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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\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 = \"\";\n if (mapArray && mapArray.length > 0) {\n textureSwitcherCode += \"if (false) {}\"; // Dummy conditions for initialisation.\n mapArray.forEach((map, index) => {\n textureSwitcherCode += ` else if (vMapArrayIndex == ${index}.0) {\\n`;\n textureSwitcherCode += ` mapArrayColor = texture2D(uMapArray${index}, uv);\\n`;\n textureSwitcherCode += `}`;\n mapArrayShader += `\n \t\t\tuniform sampler2D uMapArray${index};\n \t\t`;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \" else {\\n\";\n textureSwitcherCode += \" mapArrayColor = vec4(1.0);\\n\";\n textureSwitcherCode += \"}\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"mapArrayColor = vec4(1.0);\\n\";\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\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;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\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\";\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 is 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 is 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: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","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","object","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":[106]} \ 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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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;\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 console.log(mapArraySwitch.rewritedFragmentShader);\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\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;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\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\";\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 is 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 is 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: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","object","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":[106]} \ 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 a4ab33eb..72ba2976 100644 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs @@ -1,4 +1,4 @@ -(function(y,$){typeof exports=="object"&&typeof module<"u"?$(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],$):(y=typeof globalThis<"u"?globalThis:y||self,$(y["use-shader-fx"]={},y.THREE,y.React))})(this,function(y,$,l){"use strict";function Re(e){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(a,o,r.get?r:{enumerable:!0,get:()=>e[o]})}}return a.default=e,Object.freeze(a)}const t=Re($);var De=`varying vec2 vUv; +(function(y,$){typeof exports=="object"&&typeof module<"u"?$(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],$):(y=typeof globalThis<"u"?globalThis:y||self,$(y["use-shader-fx"]={},y.THREE,y.React))})(this,function(y,$,l){"use strict";function Re(e){const u=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(u,o,r.get?r:{enumerable:!0,get:()=>e[o]})}}return u.default=e,Object.freeze(u)}const t=Re($);var De=`varying vec2 vUv; void main() { vUv = uv; @@ -112,7 +112,7 @@ void main() { vec4 finalColor = mix(bufferColor, brushColor, isOnLine); gl_FragColor = finalColor; -}`;const E=(e,a=!1)=>{const o=a?e.width*a:e.width,r=a?e.height*a:e.height;return l.useMemo(()=>new t.Vector2(o,r),[o,r])},i=(e,a,o)=>{o!==void 0&&e.uniforms&&e.uniforms[a]&&o!==null&&(e.uniforms[a].value=o)},A=(e,a,o,r)=>{const n=l.useMemo(()=>new r(a,o),[a,o,r]);return l.useEffect(()=>{e&&e.add(n)},[e,n]),l.useEffect(()=>()=>{e&&e.remove(n),a.dispose(),o.dispose()},[e,a,o,n]),n},Ie=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:De,fragmentShader:Ae}),[]),v=E(a,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},Fe=(e,a)=>{const o=a,r=e/a,[n,v]=[o*r/2,o/2];return{width:n,height:v,near:-1e3,far:1e3}},I=(e,a="OrthographicCamera")=>{const o=E(e),{width:r,height:n,near:v,far:f}=Fe(o.x,o.y);return l.useMemo(()=>a==="OrthographicCamera"?new t.OrthographicCamera(-r,r,n,-n,v,f):new t.PerspectiveCamera(50,r/n),[r,n,v,f,a])},X=(e=0)=>{const a=l.useRef(new t.Vector2(0,0)),o=l.useRef(new t.Vector2(0,0)),r=l.useRef(new t.Vector2(0,0)),n=l.useRef(0),v=l.useRef(new t.Vector2(0,0)),f=l.useRef(!1);return l.useCallback(s=>{const u=performance.now();let c;f.current&&e?(r.current=r.current.lerp(s,1-e),c=r.current.clone()):(c=s.clone(),r.current=c),n.current===0&&(n.current=u,a.current=c);const h=Math.max(1,u-n.current);n.current=u,v.current.copy(c).sub(a.current).divideScalar(h);const p=v.current.length()>0,g=f.current?a.current.clone():c;return!f.current&&p&&(f.current=!0),a.current=c,{currentPointer:c,prevPointer:g,diffPointer:o.current.subVectors(c,g),velocity:v.current,isVelocityUpdate:p}},[e])},F=e=>{const a=n=>Object.values(n).some(v=>typeof v=="function"),o=l.useRef(a(e)?e:structuredClone(e)),r=l.useCallback(n=>{for(const v in n){const f=v;f in o.current&&n[f]!==void 0&&n[f]!==null?o.current[f]=n[f]:console.error(`"${String(f)}" does not exist in the params. or "${String(f)}" is null | undefined`)}},[]);return[o.current,r]},G={minFilter:t.LinearFilter,magFilter:t.LinearFilter,type:t.HalfFloatType,stencilBuffer:!1},H=({gl:e,fbo:a,scene:o,camera:r,onBeforeRender:n,onSwap:v})=>{e.setRenderTarget(a),n(),e.clear(),e.render(o,r),v&&v(),e.setRenderTarget(null),e.clear()},D=({scene:e,camera:a,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1})=>{const s=l.useRef(),u=E(o,r);s.current=l.useMemo(()=>{const h=new t.WebGLRenderTarget(u.x,u.y,{...G,samples:v,depthBuffer:f});return m&&(h.depthTexture=new t.DepthTexture(u.x,u.y,t.FloatType)),h},[]),l.useLayoutEffect(()=>{var h;n&&((h=s.current)==null||h.setSize(u.x,u.y))},[u,n]),l.useEffect(()=>{const h=s.current;return()=>{h==null||h.dispose()}},[]);const c=l.useCallback((h,p)=>{const g=s.current;return H({gl:h,fbo:g,scene:e,camera:a,onBeforeRender:()=>p&&p({read:g.texture})}),g.texture},[e,a]);return[s.current,c]},q=({scene:e,camera:a,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1})=>{const s=l.useRef({read:null,write:null,swap:function(){let p=this.read;this.read=this.write,this.write=p}}),u=E(o,r),c=l.useMemo(()=>{const p=new t.WebGLRenderTarget(u.x,u.y,{...G,samples:v,depthBuffer:f}),g=new t.WebGLRenderTarget(u.x,u.y,{...G,samples:v,depthBuffer:f});return m&&(p.depthTexture=new t.DepthTexture(u.x,u.y,t.FloatType),g.depthTexture=new t.DepthTexture(u.x,u.y,t.FloatType)),{read:p,write:g}},[]);s.current.read=c.read,s.current.write=c.write,l.useLayoutEffect(()=>{var p,g;n&&((p=s.current.read)==null||p.setSize(u.x,u.y),(g=s.current.write)==null||g.setSize(u.x,u.y))},[u,n]),l.useEffect(()=>{const p=s.current;return()=>{var g,x;(g=p.read)==null||g.dispose(),(x=p.write)==null||x.dispose()}},[]);const h=l.useCallback((p,g)=>{var d;const x=s.current;return H({gl:p,scene:e,camera:a,fbo:x.write,onBeforeRender:()=>g&&g({read:x.read.texture,write:x.write.texture}),onSwap:()=>x.swap()}),(d=x.read)==null?void 0:d.texture},[e,a]);return[{read:s.current.read,write:s.current.write},h]},ne=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}),ze=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Ie({scene:r,size:e,dpr:a}),f=I(e),m=X(),[s,u]=q({scene:r,camera:f,size:e,dpr:a,samples:o}),[c,h]=F(ne),p=l.useRef(null);return[l.useCallback((x,d)=>{const{gl:w,pointer:M}=x;d&&h(d),c.texture?(i(n,"uIsTexture",!0),i(n,"uTexture",c.texture)):i(n,"uIsTexture",!1),c.map?(i(n,"uIsMap",!0),i(n,"uMap",c.map),i(n,"uMapIntensity",c.mapIntensity)):i(n,"uIsMap",!1),i(n,"uRadius",c.radius),i(n,"uSmudge",c.smudge),i(n,"uDissipation",c.dissipation),i(n,"uMotionBlur",c.motionBlur),i(n,"uMotionSample",c.motionSample);const b=c.pointerValues||m(M);b.isVelocityUpdate&&(i(n,"uMouse",b.currentPointer),i(n,"uPrevMouse",b.prevPointer)),i(n,"uVelocity",b.velocity);const T=typeof c.color=="function"?c.color(b.velocity):c.color;return i(n,"uColor",T),i(n,"uIsCursor",c.isCursor),i(n,"uPressureEnd",c.pressure),p.current===null&&(p.current=c.pressure),i(n,"uPressureStart",p.current),p.current=c.pressure,u(w,({read:C})=>{i(n,"uBuffer",C)})},[n,m,u,c,h]),h,{scene:r,mesh:v,material:n,camera:f,renderTarget:s,output:s.read.texture}]};var W=`varying vec2 vUv; +}`;const E=(e,u=!1)=>{const o=u?e.width*u:e.width,r=u?e.height*u:e.height;return l.useMemo(()=>new t.Vector2(o,r),[o,r])},i=(e,u,o)=>{o!==void 0&&e.uniforms&&e.uniforms[u]&&o!==null&&(e.uniforms[u].value=o)},A=(e,u,o,r)=>{const n=l.useMemo(()=>new r(u,o),[u,o,r]);return l.useEffect(()=>{e&&e.add(n)},[e,n]),l.useEffect(()=>()=>{e&&e.remove(n),u.dispose(),o.dispose()},[e,u,o,n]),n},Ie=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:De,fragmentShader:Ae}),[]),v=E(u,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},Fe=(e,u)=>{const o=u,r=e/u,[n,v]=[o*r/2,o/2];return{width:n,height:v,near:-1e3,far:1e3}},I=(e,u="OrthographicCamera")=>{const o=E(e),{width:r,height:n,near:v,far:f}=Fe(o.x,o.y);return l.useMemo(()=>u==="OrthographicCamera"?new t.OrthographicCamera(-r,r,n,-n,v,f):new t.PerspectiveCamera(50,r/n),[r,n,v,f,u])},X=(e=0)=>{const u=l.useRef(new t.Vector2(0,0)),o=l.useRef(new t.Vector2(0,0)),r=l.useRef(new t.Vector2(0,0)),n=l.useRef(0),v=l.useRef(new t.Vector2(0,0)),f=l.useRef(!1);return l.useCallback(s=>{const a=performance.now();let c;f.current&&e?(r.current=r.current.lerp(s,1-e),c=r.current.clone()):(c=s.clone(),r.current=c),n.current===0&&(n.current=a,u.current=c);const g=Math.max(1,a-n.current);n.current=a,v.current.copy(c).sub(u.current).divideScalar(g);const p=v.current.length()>0,h=f.current?u.current.clone():c;return!f.current&&p&&(f.current=!0),u.current=c,{currentPointer:c,prevPointer:h,diffPointer:o.current.subVectors(c,h),velocity:v.current,isVelocityUpdate:p}},[e])},F=e=>{const u=n=>Object.values(n).some(v=>typeof v=="function"),o=l.useRef(u(e)?e:structuredClone(e)),r=l.useCallback(n=>{for(const v in n){const f=v;f in o.current&&n[f]!==void 0&&n[f]!==null?o.current[f]=n[f]:console.error(`"${String(f)}" does not exist in the params. or "${String(f)}" is null | undefined`)}},[]);return[o.current,r]},G={minFilter:t.LinearFilter,magFilter:t.LinearFilter,type:t.HalfFloatType,stencilBuffer:!1},H=({gl:e,fbo:u,scene:o,camera:r,onBeforeRender:n,onSwap:v})=>{e.setRenderTarget(u),n(),e.clear(),e.render(o,r),v&&v(),e.setRenderTarget(null),e.clear()},D=({scene:e,camera:u,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1})=>{const s=l.useRef(),a=E(o,r);s.current=l.useMemo(()=>{const g=new t.WebGLRenderTarget(a.x,a.y,{...G,samples:v,depthBuffer:f});return m&&(g.depthTexture=new t.DepthTexture(a.x,a.y,t.FloatType)),g},[]),l.useLayoutEffect(()=>{var g;n&&((g=s.current)==null||g.setSize(a.x,a.y))},[a,n]),l.useEffect(()=>{const g=s.current;return()=>{g==null||g.dispose()}},[]);const c=l.useCallback((g,p)=>{const h=s.current;return H({gl:g,fbo:h,scene:e,camera:u,onBeforeRender:()=>p&&p({read:h.texture})}),h.texture},[e,u]);return[s.current,c]},q=({scene:e,camera:u,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1})=>{const s=l.useRef({read:null,write:null,swap:function(){let p=this.read;this.read=this.write,this.write=p}}),a=E(o,r),c=l.useMemo(()=>{const p=new t.WebGLRenderTarget(a.x,a.y,{...G,samples:v,depthBuffer:f}),h=new t.WebGLRenderTarget(a.x,a.y,{...G,samples:v,depthBuffer:f});return m&&(p.depthTexture=new t.DepthTexture(a.x,a.y,t.FloatType),h.depthTexture=new t.DepthTexture(a.x,a.y,t.FloatType)),{read:p,write:h}},[]);s.current.read=c.read,s.current.write=c.write,l.useLayoutEffect(()=>{var p,h;n&&((p=s.current.read)==null||p.setSize(a.x,a.y),(h=s.current.write)==null||h.setSize(a.x,a.y))},[a,n]),l.useEffect(()=>{const p=s.current;return()=>{var h,x;(h=p.read)==null||h.dispose(),(x=p.write)==null||x.dispose()}},[]);const g=l.useCallback((p,h)=>{var d;const x=s.current;return H({gl:p,scene:e,camera:u,fbo:x.write,onBeforeRender:()=>h&&h({read:x.read.texture,write:x.write.texture}),onSwap:()=>x.swap()}),(d=x.read)==null?void 0:d.texture},[e,u]);return[{read:s.current.read,write:s.current.write},g]},ne=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}),ze=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Ie({scene:r,size:e,dpr:u}),f=I(e),m=X(),[s,a]=q({scene:r,camera:f,size:e,dpr:u,samples:o}),[c,g]=F(ne),p=l.useRef(null);return[l.useCallback((x,d)=>{const{gl:w,pointer:M}=x;d&&g(d),c.texture?(i(n,"uIsTexture",!0),i(n,"uTexture",c.texture)):i(n,"uIsTexture",!1),c.map?(i(n,"uIsMap",!0),i(n,"uMap",c.map),i(n,"uMapIntensity",c.mapIntensity)):i(n,"uIsMap",!1),i(n,"uRadius",c.radius),i(n,"uSmudge",c.smudge),i(n,"uDissipation",c.dissipation),i(n,"uMotionBlur",c.motionBlur),i(n,"uMotionSample",c.motionSample);const b=c.pointerValues||m(M);b.isVelocityUpdate&&(i(n,"uMouse",b.currentPointer),i(n,"uPrevMouse",b.prevPointer)),i(n,"uVelocity",b.velocity);const T=typeof c.color=="function"?c.color(b.velocity):c.color;return i(n,"uColor",T),i(n,"uIsCursor",c.isCursor),i(n,"uPressureEnd",c.pressure),p.current===null&&(p.current=c.pressure),i(n,"uPressureStart",p.current),p.current=c.pressure,a(w,({read:C})=>{i(n,"uBuffer",C)})},[n,m,a,c,g]),g,{scene:r,mesh:v,material:n,camera:f,renderTarget:s,output:s.read.texture}]};var W=`varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -273,7 +273,7 @@ void main () { vec3 splat = exp(-dot(p, p) / radius) * color; vec3 base = texture2D(uTarget, vUv).xyz; gl_FragColor = vec4(base + splat, 1.0); -}`;const Qe=()=>l.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:W,fragmentShader:Ye}),[]),Ze=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=Ve(),v=n.clone(),f=qe(),m=Ne(),s=Oe(),u=Le(),c=$e(),h=Ke(),p=He(),g=Qe(),x=l.useMemo(()=>({vorticityMaterial:m,curlMaterial:f,advectionMaterial:s,divergenceMaterial:u,pressureMaterial:c,clearMaterial:h,gradientSubtractMaterial:p,splatMaterial:g}),[m,f,s,u,c,h,p,g]),d=E(a,o);l.useEffect(()=>{i(x.splatMaterial,"aspectRatio",d.x/d.y);for(const b of Object.values(x))i(b,"texelSize",new t.Vector2(1/d.x,1/d.y))},[d,x]);const w=A(e,r,n,t.Mesh);l.useEffect(()=>{n.dispose(),w.material=v},[n,w,v]),l.useEffect(()=>()=>{for(const b of Object.values(x))b.dispose()},[x]);const M=l.useCallback(b=>{w.material=b,w.material.needsUpdate=!0},[w]);return{materials:x,setMeshMaterial:M,mesh:w}},te=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}),Je=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{materials:n,setMeshMaterial:v,mesh:f}=Ze({scene:r,size:e,dpr:a}),m=I(e),s=X(),u=l.useMemo(()=>({scene:r,camera:m,size:e,samples:o}),[r,m,e,o]),[c,h]=q(u),[p,g]=q(u),[x,d]=D(u),[w,M]=D(u),[b,T]=q(u),C=l.useRef(0),P=l.useRef(new t.Vector2(0,0)),S=l.useRef(new t.Vector3(0,0,0)),[_,V]=F(te);return[l.useCallback((O,k)=>{const{gl:B,pointer:Z,clock:J,size:Ce}=O;k&&V(k),C.current===0&&(C.current=J.getElapsedTime());const Te=Math.min((J.getElapsedTime()-C.current)/3,.02);C.current=J.getElapsedTime();const ee=h(B,({read:U})=>{v(n.advectionMaterial),i(n.advectionMaterial,"uVelocity",U),i(n.advectionMaterial,"uSource",U),i(n.advectionMaterial,"dt",Te),i(n.advectionMaterial,"dissipation",_.velocity_dissipation)}),Vt=g(B,({read:U})=>{v(n.advectionMaterial),i(n.advectionMaterial,"uVelocity",ee),i(n.advectionMaterial,"uSource",U),i(n.advectionMaterial,"dissipation",_.density_dissipation)}),Y=_.pointerValues||s(Z);Y.isVelocityUpdate&&(h(B,({read:U})=>{v(n.splatMaterial),i(n.splatMaterial,"uTarget",U),i(n.splatMaterial,"point",Y.currentPointer);const N=Y.diffPointer.multiply(P.current.set(Ce.width,Ce.height).multiplyScalar(_.velocity_acceleration));i(n.splatMaterial,"color",S.current.set(N.x,N.y,1)),i(n.splatMaterial,"radius",_.splat_radius)}),g(B,({read:U})=>{v(n.splatMaterial),i(n.splatMaterial,"uTarget",U);const N=typeof _.fluid_color=="function"?_.fluid_color(Y.velocity):_.fluid_color;i(n.splatMaterial,"color",N)}));const Bt=d(B,()=>{v(n.curlMaterial),i(n.curlMaterial,"uVelocity",ee)});h(B,({read:U})=>{v(n.vorticityMaterial),i(n.vorticityMaterial,"uVelocity",U),i(n.vorticityMaterial,"uCurl",Bt),i(n.vorticityMaterial,"curl",_.curl_strength),i(n.vorticityMaterial,"dt",Te)});const Ot=M(B,()=>{v(n.divergenceMaterial),i(n.divergenceMaterial,"uVelocity",ee)});T(B,({read:U})=>{v(n.clearMaterial),i(n.clearMaterial,"uTexture",U),i(n.clearMaterial,"value",_.pressure_dissipation)}),v(n.pressureMaterial),i(n.pressureMaterial,"uDivergence",Ot);let Pe;for(let U=0;U<_.pressure_iterations;U++)Pe=T(B,({read:N})=>{i(n.pressureMaterial,"uPressure",N)});return h(B,({read:U})=>{v(n.gradientSubtractMaterial),i(n.gradientSubtractMaterial,"uPressure",Pe),i(n.gradientSubtractMaterial,"uVelocity",U)}),Vt},[n,v,d,g,M,s,T,h,V,_]),V,{scene:r,mesh:f,materials:n,camera:m,renderTarget:{velocity:c,density:p,curl:x,divergence:w,pressure:b},output:p.read.texture}]},en=({scale:e,max:a,texture:o,scene:r})=>{const n=l.useRef([]),v=l.useMemo(()=>new t.PlaneGeometry(e,e),[e]),f=l.useMemo(()=>new t.MeshBasicMaterial({map:o,transparent:!0,blending:t.AdditiveBlending,depthTest:!1,depthWrite:!1}),[o]);return l.useEffect(()=>{for(let m=0;m()=>{n.current.forEach(m=>{m.geometry.dispose(),Array.isArray(m.material)?m.material.forEach(s=>s.dispose()):m.material.dispose(),r.remove(m)}),n.current=[]},[r]),n.current},re=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),nn=({texture:e=new t.Texture,scale:a=64,max:o=100,size:r,dpr:n,samples:v=0})=>{const f=l.useMemo(()=>new t.Scene,[]),m=en({scale:a,max:o,texture:e,scene:f}),s=I(r),u=X(),[c,h]=D({scene:f,camera:s,size:r,dpr:n,samples:v}),[p,g]=F(re),x=l.useRef(0);return[l.useCallback((w,M)=>{const{gl:b,pointer:T,size:C}=w;M&&g(M);const P=p.pointerValues||u(T);if(p.frequency{if(S.visible){const _=S.material;S.rotation.z+=p.rotation,_.opacity*=p.fadeout_speed,S.scale.x=p.fadeout_speed*S.scale.x+p.scale,S.scale.y=S.scale.x,_.opacity<.002&&(S.visible=!1)}}),h(b)},[h,m,u,o,p,g]),g,{scene:f,camera:s,meshArr:m,renderTarget:c,output:c.texture}]};var tn=`varying vec2 vUv; +}`;const Qe=()=>l.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:W,fragmentShader:Ye}),[]),Ze=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=Ve(),v=n.clone(),f=qe(),m=Ne(),s=Oe(),a=Le(),c=$e(),g=Ke(),p=He(),h=Qe(),x=l.useMemo(()=>({vorticityMaterial:m,curlMaterial:f,advectionMaterial:s,divergenceMaterial:a,pressureMaterial:c,clearMaterial:g,gradientSubtractMaterial:p,splatMaterial:h}),[m,f,s,a,c,g,p,h]),d=E(u,o);l.useEffect(()=>{i(x.splatMaterial,"aspectRatio",d.x/d.y);for(const b of Object.values(x))i(b,"texelSize",new t.Vector2(1/d.x,1/d.y))},[d,x]);const w=A(e,r,n,t.Mesh);l.useEffect(()=>{n.dispose(),w.material=v},[n,w,v]),l.useEffect(()=>()=>{for(const b of Object.values(x))b.dispose()},[x]);const M=l.useCallback(b=>{w.material=b,w.material.needsUpdate=!0},[w]);return{materials:x,setMeshMaterial:M,mesh:w}},te=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}),Je=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{materials:n,setMeshMaterial:v,mesh:f}=Ze({scene:r,size:e,dpr:u}),m=I(e),s=X(),a=l.useMemo(()=>({scene:r,camera:m,size:e,samples:o}),[r,m,e,o]),[c,g]=q(a),[p,h]=q(a),[x,d]=D(a),[w,M]=D(a),[b,T]=q(a),C=l.useRef(0),P=l.useRef(new t.Vector2(0,0)),S=l.useRef(new t.Vector3(0,0,0)),[_,V]=F(te);return[l.useCallback((O,k)=>{const{gl:B,pointer:Z,clock:J,size:Ce}=O;k&&V(k),C.current===0&&(C.current=J.getElapsedTime());const Te=Math.min((J.getElapsedTime()-C.current)/3,.02);C.current=J.getElapsedTime();const ee=g(B,({read:U})=>{v(n.advectionMaterial),i(n.advectionMaterial,"uVelocity",U),i(n.advectionMaterial,"uSource",U),i(n.advectionMaterial,"dt",Te),i(n.advectionMaterial,"dissipation",_.velocity_dissipation)}),Vt=h(B,({read:U})=>{v(n.advectionMaterial),i(n.advectionMaterial,"uVelocity",ee),i(n.advectionMaterial,"uSource",U),i(n.advectionMaterial,"dissipation",_.density_dissipation)}),Y=_.pointerValues||s(Z);Y.isVelocityUpdate&&(g(B,({read:U})=>{v(n.splatMaterial),i(n.splatMaterial,"uTarget",U),i(n.splatMaterial,"point",Y.currentPointer);const N=Y.diffPointer.multiply(P.current.set(Ce.width,Ce.height).multiplyScalar(_.velocity_acceleration));i(n.splatMaterial,"color",S.current.set(N.x,N.y,1)),i(n.splatMaterial,"radius",_.splat_radius)}),h(B,({read:U})=>{v(n.splatMaterial),i(n.splatMaterial,"uTarget",U);const N=typeof _.fluid_color=="function"?_.fluid_color(Y.velocity):_.fluid_color;i(n.splatMaterial,"color",N)}));const Bt=d(B,()=>{v(n.curlMaterial),i(n.curlMaterial,"uVelocity",ee)});g(B,({read:U})=>{v(n.vorticityMaterial),i(n.vorticityMaterial,"uVelocity",U),i(n.vorticityMaterial,"uCurl",Bt),i(n.vorticityMaterial,"curl",_.curl_strength),i(n.vorticityMaterial,"dt",Te)});const Ot=M(B,()=>{v(n.divergenceMaterial),i(n.divergenceMaterial,"uVelocity",ee)});T(B,({read:U})=>{v(n.clearMaterial),i(n.clearMaterial,"uTexture",U),i(n.clearMaterial,"value",_.pressure_dissipation)}),v(n.pressureMaterial),i(n.pressureMaterial,"uDivergence",Ot);let Pe;for(let U=0;U<_.pressure_iterations;U++)Pe=T(B,({read:N})=>{i(n.pressureMaterial,"uPressure",N)});return g(B,({read:U})=>{v(n.gradientSubtractMaterial),i(n.gradientSubtractMaterial,"uPressure",Pe),i(n.gradientSubtractMaterial,"uVelocity",U)}),Vt},[n,v,d,h,M,s,T,g,V,_]),V,{scene:r,mesh:f,materials:n,camera:m,renderTarget:{velocity:c,density:p,curl:x,divergence:w,pressure:b},output:p.read.texture}]},en=({scale:e,max:u,texture:o,scene:r})=>{const n=l.useRef([]),v=l.useMemo(()=>new t.PlaneGeometry(e,e),[e]),f=l.useMemo(()=>new t.MeshBasicMaterial({map:o,transparent:!0,blending:t.AdditiveBlending,depthTest:!1,depthWrite:!1}),[o]);return l.useEffect(()=>{for(let m=0;m()=>{n.current.forEach(m=>{m.geometry.dispose(),Array.isArray(m.material)?m.material.forEach(s=>s.dispose()):m.material.dispose(),r.remove(m)}),n.current=[]},[r]),n.current},re=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),nn=({texture:e=new t.Texture,scale:u=64,max:o=100,size:r,dpr:n,samples:v=0})=>{const f=l.useMemo(()=>new t.Scene,[]),m=en({scale:u,max:o,texture:e,scene:f}),s=I(r),a=X(),[c,g]=D({scene:f,camera:s,size:r,dpr:n,samples:v}),[p,h]=F(re),x=l.useRef(0);return[l.useCallback((w,M)=>{const{gl:b,pointer:T,size:C}=w;M&&h(M);const P=p.pointerValues||a(T);if(p.frequency{if(S.visible){const _=S.material;S.rotation.z+=p.rotation,_.opacity*=p.fadeout_speed,S.scale.x=p.fadeout_speed*S.scale.x+p.scale,S.scale.y=S.scale.x,_.opacity<.002&&(S.visible=!1)}}),g(b)},[g,m,a,o,p,h]),h,{scene:f,camera:s,meshArr:m,renderTarget:c,output:c.texture}]};var tn=`varying vec2 vUv; void main() { vUv = uv; @@ -351,7 +351,7 @@ 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 on=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:tn,fragmentShader:rn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},oe=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new t.Vector2(2,2),warpStrength:8,beat:!1}),an=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=on(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(oe);return[l.useCallback((p,g)=>{const{gl:x,clock:d}=p;return g&&c(g),i(n,"scale",u.scale),i(n,"timeStrength",u.timeStrength),i(n,"noiseOctaves",u.noiseOctaves),i(n,"fbmOctaves",u.fbmOctaves),i(n,"warpOctaves",u.warpOctaves),i(n,"warpDirection",u.warpDirection),i(n,"warpStrength",u.warpStrength),i(n,"uTime",u.beat||d.getElapsedTime()),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var un=`varying vec2 vUv; +}`;const on=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:tn,fragmentShader:rn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},oe=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new t.Vector2(2,2),warpStrength:8,beat:!1}),an=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=on(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(oe);return[l.useCallback((p,h)=>{const{gl:x,clock:d}=p;return h&&c(h),i(n,"scale",a.scale),i(n,"timeStrength",a.timeStrength),i(n,"noiseOctaves",a.noiseOctaves),i(n,"fbmOctaves",a.fbmOctaves),i(n,"warpOctaves",a.warpOctaves),i(n,"warpDirection",a.warpDirection),i(n,"warpStrength",a.warpStrength),i(n,"uTime",a.beat||d.getElapsedTime()),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var un=`varying vec2 vUv; void main() { vUv = uv; @@ -398,7 +398,7 @@ void main() { col = clamp(col, 0.0, 1.0); gl_FragColor = vec4(col, alpha); -}`;const ln=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:un,fragmentShader:sn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ie=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}),cn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=ln(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ie);return[l.useCallback((p,g)=>{const{gl:x,clock:d}=p;return g&&c(g),u.texture?(i(n,"uTexture",u.texture),i(n,"isTexture",!0)):(i(n,"isTexture",!1),i(n,"scale",u.scale)),u.noise?(i(n,"noise",u.noise),i(n,"isNoise",!0),i(n,"noiseStrength",u.noiseStrength)):i(n,"isNoise",!1),i(n,"uTime",u.beat||d.getElapsedTime()),i(n,"laminateLayer",u.laminateLayer),i(n,"laminateInterval",u.laminateInterval),i(n,"laminateDetail",u.laminateDetail),i(n,"distortion",u.distortion),i(n,"colorFactor",u.colorFactor),i(n,"timeStrength",u.timeStrength),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var vn=`varying vec2 vUv; +}`;const ln=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:un,fragmentShader:sn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},ie=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}),cn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=ln(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(ie);return[l.useCallback((p,h)=>{const{gl:x,clock:d}=p;return h&&c(h),a.texture?(i(n,"uTexture",a.texture),i(n,"isTexture",!0)):(i(n,"isTexture",!1),i(n,"scale",a.scale)),a.noise?(i(n,"noise",a.noise),i(n,"isNoise",!0),i(n,"noiseStrength",a.noiseStrength)):i(n,"isNoise",!1),i(n,"uTime",a.beat||d.getElapsedTime()),i(n,"laminateLayer",a.laminateLayer),i(n,"laminateInterval",a.laminateInterval),i(n,"laminateDetail",a.laminateDetail),i(n,"distortion",a.distortion),i(n,"colorFactor",a.colorFactor),i(n,"timeStrength",a.timeStrength),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var vn=`varying vec2 vUv; void main() { vUv = uv; @@ -428,7 +428,7 @@ 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 fn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:vn,fragmentShader:mn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ae=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),pn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=fn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ae);return[l.useCallback((p,g)=>{const{gl:x,clock:d}=p;return g&&c(g),i(n,"u_pattern",u.pattern),i(n,"u_complexity",u.complexity),i(n,"u_complexityAttenuation",u.complexityAttenuation),i(n,"u_iterations",u.iterations),i(n,"u_timeStrength",u.timeStrength),i(n,"u_scale",u.scale),i(n,"u_time",u.beat||d.getElapsedTime()),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var dn=`varying vec2 vUv; +}`;const fn=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:vn,fragmentShader:mn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},ae=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),pn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=fn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(ae);return[l.useCallback((p,h)=>{const{gl:x,clock:d}=p;return h&&c(h),i(n,"u_pattern",a.pattern),i(n,"u_complexity",a.complexity),i(n,"u_complexityAttenuation",a.complexityAttenuation),i(n,"u_iterations",a.iterations),i(n,"u_timeStrength",a.timeStrength),i(n,"u_scale",a.scale),i(n,"u_time",a.beat||d.getElapsedTime()),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var dn=`varying vec2 vUv; void main() { vUv = uv; @@ -462,7 +462,7 @@ void main() { ); gl_FragColor = vec4(outColor, tex.a); -}`;const hn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:dn,fragmentShader:gn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ue=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)}),xn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=hn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ue);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uColor1",u.color1),i(n,"uColor2",u.color2),i(n,"uColor3",u.color3),i(n,"uColor4",u.color4),i(n,"uRgbWeight",u.rgbWeight),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var yn=`varying vec2 vUv; +}`;const hn=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:dn,fragmentShader:gn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},ue=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)}),xn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=hn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(ue);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"uTexture",a.texture),i(n,"uColor1",a.color1),i(n,"uColor2",a.color2),i(n,"uColor3",a.color3),i(n,"uColor4",a.color4),i(n,"uRgbWeight",a.rgbWeight),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var yn=`varying vec2 vUv; void main() { vUv = uv; @@ -481,7 +481,7 @@ 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 bn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uColor0:{value:new t.Color(16777215)},uColor1:{value:new t.Color(0)}},vertexShader:yn,fragmentShader:Mn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},se={texture:new t.Texture,color0:new t.Color(16777215),color1:new t.Color(0)},wn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=bn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(se);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uColor0",u.color0),i(n,"uColor1",u.color1),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Sn=`varying vec2 vUv; +}`;const bn=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uColor0:{value:new t.Color(16777215)},uColor1:{value:new t.Color(0)}},vertexShader:yn,fragmentShader:Mn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},se={texture:new t.Texture,color0:new t.Color(16777215),color1:new t.Color(0)},wn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=bn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(se);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"uTexture",a.texture),i(n,"uColor0",a.color0),i(n,"uColor1",a.color1),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Sn=`varying vec2 vUv; void main() { vUv = uv; @@ -526,7 +526,7 @@ void main() { vec3 alphColor = mix(outputColor,mapColor,mixValue); gl_FragColor = vec4(alphColor, alpha); -}`;const Cn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:Sn,fragmentShader:_n}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},le={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},Tn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Cn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(le);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_map",u.map),i(n,"u_mapIntensity",u.mapIntensity),u.alphaMap?(i(n,"u_alphaMap",u.alphaMap),i(n,"u_isAlphaMap",!0)):i(n,"u_isAlphaMap",!1),i(n,"u_brightness",u.brightness),i(n,"u_min",u.min),i(n,"u_max",u.max),u.dodgeColor?(i(n,"u_dodgeColor",u.dodgeColor),i(n,"u_isDodgeColor",!0)):i(n,"u_isDodgeColor",!1),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Pn=`varying vec2 vUv; +}`;const Cn=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:Sn,fragmentShader:_n}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},le={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},Tn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Cn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(le);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"u_texture",a.texture),i(n,"u_map",a.map),i(n,"u_mapIntensity",a.mapIntensity),a.alphaMap?(i(n,"u_alphaMap",a.alphaMap),i(n,"u_isAlphaMap",!0)):i(n,"u_isAlphaMap",!1),i(n,"u_brightness",a.brightness),i(n,"u_min",a.min),i(n,"u_max",a.max),a.dodgeColor?(i(n,"u_dodgeColor",a.dodgeColor),i(n,"u_isDodgeColor",!0)):i(n,"u_isDodgeColor",!1),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Pn=`varying vec2 vUv; void main() { vUv = uv; @@ -597,7 +597,7 @@ void main() { gl_FragColor = mix(color0, color1, progress); -}`;const Dn=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:Pn,fragmentShader:Rn}),[]),v=E(a,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},ce={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)},An=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Dn({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,dpr:a,size:e,samples:o,isSizeUpdate:!0}),[u,c]=F(ce);return[l.useCallback((p,g)=>{var b,T,C,P,S,_,V,L;const{gl:x}=p;g&&c(g),i(n,"uTexture0",u.texture0),i(n,"uTexture1",u.texture1),i(n,"progress",u.progress);const d=[((T=(b=u.texture0)==null?void 0:b.image)==null?void 0:T.width)||0,((P=(C=u.texture0)==null?void 0:C.image)==null?void 0:P.height)||0],w=[((_=(S=u.texture1)==null?void 0:S.image)==null?void 0:_.width)||0,((L=(V=u.texture1)==null?void 0:V.image)==null?void 0:L.height)||0],M=d.map((O,k)=>O+(w[k]-O)*u.progress);return i(n,"uTextureResolution",M),i(n,"padding",u.padding),i(n,"uMap",u.map),i(n,"mapIntensity",u.mapIntensity),i(n,"edgeIntensity",u.edgeIntensity),i(n,"epicenter",u.epicenter),i(n,"dirX",u.dir.x),i(n,"dirY",u.dir.y),s(x)},[s,n,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var In=`varying vec2 vUv; +}`;const Dn=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:Pn,fragmentShader:Rn}),[]),v=E(u,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},ce={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)},An=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Dn({scene:r,size:e,dpr:u}),f=I(e),[m,s]=D({scene:r,camera:f,dpr:u,size:e,samples:o,isSizeUpdate:!0}),[a,c]=F(ce);return[l.useCallback((p,h)=>{var b,T,C,P,S,_,V,L;const{gl:x}=p;h&&c(h),i(n,"uTexture0",a.texture0),i(n,"uTexture1",a.texture1),i(n,"progress",a.progress);const d=[((T=(b=a.texture0)==null?void 0:b.image)==null?void 0:T.width)||0,((P=(C=a.texture0)==null?void 0:C.image)==null?void 0:P.height)||0],w=[((_=(S=a.texture1)==null?void 0:S.image)==null?void 0:_.width)||0,((L=(V=a.texture1)==null?void 0:V.image)==null?void 0:L.height)||0],M=d.map((O,k)=>O+(w[k]-O)*a.progress);return i(n,"uTextureResolution",M),i(n,"padding",a.padding),i(n,"uMap",a.map),i(n,"mapIntensity",a.mapIntensity),i(n,"edgeIntensity",a.edgeIntensity),i(n,"epicenter",a.epicenter),i(n,"dirX",a.dir.x),i(n,"dirY",a.dir.y),s(x)},[s,n,a,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var In=`varying vec2 vUv; void main() { vUv = uv; @@ -616,7 +616,7 @@ void main() { float brightness = dot(color,u_brightness); float alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0); gl_FragColor = vec4(color, alpha); -}`;const zn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:In,fragmentShader:Fn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},ve={texture:new t.Texture,brightness:new t.Vector3(.5,.5,.5),min:0,max:1},Un=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=zn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ve);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_brightness",u.brightness),i(n,"u_min",u.min),i(n,"u_max",u.max),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Vn=`varying vec2 vUv; +}`;const zn=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.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:In,fragmentShader:Fn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},ve={texture:new t.Texture,brightness:new t.Vector3(.5,.5,.5),min:0,max:1},Un=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=zn(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(ve);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"u_texture",a.texture),i(n,"u_brightness",a.brightness),i(n,"u_min",a.min),i(n,"u_max",a.max),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Vn=`varying vec2 vUv; void main() { vUv = uv; @@ -639,7 +639,7 @@ void main() { uv = (uv + 1.0) / 2.0; gl_FragColor = texture2D(u_texture, uv); -}`;const On=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_map:{value:new t.Texture},u_mapIntensity:{value:0}},vertexShader:Vn,fragmentShader:Bn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},me={texture:new t.Texture,map:new t.Texture,mapIntensity:.3},En=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=On(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(me);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_map",u.map),i(n,"u_mapIntensity",u.mapIntensity),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Ln=`varying vec2 vUv; +}`;const On=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_map:{value:new t.Texture},u_mapIntensity:{value:0}},vertexShader:Vn,fragmentShader:Bn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},me={texture:new t.Texture,map:new t.Texture,mapIntensity:.3},En=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=On(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(me);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"u_texture",a.texture),i(n,"u_map",a.map),i(n,"u_mapIntensity",a.mapIntensity),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Ln=`varying vec2 vUv; void main() { vUv = uv; @@ -656,7 +656,7 @@ void main() { vec4 tex = texture2D(uTexture, uv); vec4 map = texture2D(uMap, uv); gl_FragColor = mix(tex,map,map.a); -}`;const $n=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uMap:{value:new t.Texture}},vertexShader:Ln,fragmentShader:Wn}),[]),v=A(e,r,n,t.Mesh);return{material:n,mesh:v}},fe={texture:new t.Texture,map:new t.Texture},kn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=$n({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(fe);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uMap",u.map),s(x)},[n,s,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var qn=`varying vec2 vUv; +}`;const $n=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uMap:{value:new t.Texture}},vertexShader:Ln,fragmentShader:Wn}),[]),v=A(e,r,n,t.Mesh);return{material:n,mesh:v}},fe={texture:new t.Texture,map:new t.Texture},kn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=$n({scene:r,size:e,dpr:u}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(fe);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"uTexture",a.texture),i(n,"uMap",a.map),s(x)},[n,s,a,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var qn=`varying vec2 vUv; void main() { vUv = uv; @@ -693,7 +693,7 @@ void main() { hsv.z *= u_brightness; vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); -}`;const Nn=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_brightness:{value:1},u_saturation:{value:1}},vertexShader:qn,fragmentShader:jn}),[]),v=A(e,r,n,t.Mesh);return{material:n,mesh:v}},pe={texture:new t.Texture,brightness:1,saturation:1},Gn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Nn({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(pe);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_brightness",u.brightness),i(n,"u_saturation",u.saturation),s(x)},[n,s,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Kn=`varying vec2 vUv; +}`;const Nn=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{u_texture:{value:new t.Texture},u_brightness:{value:1},u_saturation:{value:1}},vertexShader:qn,fragmentShader:jn}),[]),v=A(e,r,n,t.Mesh);return{material:n,mesh:v}},pe={texture:new t.Texture,brightness:1,saturation:1},Gn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Nn({scene:r,size:e,dpr:u}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(pe);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"u_texture",a.texture),i(n,"u_brightness",a.brightness),i(n,"u_saturation",a.saturation),s(x)},[n,s,a,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Kn=`varying vec2 vUv; void main() { vUv = uv; @@ -716,7 +716,7 @@ void main() { gl_FragColor = texture2D(uTexture, uv); -}`;const Hn=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uResolution:{value:new t.Vector2},uTextureResolution:{value:new t.Vector2},uTexture:{value:new t.Texture}},vertexShader:Kn,fragmentShader:Xn}),[]),v=E(a,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},de={texture:new t.Texture},Yn=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Hn({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,dpr:a,size:e,samples:o,isSizeUpdate:!0}),[u,c]=F(de);return[l.useCallback((p,g)=>{var d,w,M,b,T,C;const{gl:x}=p;return g&&c(g),i(n,"uTexture",u.texture),i(n,"uTextureResolution",[((M=(w=(d=u.texture)==null?void 0:d.source)==null?void 0:w.data)==null?void 0:M.width)||0,((C=(T=(b=u.texture)==null?void 0:b.source)==null?void 0:T.data)==null?void 0:C.height)||0]),s(x)},[s,n,u,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Qn=`precision mediump float; +}`;const Hn=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uResolution:{value:new t.Vector2},uTextureResolution:{value:new t.Vector2},uTexture:{value:new t.Texture}},vertexShader:Kn,fragmentShader:Xn}),[]),v=E(u,o);l.useEffect(()=>{i(n,"uResolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},de={texture:new t.Texture},Yn=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Hn({scene:r,size:e,dpr:u}),f=I(e),[m,s]=D({scene:r,camera:f,dpr:u,size:e,samples:o,isSizeUpdate:!0}),[a,c]=F(de);return[l.useCallback((p,h)=>{var d,w,M,b,T,C;const{gl:x}=p;return h&&c(h),i(n,"uTexture",a.texture),i(n,"uTextureResolution",[((M=(w=(d=a.texture)==null?void 0:d.source)==null?void 0:w.data)==null?void 0:M.width)||0,((C=(T=(b=a.texture)==null?void 0:b.source)==null?void 0:T.data)==null?void 0:C.height)||0]),s(x)},[s,n,a,c]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var Qn=`precision mediump float; varying vec2 vUv; @@ -748,7 +748,7 @@ void main() { ) / 9.0; gl_FragColor = outColor; -}`;const Jn=e=>{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uResolution:{value:new t.Vector2(0,0)},uBlurSize:{value:Q.blurSize}},vertexShader:Qn,fragmentShader:Zn}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},Q=Object.freeze({texture:new t.Texture,blurSize:3,blurPower:5}),et=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Jn(r),f=I(e),m=l.useMemo(()=>({scene:r,camera:f,size:e,dpr:a,samples:o}),[r,f,e,a,o]),[s,u]=D(m),[c,h]=q(m),[p,g]=F(Q);return[l.useCallback((d,w)=>{var C,P,S,_,V,L;const{gl:M}=d;w&&g(w),i(n,"uTexture",p.texture),i(n,"uResolution",[((S=(P=(C=p.texture)==null?void 0:C.source)==null?void 0:P.data)==null?void 0:S.width)||0,((L=(V=(_=p.texture)==null?void 0:_.source)==null?void 0:V.data)==null?void 0:L.height)||0]),i(n,"uBlurSize",p.blurSize);let b=h(M);const T=p.blurPower;for(let O=0;O{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uTexture:{value:new t.Texture},uResolution:{value:new t.Vector2(0,0)},uBlurSize:{value:Q.blurSize}},vertexShader:Qn,fragmentShader:Zn}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},Q=Object.freeze({texture:new t.Texture,blurSize:3,blurPower:5}),et=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=Jn(r),f=I(e),m=l.useMemo(()=>({scene:r,camera:f,size:e,dpr:u,samples:o}),[r,f,e,u,o]),[s,a]=D(m),[c,g]=q(m),[p,h]=F(Q);return[l.useCallback((d,w)=>{var C,P,S,_,V,L;const{gl:M}=d;w&&h(w),i(n,"uTexture",p.texture),i(n,"uResolution",[((S=(P=(C=p.texture)==null?void 0:C.source)==null?void 0:P.data)==null?void 0:S.width)||0,((L=(V=(_=p.texture)==null?void 0:_.source)==null?void 0:V.data)==null?void 0:L.height)||0]),i(n,"uBlurSize",p.blurSize);let b=g(M);const T=p.blurPower;for(let O=0;O{const a=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uEpicenter:{value:j.epicenter},uProgress:{value:j.progress},uStrength:{value:j.strength},uWidth:{value:j.width},uMode:{value:0}},vertexShader:nt,fragmentShader:tt}),[]),r=A(e,a,o,t.Mesh);return{material:o,mesh:r}},j=Object.freeze({epicenter:new t.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),ot=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=rt(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o,isSizeUpdate:!0}),[u,c]=F(j);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"uEpicenter",u.epicenter),i(n,"uProgress",u.progress),i(n,"uWidth",u.width),i(n,"uStrength",u.strength),i(n,"uMode",u.mode==="center"?0:u.mode==="horizontal"?1:2),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var it=`varying vec2 vUv; +}`;const rt=e=>{const u=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),o=l.useMemo(()=>new t.ShaderMaterial({uniforms:{uEpicenter:{value:j.epicenter},uProgress:{value:j.progress},uStrength:{value:j.strength},uWidth:{value:j.width},uMode:{value:0}},vertexShader:nt,fragmentShader:tt}),[]),r=A(e,u,o,t.Mesh);return{material:o,mesh:r}},j=Object.freeze({epicenter:new t.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),ot=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=rt(r),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o,isSizeUpdate:!0}),[a,c]=F(j);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"uEpicenter",a.epicenter),i(n,"uProgress",a.progress),i(n,"uWidth",a.width),i(n,"uStrength",a.strength),i(n,"uMode",a.mode==="center"?0:a.mode==="horizontal"?1:2),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]};var it=`varying vec2 vUv; void main() { vUv = uv; @@ -875,7 +875,7 @@ void main() { vec4 finColor = CalcColor(texColor); gl_FragColor = finColor; -}`;const ut=({scene:e,size:a,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:it,fragmentShader:at}),[]),v=E(a,o);l.useEffect(()=>{i(n,"u_resolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},ge=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}),st=({size:e,dpr:a,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=ut({scene:r,size:e,dpr:a}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:a,samples:o}),[u,c]=F(ge);return[l.useCallback((p,g)=>{const{gl:x}=p;return g&&c(g),i(n,"u_texture",u.texture),i(n,"u_keyColor",u.keyColor),i(n,"u_similarity",u.similarity),i(n,"u_smoothness",u.smoothness),i(n,"u_spill",u.spill),i(n,"u_color",u.color),i(n,"u_contrast",u.contrast),i(n,"u_brightness",u.brightness),i(n,"u_gamma",u.gamma),s(x)},[s,n,c,u]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]},lt=({scene:e,geometry:a,material:o})=>{const r=A(e,a,o,t.Points),n=A(e,l.useMemo(()=>a.clone(),[a]),l.useMemo(()=>o.clone(),[o]),t.Mesh);return n.visible=!1,{points:r,interactiveMesh:n}};var ct=`uniform vec2 uResolution; +}`;const ut=({scene:e,size:u,dpr:o})=>{const r=l.useMemo(()=>new t.PlaneGeometry(2,2),[]),n=l.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:it,fragmentShader:at}),[]),v=E(u,o);l.useEffect(()=>{i(n,"u_resolution",v.clone())},[v,n]);const f=A(e,r,n,t.Mesh);return{material:n,mesh:f}},ge=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}),st=({size:e,dpr:u,samples:o=0})=>{const r=l.useMemo(()=>new t.Scene,[]),{material:n,mesh:v}=ut({scene:r,size:e,dpr:u}),f=I(e),[m,s]=D({scene:r,camera:f,size:e,dpr:u,samples:o}),[a,c]=F(ge);return[l.useCallback((p,h)=>{const{gl:x}=p;return h&&c(h),i(n,"u_texture",a.texture),i(n,"u_keyColor",a.keyColor),i(n,"u_similarity",a.similarity),i(n,"u_smoothness",a.smoothness),i(n,"u_spill",a.spill),i(n,"u_color",a.color),i(n,"u_contrast",a.contrast),i(n,"u_brightness",a.brightness),i(n,"u_gamma",a.gamma),s(x)},[s,n,c,a]),c,{scene:r,mesh:v,material:n,camera:f,renderTarget:m,output:m.texture}]},lt=({scene:e,geometry:u,material:o})=>{const r=A(e,u,o,t.Points),n=A(e,l.useMemo(()=>u.clone(),[u]),l.useMemo(()=>o.clone(),[o]),t.Mesh);return n.visible=!1,{points:r,interactiveMesh:n}};var ct=`uniform vec2 uResolution; uniform float uMorphProgress; uniform float uPointSize; @@ -960,6 +960,7 @@ void main() { float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; + gl_Position = projectedPosition += wobble; @@ -1125,24 +1126,19 @@ float getWobble(vec3 position) warpedPosition * uWobblePositionFrequency, uTime * uWobbleTimeFrequency )) * uWobbleStrength; -}`;const xe=process.env.NODE_ENV==="development",ye=(e,a,o,r,n)=>{var c;const v=o==="position"?"positionTarget":"uvTarget",f=o==="position"?"#usf ":"#usf ",m=o==="position"?"#usf ":"#usf ",s=o==="position"?"positionsList":"uvsList",u=o==="position"?` +}`;const xe=process.env.NODE_ENV==="development",ye=(e,u,o,r,n)=>{var c;const v=o==="position"?"positionTarget":"uvTarget",f=o==="position"?"#usf ":"#usf ",m=o==="position"?"#usf ":"#usf ",s=o==="position"?"positionsList":"uvsList",a=o==="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){a.deleteAttribute(o),a.setAttribute(o,new t.BufferAttribute(e[0],n));let h="",p="";e.forEach((g,x)=>{a.setAttribute(`${v}${x}`,new t.BufferAttribute(g,n)),h+=`attribute vec${n} ${v}${x}; -`,x===0?p+=`${v}${x}`:p+=`,${v}${x}`}),r=r.replace(`${f}`,h),r=r.replace(`${m}`,`vec${n} ${s}[${e.length}] = vec${n}[](${p}); - ${u} - `)}else r=r.replace(`${f}`,""),r=r.replace(`${m}`,""),(c=a==null?void 0:a.attributes[o])!=null&&c.array||xe&&console.error(`use-shader-fx:geometry.attributes.${o}.array is not found`);return r},Me=(e,a,o,r)=>{var v;let n=[];if(e&&e.length>0){(v=a==null?void 0:a.attributes[o])!=null&&v.array?n=[a.attributes[o].array,...e]:n=e;const f=Math.max(...n.map(m=>m.length));n.forEach((m,s)=>{if(m.length{let o="";const r={};let n="";return e&&e.length>0?(n+="if (false) {}",e.forEach((f,m)=>{n+=` else if (vMapArrayIndex == ${m}.0) { -`,n+=` mapArrayColor = texture2D(uMapArray${m}, uv); -`,n+="}",o+=` - uniform sampler2D uMapArray${m}; - `,r[`uMapArray${m}`]={value:f}}),n+=` else { -`,n+=` mapArrayColor = vec4(1.0); -`,n+="}",o+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(n+=`mapArrayColor = vec4(1.0); -`,o+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:a.replace("#usf ",n).replace("#usf ",o),mapArrayUniforms:r}},ft=({size:e,dpr:a,geometry:o,positions:r,uvs:n,mapArray:v})=>{const f=l.useMemo(()=>Me(r,o,"position",3),[r,o]),m=l.useMemo(()=>Me(n,o,"uv",2),[n,o]),s=l.useMemo(()=>{f.length!==m.length&&xe&&console.log("use-shader-fx:positions and uvs are not matched");const c=ye(m,o,"uv",ye(f,o,"position",ct,3),2).replace("#usf ",he),h=mt(v,vt);return new t.ShaderMaterial({vertexShader:c,fragmentShader:h.rewritedFragmentShader,depthTest:!1,depthWrite:!1,transparent:!0,blending:t.AdditiveBlending,uniforms:{uResolution:{value:new t.Vector2(0,0)},uMorphProgress:{value:R.morphProgress},uBlurAlpha:{value:R.blurAlpha},uBlurRadius:{value:R.blurRadius},uPointSize:{value:R.pointSize},uPointAlpha:{value:R.pointAlpha},uPicture:{value:new t.Texture},uIsPicture:{value:!1},uAlphaPicture:{value:new t.Texture},uIsAlphaPicture:{value:!1},uColor0:{value:R.color0},uColor1:{value:R.color1},uColor2:{value:R.color2},uColor3:{value:R.color3},uMap:{value:new t.Texture},uIsMap:{value:!1},uAlphaMap:{value:new t.Texture},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:R.wobblePositionFrequency},uWobbleTimeFrequency:{value:R.wobbleTimeFrequency},uWobbleStrength:{value:R.wobbleStrength},uWarpPositionFrequency:{value:R.warpPositionFrequency},uWarpTimeFrequency:{value:R.warpTimeFrequency},uWarpStrength:{value:R.warpStrength},uDisplacement:{value:new t.Texture},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:R.displacementIntensity},uDisplacementColorIntensity:{value:R.displacementColorIntensity},uSizeRandomIntensity:{value:R.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:R.sizeRandomTimeFrequency},uSizeRandomMin:{value:R.sizeRandomMin},uSizeRandomMax:{value:R.sizeRandomMax},uDivergence:{value:R.divergence},uDivergencePoint:{value:R.divergencePoint},...h.mapArrayUniforms}})},[o,f,m,v]),u=E(e,a);return l.useEffect(()=>{i(s,"uResolution",u.clone())},[u,s]),{material:s,modifiedPositions:f,modifiedUvs:m}},be=({size:e,dpr:a,scene:o=!1,geometry:r,positions:n,uvs:v,mapArray:f})=>{const m=l.useMemo(()=>{const x=r||new t.SphereGeometry(1,32,32);return x.setIndex(null),x.deleteAttribute("normal"),x},[r]),{material:s,modifiedPositions:u,modifiedUvs:c}=ft({size:e,dpr:a,geometry:m,positions:n,uvs:v,mapArray:f}),{points:h,interactiveMesh:p}=lt({scene:o,geometry:m,material:s});return[l.useCallback((x,d)=>{x&&i(s,"uTime",(d==null?void 0:d.beat)||x.clock.getElapsedTime()),d!==void 0&&(i(s,"uMorphProgress",d.morphProgress),i(s,"uBlurAlpha",d.blurAlpha),i(s,"uBlurRadius",d.blurRadius),i(s,"uPointSize",d.pointSize),i(s,"uPointAlpha",d.pointAlpha),d.picture?(i(s,"uPicture",d.picture),i(s,"uIsPicture",!0)):d.picture===!1&&i(s,"uIsPicture",!1),d.alphaPicture?(i(s,"uAlphaPicture",d.alphaPicture),i(s,"uIsAlphaPicture",!0)):d.alphaPicture===!1&&i(s,"uIsAlphaPicture",!1),i(s,"uColor0",d.color0),i(s,"uColor1",d.color1),i(s,"uColor2",d.color2),i(s,"uColor3",d.color3),d.map?(i(s,"uMap",d.map),i(s,"uIsMap",!0)):d.map===!1&&i(s,"uIsMap",!1),d.alphaMap?(i(s,"uAlphaMap",d.alphaMap),i(s,"uIsAlphaMap",!0)):d.alphaMap===!1&&i(s,"uIsAlphaMap",!1),i(s,"uWobbleStrength",d.wobbleStrength),i(s,"uWobblePositionFrequency",d.wobblePositionFrequency),i(s,"uWobbleTimeFrequency",d.wobbleTimeFrequency),i(s,"uWarpStrength",d.warpStrength),i(s,"uWarpPositionFrequency",d.warpPositionFrequency),i(s,"uWarpTimeFrequency",d.warpTimeFrequency),d.displacement?(i(s,"uDisplacement",d.displacement),i(s,"uIsDisplacement",!0)):d.displacement===!1&&i(s,"uIsDisplacement",!1),i(s,"uDisplacementIntensity",d.displacementIntensity),i(s,"uDisplacementColorIntensity",d.displacementColorIntensity),i(s,"uSizeRandomIntensity",d.sizeRandomIntensity),i(s,"uSizeRandomTimeFrequency",d.sizeRandomTimeFrequency),i(s,"uSizeRandomMin",d.sizeRandomMin),i(s,"uSizeRandomMax",d.sizeRandomMax),i(s,"uDivergence",d.divergence),i(s,"uDivergencePoint",d.divergencePoint))},[s]),{points:h,interactiveMesh:p,positions:u,uvs:c}]},R=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}),pt=({size:e,dpr:a,samples:o=0,camera:r,geometry:n,positions:v,uvs:f})=>{const m=l.useMemo(()=>new t.Scene,[]),[s,{points:u,interactiveMesh:c,positions:h,uvs:p}]=be({scene:m,size:e,dpr:a,geometry:n,positions:v,uvs:f}),[g,x]=D({scene:m,camera:r,size:e,dpr:a,samples:o,depthBuffer:!0}),d=l.useCallback((M,b)=>(s(M,b),x(M.gl)),[x,s]),w=l.useCallback(M=>{s(null,M)},[s]);return[d,w,{scene:m,points:u,interactiveMesh:c,renderTarget:g,output:g.texture,positions:h,uvs:p}]};function dt(e,a=1e-4){a=Math.max(a,Number.EPSILON);const o={},r=e.getIndex(),n=e.getAttribute("position"),v=r?r.count:n.count;let f=0;const m=Object.keys(e.attributes),s={},u={},c=[],h=["getX","getY","getZ","getW"];for(let d=0,w=m.length;d[]))}const p=Math.log10(1/a),g=Math.pow(10,p);for(let d=0;d0){u.deleteAttribute(o),u.setAttribute(o,new t.BufferAttribute(e[0],n));let g="",p="";e.forEach((h,x)=>{u.setAttribute(`${v}${x}`,new t.BufferAttribute(h,n)),g+=`attribute vec${n} ${v}${x}; +`,x===0?p+=`${v}${x}`:p+=`,${v}${x}`}),r=r.replace(`${f}`,g),r=r.replace(`${m}`,`vec${n} ${s}[${e.length}] = vec${n}[](${p}); + ${a} + `)}else r=r.replace(`${f}`,""),r=r.replace(`${m}`,""),(c=u==null?void 0:u.attributes[o])!=null&&c.array||xe&&console.error(`use-shader-fx:geometry.attributes.${o}.array is not found`);return r},Me=(e,u,o,r)=>{var v;let n=[];if(e&&e.length>0){(v=u==null?void 0:u.attributes[o])!=null&&v.array?n=[u.attributes[o].array,...e]:n=e;const f=Math.max(...n.map(m=>m.length));n.forEach((m,s)=>{if(m.length{let o="";const r={};let n="mapArrayColor = ";return e&&e.length>0?(e.forEach((f,m)=>{const s=`vMapArrayIndex < ${m}.1`,a=`texture2D(uMapArray${m}, uv)`;n+=`( ${s} ) ? ${a} : `,o+=` + uniform sampler2D uMapArray${m}; + `,r[`uMapArray${m}`]={value:f}}),n+="vec4(1.);",o+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(n+="vec4(1.0);",o+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:u.replace("#usf ",n).replace("#usf ",o),mapArrayUniforms:r}},ft=({size:e,dpr:u,geometry:o,positions:r,uvs:n,mapArray:v})=>{const f=l.useMemo(()=>Me(r,o,"position",3),[r,o]),m=l.useMemo(()=>Me(n,o,"uv",2),[n,o]),s=l.useMemo(()=>{f.length!==m.length&&xe&&console.log("use-shader-fx:positions and uvs are not matched");const c=ye(m,o,"uv",ye(f,o,"position",ct,3),2).replace("#usf ",he),g=mt(v,vt);return console.log(g.rewritedFragmentShader),new t.ShaderMaterial({vertexShader:c,fragmentShader:g.rewritedFragmentShader,depthTest:!1,depthWrite:!1,transparent:!0,blending:t.AdditiveBlending,uniforms:{uResolution:{value:new t.Vector2(0,0)},uMorphProgress:{value:R.morphProgress},uBlurAlpha:{value:R.blurAlpha},uBlurRadius:{value:R.blurRadius},uPointSize:{value:R.pointSize},uPointAlpha:{value:R.pointAlpha},uPicture:{value:new t.Texture},uIsPicture:{value:!1},uAlphaPicture:{value:new t.Texture},uIsAlphaPicture:{value:!1},uColor0:{value:R.color0},uColor1:{value:R.color1},uColor2:{value:R.color2},uColor3:{value:R.color3},uMap:{value:new t.Texture},uIsMap:{value:!1},uAlphaMap:{value:new t.Texture},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:R.wobblePositionFrequency},uWobbleTimeFrequency:{value:R.wobbleTimeFrequency},uWobbleStrength:{value:R.wobbleStrength},uWarpPositionFrequency:{value:R.warpPositionFrequency},uWarpTimeFrequency:{value:R.warpTimeFrequency},uWarpStrength:{value:R.warpStrength},uDisplacement:{value:new t.Texture},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:R.displacementIntensity},uDisplacementColorIntensity:{value:R.displacementColorIntensity},uSizeRandomIntensity:{value:R.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:R.sizeRandomTimeFrequency},uSizeRandomMin:{value:R.sizeRandomMin},uSizeRandomMax:{value:R.sizeRandomMax},uDivergence:{value:R.divergence},uDivergencePoint:{value:R.divergencePoint},...g.mapArrayUniforms}})},[o,f,m,v]),a=E(e,u);return l.useEffect(()=>{i(s,"uResolution",a.clone())},[a,s]),{material:s,modifiedPositions:f,modifiedUvs:m}},be=({size:e,dpr:u,scene:o=!1,geometry:r,positions:n,uvs:v,mapArray:f})=>{const m=l.useMemo(()=>{const x=r||new t.SphereGeometry(1,32,32);return x.setIndex(null),x.deleteAttribute("normal"),x},[r]),{material:s,modifiedPositions:a,modifiedUvs:c}=ft({size:e,dpr:u,geometry:m,positions:n,uvs:v,mapArray:f}),{points:g,interactiveMesh:p}=lt({scene:o,geometry:m,material:s});return[l.useCallback((x,d)=>{x&&i(s,"uTime",(d==null?void 0:d.beat)||x.clock.getElapsedTime()),d!==void 0&&(i(s,"uMorphProgress",d.morphProgress),i(s,"uBlurAlpha",d.blurAlpha),i(s,"uBlurRadius",d.blurRadius),i(s,"uPointSize",d.pointSize),i(s,"uPointAlpha",d.pointAlpha),d.picture?(i(s,"uPicture",d.picture),i(s,"uIsPicture",!0)):d.picture===!1&&i(s,"uIsPicture",!1),d.alphaPicture?(i(s,"uAlphaPicture",d.alphaPicture),i(s,"uIsAlphaPicture",!0)):d.alphaPicture===!1&&i(s,"uIsAlphaPicture",!1),i(s,"uColor0",d.color0),i(s,"uColor1",d.color1),i(s,"uColor2",d.color2),i(s,"uColor3",d.color3),d.map?(i(s,"uMap",d.map),i(s,"uIsMap",!0)):d.map===!1&&i(s,"uIsMap",!1),d.alphaMap?(i(s,"uAlphaMap",d.alphaMap),i(s,"uIsAlphaMap",!0)):d.alphaMap===!1&&i(s,"uIsAlphaMap",!1),i(s,"uWobbleStrength",d.wobbleStrength),i(s,"uWobblePositionFrequency",d.wobblePositionFrequency),i(s,"uWobbleTimeFrequency",d.wobbleTimeFrequency),i(s,"uWarpStrength",d.warpStrength),i(s,"uWarpPositionFrequency",d.warpPositionFrequency),i(s,"uWarpTimeFrequency",d.warpTimeFrequency),d.displacement?(i(s,"uDisplacement",d.displacement),i(s,"uIsDisplacement",!0)):d.displacement===!1&&i(s,"uIsDisplacement",!1),i(s,"uDisplacementIntensity",d.displacementIntensity),i(s,"uDisplacementColorIntensity",d.displacementColorIntensity),i(s,"uSizeRandomIntensity",d.sizeRandomIntensity),i(s,"uSizeRandomTimeFrequency",d.sizeRandomTimeFrequency),i(s,"uSizeRandomMin",d.sizeRandomMin),i(s,"uSizeRandomMax",d.sizeRandomMax),i(s,"uDivergence",d.divergence),i(s,"uDivergencePoint",d.divergencePoint))},[s]),{points:g,interactiveMesh:p,positions:a,uvs:c}]},R=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}),pt=({size:e,dpr:u,samples:o=0,camera:r,geometry:n,positions:v,uvs:f})=>{const m=l.useMemo(()=>new t.Scene,[]),[s,{points:a,interactiveMesh:c,positions:g,uvs:p}]=be({scene:m,size:e,dpr:u,geometry:n,positions:v,uvs:f}),[h,x]=D({scene:m,camera:r,size:e,dpr:u,samples:o,depthBuffer:!0}),d=l.useCallback((M,b)=>(s(M,b),x(M.gl)),[x,s]),w=l.useCallback(M=>{s(null,M)},[s]);return[d,w,{scene:m,points:a,interactiveMesh:c,renderTarget:h,output:h.texture,positions:g,uvs:p}]};function dt(e,u=1e-4){u=Math.max(u,Number.EPSILON);const o={},r=e.getIndex(),n=e.getAttribute("position"),v=r?r.count:n.count;let f=0;const m=Object.keys(e.attributes),s={},a={},c=[],g=["getX","getY","getZ","getW"];for(let d=0,w=m.length;d[]))}const p=Math.log10(1/u),h=Math.pow(10,p);for(let d=0;d{let a=e;return a=a.replace("#include ",` +#endif`;const we=e=>{let u=e;return u=u.replace("#include ",` vec3 objectNormal = usf_Normal; #ifdef USE_TANGENT vec3 objectTangent = vec3( tangent.xyz ); - #endif`),a=a.replace("#include ",` - vec3 transformed = usf_Position;`),a=a.replace("void main() {",` + #endif`),u=u.replace("#include ",` + vec3 transformed = usf_Position;`),u=u.replace("void main() {",` uniform float uTime; uniform float uWobblePositionFrequency; uniform float uWobbleTimeFrequency; @@ -1480,7 +1476,7 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); varying float vWobble; varying vec2 vPosition; // #usf - void main() {`),a=a.replace("// #usf ",`${he}`),a=a.replace("void main() {",` + void main() {`),u=u.replace("// #usf ",`${he}`),u=u.replace("void main() {",` void main() { vec3 usf_Position = position; vec3 usf_Normal = normal; @@ -1501,7 +1497,7 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); usf_Normal = cross(toA, toB); // Varying vPosition = usf_Position.xy; - vWobble = wobble / uWobbleStrength;`),a},yt=({baseMaterial:e,materialParameters:a})=>{const{material:o,depthMaterial:r}=l.useMemo(()=>{const n=new(e||t.MeshPhysicalMaterial)(a||{}),v=n.type==="MeshPhysicalMaterial"||n.type==="MeshStandardMaterial",f=n.type==="MeshPhysicalMaterial";Object.assign(n.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:z.wobblePositionFrequency},uWobbleTimeFrequency:{value:z.wobbleTimeFrequency},uWobbleStrength:{value:z.wobbleStrength},uWarpPositionFrequency:{value:z.warpPositionFrequency},uWarpTimeFrequency:{value:z.warpTimeFrequency},uWarpStrength:{value:z.warpStrength},uWobbleShine:{value:z.wobbleShine},uColor0:{value:z.color0},uColor1:{value:z.color1},uColor2:{value:z.color2},uColor3:{value:z.color3},uColorMix:{value:z.colorMix},uChromaticAberration:{value:z.chromaticAberration},uAnisotropicBlur:{value:z.anisotropicBlur},uDistortion:{value:z.distortion},uDistortionScale:{value:z.distortionScale},uTemporalDistortion:{value:z.temporalDistortion},uSamples:{value:z.samples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),n.onBeforeCompile=s=>{Object.assign(s.uniforms,n.userData.uniforms),s.vertexShader=we(s.vertexShader),s.fragmentShader=s.fragmentShader.replace("#include ",` + vWobble = wobble / uWobbleStrength;`),u},yt=({baseMaterial:e,materialParameters:u})=>{const{material:o,depthMaterial:r}=l.useMemo(()=>{const n=new(e||t.MeshPhysicalMaterial)(u||{}),v=n.type==="MeshPhysicalMaterial"||n.type==="MeshStandardMaterial",f=n.type==="MeshPhysicalMaterial";Object.assign(n.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:z.wobblePositionFrequency},uWobbleTimeFrequency:{value:z.wobbleTimeFrequency},uWobbleStrength:{value:z.wobbleStrength},uWarpPositionFrequency:{value:z.warpPositionFrequency},uWarpTimeFrequency:{value:z.warpTimeFrequency},uWarpStrength:{value:z.warpStrength},uWobbleShine:{value:z.wobbleShine},uColor0:{value:z.color0},uColor1:{value:z.color1},uColor2:{value:z.color2},uColor3:{value:z.color3},uColorMix:{value:z.colorMix},uChromaticAberration:{value:z.chromaticAberration},uAnisotropicBlur:{value:z.anisotropicBlur},uDistortion:{value:z.distortion},uDistortionScale:{value:z.distortionScale},uTemporalDistortion:{value:z.temporalDistortion},uSamples:{value:z.samples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),n.onBeforeCompile=s=>{Object.assign(s.uniforms,n.userData.uniforms),s.vertexShader=we(s.vertexShader),s.fragmentShader=s.fragmentShader.replace("#include ",` #include diffuseColor = mix(diffuseColor,usf_DiffuseColor,uColorMix);`),v&&(s.fragmentShader=s.fragmentShader.replace("#include ",` #include @@ -1535,7 +1531,7 @@ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); - ${v?"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);":""}`),f&&(s.fragmentShader=s.fragmentShader.replace("#include ",`${ht}`),s.fragmentShader=s.fragmentShader.replace("#include ",`${xt}`))},n.needsUpdate=!0;const m=new t.MeshDepthMaterial({depthPacking:t.RGBADepthPacking});return m.onBeforeCompile=s=>{Object.assign(s.uniforms,n.userData.uniforms),s.vertexShader=we(s.vertexShader)},m.needsUpdate=!0,{material:n,depthMaterial:m}},[a,e]);return{material:o,depthMaterial:r}},Se=({scene:e=!1,geometry:a,baseMaterial:o,materialParameters:r})=>{const n=l.useMemo(()=>{let u=a||new t.IcosahedronGeometry(2,50);return u=dt(u),u.computeTangents(),u},[a]),{material:v,depthMaterial:f}=yt({baseMaterial:o,materialParameters:r}),m=A(e,n,v,t.Mesh);return[l.useCallback((u,c)=>{const h=v.userData;u&&i(h,"uTime",(c==null?void 0:c.beat)||u.clock.getElapsedTime()),c!==void 0&&(i(h,"uWobbleStrength",c.wobbleStrength),i(h,"uWobblePositionFrequency",c.wobblePositionFrequency),i(h,"uWobbleTimeFrequency",c.wobbleTimeFrequency),i(h,"uWarpStrength",c.warpStrength),i(h,"uWarpPositionFrequency",c.warpPositionFrequency),i(h,"uWarpTimeFrequency",c.warpTimeFrequency),i(h,"uWobbleShine",c.wobbleShine),i(h,"uSamples",c.samples),i(h,"uColor0",c.color0),i(h,"uColor1",c.color1),i(h,"uColor2",c.color2),i(h,"uColor3",c.color3),i(h,"uColorMix",c.colorMix),i(h,"uChromaticAberration",c.chromaticAberration),i(h,"uAnisotropicBlur",c.anisotropicBlur),i(h,"uDistortion",c.distortion),i(h,"uDistortionScale",c.distortionScale),i(h,"uTemporalDistortion",c.temporalDistortion))},[v]),{mesh:m,depthMaterial:f}]},z=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}),Mt=({size:e,dpr:a,samples:o=0,camera:r,geometry:n,baseMaterial:v,materialParameters:f})=>{const m=l.useMemo(()=>new t.Scene,[]),[s,{mesh:u,depthMaterial:c}]=Se({baseMaterial:v,materialParameters:f,scene:m,geometry:n}),[h,p]=D({scene:m,camera:r,size:e,dpr:a,samples:o,depthBuffer:!0}),g=l.useCallback((d,w)=>(s(d,w),p(d.gl)),[p,s]),x=l.useCallback(d=>{s(null,d)},[s]);return[g,x,{scene:m,mesh:u,depthMaterial:c,renderTarget:h,output:h.texture}]},bt=(e,a,o)=>{const r=l.useMemo(()=>new t.Mesh(a,o),[a,o]);return l.useEffect(()=>{e.add(r)},[e,r]),l.useEffect(()=>()=>{e.remove(r),a.dispose(),o.dispose()},[e,a,o,r]),r},K=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 o=2.5949095;return e<.5?Math.pow(2*e,2)*((o+1)*2*e-o)/2:(Math.pow(2*e-2,2)*((o+1)*(e*2-2)+o)+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)},easeOutElastic(e){const a=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*a)+1},easeInOutElastic(e){const a=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)*a))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*a)/2+1},easeInBounce(e){return 1-K.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-K.easeOutBounce(1-2*e))/2:(1+K.easeOutBounce(2*e-1))/2}});function wt(e){let a=Math.sin(e*12.9898)*43758.5453;return a-Math.floor(a)}const St=(e,a="easeOutQuart")=>{const o=e/60,r=K[a];return l.useCallback(v=>{let f=v.getElapsedTime()*o;const m=Math.floor(f),s=r(f-m);f=s+m;const u=wt(m);return{beat:f,floor:m,fract:s,hash:u}},[o,r])},_t=(e=60)=>{const a=l.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),o=l.useRef(null);return l.useCallback(n=>{const v=n.getElapsedTime();return o.current===null||v-o.current>=a?(o.current=v,!0):!1},[a])},Ct=e=>{var r,n;const a=(r=e.dom)==null?void 0:r.length,o=(n=e.texture)==null?void 0:n.length;return!a||!o||a!==o};var Tt=`varying vec2 vUv; + ${v?"usf_Roughness = max(roughness - colorWobbleMix * uWobbleShine,0.);":""}`),f&&(s.fragmentShader=s.fragmentShader.replace("#include ",`${ht}`),s.fragmentShader=s.fragmentShader.replace("#include ",`${xt}`))},n.needsUpdate=!0;const m=new t.MeshDepthMaterial({depthPacking:t.RGBADepthPacking});return m.onBeforeCompile=s=>{Object.assign(s.uniforms,n.userData.uniforms),s.vertexShader=we(s.vertexShader)},m.needsUpdate=!0,{material:n,depthMaterial:m}},[u,e]);return{material:o,depthMaterial:r}},Se=({scene:e=!1,geometry:u,baseMaterial:o,materialParameters:r})=>{const n=l.useMemo(()=>{let a=u||new t.IcosahedronGeometry(2,50);return a=dt(a),a.computeTangents(),a},[u]),{material:v,depthMaterial:f}=yt({baseMaterial:o,materialParameters:r}),m=A(e,n,v,t.Mesh);return[l.useCallback((a,c)=>{const g=v.userData;a&&i(g,"uTime",(c==null?void 0:c.beat)||a.clock.getElapsedTime()),c!==void 0&&(i(g,"uWobbleStrength",c.wobbleStrength),i(g,"uWobblePositionFrequency",c.wobblePositionFrequency),i(g,"uWobbleTimeFrequency",c.wobbleTimeFrequency),i(g,"uWarpStrength",c.warpStrength),i(g,"uWarpPositionFrequency",c.warpPositionFrequency),i(g,"uWarpTimeFrequency",c.warpTimeFrequency),i(g,"uWobbleShine",c.wobbleShine),i(g,"uSamples",c.samples),i(g,"uColor0",c.color0),i(g,"uColor1",c.color1),i(g,"uColor2",c.color2),i(g,"uColor3",c.color3),i(g,"uColorMix",c.colorMix),i(g,"uChromaticAberration",c.chromaticAberration),i(g,"uAnisotropicBlur",c.anisotropicBlur),i(g,"uDistortion",c.distortion),i(g,"uDistortionScale",c.distortionScale),i(g,"uTemporalDistortion",c.temporalDistortion))},[v]),{mesh:m,depthMaterial:f}]},z=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}),Mt=({size:e,dpr:u,samples:o=0,camera:r,geometry:n,baseMaterial:v,materialParameters:f})=>{const m=l.useMemo(()=>new t.Scene,[]),[s,{mesh:a,depthMaterial:c}]=Se({baseMaterial:v,materialParameters:f,scene:m,geometry:n}),[g,p]=D({scene:m,camera:r,size:e,dpr:u,samples:o,depthBuffer:!0}),h=l.useCallback((d,w)=>(s(d,w),p(d.gl)),[p,s]),x=l.useCallback(d=>{s(null,d)},[s]);return[h,x,{scene:m,mesh:a,depthMaterial:c,renderTarget:g,output:g.texture}]},bt=(e,u,o)=>{const r=l.useMemo(()=>new t.Mesh(u,o),[u,o]);return l.useEffect(()=>{e.add(r)},[e,r]),l.useEffect(()=>()=>{e.remove(r),u.dispose(),o.dispose()},[e,u,o,r]),r},K=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 o=2.5949095;return e<.5?Math.pow(2*e,2)*((o+1)*2*e-o)/2:(Math.pow(2*e-2,2)*((o+1)*(e*2-2)+o)+2)/2},easeInElastic(e){const u=2*Math.PI/3;return e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*u)},easeOutElastic(e){const u=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*u)+1},easeInOutElastic(e){const u=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)*u))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*u)/2+1},easeInBounce(e){return 1-K.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-K.easeOutBounce(1-2*e))/2:(1+K.easeOutBounce(2*e-1))/2}});function wt(e){let u=Math.sin(e*12.9898)*43758.5453;return u-Math.floor(u)}const St=(e,u="easeOutQuart")=>{const o=e/60,r=K[u];return l.useCallback(v=>{let f=v.getElapsedTime()*o;const m=Math.floor(f),s=r(f-m);f=s+m;const a=wt(m);return{beat:f,floor:m,fract:s,hash:a}},[o,r])},_t=(e=60)=>{const u=l.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),o=l.useRef(null);return l.useCallback(n=>{const v=n.getElapsedTime();return o.current===null||v-o.current>=u?(o.current=v,!0):!1},[u])},Ct=e=>{var r,n;const u=(r=e.dom)==null?void 0:r.length,o=(n=e.texture)==null?void 0:n.length;return!u||!o||u!==o};var Tt=`varying vec2 vUv; void main() { vUv = uv; @@ -1583,5 +1579,5 @@ void main() { alpha *= textureAlpha; gl_FragColor = vec4(textureColor, alpha); -}`;const Rt=({params:e,size:a,scene:o})=>{o.children.length>0&&(o.children.forEach(r=>{r instanceof t.Mesh&&(r.geometry.dispose(),r.material.dispose())}),o.remove(...o.children)),e.texture.forEach((r,n)=>{const v=new t.Mesh(new t.PlaneGeometry(1,1),new t.ShaderMaterial({vertexShader:Tt,fragmentShader:Pt,transparent:!0,uniforms:{u_texture:{value:r},u_textureResolution:{value:new t.Vector2(0,0)},u_resolution:{value:new t.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[n]?e.boderRadius[n]:0}}}));o.add(v)})},Dt=()=>{const e=l.useRef([]),a=l.useRef([]);return l.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:n,params:v})=>{e.current.length>0&&e.current.forEach((m,s)=>{m.unobserve(a.current[s])}),a.current=[],e.current=[];const f=new Array(v.dom.length).fill(!1);r.current=[...f],n.current=[...f],v.dom.forEach((m,s)=>{const u=h=>{h.forEach(p=>{v.onIntersect[s]&&v.onIntersect[s](p),r.current[s]=p.isIntersecting})},c=new IntersectionObserver(u,{rootMargin:"0px",threshold:0});c.observe(m),e.current.push(c),a.current.push(m)})},[])},At=()=>{const e=l.useRef([]),a=l.useCallback(({params:o,size:r,resolutionRef:n,scene:v,isIntersectingRef:f})=>{v.children.length!==e.current.length&&(e.current=new Array(v.children.length)),v.children.forEach((m,s)=>{var h,p,g,x,d,w;const u=o.dom[s];if(!u)return;const c=u.getBoundingClientRect();if(e.current[s]=c,m.scale.set(c.width,c.height,1),m.position.set(c.left+c.width*.5-r.width*.5,-c.top-c.height*.5+r.height*.5,0),f.current[s]&&(o.rotation[s]&&m.rotation.copy(o.rotation[s]),m instanceof t.Mesh)){const M=m.material;i(M,"u_texture",o.texture[s]),i(M,"u_textureResolution",[((g=(p=(h=o.texture[s])==null?void 0:h.source)==null?void 0:p.data)==null?void 0:g.width)||0,((w=(d=(x=o.texture[s])==null?void 0:x.source)==null?void 0:d.data)==null?void 0:w.height)||0]),i(M,"u_resolution",n.current.set(c.width,c.height)),i(M,"u_borderRadius",o.boderRadius[s]?o.boderRadius[s]:0)}})},[]);return[e.current,a]},It=()=>{const e=l.useRef([]),a=l.useRef([]),o=l.useCallback((r,n=!1)=>{e.current.forEach((f,m)=>{f&&(a.current[m]=!0)});const v=n?[...a.current]:[...e.current];return r<0?v:v[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:a,isIntersecting:o}},Ft=e=>({onView:o,onHidden:r})=>{const n=l.useRef(!1);l.useEffect(()=>{let v;const f=()=>{e.current.some(m=>m)?n.current||(o&&o(),n.current=!0):n.current&&(r&&r(),n.current=!1),v=requestAnimationFrame(f)};return v=requestAnimationFrame(f),()=>{cancelAnimationFrame(v)}},[o,r])},_e={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},zt=({size:e,dpr:a,samples:o=0},r=[])=>{const n=l.useMemo(()=>new t.Scene,[]),v=I(e),[f,m]=D({scene:n,camera:v,size:e,dpr:a,samples:o,isSizeUpdate:!0}),[s,u]=F({..._e,updateKey:performance.now()}),[c,h]=At(),p=l.useRef(new t.Vector2(0,0)),[g,x]=l.useState(!0);l.useEffect(()=>{x(!0)},r);const d=l.useRef(null),w=l.useMemo(()=>new t.Texture,[]),M=Dt(),{isIntersectingOnceRef:b,isIntersectingRef:T,isIntersecting:C}=It(),P=Ft(T);return[l.useCallback((_,V)=>{const{gl:L,size:O}=_;if(V&&u(V),Ct(s))return w;if(g){if(d.current===s.updateKey)return w;d.current=s.updateKey}return g&&(Rt({params:s,size:O,scene:n}),M({isIntersectingRef:T,isIntersectingOnceRef:b,params:s}),x(!1)),h({params:s,size:O,resolutionRef:p,scene:n,isIntersectingRef:T}),m(L)},[m,u,M,h,g,n,s,b,T,w]),u,{scene:n,camera:v,renderTarget:f,output:f.texture,isIntersecting:C,DOMRects:c,intersections:T.current,useDomView:P}]},Ut=({scene:e,camera:a,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1},s)=>{const u=l.useRef([]),c=E(o,r);u.current=l.useMemo(()=>Array.from({length:s},()=>{const p=new t.WebGLRenderTarget(c.x,c.y,{...G,samples:v,depthBuffer:f});return m&&(p.depthTexture=new t.DepthTexture(c.x,c.y,t.FloatType)),p}),[s]),l.useLayoutEffect(()=>{n&&u.current.forEach(p=>p.setSize(c.x,c.y))},[c,n]),l.useEffect(()=>{const p=u.current;return()=>{p.forEach(g=>g.dispose())}},[s]);const h=l.useCallback((p,g,x)=>{const d=u.current[g];return H({gl:p,scene:e,camera:a,fbo:d,onBeforeRender:()=>x&&x({read:d.texture})}),d.texture},[e,a]);return[u.current,h]};y.ALPHABLENDING_PARAMS=fe,y.BLENDING_PARAMS=le,y.BRIGHTNESSPICKER_PARAMS=ve,y.BRUSH_PARAMS=ne,y.CHROMAKEY_PARAMS=ge,y.COLORSTRATA_PARAMS=ie,y.COSPALETTE_PARAMS=ue,y.COVERTEXTURE_PARAMS=de,y.DOMSYNCER_PARAMS=_e,y.DUOTONE_PARAMS=se,y.Easing=K,y.FBO_OPTION=G,y.FLUID_PARAMS=te,y.FXBLENDING_PARAMS=me,y.FXTEXTURE_PARAMS=ce,y.HSV_PARAMS=pe,y.MARBLE_PARAMS=ae,y.MORPHPARTICLES_PARAMS=R,y.NOISE_PARAMS=oe,y.RIPPLE_PARAMS=re,y.SIMPLEBLUR_PARAMS=Q,y.WAVE_PARAMS=j,y.WOBBLE3D_PARAMS=z,y.renderFBO=H,y.setUniform=i,y.useAddMesh=bt,y.useAlphaBlending=kn,y.useBeat=St,y.useBlending=Tn,y.useBrightnessPicker=Un,y.useBrush=ze,y.useCamera=I,y.useChromaKey=st,y.useColorStrata=cn,y.useCopyTexture=Ut,y.useCosPalette=xn,y.useCoverTexture=Yn,y.useCreateMorphParticles=be,y.useCreateWobble3D=Se,y.useDomSyncer=zt,y.useDoubleFBO=q,y.useDuoTone=wn,y.useFPSLimiter=_t,y.useFluid=Je,y.useFxBlending=En,y.useFxTexture=An,y.useHSV=Gn,y.useMarble=pn,y.useMorphParticles=pt,y.useNoise=an,y.useParams=F,y.usePointer=X,y.useResolution=E,y.useRipple=nn,y.useSimpleBlur=et,y.useSingleFBO=D,y.useWave=ot,y.useWobble3D=Mt,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"})}); +}`;const Rt=({params:e,size:u,scene:o})=>{o.children.length>0&&(o.children.forEach(r=>{r instanceof t.Mesh&&(r.geometry.dispose(),r.material.dispose())}),o.remove(...o.children)),e.texture.forEach((r,n)=>{const v=new t.Mesh(new t.PlaneGeometry(1,1),new t.ShaderMaterial({vertexShader:Tt,fragmentShader:Pt,transparent:!0,uniforms:{u_texture:{value:r},u_textureResolution:{value:new t.Vector2(0,0)},u_resolution:{value:new t.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[n]?e.boderRadius[n]:0}}}));o.add(v)})},Dt=()=>{const e=l.useRef([]),u=l.useRef([]);return l.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:n,params:v})=>{e.current.length>0&&e.current.forEach((m,s)=>{m.unobserve(u.current[s])}),u.current=[],e.current=[];const f=new Array(v.dom.length).fill(!1);r.current=[...f],n.current=[...f],v.dom.forEach((m,s)=>{const a=g=>{g.forEach(p=>{v.onIntersect[s]&&v.onIntersect[s](p),r.current[s]=p.isIntersecting})},c=new IntersectionObserver(a,{rootMargin:"0px",threshold:0});c.observe(m),e.current.push(c),u.current.push(m)})},[])},At=()=>{const e=l.useRef([]),u=l.useCallback(({params:o,size:r,resolutionRef:n,scene:v,isIntersectingRef:f})=>{v.children.length!==e.current.length&&(e.current=new Array(v.children.length)),v.children.forEach((m,s)=>{var g,p,h,x,d,w;const a=o.dom[s];if(!a)return;const c=a.getBoundingClientRect();if(e.current[s]=c,m.scale.set(c.width,c.height,1),m.position.set(c.left+c.width*.5-r.width*.5,-c.top-c.height*.5+r.height*.5,0),f.current[s]&&(o.rotation[s]&&m.rotation.copy(o.rotation[s]),m instanceof t.Mesh)){const M=m.material;i(M,"u_texture",o.texture[s]),i(M,"u_textureResolution",[((h=(p=(g=o.texture[s])==null?void 0:g.source)==null?void 0:p.data)==null?void 0:h.width)||0,((w=(d=(x=o.texture[s])==null?void 0:x.source)==null?void 0:d.data)==null?void 0:w.height)||0]),i(M,"u_resolution",n.current.set(c.width,c.height)),i(M,"u_borderRadius",o.boderRadius[s]?o.boderRadius[s]:0)}})},[]);return[e.current,u]},It=()=>{const e=l.useRef([]),u=l.useRef([]),o=l.useCallback((r,n=!1)=>{e.current.forEach((f,m)=>{f&&(u.current[m]=!0)});const v=n?[...u.current]:[...e.current];return r<0?v:v[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:u,isIntersecting:o}},Ft=e=>({onView:o,onHidden:r})=>{const n=l.useRef(!1);l.useEffect(()=>{let v;const f=()=>{e.current.some(m=>m)?n.current||(o&&o(),n.current=!0):n.current&&(r&&r(),n.current=!1),v=requestAnimationFrame(f)};return v=requestAnimationFrame(f),()=>{cancelAnimationFrame(v)}},[o,r])},_e={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},zt=({size:e,dpr:u,samples:o=0},r=[])=>{const n=l.useMemo(()=>new t.Scene,[]),v=I(e),[f,m]=D({scene:n,camera:v,size:e,dpr:u,samples:o,isSizeUpdate:!0}),[s,a]=F({..._e,updateKey:performance.now()}),[c,g]=At(),p=l.useRef(new t.Vector2(0,0)),[h,x]=l.useState(!0);l.useEffect(()=>{x(!0)},r);const d=l.useRef(null),w=l.useMemo(()=>new t.Texture,[]),M=Dt(),{isIntersectingOnceRef:b,isIntersectingRef:T,isIntersecting:C}=It(),P=Ft(T);return[l.useCallback((_,V)=>{const{gl:L,size:O}=_;if(V&&a(V),Ct(s))return w;if(h){if(d.current===s.updateKey)return w;d.current=s.updateKey}return h&&(Rt({params:s,size:O,scene:n}),M({isIntersectingRef:T,isIntersectingOnceRef:b,params:s}),x(!1)),g({params:s,size:O,resolutionRef:p,scene:n,isIntersectingRef:T}),m(L)},[m,a,M,g,h,n,s,b,T,w]),a,{scene:n,camera:v,renderTarget:f,output:f.texture,isIntersecting:C,DOMRects:c,intersections:T.current,useDomView:P}]},Ut=({scene:e,camera:u,size:o,dpr:r=!1,isSizeUpdate:n=!1,samples:v=0,depthBuffer:f=!1,depthTexture:m=!1},s)=>{const a=l.useRef([]),c=E(o,r);a.current=l.useMemo(()=>Array.from({length:s},()=>{const p=new t.WebGLRenderTarget(c.x,c.y,{...G,samples:v,depthBuffer:f});return m&&(p.depthTexture=new t.DepthTexture(c.x,c.y,t.FloatType)),p}),[s]),l.useLayoutEffect(()=>{n&&a.current.forEach(p=>p.setSize(c.x,c.y))},[c,n]),l.useEffect(()=>{const p=a.current;return()=>{p.forEach(h=>h.dispose())}},[s]);const g=l.useCallback((p,h,x)=>{const d=a.current[h];return H({gl:p,scene:e,camera:u,fbo:d,onBeforeRender:()=>x&&x({read:d.texture})}),d.texture},[e,u]);return[a.current,g]};y.ALPHABLENDING_PARAMS=fe,y.BLENDING_PARAMS=le,y.BRIGHTNESSPICKER_PARAMS=ve,y.BRUSH_PARAMS=ne,y.CHROMAKEY_PARAMS=ge,y.COLORSTRATA_PARAMS=ie,y.COSPALETTE_PARAMS=ue,y.COVERTEXTURE_PARAMS=de,y.DOMSYNCER_PARAMS=_e,y.DUOTONE_PARAMS=se,y.Easing=K,y.FBO_OPTION=G,y.FLUID_PARAMS=te,y.FXBLENDING_PARAMS=me,y.FXTEXTURE_PARAMS=ce,y.HSV_PARAMS=pe,y.MARBLE_PARAMS=ae,y.MORPHPARTICLES_PARAMS=R,y.NOISE_PARAMS=oe,y.RIPPLE_PARAMS=re,y.SIMPLEBLUR_PARAMS=Q,y.WAVE_PARAMS=j,y.WOBBLE3D_PARAMS=z,y.renderFBO=H,y.setUniform=i,y.useAddMesh=bt,y.useAlphaBlending=kn,y.useBeat=St,y.useBlending=Tn,y.useBrightnessPicker=Un,y.useBrush=ze,y.useCamera=I,y.useChromaKey=st,y.useColorStrata=cn,y.useCopyTexture=Ut,y.useCosPalette=xn,y.useCoverTexture=Yn,y.useCreateMorphParticles=be,y.useCreateWobble3D=Se,y.useDomSyncer=zt,y.useDoubleFBO=q,y.useDuoTone=wn,y.useFPSLimiter=_t,y.useFluid=Je,y.useFxBlending=En,y.useFxTexture=An,y.useHSV=Gn,y.useMarble=pn,y.useMorphParticles=pt,y.useNoise=an,y.useParams=F,y.usePointer=X,y.useResolution=E,y.useRipple=nn,y.useSimpleBlur=et,y.useSingleFBO=D,y.useWave=ot,y.useWobble3D=Mt,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 fe43fa4b..c4342ad7 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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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\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 = \"\";\n if (mapArray && mapArray.length > 0) {\n textureSwitcherCode += \"if (false) {}\"; // Dummy conditions for initialisation.\n mapArray.forEach((map, index) => {\n textureSwitcherCode += ` else if (vMapArrayIndex == ${index}.0) {\\n`;\n textureSwitcherCode += ` mapArrayColor = texture2D(uMapArray${index}, uv);\\n`;\n textureSwitcherCode += `}`;\n mapArrayShader += `\n \t\t\tuniform sampler2D uMapArray${index};\n \t\t`;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \" else {\\n\";\n textureSwitcherCode += \" mapArrayColor = vec4(1.0);\\n\";\n textureSwitcherCode += \"}\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"mapArrayColor = vec4(1.0);\\n\";\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\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;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\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\";\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 is 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 is 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: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","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","object","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":[106]} \ 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/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/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: THREE.Material\n) => T;\n\n/**\n * Object3Dにgeometryとmaterialを追加してsceneに追加する\n */\nexport const useAddObject = (\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n return new Proto(geometry, material);\n }, [geometry, material, Proto]);\n\n useEffect(() => {\n scene && scene.add(object3D);\n }, [scene, object3D]);\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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default:false */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. Default is 0. */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, Default is false. */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. Default is false. */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const 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;\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 useEffect(() => {\n setUniform(\n materials.splatMaterial,\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(\n material,\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useEffect(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n samples,\n }),\n [scene, camera, size, samples]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const lastTime = useRef(0);\n const scaledDiffVec = useRef(new THREE.Vector2(0, 0));\n const spaltVec = useRef(new THREE.Vector3(0, 0, 0));\n\n const [params, setParams] = useParams(FLUID_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FluidParams) => {\n const { gl, pointer, clock, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (lastTime.current === 0) {\n lastTime.current = clock.getElapsedTime();\n }\n const dt = Math.min(\n (clock.getElapsedTime() - lastTime.current) / 3,\n 0.02\n );\n lastTime.current = clock.getElapsedTime();\n\n // update velocity\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", read);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(materials.advectionMaterial, \"dt\", dt);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.velocity_dissipation!\n );\n });\n\n // update density\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n setUniform(materials.advectionMaterial, \"uVelocity\", velocityTex);\n setUniform(materials.advectionMaterial, \"uSource\", read);\n setUniform(\n materials.advectionMaterial,\n \"dissipation\",\n params.density_dissipation!\n );\n });\n\n // update splatting\n const 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\";\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 = 0,\n}: UseRippleProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: RippleParams) => {\n const { gl, pointer, size } = props;\n\n updateParams && setParams(updateParams);\n\n const 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: NoiseParams) => {\n const { gl, clock } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"scale\", params.scale!);\n setUniform(material, \"timeStrength\", params.timeStrength!);\n setUniform(material, \"noiseOctaves\", params.noiseOctaves!);\n setUniform(material, \"fbmOctaves\", params.fbmOctaves!);\n setUniform(material, \"warpOctaves\", params.warpOctaves!);\n setUniform(material, \"warpDirection\", params.warpDirection!);\n setUniform(material, \"warpStrength\", params.warpStrength!);\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: ColorStrataParams) => {\n const { gl, clock } = props;\n updateParams && setParams(updateParams);\n\n if (params.texture) {\n setUniform(material, \"uTexture\", params.texture);\n setUniform(material, \"isTexture\", true);\n } else {\n setUniform(material, \"isTexture\", false);\n setUniform(material, \"scale\", params.scale!);\n }\n\n if (params.noise) {\n setUniform(material, \"noise\", params.noise);\n setUniform(material, \"isNoise\", true);\n setUniform(material, \"noiseStrength\", params.noiseStrength!);\n } else {\n setUniform(material, \"isNoise\", false);\n }\n\n setUniform(material, \"uTime\", 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\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\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** 1st color , Default:new THREE.Color(0xffffff) */\n color0?: THREE.Color;\n /** 2nd color , Default: new THREE.Color(0x000000) */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n 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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DuoToneParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uColor0\", params.color0!);\n setUniform(material, \"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n\n if (params.alphaMap) {\n setUniform(material, \"u_alphaMap\", params.alphaMap!);\n setUniform(material, \"u_isAlphaMap\", true);\n } else {\n setUniform(material, \"u_isAlphaMap\", false);\n }\n\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n if (params.dodgeColor) {\n setUniform(material, \"u_dodgeColor\", params.dodgeColor);\n setUniform(material, \"u_isDodgeColor\", true);\n } else {\n setUniform(material, \"u_isDodgeColor\", false);\n }\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxTextureParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture0\", params.texture0!);\n setUniform(material, \"uTexture1\", params.texture1!);\n\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: BrightnessPickerParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_brightness\", params.brightness!);\n setUniform(material, \"u_min\", params.min!);\n setUniform(material, \"u_max\", params.max!);\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: FxBlendingParams) => {\n const { gl } = props;\n updateParams && setParams(updateParams);\n setUniform(material, \"u_texture\", params.texture!);\n setUniform(material, \"u_map\", params.map!);\n setUniform(material, \"u_mapIntensity\", params.mapIntensity!);\n const bufferTexture = updateRenderTarget(gl);\n return bufferTexture;\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 dpr,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(\n () =>\n new THREE.ShaderMaterial({\n uniforms: {\n 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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\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 { 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 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;\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr,\n size,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] =\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 { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\n\nimport type { HooksProps, HooksReturn } from \"../../types\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , Default:new THREE.Texture() */\n texture?: THREE.Texture;\n /** blurSize, default:3 */\n blurSize?: number;\n /** blurPower, affects performance default:5 */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n }),\n [scene, camera, size, dpr, samples]\n );\n const [renderTarget, updateRenderTarget] = useSingleFBO(fboProps);\n const [_, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: SimpleBlurParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uTexture\", params.texture!);\n setUniform(material, \"uResolution\", [\n params.texture!?.source?.data?.width || 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 updateRenderTarget(gl);\n },\n [updateRenderTarget, 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.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\";\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 = 0,\n}: HooksProps): HooksReturn => {\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,\n samples,\n isSizeUpdate: true,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: WaveParams) => {\n const { gl } = props;\n\n updateParams && setParams(updateParams);\n\n setUniform(material, \"uEpicenter\", params.epicenter!);\n setUniform(material, \"uProgress\", params.progress!);\n setUniform(material, \"uWidth\", params.width!);\n setUniform(material, \"uStrength\", params.strength!);\n setUniform(\n material,\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, material, setParams, params]\n );\n\n return [\n updateFx,\n setParams,\n {\n scene: scene,\n 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;\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 useEffect(() => {\n setUniform(material, \"u_resolution\", resolution.clone());\n }, [resolution, material]);\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\";\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 = 0,\n}: HooksProps): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, size, dpr });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n });\n\n const [params, setParams] = useParams(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 const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(scene, geometry, material, THREE.Points);\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 );\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;\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 console.log(mapArraySwitch.rewritedFragmentShader);\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 useEffect(() => {\n setUniform(material, \"uResolution\", resolution.clone());\n }, [resolution, material]);\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport { useCreateObject } 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\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: number;\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;\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 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,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\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\";\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 is 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 is 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: THREE.Points;\n interactiveMesh: THREE.Mesh;\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 = 0,\n camera,\n geometry,\n positions,\n uvs,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject\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,\n samples,\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,50) */\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, 50);\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 object = 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: object,\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\";\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 = 0,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject\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,\n samples,\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 () => new THREE.Mesh(geometry, material),\n [geometry, material]\n );\n\n useEffect(() => {\n scene.add(mesh);\n }, [scene, mesh]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","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, useEffect, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../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\";\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 = 0 }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr,\n samples,\n isSizeUpdate: true,\n });\n const [params, setParams] = useParams({\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 useEffect(() => {\n setRefreshTrigger(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => new THREE.Texture(), []);\n\n // set intersection\n const intersectionHandler = useIntersectionHandler();\n const { isIntersectingOnceRef, isIntersectingRef, isIntersecting } =\n useIsIntersecting();\n\n // create useDomView\n const useDomView = createUseDomView(isIntersectingRef);\n\n const updateFx = useCallback(\n (props: RootState, updateParams?: DomSyncerParams) => {\n const { gl, size } = props;\n\n updateParams && setParams(updateParams);\n\n if (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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} 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 useLayoutEffect(() => {\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n }, [resolution, isSizeUpdate]);\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","useAddObject","scene","geometry","Proto","object3D","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","obj","paramsRef","setParams","updateParams","paramKey","FBO_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","useLayoutEffect","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","read","write","_b","BRUSH_PARAMS","useBrush","updatePointer","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","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","object","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":[106]} \ 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 012c684c..6c1ce5b6 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hmng8/use-shader-fx", - "version": "1.1.7", + "version": "1.1.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hmng8/use-shader-fx", - "version": "1.1.7", + "version": "1.1.8", "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 2fa4e47b..5dbd7d49 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.7", + "version": "1.1.8", "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/useMorphParticles/shaders/main.vert b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert index bce8ff70..8c414db7 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/shaders/main.vert @@ -84,6 +84,7 @@ void main() { // wobble ※Do not calculate noise if uWobbleStrength is 0 float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; + gl_Position = projectedPosition += wobble; // If picture is true then display picture, otherwise 4 color linear interpolation diff --git a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts index 8ee41e7f..c4eb2c47 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.ts @@ -6,25 +6,23 @@ export const rewriteFragmentShader = ( ) => { let mapArrayShader = ""; const mapArrayUniforms: any = {}; - let textureSwitcherCode = ""; + let textureSwitcherCode = "mapArrayColor = "; + if (mapArray && mapArray.length > 0) { - textureSwitcherCode += "if (false) {}"; // Dummy conditions for initialisation. mapArray.forEach((map, index) => { - textureSwitcherCode += ` else if (vMapArrayIndex == ${index}.0) {\n`; - textureSwitcherCode += ` mapArrayColor = texture2D(uMapArray${index}, uv);\n`; - textureSwitcherCode += `}`; + const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers + const action = `texture2D(uMapArray${index}, uv)`; + textureSwitcherCode += `( ${condition} ) ? ${action} : `; mapArrayShader += ` - uniform sampler2D uMapArray${index}; - `; + uniform sampler2D uMapArray${index}; + `; mapArrayUniforms[`uMapArray${index}`] = { value: map }; }); - textureSwitcherCode += " else {\n"; - textureSwitcherCode += " mapArrayColor = vec4(1.0);\n"; - textureSwitcherCode += "}"; + textureSwitcherCode += "vec4(1.);"; mapArrayShader += `bool isMapArray = true;`; mapArrayUniforms["uMapArrayLength"] = { value: mapArray.length }; } else { - textureSwitcherCode += "mapArrayColor = vec4(1.0);\n"; + textureSwitcherCode += "vec4(1.0);"; mapArrayShader += `bool isMapArray = false;`; mapArrayUniforms["uMapArrayLength"] = { value: 0 }; } 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 d2f0ede8..5078ad3d 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 @@ -101,6 +101,8 @@ export const useMaterial = ({ // fragment const mapArraySwitch = rewriteFragmentShader(mapArray, fragmentShader); + console.log(mapArraySwitch.rewritedFragmentShader); + return new THREE.ShaderMaterial({ vertexShader: rewritedVertexShader, fragmentShader: mapArraySwitch.rewritedFragmentShader, diff --git a/public/alphaMap.jpg b/public/alphaMap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca24c1995703a5757e0f133666772701a1df5310 GIT binary patch literal 15796 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 literal 0 HcmV?d00001 diff --git a/public/alphaMask.jpg b/public/alphaMask.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb2ab46f8f7ddc6596b13a1274b9eb8f39c44b27 GIT binary patch literal 18582 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 WOfG=&=v@C_0cuLxia2>2%>Mxt39B;z diff --git a/public/playground/points/arrows-o.png b/public/playground/points/arrows-o.png deleted file mode 100755 index e7146c87306841899b6b106afcc03e689d04e860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1440 zcmX|BdsxzE6sE)rmf<~f^Cy`@bef5?i2?=!%H}1_yv$~5UaHMUyais0f<5Ie0kH%{ zRCL-_lCDh6H8t}-)H1V`X(@SuQZh(O&Ee|V^PKa&=e*~A&-eZH`9*tIlKM3cseyinK$^zRdOCZfztq+DYYufW+nKwJMJ*n(J5rqvSlJwV_A{AH z=s){X(#EeJdBYwawF7~`JTd_nbbR7Ry|pW zph_!CL)siHGYuEHHd{1QGWxNUq>}FatOUS)%vmUq5OG57-&R8auQ2urxHOEja~H~8 z>*_47jPN7*L_@}ou6aHSo+h$ZRP&+1IC_9+^q%9b%EI<|Q!4JxWIp`rUasqv8jq4c z>>gmb*Pdi-Aj=VbQ``GHGuy(7(RaJ^;7I+UUQ^ElIiiW#yZa#!N+9MkDp3} zOJfJF*Y4rL5PzzI3p-4ti3>6KiCbOhBJzda;czkr9RV<7@SMzzxI!Kr*Zj^$l0t>-?vwN17TW{0iV_?m#^J#Z5 z(rl=;+d2s22O+n7>ub#rYHgZPLX#-}WbqEBxc2GqE0TLT%RGb*<}18WZf}g@q!res zdwQw5FFrkD!6W+gb@mAO*Z4w$k8o&VEzBq>zpbnTY~_ulg$%0_Cn;jsGPI5yH;&?f z1Cq7w(8owSMCTz4w)J4zg8qGKovUxb1-FTMp7M5qzGjHNul>h;_OW*{?G`WXg)M^> zBl8cQmy+Q69d4vSK02l0U3<%@%Sxr~PyFNE7UZPXR8xPG)JKHzkr*4JBQD(Q!DX2!;XRi3+X2o@sF~y?mcTp#3moCmo zG_$f=HESWn$3STu9b(BHAyECQPM2ek-Yc(Jp4iWKIFt}vm0()@W)ZU%7aH$pMRLz_ zqF=L)rmk%*$fd9-oSjEI8@&qsUvrArl~!1-p2OT0|7`p7ovq)m&=QtP*ROja!(*Hr zo77jKCmY9?uB66Wn4_xd?Z!+kgKoTNd|_~Ft!9Wx4W6+c=o_9&H=LL-10X0&sKE?@ z2!(3tE-7KP+C(0=8}1lbY}-4+6aa<|$r&r7mlzbV4tLMSsRGNR=|VK(ZiX@?hn7K@ z60(?wIa9_%XNGFupLFIn0lIGVRMXm?`G7K$sJ4eQbzV)qBX0~qf@xbkG-&&mI0dMO zmOET5D6f)uLzBhZh;x;>p>O-_H19J7stTReoD{6Cn;9SlfD$M9mVm#`2Mo_t_0+5M zSs$g_Xa~S5kQc^G>1rRcR56EtE6p>1q+xQ-h9TvkD6MJ>1|iC5W?8+}L$~We!F?J6 zRir+qcfJGm(v?Dk=>SsY^9S|7xTi8^c=`v&bL}nuwv6|9@DYa(CO6YnlxJDnp+x{{ zU4Xkl0%lie;#JmeQCb6vDLckSBbL^s1~UPZZQ*tFzlF_c1Ty2S_R9P?EjA~H*>Y)` z5h6a_UorX)r*Rb$y90Orags1#d1ZZ7k9lNMW1RGM sdQq%-BEQ*nf0{>USy%Xnw)M1Ch-AzX2fO^CU;Vj($V5Ma7$3>_7eK7D!2kdN diff --git a/public/playground/points/cell-b.png b/public/playground/points/cell-b.png deleted file mode 100755 index 5a3dd0740d0926b9ea33990a6ab6e6e425cf287f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1513 zcmV(e0IuK$uHXQ!-~_PY2&~=#uHXT$-~+GV0j}T;vEl-*-~z7T06N$;RCPX0k7c(uHOKz-~g`R z2e07*uiyc%-~g`R0IuKxt=|By-vO@S0j}QwuHXQ#;sCDTrS=Zw0000lbW%=J00amT z?jiUm6m@tvRSiHnQtQsjn@wIMz$rv8W=20We;l{a8C!ehp@4sBX|}f4wply?00h}d zL_t(|+U=a{cA_v4fSFK<+{6|UX)9=#Uc4>u|8^@PjT)FxvRUIE=kGUzIYBY`&JcqS z*oV;`UT@;Bts>mf`yZpqcweP9!-p+QnH(_jbM?SY#~_QGnN_d|ohTca1Q71l+>onhL56YqIx8;XZ91aEG81rK)>D*=>e)Ex zv;9zT@!-spGPC4PI|sbp5O84QFyrcT_{@*_e$4WmBAneF@CRuS+gu}U5#CLAXua0(<=p0^P2wM@MeEJ^hZp;3q> zhPM4nC7(s~@GXI1wkfc%CKI)MlMN5gn&s%LK;!92E&m!F?u{QuA)fg7sFsIOT;3Z$ z@jmfH%Tmify~Hnnyf5!oan-QiUrZ6mpGGq*@0V?dDtTD_>4}#CYtLKB{LQaBECcF=5jG`nxu@c`x3!l;@O_qBZ~ zH+2UCwLB+m@jP+r$mVk$RN#w`LJqr;lbfbwUnJ zeBHI4h1h?X7?<}eY(Av?21xmnQxPZd7yJ28$cM!Ezx>EH5O9$n$xi*qPSStK)JIg> zk1+nf`H}6_{Rq)%JE6x0>#*eceG2%BWzOTpq$*#?x@SAYNe_(z?p0j|y{^O+H?WZL)9Y`NPvhL2I zyC0zOWkSeuVXp0LcUU?njQw z=5x@@rE?nmx^{yQN;aHCEH2zqRiq{D(_1{_oF8PLW&P?P#JIEy8 zbCBkIfZ*sC5FPCz%lX4>hSgycw diff --git a/public/playground/points/cell-g.png b/public/playground/points/cell-g.png deleted file mode 100755 index aaae8ea79b250a5ef4f68868c190d767c0604a77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1322 zcmV+_1=aeAP)tD!5b zqAIJPDyyI>tDq{Ypen1NE2^I=tDq{YpewAPE3BX@tf4Bap(?DPDyyI=tDY*Wpen4P zE3Kg_tD!2Zpj1Mgod5s;CUjCxQvd`A?GYjPC=_@=btPRzRXH~ef6h|MO&Y+rFEpB) z&}nAnp=QCxh`Lb#00cfsL_t(|+U=a{dZQo^KpBD(FR4o6rLD=PZR-0!;zrjN8!Ka^ zB-nNSo*AVQ{ooWJ{eW|j;Q)g08Y2k=3!qf6I)tDUzTrTH(BV|cWg1%-A%8vx4~w;+ z0DbOs`DMM3^%JWDiFp%h~Jm(DB2NHXgBDPVqHOalWpdSw;Qzd3W@JEyHRQx^X z&94O3<*`zQyWb=HpjUq^*UJ%{HAY&lV|G0)ygc-@=yQ)!J}7oqU)OF zuMw{s!k#y7b=Pn=&+K1Asyl~$4Y8wZZ27Sg5!&(k+VerHKk@2kcQ}~k?I#{Yn7^y? z{scj0l4m(*VAC+583#NL=RKuylB#)}>eROnqnCALb+d2t)mcX8qj!$SGF)jbp6m zM^2?}egte87=Z|l`Vq4f<*`jo?0;FBo0g&#@h=SSky5byhulb-)j*2lOX0o;$^e&YxI2*Lb_0j}~Ri2v|3{y{x* zf~D&>H2lhtAK794!xWbR16l(08$`jo_rW;ckg5DI)}P2g{DyIVB17RX!U^j~^!y0& z`r$m#_aks`KSFNkN4#bI$TU9^*f21flONgZ^2LwL*N<2=3Aag0Twl8Q5#vABdHE6Z zA2i3Z^&|Z5>qo@g{78}_{Kx!AiLU=Z{KpC7_xB?K#&7FKxRT3>&6M>clB0eF<2J4z z(Ov(6bN%%rSMkGCe~xd z_z^4j*NpHZJB-g{{m8PvX2yPG*B;V<(e(GTvg zDN(=if9iZA@JJ;Y+L z9^taS8-N`9q00#%96RU)OmcDN6OM*~5l6ph)yshPu$wg#^;G~l>;|qqEC)V0>(x&< gKBx(d1A=?}FX}ttn;v_GU;qFB07*qoM6N<$g3pJYtN;K2 diff --git a/public/playground/points/cell-p.png b/public/playground/points/cell-p.png deleted file mode 100755 index 56d294ea34cbe23f0d3cbca03c5dd54c26474d5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcmX|>dpMhU7RN1NFm-P&ni&i$whR$%rKR3w;*uTpsxd{9HhN)7yJ}oUr0R9smS$EE zn$mRQ_G~Xo$E|KdtZUllQG-@X+@qaJrSXQ6kT;uFpLw41JLmg5=X1{a{q@Ta2@WvO zx6;?p&@dnd5<=B6Uw!g)wbWkpU;IgRs0s-R^HayUus3mq$WQw9|0kW^a1#2I~jFp$NtR!*}Efz?3e~SXkQ^HPod#-`j+MW@ITro!>y7Vh_V1GzfgZlcNv1P7XQ|&-G{-(E z=&5s%i97DS%u9Oab*WgyXVcP^FUT4i+Nnf>PZ(`-g(E&*jWy2PYpPjd?pWgMx;u4G zc`_N6TXU_DfD7Y25-&Ajy{d4L#1-1P;*NuyN7sOVkLDT&sVw~+`@FZy>W*8b6v-r$3n{Mbu>$9Vn{pVqx-miOSG*L!griK^okVf<9~I&@Hm z%hzIzUF$r69`+d7hQbFMs=3uL)}L9lVv$VduQHQ#;9YZ#$UI@2$P23m*2;Y7s5!%a z*$Kpg4@6i&@Ku+sznzp!gFk^KJGvL_BHoayI)*errUE35dym+LGmW$&?_Hl!=SKyHIUQYA0 zbNp~!o^)&_h_mT|OB}~>>&kBEZ3r^tEe$_gP7m8}Da!B{-P@g~4AULT?+=&%J^{Wp zwM?7F@yO&g_wE5aPx>`XpCamzwxh+C+Hg@rrNSYL91v=;>B;?RGcax#F%T z#mD2^R|Z&szHML5|gzH^3qVu0I62 z^Va-!lOX1_O=YD={o-!HPe&YN#qHhT^H zYmp1_I@g;GtH!Uhi#w|d1>rQCLlM+2$Hvj9QZ4r)A%0HgE<52z3e&onu`=7%|LhD$ zlM?jrUU_0lMY<&l#vE$W(-I z3F=LeVuC!N)2WDv3i@irjdItR(HLHyuzU=h8 zYUZLvqp2huSGp+2D9qXqw`8E!oU*Gk{B?v>O-0e$WZtNdixqGaYIvws%v)#Zv<=cf zGRV#JDnyF`TdEioeNosf0S9LXxP(bLOLb3GQ%Q|XK}2_e-=nY2taJZ(2R8o!oT6W5 zbRuR)w!mf?hM)!c)&Q}S)a+GIhRJ9`SY0c@=Mj4q9?IS-GQijtGo^iOV=NRZ4shhZ zbn;kk=jgujh>A~d11fvDf<3CN4Q3|dm)NnCvi^(#8>)Pk;nK1S1hs07dhdjm*+n6p z3UGTvZgNG&Tn0|P6OBFy5pn~8-Vvk(^(v~Hqt{w4H{w7ngw-@N8_Qq3xPcUmb@9gJ zX34Jy4oERpUA)C)gm4C0IJXFPY@{BB;9J|oif9#ae1v({LUm^&H35K?N@BgjjL$T# zflwQ+m0Hp!1(*OVj3-sC-Ht-+PdW!|Ena7}tl16GO#k|s5;L@k7*g+2mz-`FY%Yu! z-L*JEZ|k_(4~H3-&OVo-pR$D}6ur<}CB@F>413%VTvIaE-gWTm9;1S#3AlXhhYPLJ z`{NZT5qgg1&H60{H!mT4nV6g8B6a!<&N91{saQ@h(RGN(Y7(ooIV)f6I(V+zRsDx+ N5dDG)^}bQr{|895Yli>; diff --git a/public/playground/points/cell-r.png b/public/playground/points/cell-r.png deleted file mode 100755 index b1a33458d4bb9950cd67fc621cc3226b02a37d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 zcmXYxdpOg39LF~sV`VHtr)guNP8Y|i2lWuSZOZM4p2%f9aui{xhMoP8LV8*o2`wgy zR4BJ7skw9^Hf&4ErMYZ&J3n>)_`crn=l%V>KhO8CZ;p=_K^yrS5(0r}yAxe} zLCsz}nlO;-B94$iDe&>|a|QK_sj0xgK!8LFArPU421pSMCO{xWYHA{N^|cTV2fa{D zO#p?06#e8{4u(*uNLza?0b9QkkTBT)S3iwNL*okywYCr({xu02aO|fCi&J113Y`WC zE(dc6g#7!|0{AkkBww#15V$6K)deIOSc<)BQfhY z6{iYLzWKXs^*I|TD>GqPk3%5vL3fvfew5+wtgzJLKXlU)!!}fGBW-6#yOup@ihi=7 zQjNghRWUHp1x5R3XHq}jNf)}0i8RqL>x08EO^*6b^Q)d3OlR?@VHegB$iB);L4O9Z zAJ!)gDa;F>B!wf{ue3PFFNW<3u)f?~?s>U9th>NKUF%$~GwPT~iMHO%kg;9Buy+P%$w=V8;cC!2!P_quTE6eE8Lr1E`*x z7yL^KrG6*A3gpv{c1E+^JFX<#*6nPwyEvMuKNNM{BJvsKe0t?I!-gW=T-Wg)ZlPBO z=~f=0HzU$Xtv$bUltQh{%X-0#9oIFu{iyT3cWgezmpq;SK2FPa=5aERI3-xq3M_`3LX>uqRwkrT`nMmq!sxTR zst~>*w!NFPH_^?zL%G;$3=r@l9~l3hvD}lbuFZ-$aad23*!DDF!sKlE-9?>4Og~1g z!24p?Kn#r26AMGOel~i2XG&%^Z@xdd-m1E?^LRs?z-^4gzHYck5@VW9$0|;V?_GZ> ze;n1K<1K2I@p~J$H5PiI2#EVx^#~lm#jxW`sI4XQRrGv(*gZv)Q7cOQG<7(B%aY0P zjS=JB>1R`HhOkV&n8jP-5WAIfA-ASJHf~EE*+)R$!b+egRwWPm(&NdvoGHV`cusN} zSB9YWwMe44%lyIKN|eAytW%-H+xI8)lpRiwZ-w&3=~C@YSt!<9CW;2v1rBc9hf`(- z6=AjX6-2I#anxbLZM)EBYGkhagW^@thf?Z32WE&eO+B+SCOi#mHLV-VERcu?$LMk_ zEh1PU z!q?Z`%)4Z_b6c?3Bi zARH}J`3S18Wo{Bisks#G#9qO-VW$h?y8LOO;&k#J zd3Nn*deR)Wg*g}9M1!X|49XZ|bgH{UxSNXjMn>>BHqbkdZ&<*`eOlR*qR37?L5sM& zOs7OH(y7J{92vn(IpIE!-QQlDzMF=3StaaWEUj9h>-N%dn7f9%TWkX@zcmXtAo~>f z154%K3N1`u&U76<)E7KM<_-N2W3EVLR{bl1Y7=@&P7BHW(qyjJK(0?X5;tieqS)&= z*3h6I?uEKs2`-q7v8;zeZAK=75&}?x-W5IJGkq4bDs{I1r&AZnM3&sf6d`K>v_4`^Hun4NHkq+fh%m8IXqC1~5*nC)@h? zt@-C^80Z|bXoKw&101D>Bk4EOf*`SZL3s(~csXm4!DGf^Y5_M0e%Mac`0C`C{ssPZ zH*SN0}y@O5p_n;BJ^33`SR2I-lM$q-jb z8OLJ$2Qd&69vvnEVP7~YKOPIXtd*=kp&E0szbqzHM?>lFM9&8+LBss>u-@huW$vMc zDRFr3m0$Tma|Pvkx?xqcj~M%c&b=k3`Usvo_=QBfzX#-4F3wwbOT@wwMp3T*Q&)

KbDv@rM=uh-39oz-+&jbx?js-UZ^$D&6RvDf1 z{K)K%`&QaYa$?6jmktFnFiN+KA^r+QagoF+JgFr!kEAkO zV5!sNX^LfS(x&&KDAStaK}Cg-uuC^#w1+d&I1PO-z+^;4!2RcBntVk`EB0-8VScs! z_r$>pl5`!NgMnX$%4(Yj;>he~2?+-g`jySQYR$kNVO;l#oqb@e3oh;#;45QN8Jhz| zFjPrAPh89XPU73C+@U`kip4)O(hS@-?_ePo04-XL!QDIIib_mQezVt>%`w6e(=+!O z=_3@AlZSCF6aJ)?a5quWNP@cMCsTxaoU-t#*0D=~{=3%K<(^9^QAqHO0XRp2jdG>B zWg-549M4acDIS$jqWWnqw-w=uy3qHdfCTw>>_#&qV`E0%#_$}UYC_btKW(0=tU}bi z#-800yCdS+-jqEonRBWOjjb_=MH?s=QvD7r^L-mc%DGlg+_EvkqLy=EC(PvL$n9nCB!@qC|&#oqa?&CiFC zJ@`XWo0oKPXSjtZPI+W!m5V_Jc4fDJgZHmE6I$YP+KG^oBs0@qnW)u8LfyHn3&K(F zSc=j7ul)}r7Y=*bxLbN#yY7@Y!dj>K9@5j7c}JIeH8kvE8}xv$T2fM^WE?N=F?|>a zmMvZSb#L-_dy6;V?L{MI*4IK`M$;bUf^Tt$0?VG0xm#Nwu#UBdmfkRU%d}&_5KKu zs+Yb=Ghw)&M+Dm>0Usw@Cc6TWU*^v?soZjKc*GzTV z_?Y@t*;3BATV1t&jRSqTPzUu${*blGpik*!GNqyRg5vsZT&84VBD7y3Q(CE?-Kw%IqhOyXHlIB?p$Ebx@Fv1?+BT>5!l`=e1*2xr?BVb6kB zW<&Ce&MjpvdO)u-VLi5AlDscI@vkPkILNQ2={-~kU<5}Z>58Nv*)VGqM5}a>-JCvu z8g&acQqe)-ZY@|4PUl5G5Kb#LLo|Y+Q493U42Sfc?t#-DJqH}kWaF*A^<=H28(25CZW(x4+4qg z!5LlA4lyR*_bM;494EZ`D5Q?pG-Aem;4KP)vKBBH zv~No-$uWnYK(#*rE%Cj`%+XTsKcka<4p4#h!q{T__7k(zW9{hXZ~6B zRD?IA%jdox3W1ApX=(RL5E&s8o74T?BM5xDlbT$Tozb4JitW>QV|=7z{=0M!?l=qX z6pMEV(Y{AT#D(15dPSEaf+w8}wc4^qMHbIq4gXw_^ySI;Si?f*fwy<#8=l-*5cnIb zm&&Ln#}@7ut~f+R$bkdB)5eC<$&(S=fM!cR-)0dzZLXWE%AWF@`8@kQ&0-i_A}%Ld zhxX}w!T!iLv~$P_Gu63a?q(awoGJ8By;(xb6il&M;if2D+@6&o9jb*p*rAT)%1gZo zH&|~S=zD%ms~A=7oqwHZff8seGFg3;gO1laCyd=hQ62 z=VAR>F6RJ7+!Kd_#+)&3}h8 zsN%B!CicHn`=PFQc~yx&dlUA`-t-KTvx4OqN*&efpX_Cj7(mL<`>D=?c!(Dt zlX>Br9x--Y*^NG!Htx+0IjD?obZL7jd&~=Xbfz25_EY4_qR#pi?bx|$GFe+@okQig zDtweXenI5)Q|C!)e_nJ4v!S!iH4*Cd;vxPV@jU&)urPX$SjAIR96sLzovLQY!2bBG;{im!*dt?g4T>nFlG?-&RDY@uT{mf0oCx*sYs2nq*&id`)AP*vJoTWU2S%Bz zDr_hm!WS3sXU|#D4CFixhl&)6gn&yR%g0?N@y~)HrWRYiR?_^Uex0ls87!iI8uNf- z29F<4e6xJg?1T9tccPa%+F=$QFp4^fxhfFitQZ;B6WV)vVlFlY|HD_>N*>trVl{=* z-dLB=Fj)2Z%Cbgq9+zWr_-R_(-=y1bj|9)nU^LeTj9G+_wK=_kmgFe(*y&gO?TN{!5S5aK1t3I8*tGfe489Zz8VHssNm zCi4DBgcr%n_-{Tp`U09@A;q1og5*+s(U3> zp@MBYxQk!6mi24tgiS@{H&a*p_S;HP8h!t>&P#qzRonm_0DR9~sH=xoB}=|50Ey^A JsIm)4{TJ@#eQ*E( diff --git a/public/playground/points/circles.png b/public/playground/points/circles.png deleted file mode 100755 index c616916eebe4e4199777bb4b4f561b0d781a008b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4074 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 SsR4dx2y`_e8ck}?V*dx1HvdEb diff --git a/public/playground/points/donut-b.png b/public/playground/points/donut-b.png deleted file mode 100755 index 1072e9f9aaf545cc4c0cecb85ab59544ee301886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2356 zcmV-43Cs40P)}%uHXQ!-~g`R0j}Tzuiyf%;R3GV z0IuNyuHgZ%;Q+4S0IuKxui*i%-~q1S0IuNxuHXQ!-~g`R0IuNxuHgW#;9&=8|%Lr0s^) zv8~Mz{J6IO00d%FZ;6g zxt^wJ(zpK}h!9Q?B%bH-9rr(yBya?wZ!-cRBJem;9m7-My4JU~(f2Z?p z4j@k8Q`JzkKy<4zEPT0z?-yYiyP~ZrhML~VOe`71Nmw;>TZ{|Yt8dwQVOh-s)^>5p zZo9J_#-gno36^>;6R=2CQxjv~J7(Ku^Enn-?fJ2&nd(Gbh=7wji!$G3Rztydy^%{% zHzIy?DoDVN62$p#y=*{O-nqnqqGAD!D-B0?i*vSY7+|fvP}ChPkP)S!yZ&y`FymwA zySg)yR5)JkX)t4Pyi-wm?tQIDi6Ry~4R&mIp=d@DdDCODVVCDc^A^@#tT~u_PaL|N zXU*GK$)b`B7YezHBivcd2sj-|+u_MTXGu+nIN(AtQ*NMI;^F=c{GCwd_OqO8N^-j$M*ybVw6Rzc9HIv}9 zZ<)Y(94I{IU_yAHJccuIcmnbl5yoSimhy`)W{|zw!dg5#=6iV zj$){(9 zAuAR9l}PT2IX1Il<2uq8iiujq%mypBKUWUol`?B)#47&Wa|Bg9G;?C<1*-6wrRv3n zRk|P7`rzevc;|X`Vb$xR&@p-6QWv+q99Cjr+nT1?fg6YN`D(G+tMDuk&9@lDy4n|2 zpqq{wrTC6CYP(rt<)7Cqzr}wRiQq5@#5&4Vpg0kh1cDHHwD;QnUSjBC=rK^)J&6Qi z-M7Hf$Sd23_&bTeJDvho%^*B{3>OKfx;6B}htf7uiTk2z=MzQrj~3KQ#J?PeSBeF+ zbaY?W(;TmAmA3`{s!-wo461<#Q%hag4$o1GW>E&l#(j{GKYTX^nV7XHwS<~)BEma? zzXFC=L-^fPHQ9pjILA7ujwX_77a%4}S;OczQx$8-ht9E*a=@Mjl*vw1xn4773DHa) z>n#s36HpbuE=}pzhf+;m0@N9HNfnTZqz3W=Am&`dgh?|C*-kj74vXP>OHe5JNklLK zKC?WCeSHRGV#a_UnDu_c>%IjkMR*{OK00ZDV$Je@eldz{50Kaa6~mrud3H+RCUT5T ziMv%$R!Q)Sb0*j(eL(Go4Frs0Qdd z+{0J#z4{x|Hmxvpf`%3hHR=*d} zYCvWL4)NUZ5MQleAzm^|S~m9)zH{h>kV6la23QpTrKD&}SoX}R?yaF)D;a*&023nu zNENRw=RuH+_)4#S6VgQ-kKQ9z@IcMz^yK-_hN&*JE&;7BZeYrKhLsatX0!!N5+pRN zz*;u|?**5f%Yh|l5_rIpvvZpxXt=`eGMzvmWlakLu-0a|4<>C(!29r7s9?gVm{jxW zZTW52sOgP_hO=u(h)pqObp*5(V?%< zc?)Vir--rPdoA^p1M`TqVg+vaf^^ekSHWB0kruW*;F{^rYC4wCp#YN9o(DL?===sY zOW1*y>j>|3BLTS2^r`l~0pVH%2IkOcgCj3U$X|yO%P5T}U(@JDX~1v0gk3a)n`;m2 z5C&!>ap=Wxao1ZM)KvQf2EOC8+Q+t;@a>xU^SD(B$^&?`e=2m0o(9l6h5>XQ2a1v4 zpEp?$BAg&~1L*y#7YAdvvKI-Q%GLWdl20*Ce~sifEKB^S=aGCX5^=-0@qX~jc1c0& zmK3T`K3x0X!aR}hMbbMC6x)yM?!3=sIo}`Z>xad9kD#}ZzZ}O~Hgn=2s=^nOuT?V( z`k5H{7nYsA9#%?@yJ=>_&NZYj7vg5zyIQ@jH}q~7V~K!jh*i*Do@6{ zoL+1$L!?o-x{3ud=5_sc>TL0qBo^6m4}IifILMD@Kis&G5A`j(^v`}+i*=vjTnkSkAZq a9^V1Fw8@?*5A9n30000FV;h7Sk|j&_iLs;+S?0)6 z2xXUTvL`BJ%bv2Q?%aO&bk6fW-*djt=li_xe{Zq{#)y{-%mn}dc#Tm=D~2XB4v_=M z=nGFYoEVa2VTLte=X4vcEu3T%6boChzsOnE#%Bvn+JMzj0 z0N7s`BXzOi??2!s9j29qXz;C;eaw2N*zA6E(-|uCJ@ciV)dQsllY^g>E3n98zL;>Q z1r6iT3kH^c(Xw|13EzDkp+CEIM7~?>UY@Mq48SW{=;JNwHV(FnsT?k|V6=ChrTwJu zWT-FxL8ez}+7{cRBGmk7HM*8_l0kxN;2fvX~8z6g3|CQJkghf`Afwe~y2uIrL#-=DbPm@$s5 zSzYZuQlQ?Ovn^gKtG5EB`V>g7E5Q=Psu0wD z5tIk%d`OrY%n!7gt(EX3dRL{~aO$bgEGduoj76gN!*Svb{vmgl)X|AOyP0FH&?w)k zsL0bVVzLA)PTrx2^)%AFsdc0Hn+8yTKgaxXlZwM-zXbe({EFZQPb9*zsM_X>+N-DP z!@R@kO52io6*iD=#kmE^BnM2r>x6Um`h0L$Gdk$*^7VK49DU!%sggwG-qe7wrh#3q zm+JxIw4wX*u8N1Cw*Y}FSAncQyp+B5vu1N=*+xfwx)|~2(n@exE^XP%1ga0Z+ZCjMmeopD6 zFT0KR?z1vljDV`9V%G!JWA_LrWG&WCeTo@K6g|6)uQX zFZyHC*h4aCobZNQ&W74k6^%g9xitQ!`%HdPxg12;i%4aGb z0)kHYMT$|y_u{@=wSu|GX=+H=OnfqJ={`M1xdIxn*CD~#2hA8Td2ugT1{!dIAf24T ziDJ6im$Ay%WvYuj*)D+jLs4%dnDZ)^CPZ^B$M3h7{Y6II9fR+Hr-dqjwH`@JR^xYk z?2hLyi51Pj`dn=J>Z8`+39#$eTHV_DO19J?Mg#)|4>MQ06G@QslGf7# z{$##axl)R8&f-j0b|lf6bi!-2hx9OBjRrBp$_w^jZzz8)24*J@b&#f|+=Vq8pwUlk z$1m}5?|n5pQyQJ|#<@6uTu~ihzb@ir=HK|)NVb1eX4=Kp?eXLj1DPVDy7Z?8l_gbT z8{GPaj&85Zi*D$!Itb&e@wjL54aq-jGAnFNuyj;vpW3AvVwFd} zNw{iow)ti@9d6C7VwRN27I8D=ZX`K40TVQvsJdxl>QUgg8%~WQNfimcYUimFmWzTR z-e%gkP4R$xmsA2!gO|iwzw<^wQ|kcg)S-{d1QyEuLT`O`t2s_kP7o?A!0>dog?=?K zPJNm!)@?xMX3MB;xpa-c%`EWpn^b{!P4HTLY?If>$qLCudqeRW*~~^K{mWwaa};adcoV@CrU@R^`?^pP1l3W^~EXW zz%i#n-{B0QoQ?*G>v=+AuWkpmAP#Za^@!VP{1dx z;HF{!M}^#r*wxScOSw<R-2=X2I97k-WHTSDJ|CVBY5`@>H&DI(>$sQ2of`5t5&~8!EOl#eJ z;`IyJ;7C+fmHIBZdk3q&AOiVTU;Be3ss`#CL^|{r?!9y`ztJaV6_ZHvWO@c$KIXLz zTnhC;_$Co>+ZJ{OIv3RJ;g9@1O2sZyK0YVvc*GPEj$a~9SpA~2vWC$G8{05Qcd-&H zF_(YFd_?YMm_r?cz`+j*fLaP*wH4J4`Z+sPOd_SzOPsTm*Hy*K$Zbh;SKlZ8uTV46 z5vbHrA^xyTfx;5qJ%2&Sw*X9&ulzYIllx_ zKT*RV*`d>6_?H`|aF&&BLu(d1?`3*DB>Z-M;?Q+oEz0-JF36X~1j;YKCnk04+ohAu SP*cYD4=^^sAZdEn;{E|ZXGaeJ diff --git a/public/playground/points/grid-g.png b/public/playground/points/grid-g.png deleted file mode 100755 index 118b8edc0f17b6cd571cafec499ef4ac6bf70508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 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 diff --git a/public/playground/points/square-grey.png b/public/playground/points/square-grey.png deleted file mode 100755 index bdc46d7a05c790ac74337adbc7fefb7004bfe3d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^9U#oY3?$D@*_Q~Uv;urWT!HjW7`CO#g8slX)KbCk+<1M<%T=XW*4qi&m7U$TE&XZxi-MtoJ_-pW@oE9Up=KQRbDc|&~D`OsTmTK_!N z`q-AymQZnMLP%J-gMw6ANkNhl&!R*(_rng4dj7I`a524PI;z5x(jXWi!Qq$1_;oA$ zN0%D{;oJhpCUXe#9-Q?}LLkww^RDANzZRDh$JffvIilZr+x$w8)GF&kMp>DQnVAoA z>U62cO86gfEMVgPG~ZW3B`@?svXZtoLucnX=P90NnniM0G-Wx1k1Sd?{b6>i&otXv z_io=ey|r!ip?RtsdzMChs|=5moj>>1rY#Sa9X)LFb#-c@zrbC_wY%h9Pn?;35E$$X Mp00i_>zopr0Mmul?EnA( diff --git a/public/playground/points/square-o.png b/public/playground/points/square-o.png deleted file mode 100755 index cc9d285dd9cfbd01a7fde0f6ae8a0feb25d3f995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>AxW@M4lt%KFM(dD6?UY07kV5N_L+p@4>X1Y0kV0&s@hSiS01b3fPE!Cf z5@TW$2`3I)Pdp#+fpsVV00Fp3L_t(&-rbt9N(3@9o--^H2S!rCXr$Iabs!sHkxlYeI>$(S~@y+2F`p={-$ z?KIgejc{|e@;fYKCmq#JwpQ4ADt~*PMabRvMHM~Wh$6S2Z{F$0jiVFtZuHT+=)CmG zGwN4Hy*^^}J__5F{ur-69%i%s`K_d{+3X%`g}fil=Bif6Yi~CDS|K5|5Yjgia)}T! zV1$HZx)wI+_SMr#l+{5A=^&a2PMRRL9w%xO1lT}tagSLYjA1qIFmTdF6ZNqaP0q=% z0pm~9$1ZMFeFM=5E3SP6d@4UW570W(k)Ct zZ(~@@3kcfpU~mF*kEHEe$ACR3peKq`;)D!PGTdWek2&$<#A42Q?2ste5Fl5;Ik)F% zg1N35IMcx(HuRL;C@2NhB}RY^l?+qPV=?|jg+T6$+t{Q@nM9j{ja_}|$gvc$xLAr; zRvOoCT-tR!p1S_j*CLiS@ns diff --git a/public/playground/points/star-grey.png b/public/playground/points/star-grey.png deleted file mode 100755 index ab1417f3ba3a94daa6d48dfcb3a8b1347a3d3017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 zcmZWpeKgYx7#{qLsQzTwfdJvoRlqY`5F4Q{bo#UK)?zz3^ywCHT_kEso-oM_IBkqpMN}H7s2!t}l ziR3Bc1X;&okTT3BU#pZ+&JkA{S;oV|!=t04G8`Eh85$ar;kuTgtb{_LY$B`IuV1f= zAGItc+y2+^uk(NAALr}A_3S#@VkDEYvxuOlyB9)Hg)pY%t-Mw9koNwM`edBc*PUWT z-(i^PPwZit+_jD4QNvF+m%kq(Tu5D^H4T@;cnEqGi!ayp}ws0lIrO%<9i z1!$r+;hqGJeO`-y^X%X(_s-^e-RO34fvbRG?ABkkfM$Mr9G~&U#HpX%o!F>jaeDyQP&-uzW^-H2W{rlbuM=qFNN0~i$Ll-9*1$AM!HipkT z>BCsxChwXqLl*8fqK$2bhp}yJ^7fME^XQJlyxeivGvR0(G6iM9+A&x5NF(5t_p!MIT9Ujv&})N+at02=SQA7As$Q%Jxyo-1HtZ{bsEL*UxQyfamDZi4Og;i(%ITMx zyLh=R5QSWnns}wp0HAwj4p+JYy~8zA{_{mN0OVq`Tmk0m6r_z2j4fBUOzUIpHdu)I zm6?t`krHqNWsg<@K>b`B^zFkXxV;vAPMnY^C^@bxx~M01hTBz7ba2p6B7!MgOVTCOMvb}hB8LBE7t zstH179t*Dt&CjT1GaO^khUdl|8{u7ZdlD;H-E!qo!Ip0?ZYB2i^iNR8($HJ$tXXPQ=<$2SGP-FW z5=oeG+r)KM7&Lw%+2WofAx)l;;A8O;+6$>pD}VV-J8scfi9}`XId~Z=)29)1sVNQm zA%)WTmNetu?!0H*FWKKk7of^W$%fAn0q!t|wL!`*Vk;Hr3rzPURqi1~11pmZK&Gu(z8s2Wo77TahXT}b4B!k*P2k@3aw{P02@vL{5mG}3j+Ty8T9hj|o ztbgwfrwWi*k{ogUZK8)A=%6xle*^xnNSlL?Mf*tzCg_xq=B`Ny2P*T5ZQJ%B!izeZy)qMkYQD zfnDNj+`unQ81cvQn4RXy;(9aa^1av{%he8~i9)!n9aQr-5u&1-K!#+cDRp1!gP5h( zVgTNhPyQ`ODG0_qSI=%Z#WpL3lQz0IHS5(vJbQZ|gqpmIlZq8chxBdO-@^b=w4GH? zy6T8l%1!YDt`KwDg3DFjq%6qAslqj{>aBt?d`8kn4$&wk$JxLqt-k-Z&Jp=%97uMR zpVd9`*FfLJh@PtVLa+tyVp5i}n-7$#G(?_kcawBvRB;ZzKVVDk8w-l?XV4u<8YI3h zF*onwu})Pg?(DnkieY-RcZH*Lx+6b2Y?>~L_?|d-KFVTuUch}hwPde`6wT`Hb5rfp zQ=E8%yhXyvH*V!yCi25qq>npS4Lz;t#-6Dczm=P>A*A%HkY0Crq3q=%C}ek1tsOn# EA5KysNB{r; diff --git a/public/snowpark.exr b/public/snowpark.exr new file mode 100644 index 0000000000000000000000000000000000000000..1e54ad434a86436b5e32d2d32f416f37d73206aa GIT binary patch literal 16418481 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

1!mdH{b|_FfC@V%R3v^|M9YN(oNlmRdRk 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%0DYsj;l0xmqLfvE$%#NsKL(Ja1I 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