From 1a6276d93e798af3467e09ddcc555760f9f16d5c Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Tue, 18 Jun 2024 14:20:08 +0900 Subject: [PATCH] v1.1.39 --- README.md | 3 +- app/stickers/Background.tsx | 35 - app/stickers/CanvasState.ts | 108 - app/stickers/Playground.tsx | 132 - app/stickers/StickerBall/index.tsx | 122 - app/stickers/StickerBall/rewriteShader.ts | 83 - app/stickers/StickerBall/useStickers.ts | 261 -- app/stickers/UI/Cursor/Confetti.tsx | 35 - app/stickers/UI/Cursor/GifPreloader.tsx | 36 - app/stickers/UI/Cursor/index.module.scss | 48 - app/stickers/UI/Cursor/index.tsx | 221 -- app/stickers/UI/Target/index.module.scss | 25 - app/stickers/UI/Target/index.tsx | 44 - app/stickers/page.tsx | 22 - app/stickers/romanticism/FxMaterial.tsx | 81 - app/stickers/romanticism/useRomanticism.ts | 84 - packages/use-shader-fx/build/use-shader-fx.js | 3201 ++++++++--------- .../use-shader-fx/build/use-shader-fx.js.map | 2 +- .../use-shader-fx/build/use-shader-fx.umd.cjs | 106 +- .../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 | 2 - .../src/fxs/3D/useWobble3D/index.ts | 2 - .../src/fxs/effects/useMotionBlur/index.ts | 12 +- .../src/fxs/effects/useSimpleBlur/index.ts | 12 +- .../src/fxs/effects/useWave/index.ts | 2 - .../src/fxs/interactions/useBrush/index.ts | 2 - .../src/fxs/misc/useBlank/index.ts | 12 +- .../src/fxs/misc/useChromaKey/index.ts | 2 - .../src/fxs/noises/useColorStrata/index.ts | 2 - .../src/fxs/noises/useCosPalette/index.ts | 2 - .../src/fxs/noises/useMarble/index.ts | 2 - .../src/fxs/noises/useNoise/index.ts | 2 - .../src/fxs/simulations/useFluid/index.ts | 12 +- .../src/fxs/simulations/useRipple/index.ts | 2 - packages/use-shader-fx/src/fxs/types/index.ts | 3 +- .../src/fxs/utils/useAlphaBlending/index.ts | 2 - .../src/fxs/utils/useBlending/index.ts | 2 - .../fxs/utils/useBrightnessPicker/index.ts | 2 - .../src/fxs/utils/useCoverTexture/index.ts | 2 - .../src/fxs/utils/useDuoTone/index.ts | 2 - .../src/fxs/utils/useFxBlending/index.ts | 2 - .../src/fxs/utils/useFxTexture/index.ts | 2 - .../src/fxs/utils/useHSV/index.ts | 2 - packages/use-shader-fx/src/libs/Utils.ts | 10 - .../src/misc/useDomSyncer/index.ts | 10 +- .../src/utils/useResizeBoundary.ts | 22 +- .../types/fxs/3D/useMorphParticles/index.d.ts | 2 +- .../types/fxs/3D/useWobble3D/index.d.ts | 2 +- .../fxs/effects/useMotionBlur/index.d.ts | 2 +- .../fxs/effects/useSimpleBlur/index.d.ts | 2 +- .../types/fxs/effects/useWave/index.d.ts | 2 +- .../fxs/interactions/useBrush/index.d.ts | 2 +- .../types/fxs/misc/useBlank/index.d.ts | 2 +- .../types/fxs/misc/useChromaKey/index.d.ts | 2 +- .../fxs/noises/useColorStrata/index.d.ts | 2 +- .../types/fxs/noises/useCosPalette/index.d.ts | 2 +- .../types/fxs/noises/useMarble/index.d.ts | 2 +- .../types/fxs/noises/useNoise/index.d.ts | 2 +- .../types/fxs/simulations/useFluid/index.d.ts | 2 +- .../fxs/simulations/useRipple/index.d.ts | 2 +- .../use-shader-fx/types/fxs/types/index.d.ts | 3 +- .../fxs/utils/useAlphaBlending/index.d.ts | 2 +- .../types/fxs/utils/useBlending/index.d.ts | 2 +- .../fxs/utils/useBrightnessPicker/index.d.ts | 2 +- .../fxs/utils/useCoverTexture/index.d.ts | 2 +- .../types/fxs/utils/useDuoTone/index.d.ts | 2 +- .../types/fxs/utils/useFxBlending/index.d.ts | 2 +- .../types/fxs/utils/useFxTexture/index.d.ts | 2 +- .../types/fxs/utils/useHSV/index.d.ts | 2 +- packages/use-shader-fx/types/libs/Utils.d.ts | 4 - .../types/misc/useDomSyncer/index.d.ts | 2 +- .../types/utils/useResizeBoundary.d.ts | 11 +- 74 files changed, 1649 insertions(+), 3201 deletions(-) delete mode 100644 app/stickers/Background.tsx delete mode 100644 app/stickers/CanvasState.ts delete mode 100644 app/stickers/Playground.tsx delete mode 100644 app/stickers/StickerBall/index.tsx delete mode 100644 app/stickers/StickerBall/rewriteShader.ts delete mode 100644 app/stickers/StickerBall/useStickers.ts delete mode 100644 app/stickers/UI/Cursor/Confetti.tsx delete mode 100644 app/stickers/UI/Cursor/GifPreloader.tsx delete mode 100644 app/stickers/UI/Cursor/index.module.scss delete mode 100644 app/stickers/UI/Cursor/index.tsx delete mode 100644 app/stickers/UI/Target/index.module.scss delete mode 100644 app/stickers/UI/Target/index.tsx delete mode 100644 app/stickers/page.tsx delete mode 100644 app/stickers/romanticism/FxMaterial.tsx delete mode 100644 app/stickers/romanticism/useRomanticism.ts diff --git a/README.md b/README.md index 9ce522e4..62b804c0 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ From each `fxHooks`, you can receive [`updateFx`, `setParams`, `fxObject`] in ar 1. `updateFx` - Functions to update parameters and render. 2. `updateParams` - Function to update parameters only. 3. `fxObject` - An object that holds various FX components, such as scene, camera, mesh, renderTarget, and `output`(final rendered texture). -4. `HooksProps` - `size`,`dpr`,`samples`,`isSizeUpdate`,`onBeforeInit` but may also be hook specific. ※ `isSizeUpdate` : Whether to `setSize` the FBO when updating size or dpr(default : `false`). +4. `HooksProps` - `size`,`dpr`,`isSizeUpdate`,`onBeforeInit` and `renderTargetOptions` ※ `isSizeUpdate` : Whether to `setSize` the FBO when updating size or dpr(default : `false`). ```js const [updateFx, updateParams, fxObject] = useSomeFx(HooksProps); @@ -180,7 +180,6 @@ export const Home = () => { camera, size, dpr: viewport.dpr, - samples: 4, }); useFrame((rootState) => { diff --git a/app/stickers/Background.tsx b/app/stickers/Background.tsx deleted file mode 100644 index 9d2a88e2..00000000 --- a/app/stickers/Background.tsx +++ /dev/null @@ -1,35 +0,0 @@ -"use client"; - -import * as THREE from "three"; -import { memo } from "react"; -import { Environment } from "@react-three/drei"; - -export const Background = memo( - ({ - stickerMap, - scene, - }: { - stickerMap: THREE.Texture; - scene: THREE.Scene; - }) => { - return ( - <> - - - - - - - ); - } -); -Background.displayName = "Background"; diff --git a/app/stickers/CanvasState.ts b/app/stickers/CanvasState.ts deleted file mode 100644 index 01c7c9e7..00000000 --- a/app/stickers/CanvasState.ts +++ /dev/null @@ -1,108 +0,0 @@ -import * as THREE from "three"; -import { CLICKED_WOBBLE_STRENGTH } from "./StickerBall"; -import { STICKER_TEXTURES_LENGTH } from "./StickerBall/useStickers"; - -export class CanvasState { - private static instance: CanvasState; - - public static getInstance(): CanvasState { - if (!CanvasState.instance) { - CanvasState.instance = new CanvasState(); - } - return CanvasState.instance; - } - - private STICKER_SIZE = { - min: 0.04, - max: 0.08, - }; - - public CAMERA_Z = { - zoom: 3.2, - default: 4, - }; - - private getRandomSize() { - return ( - Math.random() * (this.STICKER_SIZE.max - this.STICKER_SIZE.min) + - this.STICKER_SIZE.min - ); - } - private getRandomAngle() { - return Math.random() * Math.PI * 2; - } - private getNextStickerIndex() { - const prevIndex = this.stickerState.nextStickerIndex; - let nextIndex; - // Select the next sticker to avoid duplication. - do { - nextIndex = Math.floor(Math.random() * this.textures.stickers.length); - } while (nextIndex === prevIndex); - return nextIndex; - } - - public textures: { - wrinkles: THREE.Texture[]; - stickers: THREE.Texture[]; - } = { - wrinkles: [], - stickers: [], - }; - - public cursorState = { - isOver: false, - point: new THREE.Vector2(0, 0), - }; - - public cameraState: { - point: THREE.Vector3; - } = { - point: new THREE.Vector3(0, 0, this.CAMERA_Z.default), - }; - - public clockState = { - waiting: 0, - }; - - public stickerState: { - isNotSticked: boolean; - wobbleStrength: number; - point: THREE.Vector2; - sticker: THREE.Texture | null; - nextStickerIndex: number; - wrinkle: THREE.Texture | null; - wrinkleIntensity: number; - size: number; - angle: number; - count: number; - } = { - isNotSticked: true, - wobbleStrength: 0, - point: new THREE.Vector2(0, 0), - sticker: null, - nextStickerIndex: Math.floor(Math.random() * STICKER_TEXTURES_LENGTH), - wrinkle: null, - wrinkleIntensity: Math.random(), - size: this.getRandomSize(), - angle: this.getRandomAngle(), - count: 0, - }; - - public setStickerState(point: THREE.Vector2) { - this.stickerState = { - isNotSticked: false, - wobbleStrength: CLICKED_WOBBLE_STRENGTH, - point: point, - sticker: this.textures.stickers[this.stickerState.nextStickerIndex], - nextStickerIndex: this.getNextStickerIndex(), - wrinkle: - this.textures.wrinkles[ - Math.floor(Math.random() * this.textures.wrinkles.length) - ], - wrinkleIntensity: Math.random(), - size: this.getRandomSize(), - angle: this.getRandomAngle(), - count: this.stickerState.count + 2, // To swap FBOs - }; - } -} diff --git a/app/stickers/Playground.tsx b/app/stickers/Playground.tsx deleted file mode 100644 index 123b8e5f..00000000 --- a/app/stickers/Playground.tsx +++ /dev/null @@ -1,132 +0,0 @@ -"use client"; - -import * as THREE from "three"; -import { useMemo, useRef } from "react"; -import { OrbitControls } from "@react-three/drei"; -import { useFrame, createPortal, extend, useThree } from "@react-three/fiber"; -import { useStickers } from "./StickerBall/useStickers"; -import { CanvasState } from "./CanvasState"; -import { StickerBall } from "./StickerBall"; -import { - Easing, - Utils, - useResizeBoundary, - useSingleFBO, -} from "@/packages/use-shader-fx/src"; -import { Background } from "./Background"; -import { FxMaterial, FxMaterialProps } from "./romanticism/FxMaterial"; -import { useRomanticism } from "./romanticism/useRomanticism"; - -extend({ FxMaterial }); - -export const Playground = () => { - const { camera, size, viewport, gl } = useThree(); - - const canvasState = CanvasState.getInstance(); - - // 1000以上リサイズした場合のみリサイズする - const resizeBoundary = useResizeBoundary({ - gl, - size, - boundFor: "larger", - threshold: 1000, - }); - - // stickers - const { stickerMap, normalMap, isReady, silhouette } = - useStickers(resizeBoundary); - - // offscreen to stickers - const offscreenScene = useMemo(() => new THREE.Scene(), []); - const [portalStickers, updatePortalStickers] = useSingleFBO({ - scene: offscreenScene, - camera, - size, - dpr: viewport.dpr, - depthBuffer: true, - isSizeUpdate: resizeBoundary.isUpdate, - }); - - // romanticism - const romanticism = useRomanticism(portalStickers.texture); - const materialRef = useRef(null); - - useFrame(({ camera, clock, pointer, gl }) => { - if (!isReady) { - return; - } - - // update portalized stickers - updatePortalStickers(gl); - - // update romanticism - if (materialRef.current) { - materialRef.current.u_time = clock.getElapsedTime(); - } - - // control camera state - const _pointer = pointer.clone().multiplyScalar(0.32); - canvasState.cameraState.point.lerp( - { - ..._pointer, // uncomment this line to enable camera movement - // x: 0, - // y: 0, - z: canvasState.CAMERA_Z.default, - }, - 0.12 - ); - camera.position.lerp(canvasState.cameraState.point, 0.14); - camera.lookAt(0, 0, 0); - - // control clock state - if (canvasState.stickerState.isNotSticked) { - canvasState.clockState.waiting = Utils.interpolate( - canvasState.clockState.waiting, - Easing.easeOutSine( - Math.sin(clock.getElapsedTime() * 3.5) * 0.5 + 0.5 - ), - 0.1 - ); - } else if (canvasState.clockState.waiting > 0) { - canvasState.clockState.waiting = Utils.interpolate( - canvasState.clockState.waiting, - 0, - 0.16 - ); - } - }); - return ( - <> - {createPortal( - - - - - , - offscreenScene - )} - - - - - - ); -}; diff --git a/app/stickers/StickerBall/index.tsx b/app/stickers/StickerBall/index.tsx deleted file mode 100644 index 3646719d..00000000 --- a/app/stickers/StickerBall/index.tsx +++ /dev/null @@ -1,122 +0,0 @@ -"use client"; - -import * as THREE from "three"; -import { memo, useCallback, useRef } from "react"; -import { useFrame } from "@react-three/fiber"; -import { CanvasState } from "../CanvasState"; -import { Utils, useCreateWobble3D } from "@/packages/use-shader-fx/src"; -import { rewriteShader } from "./rewriteShader"; -import { OnBeforeInitParameters } from "@/packages/use-shader-fx/src/fxs/types"; -import { useMediaQuery } from "@funtech-inc/spice"; - -// ROUGHNESS other than sticker part -export const BASE_ROUGHNESS = 0.4; - -// wobble strength when clicked -export const CLICKED_WOBBLE_STRENGTH = 0.4; - -const FUNTECH_COLOR = new THREE.Color(0xb84f0a); - -const StickerBallMesh = ({ children }: { children: React.ReactNode }) => { - const canvasState = CanvasState.getInstance(); - const isDesktop = useMediaQuery({ type: "min", width: 960 }); - return ( - { - canvasState.setStickerState(e.uv!); - canvasState.cameraState.point.set( - e.point.x, - e.point.y, - canvasState.CAMERA_Z.zoom - ); - canvasState.cursorState.point.set(e.offsetX, e.offsetY); - }} - onPointerOver={() => (canvasState.cursorState.isOver = true)} - onPointerOut={() => (canvasState.cursorState.isOver = false)} - onPointerMove={(e) => { - canvasState.cursorState.point.set(e.offsetX, e.offsetY); - }}> - {children} - - ); -}; - -export const StickerBall = memo( - ({ - stickerMap, - normalMap, - silhouetteMap, - }: { - stickerMap: THREE.Texture; - normalMap: THREE.Texture; - silhouetteMap: THREE.Texture; - }) => { - const canvasState = CanvasState.getInstance(); - - const [updateWobble, wobble] = useCreateWobble3D({ - geometry: new THREE.IcosahedronGeometry(2, 12), - materialParameters: { - map: stickerMap, - normalMap: normalMap, - roughness: 1, - clearcoat: 1, - iridescence: 1, - metalness: 1, - iridescenceIOR: 1, - iridescenceThicknessRange: [0, 1400], - }, - onBeforeInit: useCallback( - (shader: OnBeforeInitParameters) => { - Object.assign(shader.uniforms, { - uSilhouette: { value: silhouetteMap }, - }); - rewriteShader(shader); - }, - [silhouetteMap] - ), - }); - - updateWobble(null, { - color0: FUNTECH_COLOR, - color1: FUNTECH_COLOR, - color2: FUNTECH_COLOR, - color3: FUNTECH_COLOR, - wobblePositionFrequency: 0.4, - wobbleTimeFrequency: 0.4, - warpPositionFrequency: 0, - warpStrength: 0, - warpTimeFrequency: 0, - }); - - const wobbleVal = useRef(0); - - useFrame((state, delta) => { - // Only let them wobble when the sticker is pressed. - if (canvasState.stickerState.wobbleStrength > 0) { - canvasState.stickerState.wobbleStrength -= delta; - } else { - canvasState.stickerState.wobbleStrength = 0; - } - - wobbleVal.current = Utils.interpolate( - wobbleVal.current, - canvasState.stickerState.wobbleStrength, - 0.24 - ); - - updateWobble(state, { - colorMix: canvasState.clockState.waiting * 0.24, - wobbleStrength: wobbleVal.current, - }); - }); - - return ( - - - - ); - } -); - -StickerBall.displayName = "StickerBall"; diff --git a/app/stickers/StickerBall/rewriteShader.ts b/app/stickers/StickerBall/rewriteShader.ts deleted file mode 100644 index 20007021..00000000 --- a/app/stickers/StickerBall/rewriteShader.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { OnBeforeInitParameters } from "@/packages/use-shader-fx/src/fxs/types"; -import { BASE_ROUGHNESS } from "."; - -export const rewriteShader = (shader: OnBeforeInitParameters) => { - shader.fragmentShader = shader.fragmentShader.replace( - "void main(){", - ` - uniform sampler2D uSilhouette; - void main(){ - ` - ); - - // Map alpha to float. - shader.fragmentShader = shader.fragmentShader.replace( - "#include ", - ` - vec4 sampledDiffuseColor = texture2D( map, vMapUv ); - - #ifdef DECODE_VIDEO_TEXTURE - // use inline sRGB decode until browsers properly support SRGB8_ALPHA8 with video textures (#26516) - sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w ); - #endif - - diffuseColor *= sampledDiffuseColor; - - vec2 silhouettePosition = vec2(0.); - float silhouetteRadius = 0.56; - float silhouetteAlpha = 0.; - float silhouetteDist = distance(silhouettePosition,vPosition); - if (silhouetteDist < silhouetteRadius) { - - vec2 sticker_texCoord = (vPosition-silhouettePosition)/(silhouetteRadius*2.); - sticker_texCoord+=0.5; - vec4 silhouetteColor = texture2D(uSilhouette,vec2(sticker_texCoord)); - - // Boundaries pick up alpha subtly, adjust with smoothstep. - silhouetteAlpha = smoothstep(0.8,0.9,silhouetteColor.a); - - // 範囲内のカラー - vec3 overwriteColor = sampledDiffuseColor.a > 0. ? sampledDiffuseColor.rgb : silhouetteColor.rgb; - - diffuseColor = silhouetteAlpha > 0. ? vec4(overwriteColor,1.) : diffuseColor; - } - - // Also add the alpha of the silhouette. - float customMapAlpha = min(sampledDiffuseColor.a + silhouetteAlpha,1.); - - ` - ); - // Multiply iridescence by alpha of map (only map iridescences). - shader.fragmentShader = shader.fragmentShader.replace( - "#include ", - ` - #include - material.iridescenceFresnel *= customMapAlpha; - material.iridescenceF0 *= customMapAlpha; - ` - ); - // Multiply clearcoat by alpha of map (only map clearcoat). - shader.fragmentShader = shader.fragmentShader.replace( - "outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;", - ` - outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat * customMapAlpha; - ` - ); - // Multiply roughness by alpha of map (only map roughness). - shader.fragmentShader = shader.fragmentShader.replace( - "#include ", - ` - #include - material.roughness = clamp(material.roughness * customMapAlpha,${BASE_ROUGHNESS},1.); - ` - ); - - // Multiply metalness by alpha of map (only map metalness). - shader.fragmentShader = shader.fragmentShader.replace( - "#include ", - ` - #include - metalnessFactor *= customMapAlpha; - ` - ); -}; diff --git a/app/stickers/StickerBall/useStickers.ts b/app/stickers/StickerBall/useStickers.ts deleted file mode 100644 index 6d8d9fbe..00000000 --- a/app/stickers/StickerBall/useStickers.ts +++ /dev/null @@ -1,261 +0,0 @@ -import * as THREE from "three"; -import { useMemo, useCallback, useRef, useState } from "react"; -import { useFrame, useThree, useLoader, Size } from "@react-three/fiber"; -import { ResizeBoundary, Utils, useBlank } from "@/packages/use-shader-fx/src"; -import { CanvasState } from "../CanvasState"; - -const STICKER_TEXCOORD = ` - vec2 stamp = uStampPoint; - uv.x *= 2.; - stamp.x *= 2.; - - float d = distance(uv, stamp); - float r = uRandomSize; - - float angle = uRandomAngle; - float cosAngle = cos(angle); - float sinAngle = sin(angle); - mat2 rotationMatrix = mat2( - cosAngle, -sinAngle, - sinAngle, cosAngle - ); - vec2 sticker_texCoord = (uv-stamp)/(r*2.); - sticker_texCoord *= rotationMatrix; - sticker_texCoord += .5; -`; - -const WRINKLE_TEXTURES = [ - "/stickers/webp/wrinkle0.webp", - "/stickers/webp/wrinkle1.webp", -]; - -const STICKER_TEXTURES = [ - "/stickers/webp/sticker0.webp", - "/stickers/webp/sticker1.webp", - "/stickers/webp/sticker2.webp", - "/stickers/webp/sticker3.webp", - "/stickers/webp/sticker4.webp", - "/stickers/webp/sticker5.webp", - "/stickers/webp/sticker6.webp", - "/stickers/webp/sticker7.webp", - "/stickers/webp/sticker8.webp", - "/stickers/webp/sticker9.webp", -]; - -export const STICKER_TEXTURES_LENGTH = STICKER_TEXTURES.length; - -const MAX_DPR = { - sticker: 5, - normal: 5, -}; - -export const useStickers = (resizeBoundary: ResizeBoundary) => { - const canvasState = CanvasState.getInstance(); - - const textures = useLoader(THREE.TextureLoader, [ - ...WRINKLE_TEXTURES, - ...STICKER_TEXTURES, - ]); - - const wrinkles = textures.slice(0, WRINKLE_TEXTURES.length); - const stickers = textures.slice(WRINKLE_TEXTURES.length); - const silhouette = stickers[0]; - - canvasState.textures = { - wrinkles, - stickers, - }; - - const { size } = useThree(); - - const [updateSticker, _, { output: stickerMap }] = useBlank({ - size, - dpr: Math.min(resizeBoundary.maxDpr, MAX_DPR.sticker), - isSizeUpdate: resizeBoundary.isUpdate, - onBeforeInit: useCallback( - (parameters: any) => { - Object.assign(parameters.uniforms, { - uStampPoint: { - value: new THREE.Vector2(0), - }, - uRandomSize: { - value: canvasState.stickerState.size, - }, - uRandomAngle: { - value: canvasState.stickerState.angle, - }, - }); - parameters.fragmentShader = parameters.fragmentShader.replace( - "#usf ", - ` - uniform vec2 uStampPoint; - uniform float uRandomSize; - uniform float uRandomAngle; - ` - ); - - parameters.fragmentShader = parameters.fragmentShader.replace( - "#usf
", - ` - vec2 uv = vUv; - - vec4 backColor = texture2D(uBackbuffer,uv); - - ${STICKER_TEXCOORD} - vec4 stampColor = texture2D(uTexture,sticker_texCoord); - - // Boundaries pick up alpha subtly, adjust with smoothstep. - vec4 finalColor = mix(backColor,stampColor,smoothstep(0.8,0.9,stampColor.a)); - usf_FragColor = finalColor; - ` - ); - - parameters.fragmentShader = parameters.fragmentShader.replace( - "precision highp float;", - "precision lowp float;" - ); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ), - }); - - const [updateNormal, __, { output: normalMap }] = useBlank({ - size, - dpr: Math.min(resizeBoundary.maxDpr, MAX_DPR.normal), - isSizeUpdate: resizeBoundary.isUpdate, - onBeforeInit: useCallback( - (shader: any) => { - Object.assign(shader.uniforms, { - uWrinkleTexure: { - value: wrinkles[0], - }, - uWrinkleIntensity: { - value: 0, - }, - uStickerTexture: { - value: stickers[0], - }, - uStampPoint: { - value: new THREE.Vector2(0), - }, - uRandomSize: { - value: canvasState.stickerState.size, - }, - uRandomAngle: { - value: canvasState.stickerState.angle, - }, - }); - shader.fragmentShader = shader.fragmentShader.replace( - "#usf ", - ` - uniform sampler2D uWrinkleTexure; - uniform sampler2D uStickerTexture; - uniform float uWrinkleIntensity; - uniform vec2 uStampPoint; - uniform float uRandomSize; - uniform float uRandomAngle; - ` - ); - shader.fragmentShader = shader.fragmentShader.replace( - "#usf
", - ` - vec2 uv = vUv; - - vec2 texelSize = 1.0 / uResolution; - - // Sampling height values from height maps. - float mapAlpha = texture2D(uTexture, uv).a; - float heightL = texture2D(uTexture, uv - vec2(texelSize.x, 0.0)).a; - float heightR = texture2D(uTexture, uv + vec2(texelSize.x, 0.0)).a; - float heightD = texture2D(uTexture, uv - vec2(0.0, texelSize.y)).a; - float heightU = texture2D(uTexture, uv + vec2(0.0, texelSize.y)).a; - - vec4 backColor = texture2D(uBackbuffer, uv); - - // wrickle texture - ${STICKER_TEXCOORD} - float stickerAlpha = texture2D(uStickerTexture,sticker_texCoord).a; - vec3 wrinkledColor = texture2D(uWrinkleTexure,sticker_texCoord).rgb; - wrinkledColor *= stickerAlpha * uWrinkleIntensity; - - // compute normal - vec3 normal; - normal.x = (heightL - heightR) + wrinkledColor.r; - normal.y = (heightD - heightU) + wrinkledColor.g; - normal.z = 1. + wrinkledColor.b; - - // normalize -1 ~ 1 - normal = normalize(normal); - - // 0 ~ 1 - vec4 normalColor = vec4(normal*.5+.5,1.); - - // Apply wrinkles to sticker areas and use backColour for the rest. - vec4 finalColor = mix(normalColor,mix(backColor,normalColor,stickerAlpha),mapAlpha); - usf_FragColor = finalColor; - ` - ); - - shader.fragmentShader = shader.fragmentShader.replace( - "precision highp float;", - "precision lowp float;" - ); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ), - }); - - const tickCount = useRef(-2); - - if ( - resizeBoundary.isUpdate && - tickCount.current === canvasState.stickerState.count - ) { - tickCount.current -= 2; - } - - const [isReady, setIsReady] = useState(false); - - useFrame((state) => { - if (tickCount.current === canvasState.stickerState.count) { - return; - } - - tickCount.current++; - - if (tickCount.current === 0 && !isReady) { - setIsReady(true); - } - - const updateState = { - uStampPoint: canvasState.stickerState.point, - uRandomSize: canvasState.stickerState.size, - uRandomAngle: canvasState.stickerState.angle, - }; - updateSticker( - state, - { - texture: canvasState.stickerState.sticker ?? stickers[0], - }, - { - ...updateState, - } - ); - updateNormal( - state, - { - texture: stickerMap, - }, - { - uStickerTexture: canvasState.stickerState.sticker ?? stickers[0], - uWrinkleTexure: canvasState.stickerState.wrinkle ?? wrinkles[0], - uWrinkleIntensity: canvasState.stickerState.wrinkleIntensity, - ...updateState, - } - ); - }); - - return { stickerMap, normalMap, isReady, silhouette }; -}; diff --git a/app/stickers/UI/Cursor/Confetti.tsx b/app/stickers/UI/Cursor/Confetti.tsx deleted file mode 100644 index e688b4bd..00000000 --- a/app/stickers/UI/Cursor/Confetti.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import Image from "next/image"; -import { useEffect, useState } from "react"; -import s from "./index.module.scss"; - -export const Confetti = ({ state }: { state: number }) => { - const [styles, setStyles] = useState< - { top: string; left: string; scale: string }[] - >([]); - - useEffect(() => { - // To avoid hydration errors, must be useEffect - const newStyles = [...Array(8)].map(() => ({ - top: `${Math.random() * 140 - 20}%`, - left: `${Math.random() * 140 - 20}%`, - scale: `${Math.random() + 0.5}`, - })); - setStyles(newStyles); - }, [state]); - - return ( - <> - {styles.map((style, i) => ( -
- -
- ))} - - ); -}; diff --git a/app/stickers/UI/Cursor/GifPreloader.tsx b/app/stickers/UI/Cursor/GifPreloader.tsx deleted file mode 100644 index affa983e..00000000 --- a/app/stickers/UI/Cursor/GifPreloader.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { memo } from "react"; -import Image from "next/image"; -import { STICKER_TEXTURES_LENGTH } from "../../StickerBall/useStickers"; - -const GIF_IMAGES = [...Array(STICKER_TEXTURES_LENGTH)].map( - (_, i) => `/stickers/gif/gif${i}.gif` -); - -/** Guarantee all gif file loads in advance */ -export const GifPreloader = memo(() => { - return ( -
- {GIF_IMAGES.map((src, i) => ( - - ))} -
- ); -}); - -GifPreloader.displayName = "GifPreloader"; diff --git a/app/stickers/UI/Cursor/index.module.scss b/app/stickers/UI/Cursor/index.module.scss deleted file mode 100644 index 0c06a0c1..00000000 --- a/app/stickers/UI/Cursor/index.module.scss +++ /dev/null @@ -1,48 +0,0 @@ -.container { - position: absolute; - width: 100%; - height: 100%; - top: 0; - pointer-events: none; - user-select: none; -} - -.cursor { - position: absolute; - top: 0; - left: 0; - width: 160px; - height: 160px; - z-index: 10; - img { - display: block; - object-fit: contain; - } -} - -/*=============================================== -confetti -===============================================*/ -.confettiContainer { - position: absolute; - top: 0; - left: 0; - width: 120px; - height: 120px; - z-index: 9; - @media (max-width: 960px) { - width: 80px; - height: 80px; - } -} -.confetti { - width: 50%; - height: 50%; - position: absolute; - z-index: 1; - filter: brightness(1.4); - img { - display: block; - object-fit: contain; - } -} diff --git a/app/stickers/UI/Cursor/index.tsx b/app/stickers/UI/Cursor/index.tsx deleted file mode 100644 index 797c56c2..00000000 --- a/app/stickers/UI/Cursor/index.tsx +++ /dev/null @@ -1,221 +0,0 @@ -"use client"; - -import * as THREE from "three"; -import Image from "next/image"; -import { CanvasState } from "../../CanvasState"; -import { useCallback, useEffect, useRef, useState } from "react"; -import gsap from "gsap"; -import { GifPreloader } from "./GifPreloader"; -import { Confetti } from "./Confetti"; -import { useIsTouchDevice, useFrame } from "@funtech-inc/spice"; -import s from "./index.module.scss"; - -const updateTargetPoint = (target: HTMLDivElement, point: THREE.Vector2) => { - const width = target.clientWidth; - const height = target.clientHeight; - target.style.left = `${point.x - width / 2}px`; - target.style.top = `${point.y - height / 2}px`; -}; - -const CURSOR_LERP = 0.8; - -const EASING: { [key: string]: gsap.TweenVars } = { - onStickerChange: { - duration: 0.4, - ease: "back.out(2)", - }, - onConfettiView: { - duration: 0.3, - ease: "back.out(2)", - stagger: { - each: 0.03, - from: "random", - }, - }, - onConfettiHide: { - duration: 0.3, - ease: "back.in(2)", - stagger: { - each: 0.03, - from: "random", - }, - }, - onPointerOver: { - duration: 0.4, - ease: "back.out(2)", - }, - onPointerOut: { - duration: 0.4, - ease: "back.in(2)", - }, -}; - -export const CursorUI = () => { - const canvasState = CanvasState.getInstance(); - - const isTouchDevice = useIsTouchDevice(); - - const [stickerIndex, setStickerIndex] = useState( - canvasState.stickerState.nextStickerIndex - ); - - const cursorRef = useRef(null); - const imageRef = useRef(null); - const confettiRef = useRef(null); - const pointerVec = useRef(new THREE.Vector2(0, 0)); - const prevIsOver = useRef(false); - - useEffect(() => { - // To avoid hydration errors, must be useEffect - const imageTarget = imageRef.current; - if (!imageTarget) { - return; - } - imageTarget.src = `/stickers/gif/gif${stickerIndex}.gif`; - }, [stickerIndex]); - - const onStickerChange = useCallback( - (point: THREE.Vector2) => { - setStickerIndex(canvasState.stickerState.nextStickerIndex); - const imageTarget = imageRef.current; - if (imageTarget) { - gsap.fromTo( - imageTarget, - { - autoAlpha: 0, - scale: 0, - }, - { - autoAlpha: 1, - scale: 1, - ...EASING.onStickerChange, - } - ); - } - const confettiTarget = confettiRef.current; - if (confettiTarget) { - updateTargetPoint(confettiTarget, point); - const confettiImages = confettiTarget.querySelectorAll("img"); - gsap.fromTo( - confettiImages, - { - autoAlpha: 0, - scale: 0, - }, - { - autoAlpha: 1, - scale: 1, - ...EASING.onConfettiView, - onComplete: () => { - gsap.to(confettiImages, { - autoAlpha: 0, - scale: 0, - ...EASING.onConfettiHide, - }); - }, - } - ); - } - }, - [canvasState.stickerState] - ); - - const onOver = useCallback(() => { - const imageTarget = imageRef.current; - if (!imageTarget) { - return; - } - document.documentElement.style.cursor = "grab"; - gsap.fromTo( - imageTarget, - { - autoAlpha: 0, - scale: 0, - }, - { - autoAlpha: 1, - scale: 1, - ...EASING.onPointerOver, - } - ); - }, []); - - const onOut = useCallback(() => { - const imageTarget = imageRef.current; - if (!imageTarget) { - return; - } - document.documentElement.style.cursor = "initial"; - gsap.to(imageTarget, { - autoAlpha: 0, - scale: 0, - ...EASING.onPointerOut, - }); - }, []); - - const updateCursorPoint = useCallback( - (immediately: boolean) => { - const target = cursorRef.current; - if (!target) { - return; - } - const point = immediately - ? pointerVec.current.copy(canvasState.cursorState.point) - : pointerVec.current.lerp( - canvasState.cursorState.point, - CURSOR_LERP - ); - updateTargetPoint(target, point); - }, - [canvasState] - ); - - useFrame(() => { - const isOver = canvasState.cursorState.isOver; - - // update sticker index - if (stickerIndex !== canvasState.stickerState.nextStickerIndex) { - updateCursorPoint(true); - onStickerChange(canvasState.cursorState.point); - } - - // onUpdate - if (prevIsOver.current !== isOver) { - if (isOver) { - updateCursorPoint(true); - onOver(); - } else { - onOut(); - } - } - - // loop - if (isOver) { - updateCursorPoint(false); - } - prevIsOver.current = isOver; - }); - - return ( -
- {!isTouchDevice && ( - <> -
- -
- - - )} -
- -
-
- ); -}; diff --git a/app/stickers/UI/Target/index.module.scss b/app/stickers/UI/Target/index.module.scss deleted file mode 100644 index cf293d81..00000000 --- a/app/stickers/UI/Target/index.module.scss +++ /dev/null @@ -1,25 +0,0 @@ -.container { - position: absolute; - width: 100%; - height: 100%; - top: 0; - pointer-events: none; - user-select: none; - display: flex; - align-items: center; - justify-content: center; - gap: 88svh; - @media (max-width: 960px) { - padding: 0 12px; - gap: initial; - justify-content: space-between; - } -} - -.touch { - filter: brightness(1.6); - opacity: 0; - &:nth-child(2) { - rotate: 180deg; - } -} diff --git a/app/stickers/UI/Target/index.tsx b/app/stickers/UI/Target/index.tsx deleted file mode 100644 index f7d33912..00000000 --- a/app/stickers/UI/Target/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -"use client"; - -import { useRef } from "react"; -import Image from "next/image"; -import { CanvasState } from "../../CanvasState"; -import s from "./index.module.scss"; -import { useFrame } from "@funtech-inc/spice"; - -export const TargetUI = () => { - const canvasState = CanvasState.getInstance(); - const containerRef = useRef(null); - - useFrame(() => { - let tick = canvasState.clockState.waiting; - if (tick === 0 && !canvasState.stickerState.isNotSticked) { - return; - } - const container = containerRef.current; - if (!container) { - return; - } - const touchUIs = container.querySelectorAll(".js_touchUI"); - touchUIs.forEach((ui, i) => { - const touchUI = ui as HTMLElement; - touchUI.style.opacity = tick.toString(); - touchUI.style.translate = `${(tick * 16 * (i ? -1 : 1)).toString()}px`; - }); - }); - - return ( -
- {[...Array(2)].map((_, i) => ( -
- touch -
- ))} -
- ); -}; diff --git a/app/stickers/page.tsx b/app/stickers/page.tsx deleted file mode 100644 index a734d305..00000000 --- a/app/stickers/page.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ShaderFx } from "../ShaderFx"; -import { Playground } from "./Playground"; -import { CursorUI } from "./UI/Cursor"; -import { TargetUI } from "./UI/Target"; - -export default function Page() { - return ( -
- - - - - -
- ); -} diff --git a/app/stickers/romanticism/FxMaterial.tsx b/app/stickers/romanticism/FxMaterial.tsx deleted file mode 100644 index 51fc7316..00000000 --- a/app/stickers/romanticism/FxMaterial.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import * as THREE from "three"; -import { shaderMaterial } from "@react-three/drei"; -import { ShaderChunk } from "@/packages/use-shader-fx/src"; -import { RomanticismConfig } from "./useRomanticism"; - -declare global { - namespace JSX { - interface IntrinsicElements { - fxMaterial: any; - } - } -} - -export type FxMaterialProps = { - u_romance: THREE.Texture; - u_original: THREE.Texture; - u_time: number; - u_floor: number; - u_contrast: number; - u_gamma: number; - u_noiseStrength: number; - u_floorStrength: THREE.Vector2; -}; - -export const FxMaterial = shaderMaterial( - { - u_romance: new THREE.Texture(), - u_original: new THREE.Texture(), - u_time: 0, - u_floor: RomanticismConfig.floor, - u_contrast: RomanticismConfig.contrast, - u_gamma: RomanticismConfig.gamma, - u_noiseStrength: RomanticismConfig.noisestrength, - u_floorStrength: RomanticismConfig.floorStrength, - }, - ShaderChunk.planeVertex, - ` - precision highp float; - varying vec2 vUv; - uniform sampler2D u_romance; - uniform sampler2D u_original; - - uniform float u_time; - uniform float u_floor; - uniform float u_contrast; - uniform float u_gamma; - - uniform float u_noiseStrength; - uniform vec2 u_floorStrength; - - float rand(vec2 n) { - return fract(sin(dot(n ,vec2(12.9898,78.233))) * 43758.5453); - } - - void main() { - vec2 uv = vUv; - - // original color - vec4 originalColor = texture2D(u_original, uv); - - // romantic color - float noise = rand(vUv + sin(u_time)) * u_noiseStrength; - noise=noise*.5+.5; // .5 ~ 1. - - float posY = floor(uv.y * u_floor); - float posMap = mod(posY, 2.) == 0. ? 1. : -1.; - uv.x += posMap * u_floorStrength.x * .01; - uv.y += posMap * u_floorStrength.y * .01; - - vec4 romance = texture2D(u_romance, uv); - vec3 gamma = pow(romance.rgb, vec3(1./u_gamma)); - gamma.rgb = ((gamma.rgb-.5)*u_contrast)+.5; - - vec4 romanticColor = vec4(vec3(clamp(gamma * noise,0.,1.)),romance.a); - - // mix - // gl_FragColor = mix(originalColor, romanticColor, sin(u_time)*0.5+0.5); - gl_FragColor = mix(originalColor, romanticColor, 0.); - } - ` -); diff --git a/app/stickers/romanticism/useRomanticism.ts b/app/stickers/romanticism/useRomanticism.ts deleted file mode 100644 index d081cead..00000000 --- a/app/stickers/romanticism/useRomanticism.ts +++ /dev/null @@ -1,84 +0,0 @@ -import * as THREE from "three"; - -import { useRef } from "react"; -import { - useMotionBlur, - useSimpleBlur, - useHSV, -} from "@/packages/use-shader-fx/src"; -import { useFrame, useThree } from "@react-three/fiber"; - -export const RomanticismConfig = { - dpr: 0.1, - // blur - motionBlurStrength: 0.94, - blurSize: 1.6, - // color - saturation: 0.1, - brightness: 1.4, - contrast: 1, - gamma: 2, - //grain noise - noisestrength: 0.24, - // floor - floor: 12, - floorStrength: new THREE.Vector2(0.24, 0.24), -}; - -export const useRomanticism = (texture: THREE.Texture) => { - const { size } = useThree(); - const dpr = RomanticismConfig.dpr; - - // motion blur - const [updateMotionBlur, setMotionBlur, { output: motionblur }] = - useMotionBlur({ - size, - dpr, - }); - setMotionBlur({ - texture: texture, - strength: RomanticismConfig.motionBlurStrength, - }); - - // simple blur - const [updateBlur, setBlur, { output: blur }] = useSimpleBlur({ - size, - dpr, - }); - setBlur({ - texture: motionblur, - blurPower: 1, //constant - blurSize: RomanticismConfig.blurSize, - }); - - // hsv - const [updateHSV, setHSV, { output: hsv }] = useHSV({ - size, - dpr, - }); - - setHSV({ - texture: blur, - saturation: RomanticismConfig.saturation, - brightness: RomanticismConfig.brightness, - }); - - // frame - const motionBlurBegin = useRef(new THREE.Vector2(0, 0)); - const motionBlurEnd = useRef(new THREE.Vector2(0, 0)); - const pointerVec = useRef(new THREE.Vector2(0, 0)); - - useFrame((state) => { - const currentPointer = pointerVec.current.lerp(state.pointer, 0.04); - updateMotionBlur(state, { - begin: motionBlurBegin.current - .add(currentPointer) - .multiplyScalar(0.16), - end: motionBlurEnd.current.add(currentPointer).multiplyScalar(0.16), - }); - updateBlur(state); - updateHSV(state); - }); - - return hsv; -}; diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js index 445dacd1..df06243f 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js +++ b/packages/use-shader-fx/build/use-shader-fx.js @@ -1,7 +1,7 @@ import * as a from "three"; -import { useMemo as b, useEffect as ie, useRef as L, useCallback as w, useState as Ee } from "react"; -import { mergeVertices as Le } from "three-stdlib"; -var $e = "#usf ", qe = `precision highp float; +import { useMemo as y, useEffect as ae, useRef as B, useCallback as _, useState as Be } from "react"; +import { mergeVertices as Ee } from "three-stdlib"; +var Le = "#usf ", $e = `precision highp float; uniform sampler2D uBuffer; uniform sampler2D uTexture; @@ -111,9 +111,9 @@ void main() { gl_FragColor = finalColor; }`; -const Y = (e, t = !1) => { +const X = (e, t = !1) => { const n = t ? e.width * t : e.width, r = t ? e.height * t : e.height; - return b( + return y( () => new a.Vector2(n, r), [n, r] ); @@ -127,25 +127,25 @@ const Y = (e, t = !1) => { const r = e.uniforms; r && r[n] && (r[n].value = t[n]); }); -}, $ = (e, t, n, r) => { - const u = b(() => { +}, E = (e, t, n, r) => { + const u = y(() => { const c = new r(t, n); return e && e.add(c), c; }, [t, n, r, e]); - return ie(() => () => { + return ae(() => () => { e && e.remove(u), t.dispose(), n.dispose(); }, [e, t, n, u]), u; -}, Ve = process.env.NODE_ENV === "development", I = { +}, Re = process.env.NODE_ENV === "development", I = { transparent: !1, depthTest: !1, depthWrite: !1 -}, _ = new a.DataTexture( +}, C = new a.DataTexture( new Uint8Array([0, 0, 0, 0]), 1, 1, a.RGBAFormat ); -var je = `vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +var qe = `vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} float permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));} vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} float taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;} @@ -252,7 +252,7 @@ float getWobble(vec3 position) warpedPosition * uWobblePositionFrequency, uTime * uWobbleTimeFrequency )) * uWobbleStrength; -}`, We = `vec3 random3(vec3 c) { +}`, je = `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); @@ -305,35 +305,35 @@ float snoiseFractal(vec3 m) { +0.2666667* snoise(2.0*m) +0.1333333* snoise(4.0*m) +0.0666667* snoise(8.0*m); -}`, Ne = `float screenAspect = uResolution.x / uResolution.y; +}`, We = `float screenAspect = uResolution.x / uResolution.y; float textureAspect = uTextureResolution.x / uTextureResolution.y; vec2 aspectRatio = vec2( min(screenAspect / textureAspect, 1.0), min(textureAspect / screenAspect, 1.0) ); -vec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;`, ke = `vec3 mapColor = texture2D(uMap, uv).rgb; +vec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;`, Ne = `vec3 mapColor = texture2D(uMap, uv).rgb; vec3 normalizedMap = mapColor * 2.0 - 1.0; uv = uv * 2.0 - 1.0; uv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity); -uv = (uv + 1.0) / 2.0;`, Ge = `precision highp float; +uv = (uv + 1.0) / 2.0;`, ke = `precision highp float; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`, Ke = `varying vec2 vUv; +}`, Ge = `varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -}`, Xe = `vec3 hsv2rgb(vec3 c) +}`, Ke = `vec3 hsv2rgb(vec3 c) { vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); -}`, Ye = `vec3 rgb2hsv(vec3 c) +}`, Xe = `vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); @@ -343,123 +343,123 @@ void main() { float e = 1.0e-10; return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); }`; -const He = Object.freeze({ - wobble3D: je, - snoise: We, - coverTexture: Ne, - fxBlending: ke, - planeVertex: Ge, - defaultVertex: Ke, - hsv2rgb: Xe, - rgb2hsv: Ye -}), Qe = /^[ \t]*#usf +<([\w\d./]+)>/gm; -function Ze(e, t) { - return be(He[t] || ""); +const Ye = Object.freeze({ + wobble3D: qe, + snoise: je, + coverTexture: We, + fxBlending: Ne, + planeVertex: ke, + defaultVertex: Ge, + hsv2rgb: Ke, + rgb2hsv: Xe +}), He = /^[ \t]*#usf +<([\w\d./]+)>/gm; +function Qe(e, t) { + return ye(Ye[t] || ""); } -function be(e) { - return e.replace(Qe, Ze); +function ye(e) { + return e.replace(He, Qe); } -const A = (e, t) => (t && t(e), e.vertexShader = be(e.vertexShader), e.fragmentShader = be(e.fragmentShader), e), Je = ({ +const V = (e, t) => (t && t(e), e.vertexShader = ye(e.vertexShader), e.fragmentShader = ye(e.fragmentShader), e), Ze = ({ scene: e, size: t, dpr: n, onBeforeInit: r }) => { - const u = b(() => new a.PlaneGeometry(2, 2), []), c = b(() => new a.ShaderMaterial({ - ...A( + const u = y(() => new a.PlaneGeometry(2, 2), []), c = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uBuffer: { value: _ }, + uBuffer: { value: C }, uResolution: { value: new a.Vector2(0, 0) }, - uTexture: { value: _ }, + uTexture: { value: C }, uIsTexture: { value: !1 }, - uMap: { value: _ }, + uMap: { value: C }, uIsMap: { value: !1 }, - uMapIntensity: { value: re.mapIntensity }, - uRadius: { value: re.radius }, - uSmudge: { value: re.smudge }, - uDissipation: { value: re.dissipation }, - uMotionBlur: { value: re.motionBlur }, - uMotionSample: { value: re.motionSample }, + uMapIntensity: { value: ne.mapIntensity }, + uRadius: { value: ne.radius }, + uSmudge: { value: ne.smudge }, + uDissipation: { value: ne.dissipation }, + uMotionBlur: { value: ne.motionBlur }, + uMotionSample: { value: ne.motionSample }, uMouse: { value: new a.Vector2(-10, -10) }, uPrevMouse: { value: new a.Vector2(-10, -10) }, uVelocity: { value: new a.Vector2(0, 0) }, - uColor: { value: re.color }, + uColor: { value: ne.color }, uIsCursor: { value: !1 }, uPressureStart: { value: 1 }, uPressureEnd: { value: 1 } }, - vertexShader: $e, - fragmentShader: qe + vertexShader: Le, + fragmentShader: $e }, r ), ...I, // Must be transparent transparent: !0 - }), [r]), p = Y(t, n); - R(c)("uResolution", p.clone()); - const l = $(e, u, c, a.Mesh); - return { material: c, mesh: l }; -}, et = (e, t) => { + }), [r]), l = X(t, n); + R(c)("uResolution", l.clone()); + const i = E(e, u, c, a.Mesh); + return { material: c, mesh: i }; +}, Je = (e, t) => { const n = t, r = e / t, [u, c] = [n * r / 2, n / 2]; return { width: u, height: c, near: -1e3, far: 1e3 }; -}, q = (e, t = "OrthographicCamera") => { - const n = Y(e), { width: r, height: u, near: c, far: p } = et( +}, L = (e, t = "OrthographicCamera") => { + const n = X(e), { width: r, height: u, near: c, far: l } = Je( n.x, n.y ); - return b(() => t === "OrthographicCamera" ? new a.OrthographicCamera( + return y(() => t === "OrthographicCamera" ? new a.OrthographicCamera( -r, r, u, -u, c, - p - ) : new a.PerspectiveCamera(50, r / u), [r, u, c, p, t]); -}, Ce = (e = 0) => { - const t = L(new a.Vector2(0, 0)), n = L(new a.Vector2(0, 0)), r = L(new a.Vector2(0, 0)), u = L(0), c = L(new a.Vector2(0, 0)), p = L(!1); - return w( - (i) => { + l + ) : new a.PerspectiveCamera(50, r / u), [r, u, c, l, t]); +}, Se = (e = 0) => { + const t = B(new a.Vector2(0, 0)), n = B(new a.Vector2(0, 0)), r = B(new a.Vector2(0, 0)), u = B(0), c = B(new a.Vector2(0, 0)), l = B(!1); + return _( + (d) => { const m = performance.now(); - let g; - p.current && e ? (r.current = r.current.lerp( - i, + let h; + l.current && e ? (r.current = r.current.lerp( + d, 1 - e - ), g = r.current.clone()) : (g = i.clone(), r.current = g), u.current === 0 && (u.current = m, t.current = g); + ), h = r.current.clone()) : (h = d.clone(), r.current = h), u.current === 0 && (u.current = m, t.current = h); const x = Math.max(1, m - u.current); - u.current = m, c.current.copy(g).sub(t.current).divideScalar(x); - const v = c.current.length() > 0, s = p.current ? t.current.clone() : g; - return !p.current && v && (p.current = !0), t.current = g, { - currentPointer: g, - prevPointer: s, - diffPointer: n.current.subVectors(g, s), + u.current = m, c.current.copy(h).sub(t.current).divideScalar(x); + const o = c.current.length() > 0, g = l.current ? t.current.clone() : h; + return !l.current && o && (l.current = !0), t.current = h, { + currentPointer: h, + prevPointer: g, + diffPointer: n.current.subVectors(h, g), velocity: c.current, - isVelocityUpdate: v + isVelocityUpdate: o }; }, [e] ); -}, j = (e) => { - const n = L( +}, $ = (e) => { + const n = B( ((u) => Object.values(u).some((c) => typeof c == "function"))(e) ? e : structuredClone(e) - ), r = w((u) => { + ), r = _((u) => { if (u !== void 0) for (const c in u) { - const p = c; - p in n.current && u[p] !== void 0 && u[p] !== null ? n.current[p] = u[p] : console.error( + const l = c; + l in n.current && u[l] !== void 0 && u[l] !== null ? n.current[l] = u[l] : console.error( `"${String( - p + l )}" does not exist in the params. or "${String( - p + l )}" is null | undefined` ); } }, []); return [n.current, r]; -}, xe = { +}, he = { depthBuffer: !1 -}, _e = ({ +}, Ce = ({ gl: e, fbo: t, scene: n, @@ -468,7 +468,7 @@ const A = (e, t) => (t && t(e), e.vertexShader = be(e.vertexShader), e.fragmentS onSwap: c }) => { e.setRenderTarget(t), u(), e.clear(), e.render(n, r), c && c(), e.setRenderTarget(null), e.clear(); -}, W = (e) => { +}, j = (e) => { var x; const { scene: t, @@ -476,115 +476,115 @@ const A = (e, t) => (t && t(e), e.vertexShader = be(e.vertexShader), e.fragmentS size: r, dpr: u = !1, isSizeUpdate: c = !1, - depth: p = !1, - ...l - } = e, i = L(), m = Y(r, u); - i.current = b( + depth: l = !1, + ...i + } = e, d = B(), m = X(r, u); + d.current = y( () => { - const v = new a.WebGLRenderTarget( + const o = new a.WebGLRenderTarget( m.x, m.y, { - ...xe, - ...l + ...he, + ...i } ); - return p && (v.depthTexture = new a.DepthTexture( + return l && (o.depthTexture = new a.DepthTexture( m.x, m.y, a.FloatType - )), v; + )), o; }, // eslint-disable-next-line react-hooks/exhaustive-deps [] - ), c && ((x = i.current) == null || x.setSize(m.x, m.y)), ie(() => { - const v = i.current; + ), c && ((x = d.current) == null || x.setSize(m.x, m.y)), ae(() => { + const o = d.current; return () => { - v == null || v.dispose(); + o == null || o.dispose(); }; }, []); - const g = w( - (v, s) => { - const d = i.current; - return _e({ - gl: v, - fbo: d, + const h = _( + (o, g) => { + const s = d.current; + return Ce({ + gl: o, + fbo: s, scene: t, camera: n, - onBeforeRender: () => s && s({ read: d.texture }) - }), d.texture; + onBeforeRender: () => g && g({ read: s.texture }) + }), s.texture; }, [t, n] ); - return [i.current, g]; -}, le = (e) => { - var x, v; + return [d.current, h]; +}, se = (e) => { + var x, o; const { scene: t, camera: n, size: r, dpr: u = !1, isSizeUpdate: c = !1, - depth: p = !1, - ...l - } = e, i = Y(r, u), m = b(() => { - const s = new a.WebGLRenderTarget(i.x, i.y, { - ...xe, - ...l - }), d = new a.WebGLRenderTarget(i.x, i.y, { - ...xe, - ...l + depth: l = !1, + ...i + } = e, d = X(r, u), m = y(() => { + const g = new a.WebGLRenderTarget(d.x, d.y, { + ...he, + ...i + }), s = new a.WebGLRenderTarget(d.x, d.y, { + ...he, + ...i }); - return p && (s.depthTexture = new a.DepthTexture( - i.x, - i.y, + return l && (g.depthTexture = new a.DepthTexture( + d.x, + d.y, a.FloatType - ), d.depthTexture = new a.DepthTexture( - i.x, - i.y, + ), s.depthTexture = new a.DepthTexture( + d.x, + d.y, a.FloatType )), { - read: s, - write: d, + read: g, + write: s, swap: function() { - let o = this.read; - this.read = this.write, this.write = o; + let v = this.read; + this.read = this.write, this.write = v; } }; }, []); - c && ((x = m.read) == null || x.setSize(i.x, i.y), (v = m.write) == null || v.setSize(i.x, i.y)), ie(() => { - const s = m; + c && ((x = m.read) == null || x.setSize(d.x, d.y), (o = m.write) == null || o.setSize(d.x, d.y)), ae(() => { + const g = m; return () => { - var d, o; - (d = s.read) == null || d.dispose(), (o = s.write) == null || o.dispose(); + var s, v; + (s = g.read) == null || s.dispose(), (v = g.write) == null || v.dispose(); }; }, [m]); - const g = w( - (s, d) => { - var h; - const o = m; - return _e({ - gl: s, + const h = _( + (g, s) => { + var p; + const v = m; + return Ce({ + gl: g, scene: t, camera: n, - fbo: o.write, - onBeforeRender: () => d && d({ - read: o.read.texture, - write: o.write.texture + fbo: v.write, + onBeforeRender: () => s && s({ + read: v.read.texture, + write: v.write.texture }), - onSwap: () => o.swap() - }), (h = o.read) == null ? void 0 : h.texture; + onSwap: () => v.swap() + }), (p = v.read) == null ? void 0 : p.texture; }, [t, n, m] ); return [ { read: m.read, write: m.write }, - g + h ]; -}, B = (e) => typeof e == "number" ? { shader: e, fbo: e } : { +}, U = (e) => typeof e == "number" ? { shader: e, fbo: e } : { shader: e.shader ?? !1, fbo: e.fbo ?? !1 -}, re = Object.freeze({ +}, ne = Object.freeze({ texture: !1, map: !1, mapIntensity: 0.1, @@ -597,59 +597,57 @@ const A = (e, t) => (t && t(e), e.vertexShader = be(e.vertexShader), e.fragmentS isCursor: !1, pressure: 1, pointerValues: !1 -}), Zn = ({ +}), Hn = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Je({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Ze({ scene: l, size: e, - dpr: p.shader, - onBeforeInit: c - }), g = q(e), x = Ce(), [v, s] = le({ + dpr: c.shader, + onBeforeInit: u + }), m = L(e), h = Se(), [x, o] = se({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [d, o] = j(re), h = L(null), y = R(i), T = F(i), f = w( - (S, C) => { - o(S), T(C); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [g, s] = $(ne), v = B(null), p = R(i), w = F(i), b = _( + (M, S) => { + s(M), w(S); }, - [o, T] + [s, w] ); return [ - w( - (S, C, D) => { - const { gl: z, pointer: U } = S; - f(C, D), d.texture ? (y("uIsTexture", !0), y("uTexture", d.texture)) : y("uIsTexture", !1), d.map ? (y("uIsMap", !0), y("uMap", d.map), y("uMapIntensity", d.mapIntensity)) : y("uIsMap", !1), y("uRadius", d.radius), y("uSmudge", d.smudge), y("uDissipation", d.dissipation), y("uMotionBlur", d.motionBlur), y("uMotionSample", d.motionSample); - const V = d.pointerValues || x(U); - V.isVelocityUpdate && (y("uMouse", V.currentPointer), y("uPrevMouse", V.prevPointer)), y("uVelocity", V.velocity); - const O = typeof d.color == "function" ? d.color(V.velocity) : d.color; - return y("uColor", O), y("uIsCursor", d.isCursor), y("uPressureEnd", d.pressure), h.current === null && (h.current = d.pressure), y("uPressureStart", h.current), h.current = d.pressure, s(z, ({ read: P }) => { - y("uBuffer", P); + _( + (M, S, D) => { + const { gl: A, pointer: z } = M; + b(S, D), g.texture ? (p("uIsTexture", !0), p("uTexture", g.texture)) : p("uIsTexture", !1), g.map ? (p("uIsMap", !0), p("uMap", g.map), p("uMapIntensity", g.mapIntensity)) : p("uIsMap", !1), p("uRadius", g.radius), p("uSmudge", g.smudge), p("uDissipation", g.dissipation), p("uMotionBlur", g.motionBlur), p("uMotionSample", g.motionSample); + const P = g.pointerValues || h(z); + P.isVelocityUpdate && (p("uMouse", P.currentPointer), p("uPrevMouse", P.prevPointer)), p("uVelocity", P.velocity); + const q = typeof g.color == "function" ? g.color(P.velocity) : g.color; + return p("uColor", q), p("uIsCursor", g.isCursor), p("uPressureEnd", g.pressure), v.current === null && (v.current = g.pressure), p("uPressureStart", v.current), v.current = g.pressure, o(A, ({ read: T }) => { + p("uBuffer", T); }); }, - [y, x, s, d, f] + [p, h, o, g, b] ), - f, + b, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: v, - output: v.read.texture + camera: m, + renderTarget: x, + output: x.read.texture } ]; }; -var J = `varying vec2 vUv; +var Z = `varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -663,17 +661,17 @@ void main () { vT = vUv + vec2(0.0, texelSize.y); vB = vUv - vec2(0.0, texelSize.y); gl_Position = vec4(position, 1.0); -}`, tt = `precision highp float; +}`, et = `precision highp float; void main(){ gl_FragColor = vec4(0.0); }`; -const nt = () => b(() => new a.ShaderMaterial({ - vertexShader: J, - fragmentShader: tt, +const tt = () => y(() => new a.ShaderMaterial({ + vertexShader: Z, + fragmentShader: et, ...I }), []); -var rt = `precision highp float; +var nt = `precision highp float; varying vec2 vUv; uniform sampler2D uVelocity; @@ -686,24 +684,24 @@ void main () { vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; gl_FragColor = vec4(dissipation * texture2D(uSource, coord).rgb,1.); }`; -const ot = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const rt = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uVelocity: { value: _ }, - uSource: { value: _ }, + uVelocity: { value: C }, + uSource: { value: C }, texelSize: { value: new a.Vector2() }, - dt: { value: Ae }, + dt: { value: Ve }, dissipation: { value: 0 } }, - vertexShader: J, - fragmentShader: rt + vertexShader: Z, + fragmentShader: nt }, e ), ...I }), [e]); -var at = `precision highp float; +var ot = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -728,21 +726,21 @@ void main () { float div = 0.5 * (R - L + T - B); gl_FragColor = vec4(div, 0.0, 0.0, 1.0); }`; -const it = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const at = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uVelocity: { value: null }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: at + vertexShader: Z, + fragmentShader: ot }, e ), ...I }), [e]); -var ut = `precision highp float; +var it = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -762,22 +760,22 @@ void main () { float pressure = (L + R + B + T - divergence) * 0.25; gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); }`; -const st = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const ut = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uPressure: { value: null }, uDivergence: { value: null }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: ut + vertexShader: Z, + fragmentShader: it }, e ), ...I }), [e]); -var lt = `precision highp float; +var st = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -794,21 +792,21 @@ void main () { float vorticity = R - L - T + B; gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); }`; -const ct = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const lt = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uVelocity: { value: null }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: lt + vertexShader: Z, + fragmentShader: st }, e ), ...I }), [e]); -var vt = `precision highp float; +var ct = `precision highp float; varying vec2 vUv; varying vec2 vT; @@ -827,24 +825,24 @@ void main () { vec2 vel = texture2D(uVelocity, vUv).xy; gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); }`; -const mt = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const vt = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uVelocity: { value: null }, uCurl: { value: null }, curl: { value: 0 }, - dt: { value: Ae }, + dt: { value: Ve }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: vt + vertexShader: Z, + fragmentShader: ct }, e ), ...I }), [e]); -var pt = `precision highp float; +var mt = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -853,22 +851,22 @@ uniform float value; void main () { gl_FragColor = value * texture2D(uTexture, vUv); }`; -const dt = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const pt = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, + uTexture: { value: C }, value: { value: 0 }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: pt + vertexShader: Z, + fragmentShader: mt }, e ), ...I }), [e]); -var ft = `precision highp float; +var dt = `precision highp float; varying vec2 vUv; varying vec2 vL; @@ -887,24 +885,24 @@ void main () { velocity.xy -= vec2(R - L, T - B); gl_FragColor = vec4(velocity, 0.0, 1.0); }`; -const gt = ({ +const ft = ({ onBeforeInit: e -}) => b(() => new a.ShaderMaterial({ - ...A( +}) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uPressure: { value: _ }, - uVelocity: { value: _ }, + uPressure: { value: C }, + uVelocity: { value: C }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: ft + vertexShader: Z, + fragmentShader: dt }, e ), ...I }), [e]); -var ht = `precision highp float; +var gt = `precision highp float; varying vec2 vUv; uniform sampler2D uTarget; @@ -921,92 +919,92 @@ void main () { vec3 base = texture2D(uTarget, vUv).xyz; gl_FragColor = vec4(base + splat, 1.0); }`; -const xt = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ - ...A( +const ht = ({ onBeforeInit: e }) => y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTarget: { value: _ }, + uTarget: { value: C }, aspectRatio: { value: 0 }, color: { value: new a.Vector3() }, point: { value: new a.Vector2() }, radius: { value: 0 }, texelSize: { value: new a.Vector2() } }, - vertexShader: J, - fragmentShader: ht + vertexShader: Z, + fragmentShader: gt }, e ), ...I -}), [e]), H = (e, t) => e(t ?? {}), yt = ({ +}), [e]), Y = (e, t) => e(t ?? {}), xt = ({ scene: e, size: t, dpr: n, customFluidProps: r }) => { - const u = b(() => new a.PlaneGeometry(2, 2), []), { + const u = y(() => new a.PlaneGeometry(2, 2), []), { curl: c, - vorticity: p, - advection: l, - divergence: i, + vorticity: l, + advection: i, + divergence: d, pressure: m, - clear: g, + clear: h, gradientSubtract: x, - splat: v - } = r ?? {}, s = H(nt), d = s.clone(), o = H(ct, c), h = H(mt, p), y = H(ot, l), T = H( - it, - i - ), f = H(st, m), M = H(dt, g), S = H( - gt, + splat: o + } = r ?? {}, g = Y(tt), s = g.clone(), v = Y(lt, c), p = Y(vt, l), w = Y(rt, i), b = Y( + at, + d + ), f = Y(ut, m), M = Y(pt, h), S = Y( + ft, x - ), C = H(xt, v), D = b( + ), D = Y(ht, o), A = y( () => ({ - vorticityMaterial: h, - curlMaterial: o, - advectionMaterial: y, - divergenceMaterial: T, + vorticityMaterial: p, + curlMaterial: v, + advectionMaterial: w, + divergenceMaterial: b, pressureMaterial: f, clearMaterial: M, gradientSubtractMaterial: S, - splatMaterial: C + splatMaterial: D }), [ - h, - o, - y, - T, + p, + v, + w, + b, f, M, S, - C + D ] - ), z = Y(t, n); - b(() => { - R(D.splatMaterial)( + ), z = X(t, n); + y(() => { + R(A.splatMaterial)( "aspectRatio", z.x / z.y ); - for (const O of Object.values(D)) - R(O)( + for (const T of Object.values(A)) + R(T)( "texelSize", new a.Vector2(1 / z.x, 1 / z.y) ); - }, [z, D]); - const U = $(e, u, s, a.Mesh); - b(() => { - s.dispose(), U.material = d; - }, [s, U, d]), ie(() => () => { - for (const O of Object.values(D)) - O.dispose(); - }, [D]); - const V = w( - (O) => { - U.material = O, U.material.needsUpdate = !0; + }, [z, A]); + const P = E(e, u, g, a.Mesh); + y(() => { + g.dispose(), P.material = s; + }, [g, P, s]), ae(() => () => { + for (const T of Object.values(A)) + T.dispose(); + }, [A]); + const q = _( + (T) => { + P.material = T, P.material.needsUpdate = !0; }, - [U] + [P] ); - return { materials: D, setMeshMaterial: V, mesh: U }; -}, Ae = 0.016, bt = Object.freeze({ + return { materials: A, setMeshMaterial: q, mesh: P }; +}, Ve = 0.016, yt = Object.freeze({ densityDissipation: 0.98, velocityDissipation: 0.99, velocityAcceleration: 10, @@ -1016,40 +1014,30 @@ const xt = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ splatRadius: 2e-3, fluidColor: new a.Vector3(1, 1, 1), pointerValues: !1 -}), Jn = ({ +}), Qn = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - customFluidProps: c + renderTargetOptions: n, + isSizeUpdate: r, + customFluidProps: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { materials: i, setMeshMaterial: m, mesh: g } = yt({ + const c = U(t), l = y(() => new a.Scene(), []), { materials: i, setMeshMaterial: d, mesh: m } = xt({ scene: l, size: e, - dpr: p.shader, - customFluidProps: c - }), x = q(e), v = Ce(), s = b( + dpr: c.shader, + customFluidProps: u + }), h = L(e), x = Se(), o = y( () => ({ scene: l, - camera: x, - dpr: p.fbo, + camera: h, + dpr: c.fbo, size: e, - samples: n, - isSizeUpdate: u, + isSizeUpdate: r, type: a.HalfFloatType, - ...r + ...n }), - [ - l, - x, - e, - n, - p.fbo, - u, - r - ] - ), [d, o] = le(s), [h, y] = le(s), [T, f] = W(s), [M, S] = W(s), [C, D] = le(s), z = L(new a.Vector2(0, 0)), U = L(new a.Vector3(0, 0, 0)), [V, O] = j(bt), P = b( + [l, h, e, c.fbo, r, n] + ), [g, s] = se(o), [v, p] = se(o), [w, b] = j(o), [f, M] = j(o), [S, D] = se(o), A = B(new a.Vector2(0, 0)), z = B(new a.Vector3(0, 0, 0)), [P, q] = $(yt), T = y( () => ({ advection: R(i.advectionMaterial), splat: R(i.splatMaterial), @@ -1061,7 +1049,7 @@ const xt = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ gradientSubtract: R(i.gradientSubtractMaterial) }), [i] - ), G = b( + ), k = y( () => ({ advection: F(i.advectionMaterial), splat: F(i.splatMaterial), @@ -1073,99 +1061,99 @@ const xt = ({ onBeforeInit: e }) => b(() => new a.ShaderMaterial({ gradientSubtract: F(i.gradientSubtractMaterial) }), [i] - ), X = w( - (te, ne) => { - O(te), ne && Object.keys(ne).forEach((ue) => { - G[ue]( - ne[ue] + ), K = _( + (ee, te) => { + q(ee), te && Object.keys(te).forEach((ie) => { + k[ie]( + te[ie] ); }); }, - [O, G] + [q, k] ); return [ - w( - (te, ne, ue) => { - const { gl: K, pointer: ze, size: we } = te; - X(ne, ue); - const ye = o(K, ({ read: k }) => { - m(i.advectionMaterial), P.advection("uVelocity", k), P.advection("uSource", k), P.advection( + _( + (ee, te, ie) => { + const { gl: G, pointer: Ie, size: _e } = ee; + K(te, ie); + const xe = s(G, ({ read: N }) => { + d(i.advectionMaterial), T.advection("uVelocity", N), T.advection("uSource", N), T.advection( "dissipation", - V.velocityDissipation + P.velocityDissipation ); - }), Ue = y(K, ({ read: k }) => { - m(i.advectionMaterial), P.advection("uVelocity", ye), P.advection("uSource", k), P.advection( + }), ze = p(G, ({ read: N }) => { + d(i.advectionMaterial), T.advection("uVelocity", xe), T.advection("uSource", N), T.advection( "dissipation", - V.densityDissipation + P.densityDissipation ); - }), de = V.pointerValues || v(ze); - de.isVelocityUpdate && (o(K, ({ read: k }) => { - m(i.splatMaterial), P.splat("uTarget", k), P.splat("point", de.currentPointer); - const ce = de.diffPointer.multiply( - z.current.set(we.width, we.height).multiplyScalar(V.velocityAcceleration) + }), pe = P.pointerValues || x(Ie); + pe.isVelocityUpdate && (s(G, ({ read: N }) => { + d(i.splatMaterial), T.splat("uTarget", N), T.splat("point", pe.currentPointer); + const le = pe.diffPointer.multiply( + A.current.set(_e.width, _e.height).multiplyScalar(P.velocityAcceleration) ); - P.splat( + T.splat( "color", - U.current.set(ce.x, ce.y, 1) - ), P.splat("radius", V.splatRadius); - }), y(K, ({ read: k }) => { - m(i.splatMaterial), P.splat("uTarget", k); - const ce = typeof V.fluidColor == "function" ? V.fluidColor(de.velocity) : V.fluidColor; - P.splat("color", ce); + z.current.set(le.x, le.y, 1) + ), T.splat("radius", P.splatRadius); + }), p(G, ({ read: N }) => { + d(i.splatMaterial), T.splat("uTarget", N); + const le = typeof P.fluidColor == "function" ? P.fluidColor(pe.velocity) : P.fluidColor; + T.splat("color", le); })); - const Oe = f(K, () => { - m(i.curlMaterial), P.curl("uVelocity", ye); + const Ue = b(G, () => { + d(i.curlMaterial), T.curl("uVelocity", xe); }); - o(K, ({ read: k }) => { - m(i.vorticityMaterial), P.vorticity("uVelocity", k), P.vorticity("uCurl", Oe), P.vorticity("curl", V.curlStrength); + s(G, ({ read: N }) => { + d(i.vorticityMaterial), T.vorticity("uVelocity", N), T.vorticity("uCurl", Ue), T.vorticity("curl", P.curlStrength); }); - const Be = S(K, () => { - m(i.divergenceMaterial), P.divergence("uVelocity", ye); + const Oe = M(G, () => { + d(i.divergenceMaterial), T.divergence("uVelocity", xe); }); - D(K, ({ read: k }) => { - m(i.clearMaterial), P.clear("uTexture", k), P.clear("value", V.pressureDissipation); - }), m(i.pressureMaterial), P.pressure("uDivergence", Be); - let Te; - for (let k = 0; k < V.pressureIterations; k++) - Te = D(K, ({ read: ce }) => { - P.pressure("uPressure", ce); + D(G, ({ read: N }) => { + d(i.clearMaterial), T.clear("uTexture", N), T.clear("value", P.pressureDissipation); + }), d(i.pressureMaterial), T.pressure("uDivergence", Oe); + let we; + for (let N = 0; N < P.pressureIterations; N++) + we = D(G, ({ read: le }) => { + T.pressure("uPressure", le); }); - return o(K, ({ read: k }) => { - m(i.gradientSubtractMaterial), P.gradientSubtract("uPressure", Te), P.gradientSubtract("uVelocity", k); - }), Ue; + return s(G, ({ read: N }) => { + d(i.gradientSubtractMaterial), T.gradientSubtract("uPressure", we), T.gradientSubtract("uVelocity", N); + }), ze; }, [ i, - P, - m, - f, - y, - S, - v, + T, + d, + b, + p, + M, + x, D, - o, - V, - X + s, + P, + K ] ), - X, + K, { scene: l, - mesh: g, + mesh: m, materials: i, - camera: x, + camera: h, renderTarget: { - velocity: d, - density: h, - curl: T, - divergence: M, - pressure: C + velocity: g, + density: v, + curl: w, + divergence: f, + pressure: S }, - output: h.read.texture + output: v.read.texture } ]; }; -var Mt = "#usf ", St = `precision highp float; +var bt = "#usf ", Mt = `precision highp float; uniform sampler2D uMap; uniform float uOpacity; @@ -1177,25 +1165,25 @@ void main() { vec3 color = texture2D(uMap, uv).rgb; gl_FragColor = vec4(color,uOpacity); }`; -const Ct = ({ +const St = ({ scale: e, max: t, texture: n, scene: r, onBeforeInit: u }) => { - const c = b( + const c = y( () => new a.PlaneGeometry(e, e), [e] - ), p = b(() => new a.ShaderMaterial({ - ...A( + ), l = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uOpacity: { value: 0 }, - uMap: { value: n || _ } + uMap: { value: n || C } }, - vertexShader: Mt, - fragmentShader: St + vertexShader: bt, + fragmentShader: Mt }, u ), @@ -1203,91 +1191,89 @@ const Ct = ({ ...I, // Must be transparent. transparent: !0 - }), [n, u]), l = b(() => { - const i = []; + }), [n, u]), i = y(() => { + const d = []; for (let m = 0; m < t; m++) { - const g = p.clone(), x = new a.Mesh(c.clone(), g); - x.rotateZ(2 * Math.PI * Math.random()), x.visible = !1, r.add(x), i.push(x); + const h = l.clone(), x = new a.Mesh(c.clone(), h); + x.rotateZ(2 * Math.PI * Math.random()), x.visible = !1, r.add(x), d.push(x); } - return i; - }, [c, p, r, t]); - return ie(() => () => { - l.forEach((i) => { - i.geometry.dispose(), Array.isArray(i.material) ? i.material.forEach((m) => m.dispose()) : i.material.dispose(), r.remove(i); + return d; + }, [c, l, r, t]); + return ae(() => () => { + i.forEach((d) => { + d.geometry.dispose(), Array.isArray(d.material) ? d.material.forEach((m) => m.dispose()) : d.material.dispose(), r.remove(d); }); - }, [r, l]), l; -}, _t = Object.freeze({ + }, [r, i]), i; +}, Ct = Object.freeze({ frequency: 0.01, rotation: 0.05, fadeoutSpeed: 0.9, scale: 0.3, alpha: 0.6, pointerValues: !1 -}), er = ({ +}), Zn = ({ texture: e, scale: t = 64, max: n = 100, size: r, dpr: u, renderTargetOptions: c, - samples: p, isSizeUpdate: l, onBeforeInit: i }) => { - const m = B(u), g = b(() => new a.Scene(), []), x = Ct({ + const d = U(u), m = y(() => new a.Scene(), []), h = St({ scale: t, max: n, texture: e, - scene: g, + scene: m, onBeforeInit: i - }), v = q(r), s = Ce(), [d, o] = W({ - scene: g, - camera: v, + }), x = L(r), o = Se(), [g, s] = j({ + scene: m, + camera: x, size: r, - dpr: m.fbo, - samples: p, + dpr: d.fbo, isSizeUpdate: l, ...c - }), [h, y] = j(_t), T = L(0), f = b(() => (S, C) => { - y(S), x.forEach((D) => { + }), [v, p] = $(Ct), w = B(0), b = y(() => (M, S) => { + p(M), h.forEach((D) => { if (D.visible) { - const z = D.material; - D.rotation.z += h.rotation, D.scale.x = h.fadeoutSpeed * D.scale.x + h.scale, D.scale.y = D.scale.x; - const U = z.uniforms.uOpacity.value; - R(z)("uOpacity", U * h.fadeoutSpeed), U < 1e-3 && (D.visible = !1); + const A = D.material; + D.rotation.z += v.rotation, D.scale.x = v.fadeoutSpeed * D.scale.x + v.scale, D.scale.y = D.scale.x; + const z = A.uniforms.uOpacity.value; + R(A)("uOpacity", z * v.fadeoutSpeed), z < 1e-3 && (D.visible = !1); } - F(D.material)(C); + F(D.material)(S); }); - }, [x, h, y]); + }, [h, v, p]); return [ - w( - (S, C, D) => { - const { gl: z, pointer: U, size: V } = S; - f(C, D); - const O = h.pointerValues || s(U); - if (h.frequency < O.diffPointer.length()) { - const P = x[T.current], G = P.material; - P.visible = !0, P.position.set( - O.currentPointer.x * (V.width / 2), - O.currentPointer.y * (V.height / 2), + _( + (M, S, D) => { + const { gl: A, pointer: z, size: P } = M; + b(S, D); + const q = v.pointerValues || o(z); + if (v.frequency < q.diffPointer.length()) { + const T = h[w.current], k = T.material; + T.visible = !0, T.position.set( + q.currentPointer.x * (P.width / 2), + q.currentPointer.y * (P.height / 2), 0 - ), P.scale.x = P.scale.y = 0, R(G)("uOpacity", h.alpha), T.current = (T.current + 1) % n; + ), T.scale.x = T.scale.y = 0, R(k)("uOpacity", v.alpha), w.current = (w.current + 1) % n; } - return o(z); + return s(A); }, - [o, x, s, n, h, f] + [s, h, o, n, v, b] ), - f, + b, { - scene: g, - camera: v, - meshArr: x, - renderTarget: d, - output: d.texture + scene: m, + camera: x, + meshArr: h, + renderTarget: g, + output: g.texture } ]; }; -var wt = "#usf ", Tt = `precision highp float; +var _t = "#usf ", wt = `precision highp float; precision highp int; varying vec2 vUv; @@ -1361,32 +1347,32 @@ void main() { float noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength); gl_FragColor = vec4(vec3(noise),1.0); }`; -const Dt = ({ +const Tt = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uTime: { value: 0 }, - scale: { value: oe.scale }, - timeStrength: { value: oe.timeStrength }, - noiseOctaves: { value: oe.noiseOctaves }, - fbmOctaves: { value: oe.fbmOctaves }, - warpOctaves: { value: oe.warpOctaves }, - warpDirection: { value: oe.warpDirection }, - warpStrength: { value: oe.warpStrength } + scale: { value: re.scale }, + timeStrength: { value: re.timeStrength }, + noiseOctaves: { value: re.noiseOctaves }, + fbmOctaves: { value: re.fbmOctaves }, + warpOctaves: { value: re.warpOctaves }, + warpDirection: { value: re.warpDirection }, + warpStrength: { value: re.warpStrength } }, - vertexShader: wt, - fragmentShader: Tt + vertexShader: _t, + fragmentShader: wt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, oe = Object.freeze({ +}, re = Object.freeze({ scale: 4e-3, timeStrength: 0.3, noiseOctaves: 2, @@ -1395,48 +1381,46 @@ const Dt = ({ warpDirection: new a.Vector2(2, 2), warpStrength: 8, beat: !1 -}), tr = ({ +}), Jn = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Dt({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Tt({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(oe), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(re), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C, clock: D } = f; - return y(M, S), o("scale", s.scale), o("timeStrength", s.timeStrength), o("noiseOctaves", s.noiseOctaves), o("fbmOctaves", s.fbmOctaves), o("warpOctaves", s.warpOctaves), o("warpDirection", s.warpDirection), o("warpStrength", s.warpStrength), o("uTime", s.beat || D.getElapsedTime()), v(C); + _( + (b, f, M) => { + const { gl: S, clock: D } = b; + return p(f, M), s("scale", o.scale), s("timeStrength", o.timeStrength), s("noiseOctaves", o.noiseOctaves), s("fbmOctaves", o.fbmOctaves), s("warpOctaves", o.warpOctaves), s("warpDirection", o.warpDirection), s("warpStrength", o.warpStrength), s("uTime", o.beat || D.getElapsedTime()), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Pt = "#usf ", Rt = `precision highp float; +var Dt = "#usf ", Pt = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -1479,39 +1463,39 @@ void main() { gl_FragColor = vec4(col, alpha); }`; -const Vt = ({ +const Rt = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, + uTexture: { value: C }, isTexture: { value: !1 }, - scale: { value: Q.scale }, - noise: { value: _ }, - noiseStrength: { value: Q.noiseStrength }, + scale: { value: H.scale }, + noise: { value: C }, + noiseStrength: { value: H.noiseStrength }, isNoise: { value: !1 }, - laminateLayer: { value: Q.laminateLayer }, + laminateLayer: { value: H.laminateLayer }, laminateInterval: { - value: Q.laminateInterval + value: H.laminateInterval }, - laminateDetail: { value: Q.laminateDetail }, - distortion: { value: Q.distortion }, - colorFactor: { value: Q.colorFactor }, + laminateDetail: { value: H.laminateDetail }, + distortion: { value: H.distortion }, + colorFactor: { value: H.colorFactor }, uTime: { value: 0 }, - timeStrength: { value: Q.timeStrength } + timeStrength: { value: H.timeStrength } }, - vertexShader: Pt, - fragmentShader: Rt + vertexShader: Dt, + fragmentShader: Pt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, Q = Object.freeze({ +}, H = Object.freeze({ texture: !1, scale: 1, laminateLayer: 1, @@ -1523,48 +1507,46 @@ const Vt = ({ noise: !1, noiseStrength: new a.Vector2(0, 0), beat: !1 -}), nr = ({ +}), er = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Vt({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Rt({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(Q), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(H), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C, clock: D } = f; - return y(M, S), s.texture ? (o("uTexture", s.texture), o("isTexture", !0)) : (o("isTexture", !1), o("scale", s.scale)), s.noise ? (o("noise", s.noise), o("isNoise", !0), o("noiseStrength", s.noiseStrength)) : o("isNoise", !1), o("uTime", s.beat || D.getElapsedTime()), o("laminateLayer", s.laminateLayer), o("laminateInterval", s.laminateInterval), o("laminateDetail", s.laminateDetail), o("distortion", s.distortion), o("colorFactor", s.colorFactor), o("timeStrength", s.timeStrength), v(C); + _( + (b, f, M) => { + const { gl: S, clock: D } = b; + return p(f, M), o.texture ? (s("uTexture", o.texture), s("isTexture", !0)) : (s("isTexture", !1), s("scale", o.scale)), o.noise ? (s("noise", o.noise), s("isNoise", !0), s("noiseStrength", o.noiseStrength)) : s("isNoise", !1), s("uTime", o.beat || D.getElapsedTime()), s("laminateLayer", o.laminateLayer), s("laminateInterval", o.laminateInterval), s("laminateDetail", o.laminateDetail), s("distortion", o.distortion), s("colorFactor", o.colorFactor), s("timeStrength", o.timeStrength), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var At = "#usf ", Ft = `precision highp float; +var Vt = "#usf ", At = `precision highp float; varying vec2 vUv; uniform float u_time; @@ -1590,33 +1572,33 @@ void main() { vec3 color = clamp(marble(vec3(gl_FragCoord.xy*u_scale,time)),0.,1.); gl_FragColor = vec4(color,1.); }`; -const It = ({ +const Ft = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { u_time: { value: 0 }, - u_pattern: { value: se.pattern }, - u_complexity: { value: se.complexity }, + u_pattern: { value: ue.pattern }, + u_complexity: { value: ue.complexity }, u_complexityAttenuation: { - value: se.complexityAttenuation + value: ue.complexityAttenuation }, - u_iterations: { value: se.iterations }, - u_timeStrength: { value: se.timeStrength }, - u_scale: { value: se.scale } + u_iterations: { value: ue.iterations }, + u_timeStrength: { value: ue.timeStrength }, + u_scale: { value: ue.scale } }, - vertexShader: At, - fragmentShader: Ft + vertexShader: Vt, + fragmentShader: At }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, se = Object.freeze({ +}, ue = Object.freeze({ pattern: 0, complexity: 2, complexityAttenuation: 0.2, @@ -1624,48 +1606,46 @@ const It = ({ timeStrength: 0.2, scale: 2e-3, beat: !1 -}), rr = ({ +}), tr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = It({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Ft({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(se), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(ue), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C, clock: D } = f; - return y(M, S), o("u_pattern", s.pattern), o("u_complexity", s.complexity), o("u_complexityAttenuation", s.complexityAttenuation), o("u_iterations", s.iterations), o("u_timeStrength", s.timeStrength), o("u_scale", s.scale), o("u_time", s.beat || D.getElapsedTime()), v(C); + _( + (b, f, M) => { + const { gl: S, clock: D } = b; + return p(f, M), s("u_pattern", o.pattern), s("u_complexity", o.complexity), s("u_complexityAttenuation", o.complexityAttenuation), s("u_iterations", o.iterations), s("u_timeStrength", o.timeStrength), s("u_scale", o.scale), s("u_time", o.beat || D.getElapsedTime()), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var zt = "#usf ", Ut = `precision highp float; +var It = "#usf ", zt = `precision highp float; precision highp int; varying vec2 vUv; @@ -1695,78 +1675,76 @@ void main() { gl_FragColor = vec4(outColor, tex.a); }`; -const Ot = ({ +const Ut = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, - uRgbWeight: { value: ve.rgbWeight }, - uColor1: { value: ve.color1 }, - uColor2: { value: ve.color2 }, - uColor3: { value: ve.color3 }, - uColor4: { value: ve.color4 } + uTexture: { value: C }, + uRgbWeight: { value: ce.rgbWeight }, + uColor1: { value: ce.color1 }, + uColor2: { value: ce.color2 }, + uColor3: { value: ce.color3 }, + uColor4: { value: ce.color4 } }, - vertexShader: zt, - fragmentShader: Ut + vertexShader: It, + fragmentShader: zt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, ve = Object.freeze({ - texture: _, +}, ce = Object.freeze({ + texture: C, color1: new a.Color().set(0.5, 0.5, 0.5), color2: new a.Color().set(0.5, 0.5, 0.5), color3: new a.Color().set(1, 1, 1), color4: new a.Color().set(0, 0.1, 0.2), rgbWeight: new a.Vector3(0.299, 0.587, 0.114) -}), or = ({ +}), nr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Ot({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Ut({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(ve), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(ce), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("uTexture", s.texture), o("uColor1", s.color1), o("uColor2", s.color2), o("uColor3", s.color3), o("uColor4", s.color4), o("uRgbWeight", s.rgbWeight), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("uTexture", o.texture), s("uColor1", o.color1), s("uColor2", o.color2), s("uColor3", o.color3), s("uColor4", o.color4), s("uRgbWeight", o.rgbWeight), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Bt = "#usf ", Et = `precision highp float; +var Ot = "#usf ", Bt = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -1781,72 +1759,70 @@ void main() { vec3 duotone = mix(uColor0, uColor1, grayscale); gl_FragColor = vec4(duotone, texColor.a); }`; -const Lt = ({ +const Et = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, - uColor0: { value: Me.color0 }, - uColor1: { value: Me.color1 } + uTexture: { value: C }, + uColor0: { value: be.color0 }, + uColor1: { value: be.color1 } }, - vertexShader: Bt, - fragmentShader: Et + vertexShader: Ot, + fragmentShader: Bt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, Me = Object.freeze({ - texture: _, +}, be = Object.freeze({ + texture: C, color0: new a.Color(16777215), color1: new a.Color(0) -}), ar = ({ +}), rr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Lt({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Et({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(Me), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(be), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("uTexture", s.texture), o("uColor0", s.color0), o("uColor1", s.color1), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("uTexture", o.texture), s("uColor0", o.color0), s("uColor1", o.color1), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var $t = "#usf ", qt = `precision highp float; +var Lt = "#usf ", $t = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1881,84 +1857,82 @@ void main() { gl_FragColor = vec4(alphaColor,alpha); }`; -const jt = ({ +const qt = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - u_texture: { value: _ }, - uMap: { value: _ }, - u_alphaMap: { value: _ }, + u_texture: { value: C }, + uMap: { value: C }, + u_alphaMap: { value: C }, u_isAlphaMap: { value: !1 }, - uMapIntensity: { value: me.mapIntensity }, - u_brightness: { value: me.brightness }, - u_min: { value: me.min }, - u_max: { value: me.max }, + uMapIntensity: { value: ve.mapIntensity }, + u_brightness: { value: ve.brightness }, + u_min: { value: ve.min }, + u_max: { value: ve.max }, u_dodgeColor: { value: new a.Color() }, u_isDodgeColor: { value: !1 } }, - vertexShader: $t, - fragmentShader: qt + vertexShader: Lt, + fragmentShader: $t }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, me = Object.freeze({ - texture: _, - map: _, +}, ve = Object.freeze({ + texture: C, + map: C, alphaMap: !1, mapIntensity: 0.3, brightness: new a.Vector3(0.5, 0.5, 0.5), min: 0, max: 1, dodgeColor: !1 -}), ir = ({ +}), or = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = jt({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = qt({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(me), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(ve), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("u_texture", s.texture), o("uMap", s.map), o("uMapIntensity", s.mapIntensity), s.alphaMap ? (o("u_alphaMap", s.alphaMap), o("u_isAlphaMap", !0)) : o("u_isAlphaMap", !1), o("u_brightness", s.brightness), o("u_min", s.min), o("u_max", s.max), s.dodgeColor ? (o("u_dodgeColor", s.dodgeColor), o("u_isDodgeColor", !0)) : o("u_isDodgeColor", !1), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("u_texture", o.texture), s("uMap", o.map), s("uMapIntensity", o.mapIntensity), o.alphaMap ? (s("u_alphaMap", o.alphaMap), s("u_isAlphaMap", !0)) : s("u_isAlphaMap", !1), s("u_brightness", o.brightness), s("u_min", o.min), s("u_max", o.max), o.dodgeColor ? (s("u_dodgeColor", o.dodgeColor), s("u_isDodgeColor", !0)) : s("u_isDodgeColor", !1), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Wt = "#usf ", Nt = `precision highp float; +var jt = "#usf ", Wt = `precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -2019,108 +1993,106 @@ void main() { gl_FragColor = mix(color0, color1, progress); }`; -const kt = ({ +const Nt = ({ scene: e, size: t, dpr: n, onBeforeInit: r }) => { - const u = b(() => new a.PlaneGeometry(2, 2), []), c = b(() => { - var m, g; + const u = y(() => new a.PlaneGeometry(2, 2), []), c = y(() => { + var m, h; return new a.ShaderMaterial({ - ...A( + ...V( { uniforms: { uResolution: { value: new a.Vector2() }, uTextureResolution: { value: new a.Vector2() }, - uTexture0: { value: _ }, - uTexture1: { value: _ }, - padding: { value: ae.padding }, - uMap: { value: _ }, - edgeIntensity: { value: ae.edgeIntensity }, - mapIntensity: { value: ae.mapIntensity }, - epicenter: { value: ae.epicenter }, - progress: { value: ae.progress }, - dirX: { value: (m = ae.dir) == null ? void 0 : m.x }, - dirY: { value: (g = ae.dir) == null ? void 0 : g.y } + uTexture0: { value: C }, + uTexture1: { value: C }, + padding: { value: oe.padding }, + uMap: { value: C }, + edgeIntensity: { value: oe.edgeIntensity }, + mapIntensity: { value: oe.mapIntensity }, + epicenter: { value: oe.epicenter }, + progress: { value: oe.progress }, + dirX: { value: (m = oe.dir) == null ? void 0 : m.x }, + dirY: { value: (h = oe.dir) == null ? void 0 : h.y } }, - vertexShader: Wt, - fragmentShader: Nt + vertexShader: jt, + fragmentShader: Wt }, r ), ...I }); - }, [r]), p = Y(t, n); - R(c)("uResolution", p.clone()); - const l = $(e, u, c, a.Mesh); - return { material: c, mesh: l }; -}, ae = Object.freeze({ - texture0: _, - texture1: _, + }, [r]), l = X(t, n); + R(c)("uResolution", l.clone()); + const i = E(e, u, c, a.Mesh); + return { material: c, mesh: i }; +}, oe = Object.freeze({ + texture0: C, + texture1: C, padding: 0, - map: _, + map: C, mapIntensity: 0, edgeIntensity: 0, epicenter: new a.Vector2(0, 0), progress: 0, dir: new a.Vector2(0, 0) -}), ur = ({ +}), ar = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = kt({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Nt({ scene: l, size: e, - dpr: p.shader, - onBeforeInit: c - }), g = q(e), [x, v] = W({ + dpr: c.shader, + onBeforeInit: u + }), m = L(e), [h, x] = j({ scene: l, - camera: g, - dpr: p.fbo, + camera: m, + dpr: c.fbo, size: e, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(ae), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + isSizeUpdate: r, + ...n + }), [o, g] = $(oe), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - var V, O, P, G, X, ee, te, ne; - const { gl: C } = f; - y(M, S), o("uTexture0", s.texture0), o("uTexture1", s.texture1), o("progress", s.progress); + _( + (b, f, M) => { + var P, q, T, k, K, J, ee, te; + const { gl: S } = b; + p(f, M), s("uTexture0", o.texture0), s("uTexture1", o.texture1), s("progress", o.progress); const D = [ - ((O = (V = s.texture0) == null ? void 0 : V.image) == null ? void 0 : O.width) || 0, - ((G = (P = s.texture0) == null ? void 0 : P.image) == null ? void 0 : G.height) || 0 - ], z = [ - ((ee = (X = s.texture1) == null ? void 0 : X.image) == null ? void 0 : ee.width) || 0, - ((ne = (te = s.texture1) == null ? void 0 : te.image) == null ? void 0 : ne.height) || 0 - ], U = D.map((ue, K) => ue + (z[K] - ue) * s.progress); - return o("uTextureResolution", U), o("padding", s.padding), o("uMap", s.map), o("mapIntensity", s.mapIntensity), o("edgeIntensity", s.edgeIntensity), o("epicenter", s.epicenter), o("dirX", s.dir.x), o("dirY", s.dir.y), v(C); + ((q = (P = o.texture0) == null ? void 0 : P.image) == null ? void 0 : q.width) || 0, + ((k = (T = o.texture0) == null ? void 0 : T.image) == null ? void 0 : k.height) || 0 + ], A = [ + ((J = (K = o.texture1) == null ? void 0 : K.image) == null ? void 0 : J.width) || 0, + ((te = (ee = o.texture1) == null ? void 0 : ee.image) == null ? void 0 : te.height) || 0 + ], z = D.map((ie, G) => ie + (A[G] - ie) * o.progress); + return s("uTextureResolution", z), s("padding", o.padding), s("uMap", o.map), s("mapIntensity", o.mapIntensity), s("edgeIntensity", o.edgeIntensity), s("epicenter", o.epicenter), s("dirX", o.dir.x), s("dirY", o.dir.y), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Gt = "#usf ", Kt = `precision highp float; +var kt = "#usf ", Gt = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -2135,76 +2107,74 @@ void main() { float alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0); gl_FragColor = vec4(color, alpha); }`; -const Xt = ({ +const Kt = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - u_texture: { value: _ }, - u_brightness: { value: fe.brightness }, - u_min: { value: fe.min }, - u_max: { value: fe.max } + u_texture: { value: C }, + u_brightness: { value: de.brightness }, + u_min: { value: de.min }, + u_max: { value: de.max } }, - vertexShader: Gt, - fragmentShader: Kt + vertexShader: kt, + fragmentShader: Gt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, fe = Object.freeze({ - texture: _, +}, de = Object.freeze({ + texture: C, brightness: new a.Vector3(0.5, 0.5, 0.5), min: 0, max: 1 -}), sr = ({ +}), ir = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Xt({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Kt({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j( - fe - ), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $( + de + ), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("u_texture", s.texture), o("u_brightness", s.brightness), o("u_min", s.min), o("u_max", s.max), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("u_texture", o.texture), s("u_brightness", o.brightness), s("u_min", o.min), s("u_max", o.max), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Yt = "#usf ", Ht = `precision highp float; +var Xt = "#usf ", Yt = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -2218,72 +2188,70 @@ void main() { gl_FragColor = texture2D(u_texture, uv); }`; -const Qt = ({ +const Ht = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - u_texture: { value: _ }, - uMap: { value: _ }, - uMapIntensity: { value: Fe.mapIntensity } + u_texture: { value: C }, + uMap: { value: C }, + uMapIntensity: { value: Ae.mapIntensity } }, - vertexShader: Yt, - fragmentShader: Ht + vertexShader: Xt, + fragmentShader: Yt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, Fe = Object.freeze({ - texture: _, - map: _, +}, Ae = Object.freeze({ + texture: C, + map: C, mapIntensity: 0.3 -}), lr = ({ +}), ur = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Qt({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Ht({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(Fe), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(Ae), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("u_texture", s.texture), o("uMap", s.map), o("uMapIntensity", s.mapIntensity), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("u_texture", o.texture), s("uMap", o.map), s("uMapIntensity", o.mapIntensity), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Zt = "#usf ", Jt = `precision highp float; +var Qt = "#usf ", Zt = `precision highp float; uniform sampler2D uTexture; uniform sampler2D uMap; @@ -2296,74 +2264,72 @@ void main() { vec4 map = texture2D(uMap, uv); gl_FragColor = mix(tex,map,map.a); }`; -const en = ({ +const Jt = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, - uMap: { value: _ } + uTexture: { value: C }, + uMap: { value: C } }, - vertexShader: Zt, - fragmentShader: Jt + vertexShader: Qt, + fragmentShader: Zt }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, tn = Object.freeze({ - texture: _, - map: _ -}), cr = ({ +}, en = Object.freeze({ + texture: C, + map: C +}), sr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = en({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Jt({ scene: l, size: e, - onBeforeInit: c - }), g = q(e), [x, v] = W({ + onBeforeInit: u + }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(tn), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(en), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("uTexture", s.texture), o("uMap", s.map), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("uTexture", o.texture), s("uMap", o.map), x(S); }, - [o, v, s, y] + [s, x, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var nn = "#usf ", rn = `precision highp float; +var tn = "#usf ", nn = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -2382,76 +2348,74 @@ void main() { vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); }`; -const on = ({ +const rn = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - u_texture: { value: _ }, - u_brightness: { value: Se.brightness }, - u_saturation: { value: Se.saturation } + u_texture: { value: C }, + u_brightness: { value: Me.brightness }, + u_saturation: { value: Me.saturation } }, - vertexShader: nn, - fragmentShader: rn + vertexShader: tn, + fragmentShader: nn }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, Se = Object.freeze({ - texture: _, +}, Me = Object.freeze({ + texture: C, brightness: 1, saturation: 1 -}), vr = ({ +}), lr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = on({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = rn({ scene: l, size: e, - onBeforeInit: c - }), g = q(e), [x, v] = W({ + onBeforeInit: u + }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(Se), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(Me), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("u_texture", s.texture), o("u_brightness", s.brightness), o("u_saturation", s.saturation), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("u_texture", o.texture), s("u_brightness", o.brightness), s("u_saturation", o.saturation), x(S); }, - [o, v, s, y] + [s, x, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var an = "#usf ", un = `precision highp float; +var on = "#usf ", an = `precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -2463,83 +2427,81 @@ void main() { gl_FragColor = texture2D(uTexture, uv); }`; -const sn = ({ +const un = ({ scene: e, size: t, dpr: n, onBeforeInit: r }) => { - const u = b(() => new a.PlaneGeometry(2, 2), []), c = b(() => new a.ShaderMaterial({ - ...A( + const u = y(() => new a.PlaneGeometry(2, 2), []), c = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { uResolution: { value: new a.Vector2() }, uTextureResolution: { value: new a.Vector2() }, - uTexture: { value: _ } + uTexture: { value: C } }, - vertexShader: an, - fragmentShader: un + vertexShader: on, + fragmentShader: an }, r ), ...I - }), [r]), p = Y(t, n); - R(c)("uResolution", p.clone()); - const l = $(e, u, c, a.Mesh); - return { material: c, mesh: l }; -}, ln = Object.freeze({ - texture: _ -}), mr = ({ + }), [r]), l = X(t, n); + R(c)("uResolution", l.clone()); + const i = E(e, u, c, a.Mesh); + return { material: c, mesh: i }; +}, sn = Object.freeze({ + texture: C +}), cr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = sn({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = un({ scene: l, size: e, - dpr: p.shader, - onBeforeInit: c - }), g = q(e), [x, v] = W({ + dpr: c.shader, + onBeforeInit: u + }), m = L(e), [h, x] = j({ scene: l, - camera: g, - dpr: p.fbo, + camera: m, + dpr: c.fbo, size: e, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(ln), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + isSizeUpdate: r, + ...n + }), [o, g] = $(sn), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - var D, z, U, V, O, P; - const { gl: C } = f; - return y(M, S), o("uTexture", s.texture), o("uTextureResolution", [ - ((U = (z = (D = s.texture) == null ? void 0 : D.source) == null ? void 0 : z.data) == null ? void 0 : U.width) || 0, - ((P = (O = (V = s.texture) == null ? void 0 : V.source) == null ? void 0 : O.data) == null ? void 0 : P.height) || 0 - ]), v(C); + _( + (b, f, M) => { + var D, A, z, P, q, T; + const { gl: S } = b; + return p(f, M), s("uTexture", o.texture), s("uTextureResolution", [ + ((z = (A = (D = o.texture) == null ? void 0 : D.source) == null ? void 0 : A.data) == null ? void 0 : z.width) || 0, + ((T = (q = (P = o.texture) == null ? void 0 : P.source) == null ? void 0 : q.data) == null ? void 0 : T.height) || 0 + ]), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var cn = "#usf ", vn = `precision highp float; +var ln = "#usf ", cn = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -2565,91 +2527,81 @@ void main() { gl_FragColor = outColor; }`; -const mn = ({ +const vn = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, + uTexture: { value: C }, uResolution: { value: new a.Vector2(0, 0) }, - uBlurSize: { value: Ie.blurSize } + uBlurSize: { value: Fe.blurSize } }, - vertexShader: cn, - fragmentShader: vn + vertexShader: ln, + fragmentShader: cn }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, Ie = Object.freeze({ - texture: _, +}, Fe = Object.freeze({ + texture: C, blurSize: 3, blurPower: 5 -}), pr = ({ +}), vr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = mn({ scene: l, onBeforeInit: c }), g = q(e), x = b( + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = vn({ scene: l, onBeforeInit: u }), m = L(e), h = y( () => ({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r + dpr: c.fbo, + isSizeUpdate: r, + ...n }), - [ - l, - g, - e, - p.fbo, - n, - u, - r - ] - ), [v, s] = le(x), [d, o] = j(Ie), h = R(i), y = F(i), T = w( - (M, S) => { - o(M), y(S); + [l, m, e, c.fbo, r, n] + ), [x, o] = se(h), [g, s] = $(Fe), v = R(i), p = F(i), w = _( + (f, M) => { + s(f), p(M); }, - [o, y] + [s, p] ); return [ - w( - (M, S, C) => { - var U, V, O, P, G, X; - const { gl: D } = M; - T(S, C), h("uTexture", d.texture), h("uResolution", [ - ((O = (V = (U = d.texture) == null ? void 0 : U.source) == null ? void 0 : V.data) == null ? void 0 : O.width) || 0, - ((X = (G = (P = d.texture) == null ? void 0 : P.source) == null ? void 0 : G.data) == null ? void 0 : X.height) || 0 - ]), h("uBlurSize", d.blurSize); - let z = s(D); - for (let ee = 0; ee < d.blurPower; ee++) - h("uTexture", z), z = s(D); - return z; + _( + (f, M, S) => { + var z, P, q, T, k, K; + const { gl: D } = f; + w(M, S), v("uTexture", g.texture), v("uResolution", [ + ((q = (P = (z = g.texture) == null ? void 0 : z.source) == null ? void 0 : P.data) == null ? void 0 : q.width) || 0, + ((K = (k = (T = g.texture) == null ? void 0 : T.source) == null ? void 0 : k.data) == null ? void 0 : K.height) || 0 + ]), v("uBlurSize", g.blurSize); + let A = o(D); + for (let J = 0; J < g.blurPower; J++) + v("uTexture", A), A = o(D); + return A; }, - [s, h, d, T] + [o, v, g, w] ), - T, + w, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: v, - output: v.read.texture + camera: m, + renderTarget: x, + output: x.read.texture } ]; }; -var pn = "#usf ", dn = `precision highp float; +var mn = "#usf ", pn = `precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -2665,88 +2617,78 @@ void main() { vec4 mixed = mix(current,back,uStrength); gl_FragColor = mixed; }`; -const fn = ({ +const dn = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, - uBackbuffer: { value: _ }, - uBegin: { value: ge.begin }, - uEnd: { value: ge.end }, - uStrength: { value: ge.strength } + uTexture: { value: C }, + uBackbuffer: { value: C }, + uBegin: { value: fe.begin }, + uEnd: { value: fe.end }, + uStrength: { value: fe.strength } }, - vertexShader: pn, - fragmentShader: dn + vertexShader: mn, + fragmentShader: pn }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, ge = Object.freeze({ - texture: _, +}, fe = Object.freeze({ + texture: C, begin: new a.Vector2(0, 0), end: new a.Vector2(0, 0), strength: 0.9 -}), dr = ({ +}), mr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = fn({ scene: l, onBeforeInit: c }), g = q(e), x = b( + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = dn({ scene: l, onBeforeInit: u }), m = L(e), h = y( () => ({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r + dpr: c.fbo, + isSizeUpdate: r, + ...n }), - [ - l, - g, - e, - p.fbo, - n, - u, - r - ] - ), [v, s] = le(x), [d, o] = j(ge), h = R(i), y = F(i), T = w( - (M, S) => { - o(M), y(S); + [l, m, e, c.fbo, r, n] + ), [x, o] = se(h), [g, s] = $(fe), v = R(i), p = F(i), w = _( + (f, M) => { + s(f), p(M); }, - [o, y] + [s, p] ); return [ - w( - (M, S, C) => { - const { gl: D } = M; - return T(S, C), h("uTexture", d.texture), h("uBegin", d.begin), h("uEnd", d.end), h("uStrength", d.strength), s(D, ({ read: z }) => { - h("uBackbuffer", z); + _( + (f, M, S) => { + const { gl: D } = f; + return w(M, S), v("uTexture", g.texture), v("uBegin", g.begin), v("uEnd", g.end), v("uStrength", g.strength), o(D, ({ read: A }) => { + v("uBackbuffer", A); }); }, - [s, h, T, d] + [o, v, w, g] ), - T, + w, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: v, - output: v.read.texture + camera: m, + renderTarget: x, + output: x.read.texture } ]; }; -var gn = "#usf ", hn = `precision highp float; +var fn = "#usf ", gn = `precision highp float; varying vec2 vUv; uniform float uProgress; @@ -2796,79 +2738,77 @@ void main() { gl_FragColor = vec4(color, 1.0); }`; -const xn = ({ +const hn = ({ scene: e, onBeforeInit: t }) => { - const n = b(() => new a.PlaneGeometry(2, 2), []), r = b(() => new a.ShaderMaterial({ - ...A( + const n = y(() => new a.PlaneGeometry(2, 2), []), r = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uEpicenter: { value: pe.epicenter }, - uProgress: { value: pe.progress }, - uStrength: { value: pe.strength }, - uWidth: { value: pe.width }, + uEpicenter: { value: me.epicenter }, + uProgress: { value: me.progress }, + uStrength: { value: me.strength }, + uWidth: { value: me.width }, uMode: { value: 0 } }, - vertexShader: gn, - fragmentShader: hn + vertexShader: fn, + fragmentShader: gn }, t ), ...I - }), [t]), u = $(e, n, r, a.Mesh); + }), [t]), u = E(e, n, r, a.Mesh); return { material: r, mesh: u }; -}, pe = Object.freeze({ +}, me = Object.freeze({ epicenter: new a.Vector2(0, 0), progress: 0, width: 0, strength: 0, mode: "center" -}), fr = ({ +}), pr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = xn({ scene: l, onBeforeInit: c }), g = q(e), [x, v] = W({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = hn({ scene: l, onBeforeInit: u }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(pe), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(me), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("uEpicenter", s.epicenter), o("uProgress", s.progress), o("uWidth", s.width), o("uStrength", s.strength), o( + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("uEpicenter", o.epicenter), s("uProgress", o.progress), s("uWidth", o.width), s("uStrength", o.strength), s( "uMode", - s.mode === "center" ? 0 : s.mode === "horizontal" ? 1 : 2 - ), v(C); + o.mode === "center" ? 0 : o.mode === "horizontal" ? 1 : 2 + ), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var yn = "#usf ", bn = `precision highp float; +var xn = "#usf ", yn = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -2937,39 +2877,39 @@ void main() { gl_FragColor = finColor; }`; -const Mn = ({ +const bn = ({ scene: e, size: t, dpr: n, onBeforeInit: r }) => { - const u = b(() => new a.PlaneGeometry(2, 2), []), c = b(() => new a.ShaderMaterial({ - ...A( + const u = y(() => new a.PlaneGeometry(2, 2), []), c = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - u_texture: { value: _ }, + u_texture: { value: C }, u_resolution: { value: new a.Vector2() }, - u_keyColor: { value: Z.color }, - u_similarity: { value: Z.similarity }, - u_smoothness: { value: Z.smoothness }, - u_spill: { value: Z.spill }, - u_color: { value: Z.color }, - u_contrast: { value: Z.contrast }, - u_brightness: { value: Z.brightness }, - u_gamma: { value: Z.gamma } + u_keyColor: { value: Q.color }, + u_similarity: { value: Q.similarity }, + u_smoothness: { value: Q.smoothness }, + u_spill: { value: Q.spill }, + u_color: { value: Q.color }, + u_contrast: { value: Q.contrast }, + u_brightness: { value: Q.brightness }, + u_gamma: { value: Q.gamma } }, - vertexShader: yn, - fragmentShader: bn + vertexShader: xn, + fragmentShader: yn }, r ), ...I - }), [r]), p = Y(t, n); - R(c)("u_resolution", p.clone()); - const l = $(e, u, c, a.Mesh); - return { material: c, mesh: l }; -}, Z = Object.freeze({ - texture: _, + }), [r]), l = X(t, n); + R(c)("u_resolution", l.clone()); + const i = E(e, u, c, a.Mesh); + return { material: c, mesh: i }; +}, Q = Object.freeze({ + texture: C, keyColor: new a.Color(65280), similarity: 0.2, smoothness: 0.1, @@ -2978,53 +2918,51 @@ const Mn = ({ contrast: 1, brightness: 0, gamma: 1 -}), gr = ({ +}), dr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = Mn({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = bn({ scene: l, size: e, - dpr: p.shader, - onBeforeInit: c - }), g = q(e), [x, v] = W({ + dpr: c.shader, + onBeforeInit: u + }), m = L(e), [h, x] = j({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r - }), [s, d] = j(Z), o = R(i), h = F(i), y = w( - (f, M) => { - d(f), h(M); + dpr: c.fbo, + isSizeUpdate: r, + ...n + }), [o, g] = $(Q), s = R(i), v = F(i), p = _( + (b, f) => { + g(b), v(f); }, - [d, h] + [g, v] ); return [ - w( - (f, M, S) => { - const { gl: C } = f; - return y(M, S), o("u_texture", s.texture), o("u_keyColor", s.keyColor), o("u_similarity", s.similarity), o("u_smoothness", s.smoothness), o("u_spill", s.spill), o("u_color", s.color), o("u_contrast", s.contrast), o("u_brightness", s.brightness), o("u_gamma", s.gamma), v(C); + _( + (b, f, M) => { + const { gl: S } = b; + return p(f, M), s("u_texture", o.texture), s("u_keyColor", o.keyColor), s("u_similarity", o.similarity), s("u_smoothness", o.smoothness), s("u_spill", o.spill), s("u_color", o.color), s("u_contrast", o.contrast), s("u_brightness", o.brightness), s("u_gamma", o.gamma), x(S); }, - [v, o, s, y] + [x, s, o, p] ), - y, + p, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: x, - output: x.texture + camera: m, + renderTarget: h, + output: h.texture } ]; }; -var Sn = `precision highp float; +var Mn = `precision highp float; varying vec2 vUv; #usf @@ -3038,7 +2976,7 @@ void main() { #usf
gl_Position = usf_Position; -}`, Cn = `precision highp float; +}`, Sn = `precision highp float; varying vec2 vUv; #usf @@ -3058,107 +2996,97 @@ void main() { gl_FragColor = usf_FragColor; }`; -const _n = ({ +const Cn = ({ scene: e, size: t, dpr: n, onBeforeInit: r }) => { - const u = b(() => new a.PlaneGeometry(2, 2), []), c = b(() => new a.ShaderMaterial({ - ...A( + const u = y(() => new a.PlaneGeometry(2, 2), []), c = y(() => new a.ShaderMaterial({ + ...V( { uniforms: { - uTexture: { value: _ }, - uBackbuffer: { value: _ }, + uTexture: { value: C }, + uBackbuffer: { value: C }, uTime: { value: 0 }, uPointer: { value: new a.Vector2() }, uResolution: { value: new a.Vector2() } }, - vertexShader: Sn, - fragmentShader: Cn + vertexShader: Mn, + fragmentShader: Sn }, r ), ...I - }), [r]), p = Y(t, n); - R(c)("uResolution", p.clone()); - const l = $(e, u, c, a.Mesh); - return { material: c, mesh: l }; -}, wn = Object.freeze({ - texture: _, + }), [r]), l = X(t, n); + R(c)("uResolution", l.clone()); + const i = E(e, u, c, a.Mesh); + return { material: c, mesh: i }; +}, _n = Object.freeze({ + texture: C, beat: !1 -}), hr = ({ +}), fr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - onBeforeInit: c + renderTargetOptions: n, + isSizeUpdate: r, + onBeforeInit: u }) => { - const p = B(t), l = b(() => new a.Scene(), []), { material: i, mesh: m } = _n({ + const c = U(t), l = y(() => new a.Scene(), []), { material: i, mesh: d } = Cn({ scene: l, size: e, - dpr: p.shader, - onBeforeInit: c - }), g = q(e), x = b( + dpr: c.shader, + onBeforeInit: u + }), m = L(e), h = y( () => ({ scene: l, - camera: g, + camera: m, size: e, - dpr: p.fbo, - samples: n, - isSizeUpdate: u, - ...r + dpr: c.fbo, + isSizeUpdate: r, + ...n }), - [ - l, - g, - e, - p.fbo, - n, - u, - r - ] - ), [v, s] = le(x), [d, o] = j(wn), h = R(i), y = F(i), T = w( - (M, S) => { - o(M), y(S); + [l, m, e, c.fbo, r, n] + ), [x, o] = se(h), [g, s] = $(_n), v = R(i), p = F(i), w = _( + (f, M) => { + s(f), p(M); }, - [o, y] + [s, p] ); return [ - w( - (M, S, C) => { - const { gl: D, clock: z, pointer: U } = M; - return T(S, C), h("uPointer", U), h("uTexture", d.texture), h("uTime", d.beat || z.getElapsedTime()), s(D, ({ read: V }) => { - h("uBackbuffer", V); + _( + (f, M, S) => { + const { gl: D, clock: A, pointer: z } = f; + return w(M, S), v("uPointer", z), v("uTexture", g.texture), v("uTime", g.beat || A.getElapsedTime()), o(D, ({ read: P }) => { + v("uBackbuffer", P); }); }, - [s, h, d, T] + [o, v, g, w] ), - T, + w, { scene: l, - mesh: m, + mesh: d, material: i, - camera: g, - renderTarget: v, - output: v.read.texture + camera: m, + renderTarget: x, + output: x.read.texture } ]; -}, Tn = ({ +}, wn = ({ scene: e, geometry: t, material: n }) => { - const r = $( + const r = E( e, t, n, a.Points - ), u = $( + ), u = E( e, - b(() => t.clone(), [t]), - b(() => n.clone(), [n]), + y(() => t.clone(), [t]), + y(() => n.clone(), [n]), a.Mesh ); return u.visible = !1, { @@ -3166,7 +3094,7 @@ const _n = ({ interactiveMesh: u }; }; -var Dn = `uniform vec2 uResolution; +var Tn = `uniform vec2 uResolution; uniform float uMorphProgress; uniform float uPointSize; @@ -3269,7 +3197,7 @@ void main() { vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; -}`, Pn = `precision highp float; +}`, Dn = `precision highp float; precision highp int; varying vec3 vColor; @@ -3312,9 +3240,9 @@ void main() { gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); }`; -const De = (e, t, n, r, u) => { - var g; - const c = n === "position" ? "positionTarget" : "uvTarget", p = n === "position" ? "#usf " : "#usf ", l = n === "position" ? "#usf " : "#usf ", i = n === "position" ? "positionsList" : "uvsList", m = n === "position" ? ` +const Te = (e, t, n, r, u) => { + var h; + const c = n === "position" ? "positionTarget" : "uvTarget", l = n === "position" ? "#usf " : "#usf ", i = n === "position" ? "#usf " : "#usf ", d = n === "position" ? "positionsList" : "uvsList", m = n === "position" ? ` float scaledProgress = uMorphProgress * ${e.length - 1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length - 1}); @@ -3327,28 +3255,28 @@ const De = (e, t, n, r, u) => { n, new a.BufferAttribute(e[0], u) ); - let x = "", v = ""; - e.forEach((s, d) => { + let x = "", o = ""; + e.forEach((g, s) => { t.setAttribute( - `${c}${d}`, - new a.BufferAttribute(s, u) - ), x += `attribute vec${u} ${c}${d}; -`, d === 0 ? v += `${c}${d}` : v += `,${c}${d}`; + `${c}${s}`, + new a.BufferAttribute(g, u) + ), x += `attribute vec${u} ${c}${s}; +`, s === 0 ? o += `${c}${s}` : o += `,${c}${s}`; }), r = r.replace( - `${p}`, + `${l}`, x ), r = r.replace( - `${l}`, - `vec${u} ${i}[${e.length}] = vec${u}[](${v}); + `${i}`, + `vec${u} ${d}[${e.length}] = vec${u}[](${o}); ${m} ` ); } else - r = r.replace(`${p}`, ""), r = r.replace(`${l}`, ""), (g = t == null ? void 0 : t.attributes[n]) != null && g.array || Ve && console.error( + r = r.replace(`${l}`, ""), r = r.replace(`${i}`, ""), (h = t == null ? void 0 : t.attributes[n]) != null && h.array || Re && console.error( `use-shader-fx:geometry.attributes.${n}.array is not found` ); return r; -}, Pe = (e, t, n, r) => { +}, De = (e, t, n, r) => { var c; let u = []; if (e && e.length > 0) { @@ -3356,131 +3284,131 @@ const De = (e, t, n, r, u) => { t.attributes[n].array, ...e ] : u = e; - const p = Math.max(...u.map((l) => l.length)); - u.forEach((l, i) => { - if (l.length < p) { - const m = (p - l.length) / r, g = [], x = Array.from(l); - for (let v = 0; v < m; v++) { - const s = Math.floor(l.length / r * Math.random()) * r; - for (let d = 0; d < r; d++) - g.push(x[s + d]); + const l = Math.max(...u.map((i) => i.length)); + u.forEach((i, d) => { + if (i.length < l) { + const m = (l - i.length) / r, h = [], x = Array.from(i); + for (let o = 0; o < m; o++) { + const g = Math.floor(i.length / r * Math.random()) * r; + for (let s = 0; s < r; s++) + h.push(x[g + s]); } - u[i] = new Float32Array([...x, ...g]); + u[d] = new Float32Array([...x, ...h]); } }); } return u; -}, Rn = (e, t) => { +}, Pn = (e, t) => { let n = ""; const r = {}; let u = "mapArrayColor = "; - return e && e.length > 0 ? (e.forEach((p, l) => { - const i = `vMapArrayIndex < ${l}.1`, m = `texture2D(uMapArray${l}, uv)`; - u += `( ${i} ) ? ${m} : `, n += ` - uniform sampler2D uMapArray${l}; - `, r[`uMapArray${l}`] = { value: p }; + return e && e.length > 0 ? (e.forEach((l, i) => { + const d = `vMapArrayIndex < ${i}.1`, m = `texture2D(uMapArray${i}, uv)`; + u += `( ${d} ) ? ${m} : `, n += ` + uniform sampler2D uMapArray${i}; + `, r[`uMapArray${i}`] = { value: l }; }), u += "vec4(1.);", n += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (u += "vec4(1.0);", n += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: t.replace("#usf ", u).replace("#usf ", n), mapArrayUniforms: r }; -}, Vn = ({ +}, Rn = ({ size: e, dpr: t, geometry: n, positions: r, uvs: u, mapArray: c, - onBeforeInit: p + onBeforeInit: l }) => { - const l = b( - () => Pe(r, n, "position", 3), + const i = y( + () => De(r, n, "position", 3), [r, n] - ), i = b( - () => Pe(u, n, "uv", 2), + ), d = y( + () => De(u, n, "uv", 2), [u, n] - ), m = b(() => { - l.length !== i.length && Ve && console.log("use-shader-fx:positions and uvs are not matched"); - const x = De( - i, + ), m = y(() => { + i.length !== d.length && Re && console.log("use-shader-fx:positions and uvs are not matched"); + const x = Te( + d, n, "uv", - De( - l, + Te( + i, n, "position", - Dn, + Tn, 3 ), 2 - ), { rewritedFragmentShader: v, mapArrayUniforms: s } = Rn(c, Pn); + ), { rewritedFragmentShader: o, mapArrayUniforms: g } = Pn(c, Dn); return new a.ShaderMaterial({ - ...A( + ...V( { uniforms: { uResolution: { value: new a.Vector2(0, 0) }, uMorphProgress: { - value: E.morphProgress + value: O.morphProgress }, - uBlurAlpha: { value: E.blurAlpha }, - uBlurRadius: { value: E.blurRadius }, - uPointSize: { value: E.pointSize }, - uPointAlpha: { value: E.pointAlpha }, - uPicture: { value: _ }, + uBlurAlpha: { value: O.blurAlpha }, + uBlurRadius: { value: O.blurRadius }, + uPointSize: { value: O.pointSize }, + uPointAlpha: { value: O.pointAlpha }, + uPicture: { value: C }, uIsPicture: { value: !1 }, - uAlphaPicture: { value: _ }, + uAlphaPicture: { value: C }, uIsAlphaPicture: { value: !1 }, - uColor0: { value: E.color0 }, - uColor1: { value: E.color1 }, - uColor2: { value: E.color2 }, - uColor3: { value: E.color3 }, - uMap: { value: _ }, + uColor0: { value: O.color0 }, + uColor1: { value: O.color1 }, + uColor2: { value: O.color2 }, + uColor3: { value: O.color3 }, + uMap: { value: C }, uIsMap: { value: !1 }, - uAlphaMap: { value: _ }, + uAlphaMap: { value: C }, uIsAlphaMap: { value: !1 }, uTime: { value: 0 }, uWobblePositionFrequency: { - value: E.wobblePositionFrequency + value: O.wobblePositionFrequency }, uWobbleTimeFrequency: { - value: E.wobbleTimeFrequency + value: O.wobbleTimeFrequency }, uWobbleStrength: { - value: E.wobbleStrength + value: O.wobbleStrength }, uWarpPositionFrequency: { - value: E.warpPositionFrequency + value: O.warpPositionFrequency }, uWarpTimeFrequency: { - value: E.warpTimeFrequency + value: O.warpTimeFrequency }, - uWarpStrength: { value: E.warpStrength }, - uDisplacement: { value: _ }, + uWarpStrength: { value: O.warpStrength }, + uDisplacement: { value: C }, uIsDisplacement: { value: !1 }, uDisplacementIntensity: { - value: E.displacementIntensity + value: O.displacementIntensity }, uDisplacementColorIntensity: { - value: E.displacementColorIntensity + value: O.displacementColorIntensity }, uSizeRandomIntensity: { - value: E.sizeRandomIntensity + value: O.sizeRandomIntensity }, uSizeRandomTimeFrequency: { - value: E.sizeRandomTimeFrequency + value: O.sizeRandomTimeFrequency }, uSizeRandomMin: { - value: E.sizeRandomMin + value: O.sizeRandomMin }, uSizeRandomMax: { - value: E.sizeRandomMax + value: O.sizeRandomMax }, - uDivergence: { value: E.divergence }, + uDivergence: { value: O.divergence }, uDivergencePoint: { - value: E.divergencePoint + value: O.divergencePoint }, - ...s + ...g }, vertexShader: x, - fragmentShader: v + fragmentShader: o }, - p + l ), ...I, blending: a.AdditiveBlending, @@ -3489,65 +3417,65 @@ const De = (e, t, n, r, u) => { }); }, [ n, - l, i, + d, c, - p - ]), g = Y(e, t); - return R(m)("uResolution", g.clone()), { material: m, modifiedPositions: l, modifiedUvs: i }; -}, An = ({ + l + ]), h = X(e, t); + return R(m)("uResolution", h.clone()), { material: m, modifiedPositions: i, modifiedUvs: d }; +}, Vn = ({ size: e, dpr: t, scene: n = !1, geometry: r, positions: u, uvs: c, - mapArray: p, - onBeforeInit: l + mapArray: l, + onBeforeInit: i }) => { - const i = B(t), m = b(() => { - const T = r || new a.SphereGeometry(1, 32, 32); - return T.setIndex(null), T.deleteAttribute("normal"), T; - }, [r]), { material: g, modifiedPositions: x, modifiedUvs: v } = Vn({ + const d = U(t), m = y(() => { + const b = r || new a.SphereGeometry(1, 32, 32); + return b.setIndex(null), b.deleteAttribute("normal"), b; + }, [r]), { material: h, modifiedPositions: x, modifiedUvs: o } = Rn({ size: e, - dpr: i.shader, + dpr: d.shader, geometry: m, positions: u, uvs: c, - mapArray: p, - onBeforeInit: l - }), { points: s, interactiveMesh: d } = Tn({ + mapArray: l, + onBeforeInit: i + }), { points: g, interactiveMesh: s } = wn({ scene: n, geometry: m, - material: g - }), o = R(g), h = F(g); + material: h + }), v = R(h), p = F(h); return [ - w( - (T, f, M) => { - T && o( + _( + (b, f, M) => { + b && v( "uTime", - (f == null ? void 0 : f.beat) || T.clock.getElapsedTime() - ), f !== void 0 && (o("uMorphProgress", f.morphProgress), o("uBlurAlpha", f.blurAlpha), o("uBlurRadius", f.blurRadius), o("uPointSize", f.pointSize), o("uPointAlpha", f.pointAlpha), f.picture ? (o("uPicture", f.picture), o("uIsPicture", !0)) : f.picture === !1 && o("uIsPicture", !1), f.alphaPicture ? (o("uAlphaPicture", f.alphaPicture), o("uIsAlphaPicture", !0)) : f.alphaPicture === !1 && o("uIsAlphaPicture", !1), o("uColor0", f.color0), o("uColor1", f.color1), o("uColor2", f.color2), o("uColor3", f.color3), f.map ? (o("uMap", f.map), o("uIsMap", !0)) : f.map === !1 && o("uIsMap", !1), f.alphaMap ? (o("uAlphaMap", f.alphaMap), o("uIsAlphaMap", !0)) : f.alphaMap === !1 && o("uIsAlphaMap", !1), o("uWobbleStrength", f.wobbleStrength), o( + (f == null ? void 0 : f.beat) || b.clock.getElapsedTime() + ), f !== void 0 && (v("uMorphProgress", f.morphProgress), v("uBlurAlpha", f.blurAlpha), v("uBlurRadius", f.blurRadius), v("uPointSize", f.pointSize), v("uPointAlpha", f.pointAlpha), f.picture ? (v("uPicture", f.picture), v("uIsPicture", !0)) : f.picture === !1 && v("uIsPicture", !1), f.alphaPicture ? (v("uAlphaPicture", f.alphaPicture), v("uIsAlphaPicture", !0)) : f.alphaPicture === !1 && v("uIsAlphaPicture", !1), v("uColor0", f.color0), v("uColor1", f.color1), v("uColor2", f.color2), v("uColor3", f.color3), f.map ? (v("uMap", f.map), v("uIsMap", !0)) : f.map === !1 && v("uIsMap", !1), f.alphaMap ? (v("uAlphaMap", f.alphaMap), v("uIsAlphaMap", !0)) : f.alphaMap === !1 && v("uIsAlphaMap", !1), v("uWobbleStrength", f.wobbleStrength), v( "uWobblePositionFrequency", f.wobblePositionFrequency - ), o("uWobbleTimeFrequency", f.wobbleTimeFrequency), o("uWarpStrength", f.warpStrength), o("uWarpPositionFrequency", f.warpPositionFrequency), o("uWarpTimeFrequency", f.warpTimeFrequency), f.displacement ? (o("uDisplacement", f.displacement), o("uIsDisplacement", !0)) : f.displacement === !1 && o("uIsDisplacement", !1), o("uDisplacementIntensity", f.displacementIntensity), o( + ), v("uWobbleTimeFrequency", f.wobbleTimeFrequency), v("uWarpStrength", f.warpStrength), v("uWarpPositionFrequency", f.warpPositionFrequency), v("uWarpTimeFrequency", f.warpTimeFrequency), f.displacement ? (v("uDisplacement", f.displacement), v("uIsDisplacement", !0)) : f.displacement === !1 && v("uIsDisplacement", !1), v("uDisplacementIntensity", f.displacementIntensity), v( "uDisplacementColorIntensity", f.displacementColorIntensity - ), o("uSizeRandomIntensity", f.sizeRandomIntensity), o( + ), v("uSizeRandomIntensity", f.sizeRandomIntensity), v( "uSizeRandomTimeFrequency", f.sizeRandomTimeFrequency - ), o("uSizeRandomMin", f.sizeRandomMin), o("uSizeRandomMax", f.sizeRandomMax), o("uDivergence", f.divergence), o("uDivergencePoint", f.divergencePoint), h(M)); + ), v("uSizeRandomMin", f.sizeRandomMin), v("uSizeRandomMax", f.sizeRandomMax), v("uDivergence", f.divergence), v("uDivergencePoint", f.divergencePoint), p(M)); }, - [o, h] + [v, p] ), { - points: s, - interactiveMesh: d, + points: g, + interactiveMesh: s, positions: x, - uvs: v + uvs: o } ]; -}, E = Object.freeze({ +}, O = Object.freeze({ morphProgress: 0, blurAlpha: 0.9, blurRadius: 0.05, @@ -3577,66 +3505,64 @@ const De = (e, t, n, r, u) => { divergence: 0, divergencePoint: new a.Vector3(0), beat: !1 -}), xr = ({ +}), gr = ({ size: e, dpr: t, - samples: n, - isSizeUpdate: r, - renderTargetOptions: u, - camera: c, - geometry: p, + isSizeUpdate: n, + renderTargetOptions: r, + camera: u, + geometry: c, positions: l, uvs: i, - onBeforeInit: m + onBeforeInit: d }) => { - const g = B(t), x = b(() => new a.Scene(), []), [ - v, + const m = U(t), h = y(() => new a.Scene(), []), [ + x, { - points: s, - interactiveMesh: d, - positions: o, - uvs: h + points: o, + interactiveMesh: g, + positions: s, + uvs: v } - ] = An({ - scene: x, + ] = Vn({ + scene: h, size: e, dpr: t, - geometry: p, + geometry: c, positions: l, uvs: i, - onBeforeInit: m - }), [y, T] = W({ - scene: x, - camera: c, + onBeforeInit: d + }), [p, w] = j({ + scene: h, + camera: u, size: e, - dpr: g.fbo, - samples: n, - isSizeUpdate: r, + dpr: m.fbo, + isSizeUpdate: n, depthBuffer: !0, - ...u - }), f = w( - (S, C, D) => (v(S, C, D), T(S.gl)), - [T, v] - ), M = w( - (S, C) => { - v(null, S, C); + ...r + }), b = _( + (M, S, D) => (x(M, S, D), w(M.gl)), + [w, x] + ), f = _( + (M, S) => { + x(null, M, S); }, - [v] + [x] ); return [ + b, f, - M, { - scene: x, - points: s, - interactiveMesh: d, - renderTarget: y, - output: y.texture, - positions: o, - uvs: h + scene: h, + points: o, + interactiveMesh: g, + renderTarget: p, + output: p.texture, + positions: s, + uvs: v } ]; -}, Re = (e) => { +}, Pe = (e) => { e.vertexShader = e.vertexShader.replace( "void main() {", ` @@ -3708,7 +3634,7 @@ const De = (e, t, n, r, u) => { vEdgeViewPosition = normalize(viewPosition.xyz); ` ); -}, Fn = (e) => { +}, An = (e) => { e.fragmentShader = e.fragmentShader.replace( "#include ", ` @@ -3760,7 +3686,7 @@ const De = (e, t, n, r, u) => { ` ); }; -var In = `#ifdef USE_TRANSMISSION +var Fn = `#ifdef USE_TRANSMISSION @@ -3958,7 +3884,7 @@ var In = `#ifdef USE_TRANSMISSION return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`, zn = `#ifdef USE_TRANSMISSION +#endif`, In = `#ifdef USE_TRANSMISSION material.transmission = _transmission; material.transmissionAlpha = 1.0; @@ -4030,17 +3956,17 @@ transmission /= uRefractionSamples; totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); #endif`; -const Un = ({ +const zn = ({ mat: e, isCustomTransmission: t, parameters: n }) => { e.type === "MeshPhysicalMaterial" && t && (n.fragmentShader = n.fragmentShader.replace( "#include ", - `${In}` + `${Fn}` ), n.fragmentShader = n.fragmentShader.replace( "#include ", - `${zn}` + `${In}` )), e.normalMap || (n.vertexShader = n.vertexShader.replace( "void main() {", ` @@ -4049,74 +3975,74 @@ const Un = ({ void main() { ` )); -}, On = ({ +}, Un = ({ baseMaterial: e, materialParameters: t, isCustomTransmission: n = !1, onBeforeInit: r, depthOnBeforeInit: u }) => { - const { material: c, depthMaterial: p } = b(() => { - const l = new (e || a.MeshPhysicalMaterial)( + const { material: c, depthMaterial: l } = y(() => { + const i = new (e || a.MeshPhysicalMaterial)( t || {} ); - Object.assign(l.userData, { + Object.assign(i.userData, { uniforms: { uTime: { value: 0 }, uWobblePositionFrequency: { - value: N.wobblePositionFrequency + value: W.wobblePositionFrequency }, uWobbleTimeFrequency: { - value: N.wobbleTimeFrequency + value: W.wobbleTimeFrequency }, - uWobbleStrength: { value: N.wobbleStrength }, + uWobbleStrength: { value: W.wobbleStrength }, uWarpPositionFrequency: { - value: N.warpPositionFrequency + value: W.warpPositionFrequency }, - uWarpTimeFrequency: { value: N.warpTimeFrequency }, - uWarpStrength: { value: N.warpStrength }, - uColor0: { value: N.color0 }, - uColor1: { value: N.color1 }, - uColor2: { value: N.color2 }, - uColor3: { value: N.color3 }, - uColorMix: { value: N.colorMix }, - uEdgeThreshold: { value: N.edgeThreshold }, - uEdgeColor: { value: N.edgeColor }, + uWarpTimeFrequency: { value: W.warpTimeFrequency }, + uWarpStrength: { value: W.warpStrength }, + uColor0: { value: W.color0 }, + uColor1: { value: W.color1 }, + uColor2: { value: W.color2 }, + uColor3: { value: W.color3 }, + uColorMix: { value: W.colorMix }, + uEdgeThreshold: { value: W.edgeThreshold }, + uEdgeColor: { value: W.edgeColor }, uChromaticAberration: { - value: N.chromaticAberration + value: W.chromaticAberration }, - uAnisotropicBlur: { value: N.anisotropicBlur }, - uDistortion: { value: N.distortion }, - uDistortionScale: { value: N.distortionScale }, - uTemporalDistortion: { value: N.temporalDistortion }, - uRefractionSamples: { value: N.refractionSamples }, + uAnisotropicBlur: { value: W.anisotropicBlur }, + uDistortion: { value: W.distortion }, + uDistortionScale: { value: W.distortionScale }, + uTemporalDistortion: { value: W.temporalDistortion }, + uRefractionSamples: { value: W.refractionSamples }, transmission: { value: 0 }, _transmission: { value: 1 }, transmissionMap: { value: null } } - }), l.onBeforeCompile = (m) => { - Re(m), Fn(m), Un({ + }), i.onBeforeCompile = (m) => { + Pe(m), An(m), zn({ parameters: m, - mat: l, + mat: i, isCustomTransmission: n }); - const g = A( + const h = V( { fragmentShader: m.fragmentShader, vertexShader: m.vertexShader, // Because wobble3D uses userData to update uniforms. - uniforms: l.userData.uniforms + uniforms: i.userData.uniforms }, r ); - m.fragmentShader = g.fragmentShader, m.vertexShader = g.vertexShader, Object.assign(m.uniforms, g.uniforms); - }, l.needsUpdate = !0; - const i = new a.MeshDepthMaterial({ + m.fragmentShader = h.fragmentShader, m.vertexShader = h.vertexShader, Object.assign(m.uniforms, h.uniforms); + }, i.needsUpdate = !0; + const d = new a.MeshDepthMaterial({ depthPacking: a.RGBADepthPacking }); - return i.onBeforeCompile = (m) => { - Object.assign(m.uniforms, l.userData.uniforms), Re(m), A(m, u); - }, i.needsUpdate = !0, { material: l, depthMaterial: i }; + return d.onBeforeCompile = (m) => { + Object.assign(m.uniforms, i.userData.uniforms), Pe(m), V(m, u); + }, d.needsUpdate = !0, { material: i, depthMaterial: d }; }, [ t, e, @@ -4126,46 +4052,46 @@ const Un = ({ ]); return { material: c, - depthMaterial: p + depthMaterial: l }; -}, Bn = ({ +}, On = ({ scene: e = !1, geometry: t, isCustomTransmission: n, baseMaterial: r, materialParameters: u, onBeforeInit: c, - depthOnBeforeInit: p + depthOnBeforeInit: l }) => { - const l = b(() => { - let o = t || new a.IcosahedronGeometry(2, 20); - return o = Le(o), o.computeTangents(), o; - }, [t]), { material: i, depthMaterial: m } = On({ + const i = y(() => { + let v = t || new a.IcosahedronGeometry(2, 20); + return v = Ee(v), v.computeTangents(), v; + }, [t]), { material: d, depthMaterial: m } = Un({ baseMaterial: r, materialParameters: u, isCustomTransmission: n, onBeforeInit: c, - depthOnBeforeInit: p - }), g = $(e, l, i, a.Mesh), x = i.userData, v = R(x), s = F(x); + depthOnBeforeInit: l + }), h = E(e, i, d, a.Mesh), x = d.userData, o = R(x), g = F(x); return [ - w( - (o, h, y) => { - o && v( + _( + (v, p, w) => { + v && o( "uTime", - (h == null ? void 0 : h.beat) || o.clock.getElapsedTime() - ), h !== void 0 && (v("uWobbleStrength", h.wobbleStrength), v( + (p == null ? void 0 : p.beat) || v.clock.getElapsedTime() + ), p !== void 0 && (o("uWobbleStrength", p.wobbleStrength), o( "uWobblePositionFrequency", - h.wobblePositionFrequency - ), v("uWobbleTimeFrequency", h.wobbleTimeFrequency), v("uWarpStrength", h.warpStrength), v("uWarpPositionFrequency", h.warpPositionFrequency), v("uWarpTimeFrequency", h.warpTimeFrequency), v("uColor0", h.color0), v("uColor1", h.color1), v("uColor2", h.color2), v("uColor3", h.color3), v("uColorMix", h.colorMix), v("uEdgeThreshold", h.edgeThreshold), v("uEdgeColor", h.edgeColor), v("uChromaticAberration", h.chromaticAberration), v("uAnisotropicBlur", h.anisotropicBlur), v("uDistortion", h.distortion), v("uDistortionScale", h.distortionScale), v("uRefractionSamples", h.refractionSamples), v("uTemporalDistortion", h.temporalDistortion), s(y)); + p.wobblePositionFrequency + ), o("uWobbleTimeFrequency", p.wobbleTimeFrequency), o("uWarpStrength", p.warpStrength), o("uWarpPositionFrequency", p.warpPositionFrequency), o("uWarpTimeFrequency", p.warpTimeFrequency), o("uColor0", p.color0), o("uColor1", p.color1), o("uColor2", p.color2), o("uColor3", p.color3), o("uColorMix", p.colorMix), o("uEdgeThreshold", p.edgeThreshold), o("uEdgeColor", p.edgeColor), o("uChromaticAberration", p.chromaticAberration), o("uAnisotropicBlur", p.anisotropicBlur), o("uDistortion", p.distortion), o("uDistortionScale", p.distortionScale), o("uRefractionSamples", p.refractionSamples), o("uTemporalDistortion", p.temporalDistortion), g(w)); }, - [v, s] + [o, g] ), { - mesh: g, + mesh: h, depthMaterial: m } ]; -}, N = Object.freeze({ +}, W = Object.freeze({ wobbleStrength: 0.3, wobblePositionFrequency: 0.3, wobbleTimeFrequency: 0.3, @@ -4186,90 +4112,84 @@ const Un = ({ temporalDistortion: 0, refractionSamples: 6, beat: !1 -}), yr = ({ +}), hr = ({ size: e, dpr: t, - samples: n, - renderTargetOptions: r, - isSizeUpdate: u, - camera: c, - geometry: p, + renderTargetOptions: n, + isSizeUpdate: r, + camera: u, + geometry: c, baseMaterial: l, materialParameters: i, - isCustomTransmission: m, - onBeforeInit: g, - depthOnBeforeInit: x + isCustomTransmission: d, + onBeforeInit: m, + depthOnBeforeInit: h }) => { - const v = B(t), s = b(() => new a.Scene(), []), [d, { mesh: o, depthMaterial: h }] = Bn({ + const x = U(t), o = y(() => new a.Scene(), []), [g, { mesh: s, depthMaterial: v }] = On({ baseMaterial: l, materialParameters: i, - scene: s, - geometry: p, - isCustomTransmission: m, - onBeforeInit: g, - depthOnBeforeInit: x - }), [y, T] = W({ - scene: s, - camera: c, + scene: o, + geometry: c, + isCustomTransmission: d, + onBeforeInit: m, + depthOnBeforeInit: h + }), [p, w] = j({ + scene: o, + camera: u, size: e, - dpr: v.fbo, - samples: n, - isSizeUpdate: u, + dpr: x.fbo, + isSizeUpdate: r, depthBuffer: !0, - ...r - }), f = w( - (S, C, D) => (d(S, C, D), T(S.gl)), - [T, d] - ), M = w( - (S, C) => { - d(null, S, C); + ...n + }), b = _( + (M, S, D) => (g(M, S, D), w(M.gl)), + [w, g] + ), f = _( + (M, S) => { + g(null, M, S); }, - [d] + [g] ); return [ + b, f, - M, { - scene: s, - mesh: o, - depthMaterial: h, - renderTarget: y, - output: y.texture + scene: o, + mesh: s, + depthMaterial: v, + renderTarget: p, + output: p.texture } ]; -}, br = (e, t, n) => { - const r = b(() => { +}, xr = (e, t, n) => { + const r = y(() => { const u = new a.Mesh(t, n); return e.add(u), u; }, [t, n, e]); - return ie(() => () => { + return ae(() => () => { e.remove(r), t.dispose(), n.dispose(); }, [e, t, n, r]), r; -}, En = (e, t, n, r, u, c) => { - const p = e < n - u || t < r - u, l = e > n + u || t > r + u; - return c === "smaller" && p || c === "larger" && l || c === "both" && (p || l); -}, Mr = ({ - gl: e, - size: t, - boundFor: n, - threshold: r +}, Bn = (e, t, n, r, u, c) => { + const l = e < n - u || t < r - u, i = e > n + u || t > r + u; + return c === "smaller" && l || c === "larger" && i || c === "both" && (l || i); +}, yr = ({ + size: e, + boundFor: t, + threshold: n }) => { - const u = L(t); - return b(() => { - const { width: p, height: l } = t, { width: i, height: m } = u.current, g = En( - p, + const r = B(e); + return y(() => { + const { width: c, height: l } = e, { width: i, height: d } = r.current, m = Bn( + c, l, i, - m, - r, - n - ), x = Yn.getMaxDpr(e, t); - return g && (u.current = t), { - maxDpr: x, - isUpdate: g - }; - }, [t, e, n, r]); -}, he = Object.freeze({ + d, + n, + t + ); + return m && (r.current = e), m; + }, [e, t, n]); +}, ge = Object.freeze({ easeInSine(e) { return 1 - Math.cos(e * Math.PI / 2); }, @@ -4356,56 +4276,56 @@ const Un = ({ return e === 0 ? 0 : e === 1 ? 1 : e < 0.5 ? -(Math.pow(2, 20 * e - 10) * Math.sin((20 * e - 11.125) * t)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * t) / 2 + 1; }, easeInBounce(e) { - return 1 - he.easeOutBounce(1 - e); + return 1 - ge.easeOutBounce(1 - e); }, easeOutBounce(e) { return e < 1 / 2.75 ? 7.5625 * e * e : e < 2 / 2.75 ? 7.5625 * (e -= 1.5 / 2.75) * e + 0.75 : e < 2.5 / 2.75 ? 7.5625 * (e -= 2.25 / 2.75) * e + 0.9375 : 7.5625 * (e -= 2.625 / 2.75) * e + 0.984375; }, easeInOutBounce(e) { - return e < 0.5 ? (1 - he.easeOutBounce(1 - 2 * e)) / 2 : (1 + he.easeOutBounce(2 * e - 1)) / 2; + return e < 0.5 ? (1 - ge.easeOutBounce(1 - 2 * e)) / 2 : (1 + ge.easeOutBounce(2 * e - 1)) / 2; } }); -function Ln(e) { +function En(e) { let t = Math.sin(e * 12.9898) * 43758.5453; return t - Math.floor(t); } -const Sr = (e, t = "easeOutQuart") => { - const n = e / 60, r = he[t]; - return w( +const br = (e, t = "easeOutQuart") => { + const n = e / 60, r = ge[t]; + return _( (c) => { - let p = c.getElapsedTime() * n; - const l = Math.floor(p), i = r(p - l); - p = i + l; - const m = Ln(l); + let l = c.getElapsedTime() * n; + const i = Math.floor(l), d = r(l - i); + l = d + i; + const m = En(i); return { - beat: p, - floor: l, - fract: i, + beat: l, + floor: i, + fract: d, hash: m }; }, [n, r] ); -}, Cr = (e = 60) => { - const t = b(() => 1 / Math.max(Math.min(e, 60), 1), [e]), n = L(null); - return w( +}, Mr = (e = 60) => { + const t = y(() => 1 / Math.max(Math.min(e, 60), 1), [e]), n = B(null); + return _( (u) => { const c = u.getElapsedTime(); return n.current === null || c - n.current >= t ? (n.current = c, !0) : !1; }, [t] ); -}, $n = (e) => { +}, Ln = (e) => { var r, u; const t = (r = e.dom) == null ? void 0 : r.length, n = (u = e.texture) == null ? void 0 : u.length; return !t || !n || t !== n; }; -var qn = `varying vec2 vUv; +var $n = `varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`, jn = `precision highp float; +}`, qn = `precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -4449,7 +4369,7 @@ void main() { gl_FragColor = vec4(textureColor, alpha); }`; -const Wn = ({ +const jn = ({ params: e, scene: t, onBeforeInit: n @@ -4458,7 +4378,7 @@ const Wn = ({ r instanceof a.Mesh && (r.geometry.dispose(), r.material.dispose()); }), t.remove(...t.children)), e.texture.forEach((r, u) => { const c = new a.ShaderMaterial({ - ...A( + ...V( { uniforms: { u_texture: { value: r }, @@ -4470,68 +4390,68 @@ const Wn = ({ value: e.boderRadius[u] ? e.boderRadius[u] : 0 } }, - vertexShader: qn, - fragmentShader: jn + vertexShader: $n, + fragmentShader: qn }, n ), ...I, // Must be transparent. transparent: !0 - }), p = new a.Mesh(new a.PlaneGeometry(1, 1), c); - t.add(p); + }), l = new a.Mesh(new a.PlaneGeometry(1, 1), c); + t.add(l); }); -}, Nn = () => { - const e = L([]), t = L([]); - return w( +}, Wn = () => { + const e = B([]), t = B([]); + return _( ({ isIntersectingRef: r, isIntersectingOnceRef: u, params: c }) => { - e.current.length > 0 && e.current.forEach((l, i) => { - l.unobserve(t.current[i]); + e.current.length > 0 && e.current.forEach((i, d) => { + i.unobserve(t.current[d]); }), t.current = [], e.current = []; - const p = new Array(c.dom.length).fill(!1); - r.current = [...p], u.current = [...p], c.dom.forEach((l, i) => { + const l = new Array(c.dom.length).fill(!1); + r.current = [...l], u.current = [...l], c.dom.forEach((i, d) => { const m = (x) => { - x.forEach((v) => { - c.onIntersect[i] && c.onIntersect[i](v), r.current[i] = v.isIntersecting; + x.forEach((o) => { + c.onIntersect[d] && c.onIntersect[d](o), r.current[d] = o.isIntersecting; }); - }, g = new IntersectionObserver(m, { + }, h = new IntersectionObserver(m, { rootMargin: "0px", threshold: 0 }); - g.observe(l), e.current.push(g), t.current.push(l); + h.observe(i), e.current.push(h), t.current.push(i); }); }, [] ); -}, kn = () => { - const e = L([]), t = w( +}, Nn = () => { + const e = B([]), t = _( ({ params: n, customParams: r, size: u, resolutionRef: c, - scene: p, - isIntersectingRef: l + scene: l, + isIntersectingRef: i }) => { - p.children.length !== e.current.length && (e.current = new Array(p.children.length)), p.children.forEach((i, m) => { - var v, s, d, o, h, y; - const g = n.dom[m]; - if (!g) + l.children.length !== e.current.length && (e.current = new Array(l.children.length)), l.children.forEach((d, m) => { + var o, g, s, v, p, w; + const h = n.dom[m]; + if (!h) return; - const x = g.getBoundingClientRect(); - if (e.current[m] = x, i.scale.set(x.width, x.height, 1), i.position.set( + const x = h.getBoundingClientRect(); + if (e.current[m] = x, d.scale.set(x.width, x.height, 1), d.position.set( x.left + x.width * 0.5 - u.width * 0.5, -x.top - x.height * 0.5 + u.height * 0.5, 0 - ), l.current[m] && (n.rotation[m] && i.rotation.copy(n.rotation[m]), i instanceof a.Mesh)) { - const T = i.material, f = R(T), M = F(T); + ), i.current[m] && (n.rotation[m] && d.rotation.copy(n.rotation[m]), d instanceof a.Mesh)) { + const b = d.material, f = R(b), M = F(b); f("u_texture", n.texture[m]), f("u_textureResolution", [ - ((d = (s = (v = n.texture[m]) == null ? void 0 : v.source) == null ? void 0 : s.data) == null ? void 0 : d.width) || 0, - ((y = (h = (o = n.texture[m]) == null ? void 0 : o.source) == null ? void 0 : h.data) == null ? void 0 : y.height) || 0 + ((s = (g = (o = n.texture[m]) == null ? void 0 : o.source) == null ? void 0 : g.data) == null ? void 0 : s.width) || 0, + ((w = (p = (v = n.texture[m]) == null ? void 0 : v.source) == null ? void 0 : p.data) == null ? void 0 : w.height) || 0 ]), f( "u_resolution", c.current.set(x.width, x.height) @@ -4545,10 +4465,10 @@ const Wn = ({ [] ); return [e.current, t]; -}, Gn = () => { - const e = L([]), t = L([]), n = w((r, u = !1) => { - e.current.forEach((p, l) => { - p && (t.current[l] = !0); +}, kn = () => { + const e = B([]), t = B([]), n = _((r, u = !1) => { + e.current.forEach((l, i) => { + l && (t.current[i] = !0); }); const c = u ? [...t.current] : [...e.current]; return r < 0 ? c : c[r]; @@ -4558,229 +4478,216 @@ const Wn = ({ isIntersectingOnceRef: t, isIntersecting: n }; -}, Kn = (e) => ({ onView: n, onHidden: r }) => { - const u = L(!1); - ie(() => { +}, Gn = (e) => ({ onView: n, onHidden: r }) => { + const u = B(!1); + ae(() => { let c; - const p = () => { - e.current.some((l) => l) ? u.current || (n && n(), u.current = !0) : u.current && (r && r(), u.current = !1), c = requestAnimationFrame(p); + const l = () => { + e.current.some((i) => i) ? u.current || (n && n(), u.current = !0) : u.current && (r && r(), u.current = !1), c = requestAnimationFrame(l); }; - return c = requestAnimationFrame(p), () => { + return c = requestAnimationFrame(l), () => { cancelAnimationFrame(c); }; }, [n, r]); -}, Xn = { +}, Kn = { texture: [], dom: [], boderRadius: [], rotation: [], onIntersect: [] -}, _r = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - renderTargetOptions: u, - onBeforeInit: c -}, p = []) => { - const l = B(t), i = b(() => new a.Scene(), []), m = q(e), [g, x] = W({ +}, Sr = ({ size: e, dpr: t, isSizeUpdate: n, renderTargetOptions: r, onBeforeInit: u }, c = []) => { + const l = U(t), i = y(() => new a.Scene(), []), d = L(e), [m, h] = j({ scene: i, - camera: m, + camera: d, size: e, dpr: l.fbo, - samples: n, - isSizeUpdate: r, - ...u - }), [v, s] = j({ - ...Xn, + isSizeUpdate: n, + ...r + }), [x, o] = $({ + ...Kn, updateKey: performance.now() - }), [d, o] = kn(), h = L(new a.Vector2(0, 0)), [y, T] = Ee(!0); - b( - () => T(!0), + }), [g, s] = Nn(), v = B(new a.Vector2(0, 0)), [p, w] = Be(!0); + y( + () => w(!0), // eslint-disable-next-line react-hooks/exhaustive-deps - p + c ); - const f = L(null), M = b(() => _, []), S = Nn(), { isIntersectingOnceRef: C, isIntersectingRef: D, isIntersecting: z } = Gn(), U = Kn(D), V = b(() => (P, G) => { - s(P), o({ - params: v, - customParams: G, + const b = B(null), f = y(() => C, []), M = Wn(), { isIntersectingOnceRef: S, isIntersectingRef: D, isIntersecting: A } = kn(), z = Gn(D), P = y(() => (T, k) => { + o(T), s({ + params: x, + customParams: k, size: e, - resolutionRef: h, + resolutionRef: v, scene: i, isIntersectingRef: D }); - }, [D, s, o, e, i, v]); + }, [D, o, s, e, i, x]); return [ - w( - (P, G, X) => { - const { gl: ee, size: te } = P; - if (V(G, X), $n(v)) - return M; - if (y) { - if (f.current === v.updateKey) - return M; - f.current = v.updateKey; + _( + (T, k, K) => { + const { gl: J, size: ee } = T; + if (P(k, K), Ln(x)) + return f; + if (p) { + if (b.current === x.updateKey) + return f; + b.current = x.updateKey; } - return y && (Wn({ - params: v, - size: te, + return p && (jn({ + params: x, + size: ee, scene: i, - onBeforeInit: c - }), S({ + onBeforeInit: u + }), M({ isIntersectingRef: D, - isIntersectingOnceRef: C, - params: v - }), T(!1)), x(ee); + isIntersectingOnceRef: S, + params: x + }), w(!1)), h(J); }, [ + h, + M, + u, + P, + p, + i, x, S, - c, - V, - y, - i, - v, - C, D, - M + f ] ), - V, + P, { scene: i, - camera: m, - renderTarget: g, - output: g.texture, - isIntersecting: z, - DOMRects: d, + camera: d, + renderTarget: m, + output: m.texture, + isIntersecting: A, + DOMRects: g, intersections: D.current, - useDomView: U + useDomView: z } ]; -}, wr = (e, t) => { +}, Cr = (e, t) => { const { scene: n, camera: r, size: u, dpr: c = !1, - isSizeUpdate: p = !1, - depth: l = !1, - ...i - } = e, m = L([]), g = Y(u, c); - m.current = b(() => Array.from({ length: t }, () => { - const v = new a.WebGLRenderTarget( - g.x, - g.y, + isSizeUpdate: l = !1, + depth: i = !1, + ...d + } = e, m = B([]), h = X(u, c); + m.current = y(() => Array.from({ length: t }, () => { + const o = new a.WebGLRenderTarget( + h.x, + h.y, { - ...xe, - ...i + ...he, + ...d } ); - return l && (v.depthTexture = new a.DepthTexture( - g.x, - g.y, + return i && (o.depthTexture = new a.DepthTexture( + h.x, + h.y, a.FloatType - )), v; - }), [t]), p && m.current.forEach( - (v) => v.setSize(g.x, g.y) - ), ie(() => { - const v = m.current; + )), o; + }), [t]), l && m.current.forEach( + (o) => o.setSize(h.x, h.y) + ), ae(() => { + const o = m.current; return () => { - v.forEach((s) => s.dispose()); + o.forEach((g) => g.dispose()); }; }, [t]); - const x = w( - (v, s, d) => { - const o = m.current[s]; - return _e({ - gl: v, + const x = _( + (o, g, s) => { + const v = m.current[g]; + return Ce({ + gl: o, scene: n, camera: r, - fbo: o, - onBeforeRender: () => d && d({ read: o.texture }) - }), o.texture; + fbo: v, + onBeforeRender: () => s && s({ read: v.texture }) + }), v.texture; }, [n, r] ); return [m.current, x]; -}, Yn = Object.freeze({ +}, _r = Object.freeze({ interpolate(e, t, n, r = 1e-6) { const u = e + (t - e) * n; return Math.abs(u) < r ? 0 : u; - }, - getMaxDpr(e, t) { - return Math.floor( - e.capabilities.maxTextureSize / Math.max(t.width, t.height) - ); } }); export { - tn as ALPHABLENDING_PARAMS, - wn as BLANK_PARAMS, - me as BLENDING_PARAMS, - fe as BRIGHTNESSPICKER_PARAMS, - re as BRUSH_PARAMS, - Z as CHROMAKEY_PARAMS, - Q as COLORSTRATA_PARAMS, - ve as COSPALETTE_PARAMS, - ln as COVERTEXTURE_PARAMS, - Ae as DELTA_TIME, - Xn as DOMSYNCER_PARAMS, - Me as DUOTONE_PARAMS, - he as Easing, - xe as FBO_DEFAULT_OPTION, - bt as FLUID_PARAMS, - Fe as FXBLENDING_PARAMS, - ae as FXTEXTURE_PARAMS, - Se as HSV_PARAMS, - se as MARBLE_PARAMS, - E as MORPHPARTICLES_PARAMS, - ge as MOTIONBLUR_PARAMS, - oe as NOISE_PARAMS, - _t as RIPPLE_PARAMS, - Ie as SIMPLEBLUR_PARAMS, - He as ShaderChunk, - Yn as Utils, - pe as WAVE_PARAMS, - N as WOBBLE3D_PARAMS, - _e as renderFBO, + en as ALPHABLENDING_PARAMS, + _n as BLANK_PARAMS, + ve as BLENDING_PARAMS, + de as BRIGHTNESSPICKER_PARAMS, + ne as BRUSH_PARAMS, + Q as CHROMAKEY_PARAMS, + H as COLORSTRATA_PARAMS, + ce as COSPALETTE_PARAMS, + sn as COVERTEXTURE_PARAMS, + Ve as DELTA_TIME, + Kn as DOMSYNCER_PARAMS, + be as DUOTONE_PARAMS, + ge as Easing, + he as FBO_DEFAULT_OPTION, + yt as FLUID_PARAMS, + Ae as FXBLENDING_PARAMS, + oe as FXTEXTURE_PARAMS, + Me as HSV_PARAMS, + ue as MARBLE_PARAMS, + O as MORPHPARTICLES_PARAMS, + fe as MOTIONBLUR_PARAMS, + re as NOISE_PARAMS, + Ct as RIPPLE_PARAMS, + Fe as SIMPLEBLUR_PARAMS, + Ye as ShaderChunk, + _r as Utils, + me as WAVE_PARAMS, + W as WOBBLE3D_PARAMS, + Ce as renderFBO, F as setCustomUniform, R as setUniform, - br as useAddMesh, - cr as useAlphaBlending, - Sr as useBeat, - hr as useBlank, - ir as useBlending, - sr as useBrightnessPicker, - Zn as useBrush, - q as useCamera, - gr as useChromaKey, - nr as useColorStrata, - wr as useCopyTexture, - or as useCosPalette, - mr as useCoverTexture, - An as useCreateMorphParticles, - Bn as useCreateWobble3D, - _r as useDomSyncer, - le as useDoubleFBO, - ar as useDuoTone, - Cr as useFPSLimiter, - Jn as useFluid, - lr as useFxBlending, - ur as useFxTexture, - vr as useHSV, - rr as useMarble, - xr as useMorphParticles, - dr as useMotionBlur, - tr as useNoise, - j as useParams, - Ce as usePointer, - Mr as useResizeBoundary, - Y as useResolution, - er as useRipple, - pr as useSimpleBlur, - W as useSingleFBO, - fr as useWave, - yr as useWobble3D + xr as useAddMesh, + sr as useAlphaBlending, + br as useBeat, + fr as useBlank, + or as useBlending, + ir as useBrightnessPicker, + Hn as useBrush, + L as useCamera, + dr as useChromaKey, + er as useColorStrata, + Cr as useCopyTexture, + nr as useCosPalette, + cr as useCoverTexture, + Vn as useCreateMorphParticles, + On as useCreateWobble3D, + Sr as useDomSyncer, + se as useDoubleFBO, + rr as useDuoTone, + Mr as useFPSLimiter, + Qn as useFluid, + ur as useFxBlending, + ar as useFxTexture, + lr as useHSV, + tr as useMarble, + gr as useMorphParticles, + mr as useMotionBlur, + Jn as useNoise, + $ as useParams, + Se as usePointer, + yr as useResizeBoundary, + X as useResolution, + Zn as useRipple, + vr as useSimpleBlur, + j as useSingleFBO, + pr as useWave, + hr 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 793260d1..ff759302 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/libs/constants.ts","../src/libs/shaders/shaderChunk/wobble3D.glsl","../src/libs/shaders/shaderChunk/snoise.glsl","../src/libs/shaders/shaderChunk/coverTexture.glsl","../src/libs/shaders/shaderChunk/fxBlending.glsl","../src/libs/shaders/shaderChunk/planeVertex.glsl","../src/libs/shaders/shaderChunk/defaultVertex.glsl","../src/libs/shaders/shaderChunk/hsv2rgb.glsl","../src/libs/shaders/shaderChunk/rgb2hsv.glsl","../src/libs/shaders/ShaderChunk.ts","../src/libs/shaders/resolveShaders.ts","../src/utils/createMaterialParameters.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/simulations/useFluid/shaders/main.vert","../src/fxs/simulations/useFluid/shaders/init.frag","../src/fxs/simulations/useFluid/materials/useInitialMaterial.ts","../src/fxs/simulations/useFluid/shaders/advection.frag","../src/fxs/simulations/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/simulations/useFluid/shaders/divergence.frag","../src/fxs/simulations/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/simulations/useFluid/shaders/pressure.frag","../src/fxs/simulations/useFluid/materials/usePressureMaterial.ts","../src/fxs/simulations/useFluid/shaders/curl.frag","../src/fxs/simulations/useFluid/materials/useCurlMaterial.ts","../src/fxs/simulations/useFluid/shaders/vorticity.frag","../src/fxs/simulations/useFluid/materials/useVorticityMaterial.ts","../src/fxs/simulations/useFluid/shaders/clear.frag","../src/fxs/simulations/useFluid/materials/useClearMaterial.ts","../src/fxs/simulations/useFluid/shaders/gradientSubtract.frag","../src/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/simulations/useFluid/shaders/splat.frag","../src/fxs/simulations/useFluid/materials/useSplatMaterial.ts","../src/fxs/simulations/useFluid/useMesh.ts","../src/fxs/simulations/useFluid/index.ts","../src/fxs/simulations/useRipple/shader/main.vert","../src/fxs/simulations/useRipple/shader/main.frag","../src/fxs/simulations/useRipple/useMesh.ts","../src/fxs/simulations/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/misc/useBlank/shader/main.vert","../src/fxs/misc/useBlank/shader/main.frag","../src/fxs/misc/useBlank/useMesh.ts","../src/fxs/misc/useBlank/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/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","../src/fxs/3D/useWobble3D/utils/rewriteVertexShader.ts","../src/fxs/3D/useWobble3D/utils/rewriteFragmentShader.ts","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/utils/resolveEachMaterial.ts","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/utils/useResizeBoundary.ts","../src/libs/Easings.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","../src/libs/Utils.ts"],"sourcesContent":["#usf ","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\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\ntype UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = value;\n }\n };\n\nexport type CustomParams = { [uniform: string]: UniformValue };\nexport const setCustomUniform =\n (material: { uniforms: UniformObject }) =>\n (customParams: CustomParams | undefined) => {\n if (customParams === undefined) {\n return;\n }\n Object.keys(customParams).forEach((key) => {\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = customParams[key];\n }\n });\n };\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\n};\n","import * as THREE from \"three\";\n\nexport const ISDEV = process.env.NODE_ENV === \"development\";\n\nexport const MATERIAL_BASIC_PARAMS = {\n transparent: false,\n depthTest: false,\n depthWrite: false,\n};\n\nexport const DEFAULT_TEXTURE = new THREE.DataTexture(\n new Uint8Array([0, 0, 0, 0]),\n 1,\n 1,\n THREE.RGBAFormat\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//\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;\n\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}","float screenAspect = uResolution.x / uResolution.y;\nfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\nvec2 aspectRatio = vec2(\n\tmin(screenAspect / textureAspect, 1.0),\n\tmin(textureAspect / screenAspect, 1.0)\n);\nvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;","vec3 mapColor = texture2D(uMap, uv).rgb;\nvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\nuv = uv * 2.0 - 1.0;\nuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\nuv = (uv + 1.0) / 2.0;","precision highp float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","vec3 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}","vec3 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}","import wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVertex from \"./shaderChunk/planeVertex.glsl\";\nimport defaultVertex from \"./shaderChunk/defaultVertex.glsl\";\nimport hsv2rgb from \"./shaderChunk/hsv2rgb.glsl\";\nimport rgb2hsv from \"./shaderChunk/rgb2hsv.glsl\";\n\nexport type ShaderChunkTypes =\n | \"wobble3D\"\n | \"snoise\"\n | \"coverTexture\"\n | \"fxBlending\"\n | \"planeVertex\"\n | \"defaultVertex\"\n | \"hsv2rgb\"\n | \"rgb2hsv\";\n\nexport const ShaderChunk: { [K in ShaderChunkTypes]: string } = Object.freeze({\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVertex,\n defaultVertex,\n hsv2rgb,\n rgb2hsv,\n});\n","import { ShaderChunk, ShaderChunkTypes } from \"./ShaderChunk\";\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: ShaderChunkTypes): string {\n return resolveIncludes(ShaderChunk[include] || \"\");\n}\n\nfunction resolveIncludes(string: string): string {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport { resolveIncludes };\n","import { resolveIncludes } from \"../libs/shaders/resolveShaders\";\nimport { OnBeforeInitParameters } from \"../fxs/types\";\n\nexport const createMaterialParameters = (\n parameters: OnBeforeInitParameters,\n onBeforeInit?: (parameters: OnBeforeInitParameters) => void\n) => {\n onBeforeInit && onBeforeInit(parameters);\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n return parameters;\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BRUSH_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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.Vector2 };\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uBuffer: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: DEFAULT_TEXTURE },\n uIsTexture: { value: false },\n uMap: { value: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uMapIntensity: { value: BRUSH_PARAMS.mapIntensity },\n uRadius: { value: BRUSH_PARAMS.radius },\n uSmudge: { value: BRUSH_PARAMS.smudge },\n uDissipation: { value: BRUSH_PARAMS.dissipation },\n uMotionBlur: { value: BRUSH_PARAMS.motionBlur },\n uMotionSample: { value: BRUSH_PARAMS.motionSample },\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: BRUSH_PARAMS.color },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [onBeforeInit]) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype SetParams = (newParams?: Partial) => void;\ntype UseParamsReturn = [T, SetParams];\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>((newParams) => {\n if (newParams === undefined) {\n return;\n }\n for (const key in newParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n newParams[paramKey] !== undefined &&\n newParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = newParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_DEFAULT_OPTION: THREE.RenderTargetOptions = {\n depthBuffer: 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 /** If set, the scene depth will be rendered into buffer.depthTexture. default : `false` */\n depth?: boolean;\n} & THREE.RenderTargetOptions;\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 * @param depthBuffer Unlike the default in three.js, the default is `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 = (props: UseFboProps): UseSingleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\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_DEFAULT_OPTION,\n ...renderTargetOptions,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { FBO_DEFAULT_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget;\n write: THREE.WebGLRenderTarget;\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 * @description Custom hook for setting up double buffering with WebGL render targets.\n * @param UseFboProps same as `useSingleFBO`\n */\nexport const useDoubleFBO = (props: UseFboProps): UseDoubleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\n const resolution = useResolution(size, dpr);\n\n const renderTarget = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n\n if (depth) {\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 {\n read: read,\n write: write,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (isSizeUpdate) {\n renderTarget.read?.setSize(resolution.x, resolution.y);\n renderTarget.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, [renderTarget]);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget;\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, renderTarget]\n );\n\n return [\n { read: renderTarget.read, write: renderTarget.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default : `0.05` */\n radius?: number;\n /** Strength of smudge effect , default : `0.0`*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. , default : `1.0` */\n dissipation?: number;\n /** Strength of motion blur , default : `0.0` */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default : `5` */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrushParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrushParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture!) {\n updateValue(\"uIsTexture\", true);\n updateValue(\"uTexture\", params.texture!);\n } else {\n updateValue(\"uIsTexture\", false);\n }\n\n if (params.map!) {\n updateValue(\"uIsMap\", true);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n } else {\n updateValue(\"uIsMap\", false);\n }\n\n updateValue(\"uRadius\", params.radius!);\n updateValue(\"uSmudge\", params.smudge!);\n updateValue(\"uDissipation\", params.dissipation!);\n updateValue(\"uMotionBlur\", params.motionBlur!);\n updateValue(\"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateValue(\"uMouse\", pointerValues.currentPointer);\n updateValue(\"uPrevMouse\", pointerValues.prevPointer);\n }\n updateValue(\"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n updateValue(\"uColor\", color);\n\n updateValue(\"uIsCursor\", params.isCursor!);\n\n // pressure\n updateValue(\"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n updateValue(\"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBuffer\", read);\n });\n },\n [updateValue, updatePointer, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\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 = vec4(dissipation * texture2D(uSource, coord).rgb,1.);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: DEFAULT_TEXTURE },\n uSource: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: DELTA_TIME },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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 clampedUV = clamp(uv, 0.0, 1.0);\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tmultiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0;\n\tmultiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0;\n\treturn multiplier * texture2D(uVelocity, clampedUV).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplatMaterial = ({ onBeforeInit }: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTarget: { value: DEFAULT_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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplatMaterial } from \"./materials/useSplatMaterial\";\nimport { CustomParams, setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\n\nexport type CustomizableKeys =\n | \"advection\"\n | \"splat\"\n | \"curl\"\n | \"vorticity\"\n | \"divergence\"\n | \"clear\"\n | \"pressure\"\n | \"gradientSubtract\";\n\nexport type CustomFluidProps = {\n [K in CustomizableKeys]?: MaterialProps;\n};\nexport type CustomFluidParams = {\n [K in CustomizableKeys]?: CustomParams;\n};\n\nconst useCustomMaterial = (\n materialHook: (materialProps: MaterialProps) => T,\n materialProps?: MaterialProps\n) => {\n return materialHook(materialProps ?? {});\n};\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n customFluidProps,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n customFluidProps?: CustomFluidProps;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n\n const {\n curl,\n vorticity,\n advection,\n divergence,\n pressure,\n clear,\n gradientSubtract,\n splat,\n } = customFluidProps ?? {};\n\n const initialMaterial = useCustomMaterial(useInitialMaterial);\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCustomMaterial(useCurlMaterial, curl);\n const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity);\n const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection);\n const divergenceMaterial = useCustomMaterial(\n useDivergenceMaterial,\n divergence\n );\n const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure);\n const clearMaterial = useCustomMaterial(useClearMaterial, clear);\n const gradientSubtractMaterial = useCustomMaterial(\n useGradientSubtractMaterial,\n gradientSubtract\n );\n const splatMaterial = useCustomMaterial(useSplatMaterial, splat);\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useMemo(() => {\n setUniform(materials.splatMaterial)(\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(material)(\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, mesh };\n};\n","import * as THREE from \"three\";\nimport {\n CustomizableKeys,\n FluidMaterials,\n CustomFluidProps,\n CustomFluidParams,\n useMesh,\n} 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport const DELTA_TIME = 0.016;\n\nexport type FluidParams = {\n /** density disspation , default : `0.98` */\n densityDissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocityDissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocityAcceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressureDissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressureIterations?: number;\n /** curl_strength , default : `35` */\n curlStrength?: number;\n /** splat radius , default : `0.002` */\n splatRadius?: 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 fluidColor?:\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 densityDissipation: 0.98,\n velocityDissipation: 0.99,\n velocityAcceleration: 10.0,\n pressureDissipation: 0.9,\n pressureIterations: 20,\n curlStrength: 35,\n splatRadius: 0.002,\n fluidColor: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeInit` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * customFluidProps: {\n vorticity: {\n onBeforeInit: (parameters) => console.log(parameters),\n },\n },\n\t * ```\n\t*/\n customFluidProps?: CustomFluidProps;\n} & HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n customFluidProps,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n type: THREE.HalfFloatType,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n samples,\n _dpr.fbo,\n isSizeUpdate,\n renderTargetOptions,\n ]\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 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 // setUniform\n const updateParamsList = useMemo(\n () => ({\n advection: setUniform(materials.advectionMaterial),\n splat: setUniform(materials.splatMaterial),\n curl: setUniform(materials.curlMaterial),\n vorticity: setUniform(materials.vorticityMaterial),\n divergence: setUniform(materials.divergenceMaterial),\n clear: setUniform(materials.clearMaterial),\n pressure: setUniform(materials.pressureMaterial),\n gradientSubtract: setUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n // customSetUniform\n const updateCustomParamsList = useMemo<{\n [K in CustomizableKeys]: (customParams: CustomParams | undefined) => void;\n }>(\n () => ({\n advection: setCustomUniform(materials.advectionMaterial),\n splat: setCustomUniform(materials.splatMaterial),\n curl: setCustomUniform(materials.curlMaterial),\n vorticity: setCustomUniform(materials.vorticityMaterial),\n divergence: setCustomUniform(materials.divergenceMaterial),\n clear: setCustomUniform(materials.clearMaterial),\n pressure: setCustomUniform(materials.pressureMaterial),\n gradientSubtract: setCustomUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n\n const updateParams = useCallback(\n (newParams?: FluidParams, customParams?: CustomFluidParams) => {\n setParams(newParams);\n if (customParams) {\n Object.keys(customParams).forEach((key) => {\n updateCustomParamsList[key as CustomizableKeys](\n customParams[key as CustomizableKeys]\n );\n });\n }\n },\n [setParams, updateCustomParamsList]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FluidParams,\n customParams?: CustomFluidParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", read);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.velocityDissipation!\n );\n });\n\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", velocityTex);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.densityDissipation!\n );\n });\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n updateParamsList.splat(\"point\", pointerValues.currentPointer);\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocityAcceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splatRadius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluidColor === \"function\"\n ? params.fluidColor(pointerValues.velocity)\n : params.fluidColor!;\n updateParamsList.splat(\"color\", color);\n });\n }\n\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n updateParamsList.curl(\"uVelocity\", velocityTex);\n });\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n updateParamsList.vorticity(\"uVelocity\", read);\n updateParamsList.vorticity(\"uCurl\", curlTex);\n updateParamsList.vorticity(\"curl\", params.curlStrength!);\n });\n\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n updateParamsList.divergence(\"uVelocity\", velocityTex);\n });\n\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n updateParamsList.clear(\"uTexture\", read);\n updateParamsList.clear(\"value\", params.pressureDissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressureIterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n updateParamsList.pressure(\"uPressure\", read);\n });\n }\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n updateParamsList.gradientSubtract(\"uPressure\", pressureTexTemp);\n updateParamsList.gradientSubtract(\"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n updateParamsList,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n params,\n updateParams,\n ]\n );\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nuniform sampler2D uMap;\nuniform float uOpacity;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(uMap, uv).rgb;\n\tgl_FragColor = vec4(color,uOpacity);\n}","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n scene: THREE.Scene;\n texture?: THREE.Texture;\n};\n\nexport const useMesh = ({\n scale,\n max,\n texture,\n scene,\n onBeforeInit,\n}: UseMeshProps & MaterialProps) => {\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, onBeforeInit]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n const mesh = new THREE.Mesh(geometry.clone(), clonedMat);\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n temp.push(mesh);\n }\n return temp;\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.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 };\n }, [scene, meshArr]);\n\n return meshArr;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\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 fadeoutSpeed?: 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 fadeoutSpeed: 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,\n scale = 64,\n max = 100,\n size,\n dpr,\n renderTargetOptions,\n samples,\n isSizeUpdate,\n onBeforeInit,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateParams = useMemo(() => {\n return (newParams?: RippleParams, customParams?: CustomParams) => {\n setParams(newParams);\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.ShaderMaterial;\n mesh.rotation.z += params.rotation!;\n mesh.scale.x =\n params.fadeoutSpeed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\"uOpacity\", opacity * params.fadeoutSpeed!);\n if (opacity < 0.001) mesh.visible = false;\n }\n setCustomUniform(mesh.material)(customParams);\n });\n };\n }, [meshArr, params, setParams]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: RippleParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n const material = mesh.material as THREE.ShaderMaterial;\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 setUniform(material)(\"uOpacity\", params.alpha!);\n currentWave.current = (currentWave.current + 1) % max;\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { NOISE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: NOISE_PARAMS.scale },\n timeStrength: { value: NOISE_PARAMS.timeStrength },\n noiseOctaves: { value: NOISE_PARAMS.noiseOctaves },\n fbmOctaves: { value: NOISE_PARAMS.fbmOctaves },\n warpOctaves: { value: NOISE_PARAMS.warpOctaves },\n warpDirection: { value: NOISE_PARAMS.warpDirection },\n warpStrength: { value: NOISE_PARAMS.warpStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type NoiseParams = {\n /** noise scale , default : `0.004` */\n scale?: number;\n /** time factor default : `0.3` */\n timeStrength?: number;\n /** noiseOctaves, affects performance default : `2` */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default : `2` */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default : `2` */\n warpOctaves?: number;\n /** direction of domain warping , default : `(2.0,2,0)` */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default : `8.0` */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: NoiseParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: NoiseParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"scale\", params.scale!);\n updateValue(\"timeStrength\", params.timeStrength!);\n updateValue(\"noiseOctaves\", params.noiseOctaves!);\n updateValue(\"fbmOctaves\", params.fbmOctaves!);\n updateValue(\"warpOctaves\", params.warpOctaves!);\n updateValue(\"warpDirection\", params.warpDirection!);\n updateValue(\"warpStrength\", params.warpStrength!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COLORSTRATA_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n isTexture: { value: false },\n scale: { value: COLORSTRATA_PARAMS.scale },\n noise: { value: DEFAULT_TEXTURE },\n noiseStrength: { value: COLORSTRATA_PARAMS.noiseStrength },\n isNoise: { value: false },\n laminateLayer: { value: COLORSTRATA_PARAMS.laminateLayer },\n laminateInterval: {\n value: COLORSTRATA_PARAMS.laminateInterval,\n },\n laminateDetail: { value: COLORSTRATA_PARAMS.laminateDetail },\n distortion: { value: COLORSTRATA_PARAMS.distortion },\n colorFactor: { value: COLORSTRATA_PARAMS.colorFactor },\n uTime: { value: 0 },\n timeStrength: { value: COLORSTRATA_PARAMS.timeStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ColorStrataParams = {\n /** default : `null` */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : `1` */\n scale?: number;\n /** default : `1.0` */\n laminateLayer?: number;\n /** default : `(0.1, 0.1)` */\n laminateInterval?: THREE.Vector2;\n /** default : `(1.0, 1.0)` */\n laminateDetail?: THREE.Vector2;\n /** default : `(0.0, 0.0)` */\n distortion?: THREE.Vector2;\n /** default : `(1.0, 1.0, 1.0)` */\n colorFactor?: THREE.Vector3;\n /** default : `(0.0, 0.0)` */\n timeStrength?: THREE.Vector2;\n /** default : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n ColorStrataParams,\n ColorStrataObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ColorStrataParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ColorStrataParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture) {\n updateValue(\"uTexture\", params.texture);\n updateValue(\"isTexture\", true);\n } else {\n updateValue(\"isTexture\", false);\n updateValue(\"scale\", params.scale!);\n }\n\n if (params.noise) {\n updateValue(\"noise\", params.noise);\n updateValue(\"isNoise\", true);\n updateValue(\"noiseStrength\", params.noiseStrength!);\n } else {\n updateValue(\"isNoise\", false);\n }\n\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n updateValue(\"laminateLayer\", params.laminateLayer!);\n updateValue(\"laminateInterval\", params.laminateInterval!);\n updateValue(\"laminateDetail\", params.laminateDetail!);\n updateValue(\"distortion\", params.distortion!);\n updateValue(\"colorFactor\", params.colorFactor!);\n updateValue(\"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: MARBLE_PARAMS.pattern },\n u_complexity: { value: MARBLE_PARAMS.complexity },\n u_complexityAttenuation: {\n value: MARBLE_PARAMS.complexityAttenuation,\n },\n u_iterations: { value: MARBLE_PARAMS.iterations },\n u_timeStrength: { value: MARBLE_PARAMS.timeStrength },\n u_scale: { value: MARBLE_PARAMS.scale },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MarbleParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MarbleParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_pattern\", params.pattern!);\n updateValue(\"u_complexity\", params.complexity!);\n updateValue(\"u_complexityAttenuation\", params.complexityAttenuation!);\n updateValue(\"u_iterations\", params.iterations!);\n updateValue(\"u_timeStrength\", params.timeStrength!);\n updateValue(\"u_scale\", params.scale!);\n updateValue(\"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COSPALETTE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uRgbWeight: { value: COSPALETTE_PARAMS.rgbWeight },\n uColor1: { value: COSPALETTE_PARAMS.color1 },\n uColor2: { value: COSPALETTE_PARAMS.color2 },\n uColor3: { value: COSPALETTE_PARAMS.color3 },\n uColor4: { value: COSPALETTE_PARAMS.color4 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_TEXTURE,\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CosPaletteParams,\n ColorPaletteObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CosPaletteParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CosPaletteParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor1\", params.color1!);\n updateValue(\"uColor2\", params.color2!);\n updateValue(\"uColor3\", params.color3!);\n updateValue(\"uColor4\", params.color4!);\n updateValue(\"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { DUOTONE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: DuoToneParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DuoToneParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor0\", params.color0!);\n updateValue(\"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float uMapIntensity;\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#usf \n\n\t// color 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 alphaColor = vec3(mix(outputColor,mapColor,mixValue));\n\n\tgl_FragColor = vec4(alphaColor,alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n uMapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n u_alphaMap: { value: DEFAULT_TEXTURE },\n u_isAlphaMap: { value: false },\n uMapIntensity: { value: BLENDING_PARAMS.mapIntensity },\n u_brightness: { value: BLENDING_PARAMS.brightness },\n u_min: { value: BLENDING_PARAMS.min },\n u_max: { value: BLENDING_PARAMS.max },\n u_dodgeColor: { value: new THREE.Color() },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_TEXTURE,\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n});\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n if (params.alphaMap) {\n updateValue(\"u_alphaMap\", params.alphaMap!);\n updateValue(\"u_isAlphaMap\", true);\n } else {\n updateValue(\"u_isAlphaMap\", false);\n }\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n if (params.dodgeColor) {\n updateValue(\"u_dodgeColor\", params.dodgeColor);\n updateValue(\"u_isDodgeColor\", true);\n } else {\n updateValue(\"u_isDodgeColor\", false);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","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\t#usf \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 { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: DEFAULT_TEXTURE },\n uTexture1: { value: DEFAULT_TEXTURE },\n padding: { value: FXTEXTURE_PARAMS.padding },\n uMap: { value: DEFAULT_TEXTURE },\n edgeIntensity: { value: FXTEXTURE_PARAMS.edgeIntensity },\n mapIntensity: { value: FXTEXTURE_PARAMS.mapIntensity },\n epicenter: { value: FXTEXTURE_PARAMS.epicenter },\n progress: { value: FXTEXTURE_PARAMS.progress },\n dirX: { value: FXTEXTURE_PARAMS.dir?.x },\n dirY: { value: FXTEXTURE_PARAMS.dir?.y },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture0: DEFAULT_TEXTURE,\n texture1: DEFAULT_TEXTURE,\n padding: 0.0,\n map: DEFAULT_TEXTURE,\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture0\", params.texture0!);\n updateValue(\"uTexture1\", params.texture1!);\n updateValue(\"progress\", params.progress!);\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n updateValue(\"uTextureResolution\", interpolatedResolution);\n updateValue(\"padding\", params.padding!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"mapIntensity\", params.mapIntensity!);\n updateValue(\"edgeIntensity\", params.edgeIntensity!);\n updateValue(\"epicenter\", params.epicenter!);\n updateValue(\"dirX\", params.dir!.x);\n updateValue(\"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { BRIGHTNESSPICKER_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n BrightnessPickerParams,\n BrightnessPickerObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrightnessPickerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrightnessPickerParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform float uMapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t#usf \n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXBLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n uMapIntensity: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_TEXTURE,\n mapIntensity: 0.3,\n});\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n FxBlendingParams,\n FxBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_TEXTURE,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n AlphaBlendingParams,\n AlphaBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: AlphaBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: AlphaBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n brightness: 1,\n saturation: 1,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: HSVParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: HSVParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\t#usf \n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n}\n\n","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CoverTextureParams,\n CoverTextureObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CoverTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CoverTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** blurSize, default : `3` */\n blurSize?: number;\n /** blurPower, affects performance default : `5` */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n blurSize: 3,\n blurPower: 5,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n SimpleBlurParams,\n SimpleBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n _dpr.fbo,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n ]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: SimpleBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: SimpleBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n updateValue(\"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n for (let i = 0; i < params.blurPower!; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n MotionBlurParams,\n MotionBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n _dpr.fbo,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n ]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MotionBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MotionBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uBegin\", params.begin!);\n updateValue(\"uEnd\", params.end!);\n updateValue(\"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, updateParams, params]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default : `vec2(0.0,0.0)` */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default : `0.0` */\n progress?: number;\n /** default : `0.0` */\n width?: number;\n /** default : `0.0` */\n strength?: number;\n /** default : `center` */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: WaveParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: WaveParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uEpicenter\", params.epicenter!);\n updateValue(\"uProgress\", params.progress!);\n updateValue(\"uWidth\", params.width!);\n updateValue(\"uStrength\", params.strength!);\n updateValue(\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { CHROMAKEY_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: CHROMAKEY_PARAMS.color },\n u_similarity: { value: CHROMAKEY_PARAMS.similarity },\n u_smoothness: { value: CHROMAKEY_PARAMS.smoothness },\n u_spill: { value: CHROMAKEY_PARAMS.spill },\n u_color: { value: CHROMAKEY_PARAMS.color },\n u_contrast: { value: CHROMAKEY_PARAMS.contrast },\n u_brightness: { value: CHROMAKEY_PARAMS.brightness },\n u_gamma: { value: CHROMAKEY_PARAMS.gamma },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_TEXTURE,\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ChromaKeyParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ChromaKeyParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_keyColor\", params.keyColor!);\n updateValue(\"u_similarity\", params.similarity!);\n updateValue(\"u_smoothness\", params.smoothness!);\n updateValue(\"u_spill\", params.spill!);\n updateValue(\"u_color\", params.color!);\n updateValue(\"u_contrast\", params.contrast!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 usf_Position = vec4(position,1.);\n\tvUv = uv;\n\n\t#usf
\n\t\n\tgl_Position = usf_Position;\n}","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec2 uResolution;\n\n#usf \n\nvoid main() {\n\tvec4 usf_FragColor = vec4(1.);\n\n\t#usf
\n\t\n\tgl_FragColor = usf_FragColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform, useResolution } from \"../../..\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlankMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uTime: { value: number };\n uPointer: { value: THREE.Vector2 };\n uResolution: { value: THREE.Vector2 };\n };\n}\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type BlankParams = {\n /** texture, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type BlankObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh<\n THREE.BufferGeometry,\n BlankMaterial\n >;\n material: BlankMaterial;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLANK_PARAMS: BlankParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n beat: false,\n});\n\n/**\n * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`.\n * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms.\n *\n * ※ `usf_FragColor` overrides `gl_FragColor`\n *\n * ※ `usf_Position` overrides `gl_Position`\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlank = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n _dpr.fbo,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n ]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlankParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlankParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uPointer\", pointer);\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\nfloat random3D(vec3 co) {\n\treturn 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\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","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport {\n DEFAULT_TEXTURE,\n ISDEV,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\nimport { MaterialProps } from \"../../../types\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: {\n value: MORPHPARTICLES_PARAMS.morphProgress,\n },\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: DEFAULT_TEXTURE },\n uIsPicture: { value: false },\n uAlphaPicture: { value: DEFAULT_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: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uAlphaMap: { value: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.wobbleStrength,\n },\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: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMin,\n },\n uSizeRandomMax: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMax,\n },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: {\n value: MORPHPARTICLES_PARAMS.divergencePoint,\n },\n ...mapArrayUniforms,\n },\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n blending: THREE.AdditiveBlending,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeInit,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport {\n setUniform,\n CustomParams,\n setCustomUniform,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uMorphProgress\", newParams.morphProgress);\n updateValue(\"uBlurAlpha\", newParams.blurAlpha);\n updateValue(\"uBlurRadius\", newParams.blurRadius);\n updateValue(\"uPointSize\", newParams.pointSize);\n updateValue(\"uPointAlpha\", newParams.pointAlpha);\n if (newParams.picture) {\n updateValue(\"uPicture\", newParams.picture);\n updateValue(\"uIsPicture\", true);\n } else if (newParams.picture === false) {\n updateValue(\"uIsPicture\", false);\n }\n if (newParams.alphaPicture) {\n updateValue(\"uAlphaPicture\", newParams.alphaPicture);\n updateValue(\"uIsAlphaPicture\", true);\n } else if (newParams.alphaPicture === false) {\n updateValue(\"uIsAlphaPicture\", false);\n }\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n if (newParams.map) {\n updateValue(\"uMap\", newParams.map);\n updateValue(\"uIsMap\", true);\n } else if (newParams.map === false) {\n updateValue(\"uIsMap\", false);\n }\n if (newParams.alphaMap) {\n updateValue(\"uAlphaMap\", newParams.alphaMap);\n updateValue(\"uIsAlphaMap\", true);\n } else if (newParams.alphaMap === false) {\n updateValue(\"uIsAlphaMap\", false);\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n if (newParams.displacement) {\n updateValue(\"uDisplacement\", newParams.displacement);\n updateValue(\"uIsDisplacement\", true);\n } else if (newParams.displacement === false) {\n updateValue(\"uIsDisplacement\", false);\n }\n updateValue(\"uDisplacementIntensity\", newParams.displacementIntensity);\n updateValue(\n \"uDisplacementColorIntensity\",\n newParams.displacementColorIntensity\n );\n updateValue(\"uSizeRandomIntensity\", newParams.sizeRandomIntensity);\n updateValue(\n \"uSizeRandomTimeFrequency\",\n newParams.sizeRandomTimeFrequency\n );\n updateValue(\"uSizeRandomMin\", newParams.sizeRandomMin);\n updateValue(\"uSizeRandomMax\", newParams.sizeRandomMax);\n updateValue(\"uDivergence\", newParams.divergence);\n updateValue(\"uDivergencePoint\", newParams.divergencePoint);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n camera,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({\n scene,\n size,\n dpr,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n ) => {\n updateUniform(rootState, newParams, customParams);\n return updateRenderTarget(rootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: MorphParticlesParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\n\nexport const rewriteVertexShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform float uTime;\n\t\t\tuniform float uWobblePositionFrequency;\n\t\t\tuniform float uWobbleTimeFrequency;\n\t\t\tuniform float uWobbleStrength;\n\t\t\tuniform float uWarpPositionFrequency;\n\t\t\tuniform float uWarpTimeFrequency;\n\t\t\tuniform float uWarpStrength;\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\t\n\t\t\t// edge\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\n\t\t\t#usf \n\n\t\t\tvoid main() {\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 objectNormal = usf_Normal;\n\t\t\t#ifdef USE_TANGENT\n\t\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t\t#endif\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 transformed = usf_Position;\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\t\n\t\t\tvec3 usf_Position = position;\n\t\t\tvec3 usf_Normal = normal;\n\t\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\t\n\t\t\t// Neighbours positions\n\t\t\tfloat shift = 0.01;\n\t\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\t\n\t\t\t// wobble\n\t\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\t\n\t\t\tusf_Position += wobble * normal;\n\t\t\tpositionA += wobblePositionA * normal;\n\t\t\tpositionB += wobblePositionB * normal;\n\n\t\t\t// Compute normal\n\t\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\t\tusf_Normal = cross(toA, toB);\n\t\t\t\n\t\t\t// Varying\n\t\t\tvPosition = usf_Position.xy;\n\t\t\tvWobble = wobble/uWobbleStrength;\n\t\t\t\n\t\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t#include \n\n\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t} else {\n\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t}\n\t\t`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform vec3 uColor0;\n\t\t\tuniform vec3 uColor1;\n\t\t\tuniform vec3 uColor2;\n\t\t\tuniform vec3 uColor3;\n\t\t\tuniform float uColorMix;\n\t\t\tuniform float uEdgeThreshold;\n\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\n\t\t\t// transmission\n\t\t\tuniform float uChromaticAberration; \n\t\t\tuniform float uAnisotropicBlur; \n\t\t\tuniform float uTime;\n\t\t\tuniform float uDistortion;\n\t\t\tuniform float uDistortionScale;\n\t\t\tuniform float uTemporalDistortion;\n\t\t\tuniform float uRefractionSamples;\n\t\t\t\n\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\n\t\t\t#usf \n\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\n\t\t\tvoid main(){\n\t\t\t\t\n\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\n\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t`\n );\n};\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 < uRefractionSamples; 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) / uRefractionSamples,\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) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\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) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uRefractionSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport transmission_pars_fragment from \"../shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"../shaders/transmission_fragment.glsl\";\n\nexport const resolveEachMaterial = ({\n mat,\n isCustomTransmission,\n parameters,\n}: {\n mat: THREE.Material;\n isCustomTransmission: boolean;\n parameters: THREE.WebGLProgramParametersWithUniforms;\n}) => {\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n // if normalMap is defined, don't add tangent attribute\n if (!(mat as any).normalMap) {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\t\tattribute vec4 tangent;\n\t\t\t\t\n\t\t\t\tvoid main() {\n\t\t\t`\n );\n }\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps, OnBeforeInitParameters } from \"../../types\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\nimport { rewriteVertexShader } from \"./utils/rewriteVertexShader\";\nimport { rewriteFragmentShader } from \"./utils/rewriteFragmentShader\";\nimport { resolveEachMaterial } from \"./utils/resolveEachMaterial\";\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 uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uEdgeThreshold: { value: number };\n uEdgeColor: { value: THREE.Color };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uRefractionSamples: { value: number };\n };\n}\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\n\ntype WobbleMaterialParams =\n ConstructorParameters[0];\n\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n depthOnBeforeInit?: (parameters: OnBeforeInitParameters) => void;\n /**\n * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false`\n * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial\n * */\n isCustomTransmission?: boolean;\n}\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n isCustomTransmission = false,\n onBeforeInit,\n depthOnBeforeInit,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\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 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 uEdgeThreshold: { value: WOBBLE3D_PARAMS.edgeThreshold },\n uEdgeColor: { value: WOBBLE3D_PARAMS.edgeColor },\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 uRefractionSamples: { value: WOBBLE3D_PARAMS.refractionSamples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (parameters) => {\n rewriteVertexShader(parameters);\n\n rewriteFragmentShader(parameters);\n\n resolveEachMaterial({\n parameters,\n mat,\n isCustomTransmission,\n });\n\n const cutomizedParams = createMaterialParameters(\n {\n fragmentShader: parameters.fragmentShader,\n vertexShader: parameters.vertexShader,\n // Because wobble3D uses userData to update uniforms.\n uniforms: mat.userData.uniforms,\n },\n onBeforeInit\n );\n parameters.fragmentShader = cutomizedParams.fragmentShader;\n parameters.vertexShader = cutomizedParams.vertexShader;\n Object.assign(parameters.uniforms, cutomizedParams.uniforms);\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 = (parameters) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n rewriteVertexShader(parameters);\n createMaterialParameters(parameters, depthOnBeforeInit);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeInit,\n depthOnBeforeInit,\n isCustomTransmission,\n ]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport {\n setUniform,\n setCustomUniform,\n CustomParams,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n) => void;\n\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 isCustomTransmission,\n baseMaterial,\n materialParameters,\n onBeforeInit,\n depthOnBeforeInit,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n\n const updateValue = setUniform(userData);\n const updateCustomValue = setCustomUniform(userData);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n updateValue(\"uColorMix\", newParams.colorMix);\n updateValue(\"uEdgeThreshold\", newParams.edgeThreshold);\n updateValue(\"uEdgeColor\", newParams.edgeColor);\n updateValue(\"uChromaticAberration\", newParams.chromaticAberration);\n updateValue(\"uAnisotropicBlur\", newParams.anisotropicBlur);\n updateValue(\"uDistortion\", newParams.distortion);\n updateValue(\"uDistortionScale\", newParams.distortionScale);\n updateValue(\"uRefractionSamples\", newParams.refractionSamples);\n updateValue(\"uTemporalDistortion\", newParams.temporalDistortion);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type Wobble3DParams = {\n /** default : `0.3` */\n wobbleStrength?: number;\n /** default : `0.3` */\n wobblePositionFrequency?: number;\n /** default : `0.3` */\n wobbleTimeFrequency?: number;\n /** default : `0.3` */\n warpStrength?: number;\n /** default : `0.3` */\n warpPositionFrequency?: number;\n /** default : `0.3` */\n warpTimeFrequency?: 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 /** Threshold of edge. 0 for edge disabled, default : `0` */\n edgeThreshold?: number;\n /** Color of edge. default : `0x000000` */\n edgeColor?: THREE.Color;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n chromaticAberration?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n distortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n distortionScale?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n temporalDistortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `6` */\n refractionSamples?: number;\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 wobbleStrength: 0.3,\n wobblePositionFrequency: 0.3,\n wobbleTimeFrequency: 0.3,\n warpStrength: 0.3,\n warpPositionFrequency: 0.3,\n warpTimeFrequency: 0.3,\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 edgeThreshold: 0.0,\n edgeColor: new THREE.Color(0x000000),\n chromaticAberration: 0.1,\n anisotropicBlur: 0.1,\n distortion: 0.0,\n distortionScale: 0.1,\n temporalDistortion: 0.0,\n refractionSamples: 6,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n RootState: RootState,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n ) => {\n updateUniform(RootState, newParams, customParams);\n return updateRenderTarget(RootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: Wobble3DParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(() => {\n const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","import * as THREE from \"three\";\nimport { useMemo, useRef } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { Utils } from \"..\";\n\nexport type ResizeBoundary = {\n /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */\n maxDpr: number;\n isUpdate: boolean;\n};\n\nconst checkUpdate = (\n currentW: number,\n currentH: number,\n memoW: number,\n memoH: number,\n threshold: number,\n boundFor: \"smaller\" | \"larger\" | \"both\"\n) => {\n const isSmaller =\n currentW < memoW - threshold || currentH < memoH - threshold;\n const isLarger =\n currentW > memoW + threshold || currentH > memoH + threshold;\n\n return (\n (boundFor === \"smaller\" && isSmaller) ||\n (boundFor === \"larger\" && isLarger) ||\n (boundFor === \"both\" && (isSmaller || isLarger))\n );\n};\n\nexport const useResizeBoundary = ({\n gl,\n size,\n boundFor,\n threshold,\n}: {\n gl: THREE.WebGLRenderer;\n size: Size;\n boundFor: \"smaller\" | \"larger\" | \"both\";\n threshold: number;\n}) => {\n const memorizedSize = useRef(size);\n\n const resizeBoundary = useMemo(() => {\n const { width: currentW, height: currentH } = size;\n const { width: memoW, height: memoH } = memorizedSize.current;\n\n const isUpdate = checkUpdate(\n currentW,\n currentH,\n memoW,\n memoH,\n threshold,\n boundFor\n );\n const dpr = Utils.getMaxDpr(gl, size);\n\n if (isUpdate) {\n memorizedSize.current = size;\n }\n return {\n maxDpr: dpr,\n isUpdate,\n };\n }, [size, gl, boundFor, threshold]);\n\n return resizeBoundary;\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/Easings\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 scene,\n onBeforeInit,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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]\n ? params.boderRadius![i]\n : 0.0,\n },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n customParams?: CustomParams;\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 ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n updateValue(\"u_texture\", params.texture![i]);\n updateValue(\"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n updateValue(\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n updateValue(\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n updateCustomValue(customParams);\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\nimport { getDpr } from \"../../utils/getDpr\";\nimport { CustomParams } from \"../../utils/setUniforms\";\nimport { DEFAULT_TEXTURE } from \"../../libs/constants\";\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 {\n size,\n dpr,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n onBeforeInit,\n }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => DEFAULT_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 updateParams = useMemo(() => {\n return (newParams?: DomSyncerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateDomRects({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n };\n }, [isIntersectingRef, setParams, updateDomRects, size, scene, params]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DomSyncerParams,\n customParams?: CustomParams\n ) => {\n const { gl, size } = rootState;\n\n updateParams(newParams, customParams);\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 onBeforeInit,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n intersectionHandler,\n onBeforeInit,\n updateParams,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport {\n UseFboProps,\n renderFBO,\n FBO_DEFAULT_OPTION,\n} 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 props: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...targetSettings\n } = props;\n\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_DEFAULT_OPTION,\n ...targetSettings,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","import * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\n\ntype Utils = {\n interpolate: (\n startValue: number,\n endValue: number,\n progress: number,\n threshold?: number\n ) => number;\n /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */\n getMaxDpr: (gl: THREE.WebGLRenderer, size: Size) => number;\n};\n\nexport const Utils: Utils = Object.freeze({\n interpolate(startValue, endValue, progress, threshold = 1e-6): number {\n const result = startValue + (endValue - startValue) * progress;\n return Math.abs(result) < threshold ? 0 : result;\n },\n getMaxDpr(gl, size) {\n return Math.floor(\n gl.capabilities.maxTextureSize / Math.max(size.width, size.height)\n );\n },\n});\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVertex_default","defaultVertex_default","hsv2rgb_default","rgb2hsv_default","ShaderChunk","wobble3D","snoise","coverTexture","fxBlending","planeVertex","defaultVertex","hsv2rgb","rgb2hsv","includePattern","includeReplacer","match","include","resolveIncludes","string","createMaterialParameters","parameters","onBeforeInit","useMesh","BRUSH_PARAMS","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","setParams","newParams","paramKey","FBO_DEFAULT_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","props","isSizeUpdate","depth","renderTargetOptions","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","read","write","_b","getDpr","useBrush","samples","_dpr","updatePointer","pressureEnd","updateValue","updateCustomValue","updateParams","rootState","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","DELTA_TIME","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplatMaterial","useCustomMaterial","materialHook","materialProps","customFluidProps","curl","vorticity","advection","divergence","pressure","clear","gradientSubtract","splat","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","scaledDiffVec","spaltVec","updateParamsList","updateCustomParamsList","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","clonedMat","RIPPLE_PARAMS","useRipple","currentWave","opacity","NOISE_PARAMS","useNoise","clock","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","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","BLANK_PARAMS","useBlank","useCreateObject","points","interactiveMesh","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","rewritedFragmentShader","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","transmission_pars_fragment_default","transmission_fragment_default","resolveEachMaterial","mat","isCustomTransmission","transmission_pars_fragment","transmission_fragment","baseMaterial","materialParameters","depthOnBeforeInit","depthMaterial","WOBBLE3D_PARAMS","cutomizedParams","depthMat","useCreateWobble3D","wobbleGeometry","mergeVertices","userData","useWobble3D","RootState","useAddMesh","checkUpdate","currentW","currentH","memoW","memoH","threshold","boundFor","isSmaller","isLarger","useResizeBoundary","memorizedSize","Utils","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","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","targetSettings","renderTargetArr","updateCopyTexture","startValue","endValue","progress","result"],"mappings":"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"} \ 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/libs/constants.ts","../src/libs/shaders/shaderChunk/wobble3D.glsl","../src/libs/shaders/shaderChunk/snoise.glsl","../src/libs/shaders/shaderChunk/coverTexture.glsl","../src/libs/shaders/shaderChunk/fxBlending.glsl","../src/libs/shaders/shaderChunk/planeVertex.glsl","../src/libs/shaders/shaderChunk/defaultVertex.glsl","../src/libs/shaders/shaderChunk/hsv2rgb.glsl","../src/libs/shaders/shaderChunk/rgb2hsv.glsl","../src/libs/shaders/ShaderChunk.ts","../src/libs/shaders/resolveShaders.ts","../src/utils/createMaterialParameters.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/simulations/useFluid/shaders/main.vert","../src/fxs/simulations/useFluid/shaders/init.frag","../src/fxs/simulations/useFluid/materials/useInitialMaterial.ts","../src/fxs/simulations/useFluid/shaders/advection.frag","../src/fxs/simulations/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/simulations/useFluid/shaders/divergence.frag","../src/fxs/simulations/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/simulations/useFluid/shaders/pressure.frag","../src/fxs/simulations/useFluid/materials/usePressureMaterial.ts","../src/fxs/simulations/useFluid/shaders/curl.frag","../src/fxs/simulations/useFluid/materials/useCurlMaterial.ts","../src/fxs/simulations/useFluid/shaders/vorticity.frag","../src/fxs/simulations/useFluid/materials/useVorticityMaterial.ts","../src/fxs/simulations/useFluid/shaders/clear.frag","../src/fxs/simulations/useFluid/materials/useClearMaterial.ts","../src/fxs/simulations/useFluid/shaders/gradientSubtract.frag","../src/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/simulations/useFluid/shaders/splat.frag","../src/fxs/simulations/useFluid/materials/useSplatMaterial.ts","../src/fxs/simulations/useFluid/useMesh.ts","../src/fxs/simulations/useFluid/index.ts","../src/fxs/simulations/useRipple/shader/main.vert","../src/fxs/simulations/useRipple/shader/main.frag","../src/fxs/simulations/useRipple/useMesh.ts","../src/fxs/simulations/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/misc/useBlank/shader/main.vert","../src/fxs/misc/useBlank/shader/main.frag","../src/fxs/misc/useBlank/useMesh.ts","../src/fxs/misc/useBlank/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/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","../src/fxs/3D/useWobble3D/utils/rewriteVertexShader.ts","../src/fxs/3D/useWobble3D/utils/rewriteFragmentShader.ts","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/utils/resolveEachMaterial.ts","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/utils/useResizeBoundary.ts","../src/libs/Easings.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","../src/libs/Utils.ts"],"sourcesContent":["#usf ","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\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\ntype UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = value;\n }\n };\n\nexport type CustomParams = { [uniform: string]: UniformValue };\nexport const setCustomUniform =\n (material: { uniforms: UniformObject }) =>\n (customParams: CustomParams | undefined) => {\n if (customParams === undefined) {\n return;\n }\n Object.keys(customParams).forEach((key) => {\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = customParams[key];\n }\n });\n };\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\n};\n","import * as THREE from \"three\";\n\nexport const ISDEV = process.env.NODE_ENV === \"development\";\n\nexport const MATERIAL_BASIC_PARAMS = {\n transparent: false,\n depthTest: false,\n depthWrite: false,\n};\n\nexport const DEFAULT_TEXTURE = new THREE.DataTexture(\n new Uint8Array([0, 0, 0, 0]),\n 1,\n 1,\n THREE.RGBAFormat\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//\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;\n\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}","float screenAspect = uResolution.x / uResolution.y;\nfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\nvec2 aspectRatio = vec2(\n\tmin(screenAspect / textureAspect, 1.0),\n\tmin(textureAspect / screenAspect, 1.0)\n);\nvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;","vec3 mapColor = texture2D(uMap, uv).rgb;\nvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\nuv = uv * 2.0 - 1.0;\nuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\nuv = (uv + 1.0) / 2.0;","precision highp float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","vec3 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}","vec3 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}","import wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVertex from \"./shaderChunk/planeVertex.glsl\";\nimport defaultVertex from \"./shaderChunk/defaultVertex.glsl\";\nimport hsv2rgb from \"./shaderChunk/hsv2rgb.glsl\";\nimport rgb2hsv from \"./shaderChunk/rgb2hsv.glsl\";\n\nexport type ShaderChunkTypes =\n | \"wobble3D\"\n | \"snoise\"\n | \"coverTexture\"\n | \"fxBlending\"\n | \"planeVertex\"\n | \"defaultVertex\"\n | \"hsv2rgb\"\n | \"rgb2hsv\";\n\nexport const ShaderChunk: { [K in ShaderChunkTypes]: string } = Object.freeze({\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVertex,\n defaultVertex,\n hsv2rgb,\n rgb2hsv,\n});\n","import { ShaderChunk, ShaderChunkTypes } from \"./ShaderChunk\";\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: ShaderChunkTypes): string {\n return resolveIncludes(ShaderChunk[include] || \"\");\n}\n\nfunction resolveIncludes(string: string): string {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport { resolveIncludes };\n","import { resolveIncludes } from \"../libs/shaders/resolveShaders\";\nimport { OnBeforeInitParameters } from \"../fxs/types\";\n\nexport const createMaterialParameters = (\n parameters: OnBeforeInitParameters,\n onBeforeInit?: (parameters: OnBeforeInitParameters) => void\n) => {\n onBeforeInit && onBeforeInit(parameters);\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n return parameters;\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BRUSH_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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.Vector2 };\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uBuffer: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: DEFAULT_TEXTURE },\n uIsTexture: { value: false },\n uMap: { value: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uMapIntensity: { value: BRUSH_PARAMS.mapIntensity },\n uRadius: { value: BRUSH_PARAMS.radius },\n uSmudge: { value: BRUSH_PARAMS.smudge },\n uDissipation: { value: BRUSH_PARAMS.dissipation },\n uMotionBlur: { value: BRUSH_PARAMS.motionBlur },\n uMotionSample: { value: BRUSH_PARAMS.motionSample },\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: BRUSH_PARAMS.color },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [onBeforeInit]) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype SetParams = (newParams?: Partial) => void;\ntype UseParamsReturn = [T, SetParams];\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>((newParams) => {\n if (newParams === undefined) {\n return;\n }\n for (const key in newParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n newParams[paramKey] !== undefined &&\n newParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = newParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_DEFAULT_OPTION: THREE.RenderTargetOptions = {\n depthBuffer: 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 /** If set, the scene depth will be rendered into buffer.depthTexture. default : `false` */\n depth?: boolean;\n} & THREE.RenderTargetOptions;\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 * @param depthBuffer Unlike the default in three.js, the default is `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 = (props: UseFboProps): UseSingleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\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_DEFAULT_OPTION,\n ...renderTargetOptions,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { FBO_DEFAULT_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget;\n write: THREE.WebGLRenderTarget;\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 * @description Custom hook for setting up double buffering with WebGL render targets.\n * @param UseFboProps same as `useSingleFBO`\n */\nexport const useDoubleFBO = (props: UseFboProps): UseDoubleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\n const resolution = useResolution(size, dpr);\n\n const renderTarget = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n\n if (depth) {\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 {\n read: read,\n write: write,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (isSizeUpdate) {\n renderTarget.read?.setSize(resolution.x, resolution.y);\n renderTarget.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, [renderTarget]);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget;\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, renderTarget]\n );\n\n return [\n { read: renderTarget.read, write: renderTarget.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default : `0.05` */\n radius?: number;\n /** Strength of smudge effect , default : `0.0`*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. , default : `1.0` */\n dissipation?: number;\n /** Strength of motion blur , default : `0.0` */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default : `5` */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrushParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrushParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture!) {\n updateValue(\"uIsTexture\", true);\n updateValue(\"uTexture\", params.texture!);\n } else {\n updateValue(\"uIsTexture\", false);\n }\n\n if (params.map!) {\n updateValue(\"uIsMap\", true);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n } else {\n updateValue(\"uIsMap\", false);\n }\n\n updateValue(\"uRadius\", params.radius!);\n updateValue(\"uSmudge\", params.smudge!);\n updateValue(\"uDissipation\", params.dissipation!);\n updateValue(\"uMotionBlur\", params.motionBlur!);\n updateValue(\"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateValue(\"uMouse\", pointerValues.currentPointer);\n updateValue(\"uPrevMouse\", pointerValues.prevPointer);\n }\n updateValue(\"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n updateValue(\"uColor\", color);\n\n updateValue(\"uIsCursor\", params.isCursor!);\n\n // pressure\n updateValue(\"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n updateValue(\"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBuffer\", read);\n });\n },\n [updateValue, updatePointer, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\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 = vec4(dissipation * texture2D(uSource, coord).rgb,1.);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: DEFAULT_TEXTURE },\n uSource: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: DELTA_TIME },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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 clampedUV = clamp(uv, 0.0, 1.0);\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tmultiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0;\n\tmultiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0;\n\treturn multiplier * texture2D(uVelocity, clampedUV).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplatMaterial = ({ onBeforeInit }: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTarget: { value: DEFAULT_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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplatMaterial } from \"./materials/useSplatMaterial\";\nimport { CustomParams, setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\n\nexport type CustomizableKeys =\n | \"advection\"\n | \"splat\"\n | \"curl\"\n | \"vorticity\"\n | \"divergence\"\n | \"clear\"\n | \"pressure\"\n | \"gradientSubtract\";\n\nexport type CustomFluidProps = {\n [K in CustomizableKeys]?: MaterialProps;\n};\nexport type CustomFluidParams = {\n [K in CustomizableKeys]?: CustomParams;\n};\n\nconst useCustomMaterial = (\n materialHook: (materialProps: MaterialProps) => T,\n materialProps?: MaterialProps\n) => {\n return materialHook(materialProps ?? {});\n};\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n customFluidProps,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n customFluidProps?: CustomFluidProps;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n\n const {\n curl,\n vorticity,\n advection,\n divergence,\n pressure,\n clear,\n gradientSubtract,\n splat,\n } = customFluidProps ?? {};\n\n const initialMaterial = useCustomMaterial(useInitialMaterial);\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCustomMaterial(useCurlMaterial, curl);\n const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity);\n const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection);\n const divergenceMaterial = useCustomMaterial(\n useDivergenceMaterial,\n divergence\n );\n const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure);\n const clearMaterial = useCustomMaterial(useClearMaterial, clear);\n const gradientSubtractMaterial = useCustomMaterial(\n useGradientSubtractMaterial,\n gradientSubtract\n );\n const splatMaterial = useCustomMaterial(useSplatMaterial, splat);\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useMemo(() => {\n setUniform(materials.splatMaterial)(\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(material)(\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, mesh };\n};\n","import * as THREE from \"three\";\nimport {\n CustomizableKeys,\n FluidMaterials,\n CustomFluidProps,\n CustomFluidParams,\n useMesh,\n} 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport const DELTA_TIME = 0.016;\n\nexport type FluidParams = {\n /** density disspation , default : `0.98` */\n densityDissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocityDissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocityAcceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressureDissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressureIterations?: number;\n /** curl_strength , default : `35` */\n curlStrength?: number;\n /** splat radius , default : `0.002` */\n splatRadius?: 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 fluidColor?:\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 densityDissipation: 0.98,\n velocityDissipation: 0.99,\n velocityAcceleration: 10.0,\n pressureDissipation: 0.9,\n pressureIterations: 20,\n curlStrength: 35,\n splatRadius: 0.002,\n fluidColor: 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 renderTargetOptions,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeInit` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * customFluidProps: {\n vorticity: {\n onBeforeInit: (parameters) => console.log(parameters),\n },\n },\n\t * ```\n\t*/\n customFluidProps?: CustomFluidProps;\n} & HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n customFluidProps,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n isSizeUpdate,\n type: THREE.HalfFloatType,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\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 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 // setUniform\n const updateParamsList = useMemo(\n () => ({\n advection: setUniform(materials.advectionMaterial),\n splat: setUniform(materials.splatMaterial),\n curl: setUniform(materials.curlMaterial),\n vorticity: setUniform(materials.vorticityMaterial),\n divergence: setUniform(materials.divergenceMaterial),\n clear: setUniform(materials.clearMaterial),\n pressure: setUniform(materials.pressureMaterial),\n gradientSubtract: setUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n // customSetUniform\n const updateCustomParamsList = useMemo<{\n [K in CustomizableKeys]: (customParams: CustomParams | undefined) => void;\n }>(\n () => ({\n advection: setCustomUniform(materials.advectionMaterial),\n splat: setCustomUniform(materials.splatMaterial),\n curl: setCustomUniform(materials.curlMaterial),\n vorticity: setCustomUniform(materials.vorticityMaterial),\n divergence: setCustomUniform(materials.divergenceMaterial),\n clear: setCustomUniform(materials.clearMaterial),\n pressure: setCustomUniform(materials.pressureMaterial),\n gradientSubtract: setCustomUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n\n const updateParams = useCallback(\n (newParams?: FluidParams, customParams?: CustomFluidParams) => {\n setParams(newParams);\n if (customParams) {\n Object.keys(customParams).forEach((key) => {\n updateCustomParamsList[key as CustomizableKeys](\n customParams[key as CustomizableKeys]\n );\n });\n }\n },\n [setParams, updateCustomParamsList]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FluidParams,\n customParams?: CustomFluidParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", read);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.velocityDissipation!\n );\n });\n\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", velocityTex);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.densityDissipation!\n );\n });\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n updateParamsList.splat(\"point\", pointerValues.currentPointer);\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocityAcceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splatRadius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluidColor === \"function\"\n ? params.fluidColor(pointerValues.velocity)\n : params.fluidColor!;\n updateParamsList.splat(\"color\", color);\n });\n }\n\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n updateParamsList.curl(\"uVelocity\", velocityTex);\n });\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n updateParamsList.vorticity(\"uVelocity\", read);\n updateParamsList.vorticity(\"uCurl\", curlTex);\n updateParamsList.vorticity(\"curl\", params.curlStrength!);\n });\n\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n updateParamsList.divergence(\"uVelocity\", velocityTex);\n });\n\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n updateParamsList.clear(\"uTexture\", read);\n updateParamsList.clear(\"value\", params.pressureDissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressureIterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n updateParamsList.pressure(\"uPressure\", read);\n });\n }\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n updateParamsList.gradientSubtract(\"uPressure\", pressureTexTemp);\n updateParamsList.gradientSubtract(\"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n updateParamsList,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n params,\n updateParams,\n ]\n );\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nuniform sampler2D uMap;\nuniform float uOpacity;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(uMap, uv).rgb;\n\tgl_FragColor = vec4(color,uOpacity);\n}","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n scene: THREE.Scene;\n texture?: THREE.Texture;\n};\n\nexport const useMesh = ({\n scale,\n max,\n texture,\n scene,\n onBeforeInit,\n}: UseMeshProps & MaterialProps) => {\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, onBeforeInit]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n const mesh = new THREE.Mesh(geometry.clone(), clonedMat);\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n temp.push(mesh);\n }\n return temp;\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.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 };\n }, [scene, meshArr]);\n\n return meshArr;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\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 fadeoutSpeed?: 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 fadeoutSpeed: 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,\n scale = 64,\n max = 100,\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateParams = useMemo(() => {\n return (newParams?: RippleParams, customParams?: CustomParams) => {\n setParams(newParams);\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.ShaderMaterial;\n mesh.rotation.z += params.rotation!;\n mesh.scale.x =\n params.fadeoutSpeed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\"uOpacity\", opacity * params.fadeoutSpeed!);\n if (opacity < 0.001) mesh.visible = false;\n }\n setCustomUniform(mesh.material)(customParams);\n });\n };\n }, [meshArr, params, setParams]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: RippleParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n const material = mesh.material as THREE.ShaderMaterial;\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 setUniform(material)(\"uOpacity\", params.alpha!);\n currentWave.current = (currentWave.current + 1) % max;\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { NOISE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: NOISE_PARAMS.scale },\n timeStrength: { value: NOISE_PARAMS.timeStrength },\n noiseOctaves: { value: NOISE_PARAMS.noiseOctaves },\n fbmOctaves: { value: NOISE_PARAMS.fbmOctaves },\n warpOctaves: { value: NOISE_PARAMS.warpOctaves },\n warpDirection: { value: NOISE_PARAMS.warpDirection },\n warpStrength: { value: NOISE_PARAMS.warpStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type NoiseParams = {\n /** noise scale , default : `0.004` */\n scale?: number;\n /** time factor default : `0.3` */\n timeStrength?: number;\n /** noiseOctaves, affects performance default : `2` */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default : `2` */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default : `2` */\n warpOctaves?: number;\n /** direction of domain warping , default : `(2.0,2,0)` */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default : `8.0` */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: NoiseParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: NoiseParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"scale\", params.scale!);\n updateValue(\"timeStrength\", params.timeStrength!);\n updateValue(\"noiseOctaves\", params.noiseOctaves!);\n updateValue(\"fbmOctaves\", params.fbmOctaves!);\n updateValue(\"warpOctaves\", params.warpOctaves!);\n updateValue(\"warpDirection\", params.warpDirection!);\n updateValue(\"warpStrength\", params.warpStrength!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COLORSTRATA_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n isTexture: { value: false },\n scale: { value: COLORSTRATA_PARAMS.scale },\n noise: { value: DEFAULT_TEXTURE },\n noiseStrength: { value: COLORSTRATA_PARAMS.noiseStrength },\n isNoise: { value: false },\n laminateLayer: { value: COLORSTRATA_PARAMS.laminateLayer },\n laminateInterval: {\n value: COLORSTRATA_PARAMS.laminateInterval,\n },\n laminateDetail: { value: COLORSTRATA_PARAMS.laminateDetail },\n distortion: { value: COLORSTRATA_PARAMS.distortion },\n colorFactor: { value: COLORSTRATA_PARAMS.colorFactor },\n uTime: { value: 0 },\n timeStrength: { value: COLORSTRATA_PARAMS.timeStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ColorStrataParams = {\n /** default : `null` */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : `1` */\n scale?: number;\n /** default : `1.0` */\n laminateLayer?: number;\n /** default : `(0.1, 0.1)` */\n laminateInterval?: THREE.Vector2;\n /** default : `(1.0, 1.0)` */\n laminateDetail?: THREE.Vector2;\n /** default : `(0.0, 0.0)` */\n distortion?: THREE.Vector2;\n /** default : `(1.0, 1.0, 1.0)` */\n colorFactor?: THREE.Vector3;\n /** default : `(0.0, 0.0)` */\n timeStrength?: THREE.Vector2;\n /** default : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n ColorStrataParams,\n ColorStrataObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ColorStrataParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ColorStrataParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture) {\n updateValue(\"uTexture\", params.texture);\n updateValue(\"isTexture\", true);\n } else {\n updateValue(\"isTexture\", false);\n updateValue(\"scale\", params.scale!);\n }\n\n if (params.noise) {\n updateValue(\"noise\", params.noise);\n updateValue(\"isNoise\", true);\n updateValue(\"noiseStrength\", params.noiseStrength!);\n } else {\n updateValue(\"isNoise\", false);\n }\n\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n updateValue(\"laminateLayer\", params.laminateLayer!);\n updateValue(\"laminateInterval\", params.laminateInterval!);\n updateValue(\"laminateDetail\", params.laminateDetail!);\n updateValue(\"distortion\", params.distortion!);\n updateValue(\"colorFactor\", params.colorFactor!);\n updateValue(\"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: MARBLE_PARAMS.pattern },\n u_complexity: { value: MARBLE_PARAMS.complexity },\n u_complexityAttenuation: {\n value: MARBLE_PARAMS.complexityAttenuation,\n },\n u_iterations: { value: MARBLE_PARAMS.iterations },\n u_timeStrength: { value: MARBLE_PARAMS.timeStrength },\n u_scale: { value: MARBLE_PARAMS.scale },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MarbleParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MarbleParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_pattern\", params.pattern!);\n updateValue(\"u_complexity\", params.complexity!);\n updateValue(\"u_complexityAttenuation\", params.complexityAttenuation!);\n updateValue(\"u_iterations\", params.iterations!);\n updateValue(\"u_timeStrength\", params.timeStrength!);\n updateValue(\"u_scale\", params.scale!);\n updateValue(\"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COSPALETTE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uRgbWeight: { value: COSPALETTE_PARAMS.rgbWeight },\n uColor1: { value: COSPALETTE_PARAMS.color1 },\n uColor2: { value: COSPALETTE_PARAMS.color2 },\n uColor3: { value: COSPALETTE_PARAMS.color3 },\n uColor4: { value: COSPALETTE_PARAMS.color4 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CosPaletteParams,\n ColorPaletteObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CosPaletteParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CosPaletteParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor1\", params.color1!);\n updateValue(\"uColor2\", params.color2!);\n updateValue(\"uColor3\", params.color3!);\n updateValue(\"uColor4\", params.color4!);\n updateValue(\"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { DUOTONE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: DuoToneParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DuoToneParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor0\", params.color0!);\n updateValue(\"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float uMapIntensity;\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#usf \n\n\t// color 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 alphaColor = vec3(mix(outputColor,mapColor,mixValue));\n\n\tgl_FragColor = vec4(alphaColor,alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n uMapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n u_alphaMap: { value: DEFAULT_TEXTURE },\n u_isAlphaMap: { value: false },\n uMapIntensity: { value: BLENDING_PARAMS.mapIntensity },\n u_brightness: { value: BLENDING_PARAMS.brightness },\n u_min: { value: BLENDING_PARAMS.min },\n u_max: { value: BLENDING_PARAMS.max },\n u_dodgeColor: { value: new THREE.Color() },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n if (params.alphaMap) {\n updateValue(\"u_alphaMap\", params.alphaMap!);\n updateValue(\"u_isAlphaMap\", true);\n } else {\n updateValue(\"u_isAlphaMap\", false);\n }\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n if (params.dodgeColor) {\n updateValue(\"u_dodgeColor\", params.dodgeColor);\n updateValue(\"u_isDodgeColor\", true);\n } else {\n updateValue(\"u_isDodgeColor\", false);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","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\t#usf \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 { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: DEFAULT_TEXTURE },\n uTexture1: { value: DEFAULT_TEXTURE },\n padding: { value: FXTEXTURE_PARAMS.padding },\n uMap: { value: DEFAULT_TEXTURE },\n edgeIntensity: { value: FXTEXTURE_PARAMS.edgeIntensity },\n mapIntensity: { value: FXTEXTURE_PARAMS.mapIntensity },\n epicenter: { value: FXTEXTURE_PARAMS.epicenter },\n progress: { value: FXTEXTURE_PARAMS.progress },\n dirX: { value: FXTEXTURE_PARAMS.dir?.x },\n dirY: { value: FXTEXTURE_PARAMS.dir?.y },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture0: DEFAULT_TEXTURE,\n texture1: DEFAULT_TEXTURE,\n padding: 0.0,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture0\", params.texture0!);\n updateValue(\"uTexture1\", params.texture1!);\n updateValue(\"progress\", params.progress!);\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n updateValue(\"uTextureResolution\", interpolatedResolution);\n updateValue(\"padding\", params.padding!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"mapIntensity\", params.mapIntensity!);\n updateValue(\"edgeIntensity\", params.edgeIntensity!);\n updateValue(\"epicenter\", params.epicenter!);\n updateValue(\"dirX\", params.dir!.x);\n updateValue(\"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { BRIGHTNESSPICKER_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n BrightnessPickerParams,\n BrightnessPickerObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrightnessPickerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrightnessPickerParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform float uMapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t#usf \n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXBLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n uMapIntensity: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n FxBlendingParams,\n FxBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n AlphaBlendingParams,\n AlphaBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: AlphaBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: AlphaBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: HSVParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: HSVParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\t#usf \n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n}\n\n","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CoverTextureParams,\n CoverTextureObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CoverTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CoverTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** blurSize, default : `3` */\n blurSize?: number;\n /** blurPower, affects performance default : `5` */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n SimpleBlurParams,\n SimpleBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: SimpleBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: SimpleBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n updateValue(\"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n for (let i = 0; i < params.blurPower!; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n MotionBlurParams,\n MotionBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MotionBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MotionBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uBegin\", params.begin!);\n updateValue(\"uEnd\", params.end!);\n updateValue(\"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, updateParams, params]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default : `vec2(0.0,0.0)` */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default : `0.0` */\n progress?: number;\n /** default : `0.0` */\n width?: number;\n /** default : `0.0` */\n strength?: number;\n /** default : `center` */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: WaveParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: WaveParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uEpicenter\", params.epicenter!);\n updateValue(\"uProgress\", params.progress!);\n updateValue(\"uWidth\", params.width!);\n updateValue(\"uStrength\", params.strength!);\n updateValue(\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { CHROMAKEY_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: CHROMAKEY_PARAMS.color },\n u_similarity: { value: CHROMAKEY_PARAMS.similarity },\n u_smoothness: { value: CHROMAKEY_PARAMS.smoothness },\n u_spill: { value: CHROMAKEY_PARAMS.spill },\n u_color: { value: CHROMAKEY_PARAMS.color },\n u_contrast: { value: CHROMAKEY_PARAMS.contrast },\n u_brightness: { value: CHROMAKEY_PARAMS.brightness },\n u_gamma: { value: CHROMAKEY_PARAMS.gamma },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ChromaKeyParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ChromaKeyParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_keyColor\", params.keyColor!);\n updateValue(\"u_similarity\", params.similarity!);\n updateValue(\"u_smoothness\", params.smoothness!);\n updateValue(\"u_spill\", params.spill!);\n updateValue(\"u_color\", params.color!);\n updateValue(\"u_contrast\", params.contrast!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 usf_Position = vec4(position,1.);\n\tvUv = uv;\n\n\t#usf
\n\t\n\tgl_Position = usf_Position;\n}","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec2 uResolution;\n\n#usf \n\nvoid main() {\n\tvec4 usf_FragColor = vec4(1.);\n\n\t#usf
\n\t\n\tgl_FragColor = usf_FragColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform, useResolution } from \"../../..\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlankMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uTime: { value: number };\n uPointer: { value: THREE.Vector2 };\n uResolution: { value: THREE.Vector2 };\n };\n}\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type BlankParams = {\n /** texture, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type BlankObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh<\n THREE.BufferGeometry,\n BlankMaterial\n >;\n material: BlankMaterial;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLANK_PARAMS: BlankParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n beat: false,\n});\n\n/**\n * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`.\n * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms.\n *\n * ※ `usf_FragColor` overrides `gl_FragColor`\n *\n * ※ `usf_Position` overrides `gl_Position`\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlank = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlankParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlankParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uPointer\", pointer);\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\nfloat random3D(vec3 co) {\n\treturn 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\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","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport {\n DEFAULT_TEXTURE,\n ISDEV,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\nimport { MaterialProps } from \"../../../types\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: {\n value: MORPHPARTICLES_PARAMS.morphProgress,\n },\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: DEFAULT_TEXTURE },\n uIsPicture: { value: false },\n uAlphaPicture: { value: DEFAULT_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: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uAlphaMap: { value: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.wobbleStrength,\n },\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: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMin,\n },\n uSizeRandomMax: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMax,\n },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: {\n value: MORPHPARTICLES_PARAMS.divergencePoint,\n },\n ...mapArrayUniforms,\n },\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n blending: THREE.AdditiveBlending,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeInit,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport {\n setUniform,\n CustomParams,\n setCustomUniform,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uMorphProgress\", newParams.morphProgress);\n updateValue(\"uBlurAlpha\", newParams.blurAlpha);\n updateValue(\"uBlurRadius\", newParams.blurRadius);\n updateValue(\"uPointSize\", newParams.pointSize);\n updateValue(\"uPointAlpha\", newParams.pointAlpha);\n if (newParams.picture) {\n updateValue(\"uPicture\", newParams.picture);\n updateValue(\"uIsPicture\", true);\n } else if (newParams.picture === false) {\n updateValue(\"uIsPicture\", false);\n }\n if (newParams.alphaPicture) {\n updateValue(\"uAlphaPicture\", newParams.alphaPicture);\n updateValue(\"uIsAlphaPicture\", true);\n } else if (newParams.alphaPicture === false) {\n updateValue(\"uIsAlphaPicture\", false);\n }\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n if (newParams.map) {\n updateValue(\"uMap\", newParams.map);\n updateValue(\"uIsMap\", true);\n } else if (newParams.map === false) {\n updateValue(\"uIsMap\", false);\n }\n if (newParams.alphaMap) {\n updateValue(\"uAlphaMap\", newParams.alphaMap);\n updateValue(\"uIsAlphaMap\", true);\n } else if (newParams.alphaMap === false) {\n updateValue(\"uIsAlphaMap\", false);\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n if (newParams.displacement) {\n updateValue(\"uDisplacement\", newParams.displacement);\n updateValue(\"uIsDisplacement\", true);\n } else if (newParams.displacement === false) {\n updateValue(\"uIsDisplacement\", false);\n }\n updateValue(\"uDisplacementIntensity\", newParams.displacementIntensity);\n updateValue(\n \"uDisplacementColorIntensity\",\n newParams.displacementColorIntensity\n );\n updateValue(\"uSizeRandomIntensity\", newParams.sizeRandomIntensity);\n updateValue(\n \"uSizeRandomTimeFrequency\",\n newParams.sizeRandomTimeFrequency\n );\n updateValue(\"uSizeRandomMin\", newParams.sizeRandomMin);\n updateValue(\"uSizeRandomMax\", newParams.sizeRandomMax);\n updateValue(\"uDivergence\", newParams.divergence);\n updateValue(\"uDivergencePoint\", newParams.divergencePoint);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n isSizeUpdate,\n renderTargetOptions,\n camera,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({\n scene,\n size,\n dpr,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n ) => {\n updateUniform(rootState, newParams, customParams);\n return updateRenderTarget(rootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: MorphParticlesParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\n\nexport const rewriteVertexShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform float uTime;\n\t\t\tuniform float uWobblePositionFrequency;\n\t\t\tuniform float uWobbleTimeFrequency;\n\t\t\tuniform float uWobbleStrength;\n\t\t\tuniform float uWarpPositionFrequency;\n\t\t\tuniform float uWarpTimeFrequency;\n\t\t\tuniform float uWarpStrength;\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\t\n\t\t\t// edge\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\n\t\t\t#usf \n\n\t\t\tvoid main() {\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 objectNormal = usf_Normal;\n\t\t\t#ifdef USE_TANGENT\n\t\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t\t#endif\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 transformed = usf_Position;\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\t\n\t\t\tvec3 usf_Position = position;\n\t\t\tvec3 usf_Normal = normal;\n\t\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\t\n\t\t\t// Neighbours positions\n\t\t\tfloat shift = 0.01;\n\t\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\t\n\t\t\t// wobble\n\t\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\t\n\t\t\tusf_Position += wobble * normal;\n\t\t\tpositionA += wobblePositionA * normal;\n\t\t\tpositionB += wobblePositionB * normal;\n\n\t\t\t// Compute normal\n\t\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\t\tusf_Normal = cross(toA, toB);\n\t\t\t\n\t\t\t// Varying\n\t\t\tvPosition = usf_Position.xy;\n\t\t\tvWobble = wobble/uWobbleStrength;\n\t\t\t\n\t\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t#include \n\n\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t} else {\n\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t}\n\t\t`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform vec3 uColor0;\n\t\t\tuniform vec3 uColor1;\n\t\t\tuniform vec3 uColor2;\n\t\t\tuniform vec3 uColor3;\n\t\t\tuniform float uColorMix;\n\t\t\tuniform float uEdgeThreshold;\n\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\n\t\t\t// transmission\n\t\t\tuniform float uChromaticAberration; \n\t\t\tuniform float uAnisotropicBlur; \n\t\t\tuniform float uTime;\n\t\t\tuniform float uDistortion;\n\t\t\tuniform float uDistortionScale;\n\t\t\tuniform float uTemporalDistortion;\n\t\t\tuniform float uRefractionSamples;\n\t\t\t\n\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\n\t\t\t#usf \n\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\n\t\t\tvoid main(){\n\t\t\t\t\n\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\n\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t`\n );\n};\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 < uRefractionSamples; 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) / uRefractionSamples,\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) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\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) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uRefractionSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport transmission_pars_fragment from \"../shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"../shaders/transmission_fragment.glsl\";\n\nexport const resolveEachMaterial = ({\n mat,\n isCustomTransmission,\n parameters,\n}: {\n mat: THREE.Material;\n isCustomTransmission: boolean;\n parameters: THREE.WebGLProgramParametersWithUniforms;\n}) => {\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n // if normalMap is defined, don't add tangent attribute\n if (!(mat as any).normalMap) {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\t\tattribute vec4 tangent;\n\t\t\t\t\n\t\t\t\tvoid main() {\n\t\t\t`\n );\n }\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps, OnBeforeInitParameters } from \"../../types\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\nimport { rewriteVertexShader } from \"./utils/rewriteVertexShader\";\nimport { rewriteFragmentShader } from \"./utils/rewriteFragmentShader\";\nimport { resolveEachMaterial } from \"./utils/resolveEachMaterial\";\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 uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uEdgeThreshold: { value: number };\n uEdgeColor: { value: THREE.Color };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uRefractionSamples: { value: number };\n };\n}\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\n\ntype WobbleMaterialParams =\n ConstructorParameters[0];\n\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n depthOnBeforeInit?: (parameters: OnBeforeInitParameters) => void;\n /**\n * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false`\n * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial\n * */\n isCustomTransmission?: boolean;\n}\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n isCustomTransmission = false,\n onBeforeInit,\n depthOnBeforeInit,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\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 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 uEdgeThreshold: { value: WOBBLE3D_PARAMS.edgeThreshold },\n uEdgeColor: { value: WOBBLE3D_PARAMS.edgeColor },\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 uRefractionSamples: { value: WOBBLE3D_PARAMS.refractionSamples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (parameters) => {\n rewriteVertexShader(parameters);\n\n rewriteFragmentShader(parameters);\n\n resolveEachMaterial({\n parameters,\n mat,\n isCustomTransmission,\n });\n\n const cutomizedParams = createMaterialParameters(\n {\n fragmentShader: parameters.fragmentShader,\n vertexShader: parameters.vertexShader,\n // Because wobble3D uses userData to update uniforms.\n uniforms: mat.userData.uniforms,\n },\n onBeforeInit\n );\n parameters.fragmentShader = cutomizedParams.fragmentShader;\n parameters.vertexShader = cutomizedParams.vertexShader;\n Object.assign(parameters.uniforms, cutomizedParams.uniforms);\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 = (parameters) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n rewriteVertexShader(parameters);\n createMaterialParameters(parameters, depthOnBeforeInit);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeInit,\n depthOnBeforeInit,\n isCustomTransmission,\n ]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport {\n setUniform,\n setCustomUniform,\n CustomParams,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n) => void;\n\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 isCustomTransmission,\n baseMaterial,\n materialParameters,\n onBeforeInit,\n depthOnBeforeInit,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n\n const updateValue = setUniform(userData);\n const updateCustomValue = setCustomUniform(userData);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n updateValue(\"uColorMix\", newParams.colorMix);\n updateValue(\"uEdgeThreshold\", newParams.edgeThreshold);\n updateValue(\"uEdgeColor\", newParams.edgeColor);\n updateValue(\"uChromaticAberration\", newParams.chromaticAberration);\n updateValue(\"uAnisotropicBlur\", newParams.anisotropicBlur);\n updateValue(\"uDistortion\", newParams.distortion);\n updateValue(\"uDistortionScale\", newParams.distortionScale);\n updateValue(\"uRefractionSamples\", newParams.refractionSamples);\n updateValue(\"uTemporalDistortion\", newParams.temporalDistortion);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type Wobble3DParams = {\n /** default : `0.3` */\n wobbleStrength?: number;\n /** default : `0.3` */\n wobblePositionFrequency?: number;\n /** default : `0.3` */\n wobbleTimeFrequency?: number;\n /** default : `0.3` */\n warpStrength?: number;\n /** default : `0.3` */\n warpPositionFrequency?: number;\n /** default : `0.3` */\n warpTimeFrequency?: 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 /** Threshold of edge. 0 for edge disabled, default : `0` */\n edgeThreshold?: number;\n /** Color of edge. default : `0x000000` */\n edgeColor?: THREE.Color;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n chromaticAberration?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n distortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n distortionScale?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n temporalDistortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `6` */\n refractionSamples?: number;\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 wobbleStrength: 0.3,\n wobblePositionFrequency: 0.3,\n wobbleTimeFrequency: 0.3,\n warpStrength: 0.3,\n warpPositionFrequency: 0.3,\n warpTimeFrequency: 0.3,\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 edgeThreshold: 0.0,\n edgeColor: new THREE.Color(0x000000),\n chromaticAberration: 0.1,\n anisotropicBlur: 0.1,\n distortion: 0.0,\n distortionScale: 0.1,\n temporalDistortion: 0.0,\n refractionSamples: 6,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n RootState: RootState,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n ) => {\n updateUniform(RootState, newParams, customParams);\n return updateRenderTarget(RootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: Wobble3DParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(() => {\n const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","import { useMemo, useRef } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst checkUpdate = (\n currentW: number,\n currentH: number,\n memoW: number,\n memoH: number,\n threshold: number,\n boundFor: \"smaller\" | \"larger\" | \"both\"\n) => {\n const isSmaller =\n currentW < memoW - threshold || currentH < memoH - threshold;\n const isLarger =\n currentW > memoW + threshold || currentH > memoH + threshold;\n\n return (\n (boundFor === \"smaller\" && isSmaller) ||\n (boundFor === \"larger\" && isLarger) ||\n (boundFor === \"both\" && (isSmaller || isLarger))\n );\n};\n\nexport const useResizeBoundary = ({\n size,\n boundFor,\n threshold,\n}: {\n size: Size;\n boundFor: \"smaller\" | \"larger\" | \"both\";\n threshold: number;\n}) => {\n const memorizedSize = useRef(size);\n\n const isBeyondBoundary = useMemo(() => {\n const { width: currentW, height: currentH } = size;\n const { width: memoW, height: memoH } = memorizedSize.current;\n\n const isUpdate = checkUpdate(\n currentW,\n currentH,\n memoW,\n memoH,\n threshold,\n boundFor\n );\n\n if (isUpdate) {\n memorizedSize.current = size;\n }\n return isUpdate;\n }, [size, boundFor, threshold]);\n\n return isBeyondBoundary;\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/Easings\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 scene,\n onBeforeInit,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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]\n ? params.boderRadius![i]\n : 0.0,\n },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n customParams?: CustomParams;\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 ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n updateValue(\"u_texture\", params.texture![i]);\n updateValue(\"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n updateValue(\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n updateValue(\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n updateCustomValue(customParams);\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\nimport { getDpr } from \"../../utils/getDpr\";\nimport { CustomParams } from \"../../utils/setUniforms\";\nimport { DEFAULT_TEXTURE } from \"../../libs/constants\";\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, isSizeUpdate, renderTargetOptions, onBeforeInit }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => DEFAULT_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 updateParams = useMemo(() => {\n return (newParams?: DomSyncerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateDomRects({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n };\n }, [isIntersectingRef, setParams, updateDomRects, size, scene, params]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DomSyncerParams,\n customParams?: CustomParams\n ) => {\n const { gl, size } = rootState;\n\n updateParams(newParams, customParams);\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 onBeforeInit,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n intersectionHandler,\n onBeforeInit,\n updateParams,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport {\n UseFboProps,\n renderFBO,\n FBO_DEFAULT_OPTION,\n} 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 props: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...targetSettings\n } = props;\n\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_DEFAULT_OPTION,\n ...targetSettings,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","type Utils = {\n interpolate: (\n startValue: number,\n endValue: number,\n progress: number,\n threshold?: number\n ) => number;\n};\n\nexport const Utils: Utils = Object.freeze({\n interpolate(startValue, endValue, progress, threshold = 1e-6): number {\n const result = startValue + (endValue - startValue) * progress;\n return Math.abs(result) < threshold ? 0 : result;\n },\n});\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVertex_default","defaultVertex_default","hsv2rgb_default","rgb2hsv_default","ShaderChunk","wobble3D","snoise","coverTexture","fxBlending","planeVertex","defaultVertex","hsv2rgb","rgb2hsv","includePattern","includeReplacer","match","include","resolveIncludes","string","createMaterialParameters","parameters","onBeforeInit","useMesh","BRUSH_PARAMS","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","paramsRef","setParams","newParams","paramKey","FBO_DEFAULT_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","props","isSizeUpdate","depth","renderTargetOptions","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","read","write","_b","getDpr","useBrush","_dpr","updatePointer","pressureEnd","updateValue","updateCustomValue","updateParams","rootState","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","DELTA_TIME","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplatMaterial","useCustomMaterial","materialHook","materialProps","customFluidProps","curl","vorticity","advection","divergence","pressure","clear","gradientSubtract","splat","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","scaledDiffVec","spaltVec","updateParamsList","updateCustomParamsList","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","clonedMat","RIPPLE_PARAMS","useRipple","currentWave","opacity","NOISE_PARAMS","useNoise","clock","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","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","BLANK_PARAMS","useBlank","useCreateObject","points","interactiveMesh","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","rewritedFragmentShader","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","transmission_pars_fragment_default","transmission_fragment_default","resolveEachMaterial","mat","isCustomTransmission","transmission_pars_fragment","transmission_fragment","baseMaterial","materialParameters","depthOnBeforeInit","depthMaterial","WOBBLE3D_PARAMS","cutomizedParams","depthMat","useCreateWobble3D","wobbleGeometry","mergeVertices","userData","useWobble3D","RootState","useAddMesh","checkUpdate","currentW","currentH","memoW","memoH","threshold","boundFor","isSmaller","isLarger","useResizeBoundary","memorizedSize","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","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","targetSettings","renderTargetArr","updateCopyTexture","Utils","startValue","endValue","progress","result"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SCAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"} \ No newline at end of file diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs b/packages/use-shader-fx/build/use-shader-fx.umd.cjs index 155b45a1..14b4eea4 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(S,ve){typeof exports=="object"&&typeof module<"u"?ve(exports,require("three"),require("react"),require("three-stdlib")):typeof define=="function"&&define.amd?define(["exports","three","react","three-stdlib"],ve):(S=typeof globalThis<"u"?globalThis:S||self,ve(S["use-shader-fx"]={},S.THREE,S.React,S.THREEStdlib))})(this,function(S,ve,i,qe){"use strict";function We(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const a=We(ve);var Ne="#usf ",Ge=`precision highp float; +(function(b,me){typeof exports=="object"&&typeof module<"u"?me(exports,require("three"),require("react"),require("three-stdlib")):typeof define=="function"&&define.amd?define(["exports","three","react","three-stdlib"],me):(b=typeof globalThis<"u"?globalThis:b||self,me(b["use-shader-fx"]={},b.THREE,b.React,b.THREEStdlib))})(this,function(b,me,i,$e){"use strict";function je(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const a=je(me);var qe="#usf ",We=`precision highp float; uniform sampler2D uBuffer; uniform sampler2D uTexture; @@ -107,7 +107,7 @@ void main() { vec4 finalColor = mix(bufferColor, brushColor, isOnLine); gl_FragColor = finalColor; -}`;const G=(e,n=!1)=>{const t=n?e.width*n:e.width,r=n?e.height*n:e.height;return i.useMemo(()=>new a.Vector2(t,r),[t,r])},P=e=>(n,t)=>{if(t===void 0)return;const r=e.uniforms;r&&r[n]&&(r[n].value=t)},V=e=>n=>{n!==void 0&&Object.keys(n).forEach(t=>{const r=e.uniforms;r&&r[t]&&(r[t].value=n[t])})},L=(e,n,t,r)=>{const s=i.useMemo(()=>{const m=new r(n,t);return e&&e.add(m),m},[n,t,r,e]);return i.useEffect(()=>()=>{e&&e.remove(s),n.dispose(),t.dispose()},[e,n,t,s]),s},De=process.env.NODE_ENV==="development",I={transparent:!1,depthTest:!1,depthWrite:!1},_=new a.DataTexture(new Uint8Array([0,0,0,0]),1,1,a.RGBAFormat);var Ke=`vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +}`;const N=(e,n=!1)=>{const t=n?e.width*n:e.width,r=n?e.height*n:e.height;return i.useMemo(()=>new a.Vector2(t,r),[t,r])},P=e=>(n,t)=>{if(t===void 0)return;const r=e.uniforms;r&&r[n]&&(r[n].value=t)},A=e=>n=>{n!==void 0&&Object.keys(n).forEach(t=>{const r=e.uniforms;r&&r[t]&&(r[t].value=n[t])})},B=(e,n,t,r)=>{const s=i.useMemo(()=>{const m=new r(n,t);return e&&e.add(m),m},[n,t,r,e]);return i.useEffect(()=>()=>{e&&e.remove(s),n.dispose(),t.dispose()},[e,n,t,s]),s},we=process.env.NODE_ENV==="development",F={transparent:!1,depthTest:!1,depthWrite:!1},C=new a.DataTexture(new Uint8Array([0,0,0,0]),1,1,a.RGBAFormat);var Ne=`vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} float permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));} vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} float taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;} @@ -214,7 +214,7 @@ float getWobble(vec3 position) warpedPosition * uWobblePositionFrequency, uTime * uWobbleTimeFrequency )) * uWobbleStrength; -}`,He=`vec3 random3(vec3 c) { +}`,Ge=`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); @@ -267,35 +267,35 @@ float snoiseFractal(vec3 m) { +0.2666667* snoise(2.0*m) +0.1333333* snoise(4.0*m) +0.0666667* snoise(8.0*m); -}`,Xe=`float screenAspect = uResolution.x / uResolution.y; +}`,Ke=`float screenAspect = uResolution.x / uResolution.y; float textureAspect = uTextureResolution.x / uTextureResolution.y; vec2 aspectRatio = vec2( min(screenAspect / textureAspect, 1.0), min(textureAspect / screenAspect, 1.0) ); -vec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;`,Ye=`vec3 mapColor = texture2D(uMap, uv).rgb; +vec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;`,He=`vec3 mapColor = texture2D(uMap, uv).rgb; vec3 normalizedMap = mapColor * 2.0 - 1.0; uv = uv * 2.0 - 1.0; uv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity); -uv = (uv + 1.0) / 2.0;`,Qe=`precision highp float; +uv = (uv + 1.0) / 2.0;`,Xe=`precision highp float; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); -}`,Ze=`varying vec2 vUv; +}`,Ye=`varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -}`,Je=`vec3 hsv2rgb(vec3 c) +}`,Qe=`vec3 hsv2rgb(vec3 c) { vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); -}`,en=`vec3 rgb2hsv(vec3 c) +}`,Ze=`vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); @@ -304,7 +304,7 @@ void main() { float d = q.x - min(q.w, q.y); float e = 1.0e-10; return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); -}`;const Re=Object.freeze({wobble3D:Ke,snoise:He,coverTexture:Xe,fxBlending:Ye,planeVertex:Qe,defaultVertex:Ze,hsv2rgb:Je,rgb2hsv:en}),nn=/^[ \t]*#usf +<([\w\d./]+)>/gm;function tn(e,n){return Se(Re[n]||"")}function Se(e){return e.replace(nn,tn)}const F=(e,n)=>(n&&n(e),e.vertexShader=Se(e.vertexShader),e.fragmentShader=Se(e.fragmentShader),e),rn=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uBuffer:{value:_},uResolution:{value:new a.Vector2(0,0)},uTexture:{value:_},uIsTexture:{value:!1},uMap:{value:_},uIsMap:{value:!1},uMapIntensity:{value:Q.mapIntensity},uRadius:{value:Q.radius},uSmudge:{value:Q.smudge},uDissipation:{value:Q.dissipation},uMotionBlur:{value:Q.motionBlur},uMotionSample:{value:Q.motionSample},uMouse:{value:new a.Vector2(-10,-10)},uPrevMouse:{value:new a.Vector2(-10,-10)},uVelocity:{value:new a.Vector2(0,0)},uColor:{value:Q.color},uIsCursor:{value:!1},uPressureStart:{value:1},uPressureEnd:{value:1}},vertexShader:Ne,fragmentShader:Ge},r),...I,transparent:!0}),[r]),f=G(n,t);P(m)("uResolution",f.clone());const c=L(e,s,m,a.Mesh);return{material:m,mesh:c}},on=(e,n)=>{const t=n,r=e/n,[s,m]=[t*r/2,t/2];return{width:s,height:m,near:-1e3,far:1e3}},k=(e,n="OrthographicCamera")=>{const t=G(e),{width:r,height:s,near:m,far:f}=on(t.x,t.y);return i.useMemo(()=>n==="OrthographicCamera"?new a.OrthographicCamera(-r,r,s,-s,m,f):new a.PerspectiveCamera(50,r/s),[r,s,m,f,n])},he=(e=0)=>{const n=i.useRef(new a.Vector2(0,0)),t=i.useRef(new a.Vector2(0,0)),r=i.useRef(new a.Vector2(0,0)),s=i.useRef(0),m=i.useRef(new a.Vector2(0,0)),f=i.useRef(!1);return i.useCallback(u=>{const p=performance.now();let h;f.current&&e?(r.current=r.current.lerp(u,1-e),h=r.current.clone()):(h=u.clone(),r.current=h),s.current===0&&(s.current=p,n.current=h);const M=Math.max(1,p-s.current);s.current=p,m.current.copy(h).sub(n.current).divideScalar(M);const v=m.current.length()>0,l=f.current?n.current.clone():h;return!f.current&&v&&(f.current=!0),n.current=h,{currentPointer:h,prevPointer:l,diffPointer:t.current.subVectors(h,l),velocity:m.current,isVelocityUpdate:v}},[e])},$=e=>{const n=s=>Object.values(s).some(m=>typeof m=="function"),t=i.useRef(n(e)?e:structuredClone(e)),r=i.useCallback(s=>{if(s!==void 0)for(const m in s){const f=m;f in t.current&&s[f]!==void 0&&s[f]!==null?t.current[f]=s[f]:console.error(`"${String(f)}" does not exist in the params. or "${String(f)}" is null | undefined`)}},[]);return[t.current,r]},pe={depthBuffer:!1},xe=({gl:e,fbo:n,scene:t,camera:r,onBeforeRender:s,onSwap:m})=>{e.setRenderTarget(n),s(),e.clear(),e.render(t,r),m&&m(),e.setRenderTarget(null),e.clear()},j=e=>{var M;const{scene:n,camera:t,size:r,dpr:s=!1,isSizeUpdate:m=!1,depth:f=!1,...c}=e,u=i.useRef(),p=G(r,s);u.current=i.useMemo(()=>{const v=new a.WebGLRenderTarget(p.x,p.y,{...pe,...c});return f&&(v.depthTexture=new a.DepthTexture(p.x,p.y,a.FloatType)),v},[]),m&&((M=u.current)==null||M.setSize(p.x,p.y)),i.useEffect(()=>{const v=u.current;return()=>{v==null||v.dispose()}},[]);const h=i.useCallback((v,l)=>{const d=u.current;return xe({gl:v,fbo:d,scene:n,camera:t,onBeforeRender:()=>l&&l({read:d.texture})}),d.texture},[n,t]);return[u.current,h]},te=e=>{var M,v;const{scene:n,camera:t,size:r,dpr:s=!1,isSizeUpdate:m=!1,depth:f=!1,...c}=e,u=G(r,s),p=i.useMemo(()=>{const l=new a.WebGLRenderTarget(u.x,u.y,{...pe,...c}),d=new a.WebGLRenderTarget(u.x,u.y,{...pe,...c});return f&&(l.depthTexture=new a.DepthTexture(u.x,u.y,a.FloatType),d.depthTexture=new a.DepthTexture(u.x,u.y,a.FloatType)),{read:l,write:d,swap:function(){let o=this.read;this.read=this.write,this.write=o}}},[]);m&&((M=p.read)==null||M.setSize(u.x,u.y),(v=p.write)==null||v.setSize(u.x,u.y)),i.useEffect(()=>{const l=p;return()=>{var d,o;(d=l.read)==null||d.dispose(),(o=l.write)==null||o.dispose()}},[p]);const h=i.useCallback((l,d)=>{var x;const o=p;return xe({gl:l,scene:n,camera:t,fbo:o.write,onBeforeRender:()=>d&&d({read:o.read.texture,write:o.write.texture}),onSwap:()=>o.swap()}),(x=o.read)==null?void 0:x.texture},[n,t,p]);return[{read:p.read,write:p.write},h]},U=e=>typeof e=="number"?{shader:e,fbo:e}:{shader:e.shader??!1,fbo:e.fbo??!1},Q=Object.freeze({texture:!1,map:!1,mapIntensity:.1,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new a.Vector3(1,0,0),isCursor:!1,pressure:1,pointerValues:!1}),an=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=rn({scene:c,size:e,dpr:f.shader,onBeforeInit:m}),h=k(e),M=he(),[v,l]=te({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[d,o]=$(Q),x=i.useRef(null),y=P(u),w=V(u),g=i.useCallback((C,T)=>{o(C),w(T)},[o,w]);return[i.useCallback((C,T,D)=>{const{gl:z,pointer:O}=C;g(T,D),d.texture?(y("uIsTexture",!0),y("uTexture",d.texture)):y("uIsTexture",!1),d.map?(y("uIsMap",!0),y("uMap",d.map),y("uMapIntensity",d.mapIntensity)):y("uIsMap",!1),y("uRadius",d.radius),y("uSmudge",d.smudge),y("uDissipation",d.dissipation),y("uMotionBlur",d.motionBlur),y("uMotionSample",d.motionSample);const A=d.pointerValues||M(O);A.isVelocityUpdate&&(y("uMouse",A.currentPointer),y("uPrevMouse",A.prevPointer)),y("uVelocity",A.velocity);const B=typeof d.color=="function"?d.color(A.velocity):d.color;return y("uColor",B),y("uIsCursor",d.isCursor),y("uPressureEnd",d.pressure),x.current===null&&(x.current=d.pressure),y("uPressureStart",x.current),x.current=d.pressure,l(z,({read:R})=>{y("uBuffer",R)})},[y,M,l,d,g]),g,{scene:c,mesh:p,material:u,camera:h,renderTarget:v,output:v.read.texture}]};var Z=`varying vec2 vUv; +}`;const De=Object.freeze({wobble3D:Ne,snoise:Ge,coverTexture:Ke,fxBlending:He,planeVertex:Xe,defaultVertex:Ye,hsv2rgb:Qe,rgb2hsv:Ze}),Je=/^[ \t]*#usf +<([\w\d./]+)>/gm;function en(e,n){return be(De[n]||"")}function be(e){return e.replace(Je,en)}const V=(e,n)=>(n&&n(e),e.vertexShader=be(e.vertexShader),e.fragmentShader=be(e.fragmentShader),e),nn=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uBuffer:{value:C},uResolution:{value:new a.Vector2(0,0)},uTexture:{value:C},uIsTexture:{value:!1},uMap:{value:C},uIsMap:{value:!1},uMapIntensity:{value:Y.mapIntensity},uRadius:{value:Y.radius},uSmudge:{value:Y.smudge},uDissipation:{value:Y.dissipation},uMotionBlur:{value:Y.motionBlur},uMotionSample:{value:Y.motionSample},uMouse:{value:new a.Vector2(-10,-10)},uPrevMouse:{value:new a.Vector2(-10,-10)},uVelocity:{value:new a.Vector2(0,0)},uColor:{value:Y.color},uIsCursor:{value:!1},uPressureStart:{value:1},uPressureEnd:{value:1}},vertexShader:qe,fragmentShader:We},r),...F,transparent:!0}),[r]),c=N(n,t);P(m)("uResolution",c.clone());const u=B(e,s,m,a.Mesh);return{material:m,mesh:u}},tn=(e,n)=>{const t=n,r=e/n,[s,m]=[t*r/2,t/2];return{width:s,height:m,near:-1e3,far:1e3}},E=(e,n="OrthographicCamera")=>{const t=N(e),{width:r,height:s,near:m,far:c}=tn(t.x,t.y);return i.useMemo(()=>n==="OrthographicCamera"?new a.OrthographicCamera(-r,r,s,-s,m,c):new a.PerspectiveCamera(50,r/s),[r,s,m,c,n])},ge=(e=0)=>{const n=i.useRef(new a.Vector2(0,0)),t=i.useRef(new a.Vector2(0,0)),r=i.useRef(new a.Vector2(0,0)),s=i.useRef(0),m=i.useRef(new a.Vector2(0,0)),c=i.useRef(!1);return i.useCallback(d=>{const p=performance.now();let x;c.current&&e?(r.current=r.current.lerp(d,1-e),x=r.current.clone()):(x=d.clone(),r.current=x),s.current===0&&(s.current=p,n.current=x);const M=Math.max(1,p-s.current);s.current=p,m.current.copy(x).sub(n.current).divideScalar(M);const o=m.current.length()>0,h=c.current?n.current.clone():x;return!c.current&&o&&(c.current=!0),n.current=x,{currentPointer:x,prevPointer:h,diffPointer:t.current.subVectors(x,h),velocity:m.current,isVelocityUpdate:o}},[e])},L=e=>{const n=s=>Object.values(s).some(m=>typeof m=="function"),t=i.useRef(n(e)?e:structuredClone(e)),r=i.useCallback(s=>{if(s!==void 0)for(const m in s){const c=m;c in t.current&&s[c]!==void 0&&s[c]!==null?t.current[c]=s[c]:console.error(`"${String(c)}" does not exist in the params. or "${String(c)}" is null | undefined`)}},[]);return[t.current,r]},ve={depthBuffer:!1},he=({gl:e,fbo:n,scene:t,camera:r,onBeforeRender:s,onSwap:m})=>{e.setRenderTarget(n),s(),e.clear(),e.render(t,r),m&&m(),e.setRenderTarget(null),e.clear()},k=e=>{var M;const{scene:n,camera:t,size:r,dpr:s=!1,isSizeUpdate:m=!1,depth:c=!1,...u}=e,d=i.useRef(),p=N(r,s);d.current=i.useMemo(()=>{const o=new a.WebGLRenderTarget(p.x,p.y,{...ve,...u});return c&&(o.depthTexture=new a.DepthTexture(p.x,p.y,a.FloatType)),o},[]),m&&((M=d.current)==null||M.setSize(p.x,p.y)),i.useEffect(()=>{const o=d.current;return()=>{o==null||o.dispose()}},[]);const x=i.useCallback((o,h)=>{const l=d.current;return he({gl:o,fbo:l,scene:n,camera:t,onBeforeRender:()=>h&&h({read:l.texture})}),l.texture},[n,t]);return[d.current,x]},ne=e=>{var M,o;const{scene:n,camera:t,size:r,dpr:s=!1,isSizeUpdate:m=!1,depth:c=!1,...u}=e,d=N(r,s),p=i.useMemo(()=>{const h=new a.WebGLRenderTarget(d.x,d.y,{...ve,...u}),l=new a.WebGLRenderTarget(d.x,d.y,{...ve,...u});return c&&(h.depthTexture=new a.DepthTexture(d.x,d.y,a.FloatType),l.depthTexture=new a.DepthTexture(d.x,d.y,a.FloatType)),{read:h,write:l,swap:function(){let v=this.read;this.read=this.write,this.write=v}}},[]);m&&((M=p.read)==null||M.setSize(d.x,d.y),(o=p.write)==null||o.setSize(d.x,d.y)),i.useEffect(()=>{const h=p;return()=>{var l,v;(l=h.read)==null||l.dispose(),(v=h.write)==null||v.dispose()}},[p]);const x=i.useCallback((h,l)=>{var f;const v=p;return he({gl:h,scene:n,camera:t,fbo:v.write,onBeforeRender:()=>l&&l({read:v.read.texture,write:v.write.texture}),onSwap:()=>v.swap()}),(f=v.read)==null?void 0:f.texture},[n,t,p]);return[{read:p.read,write:p.write},x]},O=e=>typeof e=="number"?{shader:e,fbo:e}:{shader:e.shader??!1,fbo:e.fbo??!1},Y=Object.freeze({texture:!1,map:!1,mapIntensity:.1,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new a.Vector3(1,0,0),isCursor:!1,pressure:1,pointerValues:!1}),rn=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=nn({scene:c,size:e,dpr:m.shader,onBeforeInit:s}),p=E(e),x=ge(),[M,o]=ne({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[h,l]=L(Y),v=i.useRef(null),f=P(u),T=A(u),y=i.useCallback((S,_)=>{l(S),T(_)},[l,T]);return[i.useCallback((S,_,D)=>{const{gl:I,pointer:z}=S;y(_,D),h.texture?(f("uIsTexture",!0),f("uTexture",h.texture)):f("uIsTexture",!1),h.map?(f("uIsMap",!0),f("uMap",h.map),f("uMapIntensity",h.mapIntensity)):f("uIsMap",!1),f("uRadius",h.radius),f("uSmudge",h.smudge),f("uDissipation",h.dissipation),f("uMotionBlur",h.motionBlur),f("uMotionSample",h.motionSample);const R=h.pointerValues||x(z);R.isVelocityUpdate&&(f("uMouse",R.currentPointer),f("uPrevMouse",R.prevPointer)),f("uVelocity",R.velocity);const j=typeof h.color=="function"?h.color(R.velocity):h.color;return f("uColor",j),f("uIsCursor",h.isCursor),f("uPressureEnd",h.pressure),v.current===null&&(v.current=h.pressure),f("uPressureStart",v.current),v.current=h.pressure,o(I,({read:w})=>{f("uBuffer",w)})},[f,x,o,h,y]),y,{scene:c,mesh:d,material:u,camera:p,renderTarget:M,output:M.read.texture}]};var Q=`varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; @@ -318,11 +318,11 @@ void main () { vT = vUv + vec2(0.0, texelSize.y); vB = vUv - vec2(0.0, texelSize.y); gl_Position = vec4(position, 1.0); -}`,un=`precision highp float; +}`,on=`precision highp float; void main(){ gl_FragColor = vec4(0.0); -}`;const sn=()=>i.useMemo(()=>new a.ShaderMaterial({vertexShader:Z,fragmentShader:un,...I}),[]);var ln=`precision highp float; +}`;const an=()=>i.useMemo(()=>new a.ShaderMaterial({vertexShader:Q,fragmentShader:on,...F}),[]);var un=`precision highp float; varying vec2 vUv; uniform sampler2D uVelocity; @@ -334,7 +334,7 @@ uniform float dissipation; void main () { vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; gl_FragColor = vec4(dissipation * texture2D(uSource, coord).rgb,1.); -}`;const cn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uVelocity:{value:_},uSource:{value:_},texelSize:{value:new a.Vector2},dt:{value:Ce},dissipation:{value:0}},vertexShader:Z,fragmentShader:ln},e),...I}),[e]);var mn=`precision highp float; +}`;const sn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uVelocity:{value:C},uSource:{value:C},texelSize:{value:new a.Vector2},dt:{value:Se},dissipation:{value:0}},vertexShader:Q,fragmentShader:un},e),...F}),[e]);var ln=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -358,7 +358,7 @@ void main () { float B = sampleVelocity(vB).y; float div = 0.5 * (R - L + T - B); gl_FragColor = vec4(div, 0.0, 0.0, 1.0); -}`;const vn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uVelocity:{value:null},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:mn},e),...I}),[e]);var pn=`precision highp float; +}`;const cn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uVelocity:{value:null},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:ln},e),...F}),[e]);var mn=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -377,7 +377,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 fn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:pn},e),...I}),[e]);var dn=`precision highp float; +}`;const vn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:mn},e),...F}),[e]);var pn=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -393,7 +393,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 gn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uVelocity:{value:null},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:dn},e),...I}),[e]);var hn=`precision highp float; +}`;const fn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uVelocity:{value:null},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:pn},e),...F}),[e]);var dn=`precision highp float; varying vec2 vUv; varying vec2 vT; @@ -411,7 +411,7 @@ void main () { force *= 1.0 / length(force + 0.00001) * curl * C; vec2 vel = texture2D(uVelocity, vUv).xy; gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); -}`;const xn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:Ce},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:hn},e),...I}),[e]);var Mn=`precision highp float; +}`;const gn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:Se},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:dn},e),...F}),[e]);var hn=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -419,7 +419,7 @@ uniform float value; void main () { gl_FragColor = value * texture2D(uTexture, vUv); -}`;const yn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},value:{value:0},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:Mn},e),...I}),[e]);var bn=`precision highp float; +}`;const xn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},value:{value:0},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:hn},e),...F}),[e]);var Mn=`precision highp float; varying vec2 vUv; varying vec2 vL; @@ -437,7 +437,7 @@ void main () { vec2 velocity = texture2D(uVelocity, vUv).xy; velocity.xy -= vec2(R - L, T - B); gl_FragColor = vec4(velocity, 0.0, 1.0); -}`;const Sn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uPressure:{value:_},uVelocity:{value:_},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:bn},e),...I}),[e]);var Cn=`precision highp float; +}`;const yn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uPressure:{value:C},uVelocity:{value:C},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:Mn},e),...F}),[e]);var bn=`precision highp float; varying vec2 vUv; uniform sampler2D uTarget; @@ -453,7 +453,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 _n=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTarget:{value:_},aspectRatio:{value:0},color:{value:new a.Vector3},point:{value:new a.Vector2},radius:{value:0},texelSize:{value:new a.Vector2}},vertexShader:Z,fragmentShader:Cn},e),...I}),[e]),J=(e,n)=>e(n??{}),Tn=({scene:e,size:n,dpr:t,customFluidProps:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),{curl:m,vorticity:f,advection:c,divergence:u,pressure:p,clear:h,gradientSubtract:M,splat:v}=r??{},l=J(sn),d=l.clone(),o=J(gn,m),x=J(xn,f),y=J(cn,c),w=J(vn,u),g=J(fn,p),b=J(yn,h),C=J(Sn,M),T=J(_n,v),D=i.useMemo(()=>({vorticityMaterial:x,curlMaterial:o,advectionMaterial:y,divergenceMaterial:w,pressureMaterial:g,clearMaterial:b,gradientSubtractMaterial:C,splatMaterial:T}),[x,o,y,w,g,b,C,T]),z=G(n,t);i.useMemo(()=>{P(D.splatMaterial)("aspectRatio",z.x/z.y);for(const B of Object.values(D))P(B)("texelSize",new a.Vector2(1/z.x,1/z.y))},[z,D]);const O=L(e,s,l,a.Mesh);i.useMemo(()=>{l.dispose(),O.material=d},[l,O,d]),i.useEffect(()=>()=>{for(const B of Object.values(D))B.dispose()},[D]);const A=i.useCallback(B=>{O.material=B,O.material.needsUpdate=!0},[O]);return{materials:D,setMeshMaterial:A,mesh:O}},Ce=.016,Pe=Object.freeze({densityDissipation:.98,velocityDissipation:.99,velocityAcceleration:10,pressureDissipation:.9,pressureIterations:20,curlStrength:35,splatRadius:.002,fluidColor:new a.Vector3(1,1,1),pointerValues:!1}),wn=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,customFluidProps:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{materials:u,setMeshMaterial:p,mesh:h}=Tn({scene:c,size:e,dpr:f.shader,customFluidProps:m}),M=k(e),v=he(),l=i.useMemo(()=>({scene:c,camera:M,dpr:f.fbo,size:e,samples:t,isSizeUpdate:s,type:a.HalfFloatType,...r}),[c,M,e,t,f.fbo,s,r]),[d,o]=te(l),[x,y]=te(l),[w,g]=j(l),[b,C]=j(l),[T,D]=te(l),z=i.useRef(new a.Vector2(0,0)),O=i.useRef(new a.Vector3(0,0,0)),[A,B]=$(Pe),R=i.useMemo(()=>({advection:P(u.advectionMaterial),splat:P(u.splatMaterial),curl:P(u.curlMaterial),vorticity:P(u.vorticityMaterial),divergence:P(u.divergenceMaterial),clear:P(u.clearMaterial),pressure:P(u.pressureMaterial),gradientSubtract:P(u.gradientSubtractMaterial)}),[u]),N=i.useMemo(()=>({advection:V(u.advectionMaterial),splat:V(u.splatMaterial),curl:V(u.curlMaterial),vorticity:V(u.vorticityMaterial),divergence:V(u.divergenceMaterial),clear:V(u.clearMaterial),pressure:V(u.pressureMaterial),gradientSubtract:V(u.gradientSubtractMaterial)}),[u]),H=i.useCallback((ae,ue)=>{B(ae),ue&&Object.keys(ue).forEach(se=>{N[se](ue[se])})},[B,N]);return[i.useCallback((ae,ue,se)=>{const{gl:K,pointer:Mr,size:$e}=ae;H(ue,se);const we=o(K,({read:W})=>{p(u.advectionMaterial),R.advection("uVelocity",W),R.advection("uSource",W),R.advection("dissipation",A.velocityDissipation)}),yr=y(K,({read:W})=>{p(u.advectionMaterial),R.advection("uVelocity",we),R.advection("uSource",W),R.advection("dissipation",A.densityDissipation)}),be=A.pointerValues||v(Mr);be.isVelocityUpdate&&(o(K,({read:W})=>{p(u.splatMaterial),R.splat("uTarget",W),R.splat("point",be.currentPointer);const me=be.diffPointer.multiply(z.current.set($e.width,$e.height).multiplyScalar(A.velocityAcceleration));R.splat("color",O.current.set(me.x,me.y,1)),R.splat("radius",A.splatRadius)}),y(K,({read:W})=>{p(u.splatMaterial),R.splat("uTarget",W);const me=typeof A.fluidColor=="function"?A.fluidColor(be.velocity):A.fluidColor;R.splat("color",me)}));const br=g(K,()=>{p(u.curlMaterial),R.curl("uVelocity",we)});o(K,({read:W})=>{p(u.vorticityMaterial),R.vorticity("uVelocity",W),R.vorticity("uCurl",br),R.vorticity("curl",A.curlStrength)});const Sr=C(K,()=>{p(u.divergenceMaterial),R.divergence("uVelocity",we)});D(K,({read:W})=>{p(u.clearMaterial),R.clear("uTexture",W),R.clear("value",A.pressureDissipation)}),p(u.pressureMaterial),R.pressure("uDivergence",Sr);let je;for(let W=0;W{R.pressure("uPressure",me)});return o(K,({read:W})=>{p(u.gradientSubtractMaterial),R.gradientSubtract("uPressure",je),R.gradientSubtract("uVelocity",W)}),yr},[u,R,p,g,y,C,v,D,o,A,H]),H,{scene:c,mesh:h,materials:u,camera:M,renderTarget:{velocity:d,density:x,curl:w,divergence:b,pressure:T},output:x.read.texture}]};var Dn="#usf ",Rn=`precision highp float; +}`;const Sn=({onBeforeInit:e})=>i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTarget:{value:C},aspectRatio:{value:0},color:{value:new a.Vector3},point:{value:new a.Vector2},radius:{value:0},texelSize:{value:new a.Vector2}},vertexShader:Q,fragmentShader:bn},e),...F}),[e]),Z=(e,n)=>e(n??{}),Cn=({scene:e,size:n,dpr:t,customFluidProps:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),{curl:m,vorticity:c,advection:u,divergence:d,pressure:p,clear:x,gradientSubtract:M,splat:o}=r??{},h=Z(an),l=h.clone(),v=Z(fn,m),f=Z(gn,c),T=Z(sn,u),y=Z(cn,d),g=Z(vn,p),S=Z(xn,x),_=Z(yn,M),D=Z(Sn,o),I=i.useMemo(()=>({vorticityMaterial:f,curlMaterial:v,advectionMaterial:T,divergenceMaterial:y,pressureMaterial:g,clearMaterial:S,gradientSubtractMaterial:_,splatMaterial:D}),[f,v,T,y,g,S,_,D]),z=N(n,t);i.useMemo(()=>{P(I.splatMaterial)("aspectRatio",z.x/z.y);for(const w of Object.values(I))P(w)("texelSize",new a.Vector2(1/z.x,1/z.y))},[z,I]);const R=B(e,s,h,a.Mesh);i.useMemo(()=>{h.dispose(),R.material=l},[h,R,l]),i.useEffect(()=>()=>{for(const w of Object.values(I))w.dispose()},[I]);const j=i.useCallback(w=>{R.material=w,R.material.needsUpdate=!0},[R]);return{materials:I,setMeshMaterial:j,mesh:R}},Se=.016,Re=Object.freeze({densityDissipation:.98,velocityDissipation:.99,velocityAcceleration:10,pressureDissipation:.9,pressureIterations:20,curlStrength:35,splatRadius:.002,fluidColor:new a.Vector3(1,1,1),pointerValues:!1}),_n=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,customFluidProps:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{materials:u,setMeshMaterial:d,mesh:p}=Cn({scene:c,size:e,dpr:m.shader,customFluidProps:s}),x=E(e),M=ge(),o=i.useMemo(()=>({scene:c,camera:x,dpr:m.fbo,size:e,isSizeUpdate:r,type:a.HalfFloatType,...t}),[c,x,e,m.fbo,r,t]),[h,l]=ne(o),[v,f]=ne(o),[T,y]=k(o),[g,S]=k(o),[_,D]=ne(o),I=i.useRef(new a.Vector2(0,0)),z=i.useRef(new a.Vector3(0,0,0)),[R,j]=L(Re),w=i.useMemo(()=>({advection:P(u.advectionMaterial),splat:P(u.splatMaterial),curl:P(u.curlMaterial),vorticity:P(u.vorticityMaterial),divergence:P(u.divergenceMaterial),clear:P(u.clearMaterial),pressure:P(u.pressureMaterial),gradientSubtract:P(u.gradientSubtractMaterial)}),[u]),W=i.useMemo(()=>({advection:A(u.advectionMaterial),splat:A(u.splatMaterial),curl:A(u.curlMaterial),vorticity:A(u.vorticityMaterial),divergence:A(u.divergenceMaterial),clear:A(u.clearMaterial),pressure:A(u.pressureMaterial),gradientSubtract:A(u.gradientSubtractMaterial)}),[u]),K=i.useCallback((oe,ae)=>{j(oe),ae&&Object.keys(ae).forEach(ie=>{W[ie](ae[ie])})},[j,W]);return[i.useCallback((oe,ae,ie)=>{const{gl:G,pointer:xr,size:Le}=oe;K(ae,ie);const Te=l(G,({read:q})=>{d(u.advectionMaterial),w.advection("uVelocity",q),w.advection("uSource",q),w.advection("dissipation",R.velocityDissipation)}),Mr=f(G,({read:q})=>{d(u.advectionMaterial),w.advection("uVelocity",Te),w.advection("uSource",q),w.advection("dissipation",R.densityDissipation)}),ye=R.pointerValues||M(xr);ye.isVelocityUpdate&&(l(G,({read:q})=>{d(u.splatMaterial),w.splat("uTarget",q),w.splat("point",ye.currentPointer);const ce=ye.diffPointer.multiply(I.current.set(Le.width,Le.height).multiplyScalar(R.velocityAcceleration));w.splat("color",z.current.set(ce.x,ce.y,1)),w.splat("radius",R.splatRadius)}),f(G,({read:q})=>{d(u.splatMaterial),w.splat("uTarget",q);const ce=typeof R.fluidColor=="function"?R.fluidColor(ye.velocity):R.fluidColor;w.splat("color",ce)}));const yr=y(G,()=>{d(u.curlMaterial),w.curl("uVelocity",Te)});l(G,({read:q})=>{d(u.vorticityMaterial),w.vorticity("uVelocity",q),w.vorticity("uCurl",yr),w.vorticity("curl",R.curlStrength)});const br=S(G,()=>{d(u.divergenceMaterial),w.divergence("uVelocity",Te)});D(G,({read:q})=>{d(u.clearMaterial),w.clear("uTexture",q),w.clear("value",R.pressureDissipation)}),d(u.pressureMaterial),w.pressure("uDivergence",br);let ke;for(let q=0;q{w.pressure("uPressure",ce)});return l(G,({read:q})=>{d(u.gradientSubtractMaterial),w.gradientSubtract("uPressure",ke),w.gradientSubtract("uVelocity",q)}),Mr},[u,w,d,y,f,S,M,D,l,R,K]),K,{scene:c,mesh:p,materials:u,camera:x,renderTarget:{velocity:h,density:v,curl:T,divergence:g,pressure:_},output:v.read.texture}]};var Tn="#usf ",wn=`precision highp float; uniform sampler2D uMap; uniform float uOpacity; @@ -464,7 +464,7 @@ void main() { vec2 uv = vUv; vec3 color = texture2D(uMap, uv).rgb; gl_FragColor = vec4(color,uOpacity); -}`;const Pn=({scale:e,max:n,texture:t,scene:r,onBeforeInit:s})=>{const m=i.useMemo(()=>new a.PlaneGeometry(e,e),[e]),f=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uOpacity:{value:0},uMap:{value:t||_}},vertexShader:Dn,fragmentShader:Rn},s),blending:a.AdditiveBlending,...I,transparent:!0}),[t,s]),c=i.useMemo(()=>{const u=[];for(let p=0;p()=>{c.forEach(u=>{u.geometry.dispose(),Array.isArray(u.material)?u.material.forEach(p=>p.dispose()):u.material.dispose(),r.remove(u)})},[r,c]),c},Ae=Object.freeze({frequency:.01,rotation:.05,fadeoutSpeed:.9,scale:.3,alpha:.6,pointerValues:!1}),An=({texture:e,scale:n=64,max:t=100,size:r,dpr:s,renderTargetOptions:m,samples:f,isSizeUpdate:c,onBeforeInit:u})=>{const p=U(s),h=i.useMemo(()=>new a.Scene,[]),M=Pn({scale:n,max:t,texture:e,scene:h,onBeforeInit:u}),v=k(r),l=he(),[d,o]=j({scene:h,camera:v,size:r,dpr:p.fbo,samples:f,isSizeUpdate:c,...m}),[x,y]=$(Ae),w=i.useRef(0),g=i.useMemo(()=>(C,T)=>{y(C),M.forEach(D=>{if(D.visible){const z=D.material;D.rotation.z+=x.rotation,D.scale.x=x.fadeoutSpeed*D.scale.x+x.scale,D.scale.y=D.scale.x;const O=z.uniforms.uOpacity.value;P(z)("uOpacity",O*x.fadeoutSpeed),O<.001&&(D.visible=!1)}V(D.material)(T)})},[M,x,y]);return[i.useCallback((C,T,D)=>{const{gl:z,pointer:O,size:A}=C;g(T,D);const B=x.pointerValues||l(O);if(x.frequency{const m=i.useMemo(()=>new a.PlaneGeometry(e,e),[e]),c=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uOpacity:{value:0},uMap:{value:t||C}},vertexShader:Tn,fragmentShader:wn},s),blending:a.AdditiveBlending,...F,transparent:!0}),[t,s]),u=i.useMemo(()=>{const d=[];for(let p=0;p()=>{u.forEach(d=>{d.geometry.dispose(),Array.isArray(d.material)?d.material.forEach(p=>p.dispose()):d.material.dispose(),r.remove(d)})},[r,u]),u},Pe=Object.freeze({frequency:.01,rotation:.05,fadeoutSpeed:.9,scale:.3,alpha:.6,pointerValues:!1}),Rn=({texture:e,scale:n=64,max:t=100,size:r,dpr:s,renderTargetOptions:m,isSizeUpdate:c,onBeforeInit:u})=>{const d=O(s),p=i.useMemo(()=>new a.Scene,[]),x=Dn({scale:n,max:t,texture:e,scene:p,onBeforeInit:u}),M=E(r),o=ge(),[h,l]=k({scene:p,camera:M,size:r,dpr:d.fbo,isSizeUpdate:c,...m}),[v,f]=L(Pe),T=i.useRef(0),y=i.useMemo(()=>(S,_)=>{f(S),x.forEach(D=>{if(D.visible){const I=D.material;D.rotation.z+=v.rotation,D.scale.x=v.fadeoutSpeed*D.scale.x+v.scale,D.scale.y=D.scale.x;const z=I.uniforms.uOpacity.value;P(I)("uOpacity",z*v.fadeoutSpeed),z<.001&&(D.visible=!1)}A(D.material)(_)})},[x,v,f]);return[i.useCallback((S,_,D)=>{const{gl:I,pointer:z,size:R}=S;y(_,D);const j=v.pointerValues||o(z);if(v.frequency{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTime:{value:0},scale:{value:ee.scale},timeStrength:{value:ee.timeStrength},noiseOctaves:{value:ee.noiseOctaves},fbmOctaves:{value:ee.fbmOctaves},warpOctaves:{value:ee.warpOctaves},warpDirection:{value:ee.warpDirection},warpStrength:{value:ee.warpStrength}},vertexShader:Vn,fragmentShader:Fn},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},ee=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new a.Vector2(2,2),warpStrength:8,beat:!1}),zn=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=In({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(ee),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T,clock:D}=g;return y(b,C),o("scale",l.scale),o("timeStrength",l.timeStrength),o("noiseOctaves",l.noiseOctaves),o("fbmOctaves",l.fbmOctaves),o("warpOctaves",l.warpOctaves),o("warpDirection",l.warpDirection),o("warpStrength",l.warpStrength),o("uTime",l.beat||D.getElapsedTime()),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var On="#usf ",Un=`precision highp float; +}`;const Vn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTime:{value:0},scale:{value:J.scale},timeStrength:{value:J.timeStrength},noiseOctaves:{value:J.noiseOctaves},fbmOctaves:{value:J.fbmOctaves},warpOctaves:{value:J.warpOctaves},warpDirection:{value:J.warpDirection},warpStrength:{value:J.warpStrength}},vertexShader:Pn,fragmentShader:An},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},J=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new a.Vector2(2,2),warpStrength:8,beat:!1}),Fn=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Vn({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(J),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_,clock:D}=y;return f(g,S),l("scale",o.scale),l("timeStrength",o.timeStrength),l("noiseOctaves",o.noiseOctaves),l("fbmOctaves",o.fbmOctaves),l("warpOctaves",o.warpOctaves),l("warpDirection",o.warpDirection),l("warpStrength",o.warpStrength),l("uTime",o.beat||D.getElapsedTime()),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var In="#usf ",zn=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -579,7 +579,7 @@ void main() { col = clamp(col, 0.0, 1.0); gl_FragColor = vec4(col, alpha); -}`;const En=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},isTexture:{value:!1},scale:{value:X.scale},noise:{value:_},noiseStrength:{value:X.noiseStrength},isNoise:{value:!1},laminateLayer:{value:X.laminateLayer},laminateInterval:{value:X.laminateInterval},laminateDetail:{value:X.laminateDetail},distortion:{value:X.distortion},colorFactor:{value:X.colorFactor},uTime:{value:0},timeStrength:{value:X.timeStrength}},vertexShader:On,fragmentShader:Un},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},X=Object.freeze({texture:!1,scale:1,laminateLayer:1,laminateInterval:new a.Vector2(.1,.1),laminateDetail:new a.Vector2(1,1),distortion:new a.Vector2(0,0),colorFactor:new a.Vector3(1,1,1),timeStrength:new a.Vector2(0,0),noise:!1,noiseStrength:new a.Vector2(0,0),beat:!1}),Bn=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=En({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(X),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T,clock:D}=g;return y(b,C),l.texture?(o("uTexture",l.texture),o("isTexture",!0)):(o("isTexture",!1),o("scale",l.scale)),l.noise?(o("noise",l.noise),o("isNoise",!0),o("noiseStrength",l.noiseStrength)):o("isNoise",!1),o("uTime",l.beat||D.getElapsedTime()),o("laminateLayer",l.laminateLayer),o("laminateInterval",l.laminateInterval),o("laminateDetail",l.laminateDetail),o("distortion",l.distortion),o("colorFactor",l.colorFactor),o("timeStrength",l.timeStrength),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var Ln="#usf ",kn=`precision highp float; +}`;const On=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},isTexture:{value:!1},scale:{value:H.scale},noise:{value:C},noiseStrength:{value:H.noiseStrength},isNoise:{value:!1},laminateLayer:{value:H.laminateLayer},laminateInterval:{value:H.laminateInterval},laminateDetail:{value:H.laminateDetail},distortion:{value:H.distortion},colorFactor:{value:H.colorFactor},uTime:{value:0},timeStrength:{value:H.timeStrength}},vertexShader:In,fragmentShader:zn},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},H=Object.freeze({texture:!1,scale:1,laminateLayer:1,laminateInterval:new a.Vector2(.1,.1),laminateDetail:new a.Vector2(1,1),distortion:new a.Vector2(0,0),colorFactor:new a.Vector3(1,1,1),timeStrength:new a.Vector2(0,0),noise:!1,noiseStrength:new a.Vector2(0,0),beat:!1}),Un=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=On({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(H),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_,clock:D}=y;return f(g,S),o.texture?(l("uTexture",o.texture),l("isTexture",!0)):(l("isTexture",!1),l("scale",o.scale)),o.noise?(l("noise",o.noise),l("isNoise",!0),l("noiseStrength",o.noiseStrength)):l("isNoise",!1),l("uTime",o.beat||D.getElapsedTime()),l("laminateLayer",o.laminateLayer),l("laminateInterval",o.laminateInterval),l("laminateDetail",o.laminateDetail),l("distortion",o.distortion),l("colorFactor",o.colorFactor),l("timeStrength",o.timeStrength),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Bn="#usf ",En=`precision highp float; varying vec2 vUv; uniform float u_time; @@ -604,7 +604,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 $n=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{u_time:{value:0},u_pattern:{value:re.pattern},u_complexity:{value:re.complexity},u_complexityAttenuation:{value:re.complexityAttenuation},u_iterations:{value:re.iterations},u_timeStrength:{value:re.timeStrength},u_scale:{value:re.scale}},vertexShader:Ln,fragmentShader:kn},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},re=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),jn=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=$n({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(re),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T,clock:D}=g;return y(b,C),o("u_pattern",l.pattern),o("u_complexity",l.complexity),o("u_complexityAttenuation",l.complexityAttenuation),o("u_iterations",l.iterations),o("u_timeStrength",l.timeStrength),o("u_scale",l.scale),o("u_time",l.beat||D.getElapsedTime()),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var qn="#usf ",Wn=`precision highp float; +}`;const Ln=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{u_time:{value:0},u_pattern:{value:te.pattern},u_complexity:{value:te.complexity},u_complexityAttenuation:{value:te.complexityAttenuation},u_iterations:{value:te.iterations},u_timeStrength:{value:te.timeStrength},u_scale:{value:te.scale}},vertexShader:Bn,fragmentShader:En},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},te=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),kn=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Ln({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(te),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_,clock:D}=y;return f(g,S),l("u_pattern",o.pattern),l("u_complexity",o.complexity),l("u_complexityAttenuation",o.complexityAttenuation),l("u_iterations",o.iterations),l("u_timeStrength",o.timeStrength),l("u_scale",o.scale),l("u_time",o.beat||D.getElapsedTime()),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var $n="#usf ",jn=`precision highp float; precision highp int; varying vec2 vUv; @@ -633,7 +633,7 @@ void main() { ); gl_FragColor = vec4(outColor, tex.a); -}`;const Nn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},uRgbWeight:{value:ie.rgbWeight},uColor1:{value:ie.color1},uColor2:{value:ie.color2},uColor3:{value:ie.color3},uColor4:{value:ie.color4}},vertexShader:qn,fragmentShader:Wn},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},ie=Object.freeze({texture:_,color1:new a.Color().set(.5,.5,.5),color2:new a.Color().set(.5,.5,.5),color3:new a.Color().set(1,1,1),color4:new a.Color().set(0,.1,.2),rgbWeight:new a.Vector3(.299,.587,.114)}),Gn=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Nn({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(ie),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("uTexture",l.texture),o("uColor1",l.color1),o("uColor2",l.color2),o("uColor3",l.color3),o("uColor4",l.color4),o("uRgbWeight",l.rgbWeight),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var Kn="#usf ",Hn=`precision highp float; +}`;const qn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},uRgbWeight:{value:ue.rgbWeight},uColor1:{value:ue.color1},uColor2:{value:ue.color2},uColor3:{value:ue.color3},uColor4:{value:ue.color4}},vertexShader:$n,fragmentShader:jn},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},ue=Object.freeze({texture:C,color1:new a.Color().set(.5,.5,.5),color2:new a.Color().set(.5,.5,.5),color3:new a.Color().set(1,1,1),color4:new a.Color().set(0,.1,.2),rgbWeight:new a.Vector3(.299,.587,.114)}),Wn=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=qn({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(ue),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("uTexture",o.texture),l("uColor1",o.color1),l("uColor2",o.color2),l("uColor3",o.color3),l("uColor4",o.color4),l("uRgbWeight",o.rgbWeight),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Nn="#usf ",Gn=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -647,7 +647,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 Xn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},uColor0:{value:Me.color0},uColor1:{value:Me.color1}},vertexShader:Kn,fragmentShader:Hn},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},Me=Object.freeze({texture:_,color0:new a.Color(16777215),color1:new a.Color(0)}),Yn=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Xn({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(Me),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("uTexture",l.texture),o("uColor0",l.color0),o("uColor1",l.color1),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var Qn="#usf ",Zn=`precision highp float; +}`;const Kn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},uColor0:{value:xe.color0},uColor1:{value:xe.color1}},vertexShader:Nn,fragmentShader:Gn},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},xe=Object.freeze({texture:C,color0:new a.Color(16777215),color1:new a.Color(0)}),Hn=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Kn({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(xe),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("uTexture",o.texture),l("uColor0",o.color0),l("uColor1",o.color1),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Xn="#usf ",Yn=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -681,7 +681,7 @@ void main() { vec3 alphaColor = vec3(mix(outputColor,mapColor,mixValue)); gl_FragColor = vec4(alphaColor,alpha); -}`;const Jn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{u_texture:{value:_},uMap:{value:_},u_alphaMap:{value:_},u_isAlphaMap:{value:!1},uMapIntensity:{value:le.mapIntensity},u_brightness:{value:le.brightness},u_min:{value:le.min},u_max:{value:le.max},u_dodgeColor:{value:new a.Color},u_isDodgeColor:{value:!1}},vertexShader:Qn,fragmentShader:Zn},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},le=Object.freeze({texture:_,map:_,alphaMap:!1,mapIntensity:.3,brightness:new a.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1}),et=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Jn({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(le),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("u_texture",l.texture),o("uMap",l.map),o("uMapIntensity",l.mapIntensity),l.alphaMap?(o("u_alphaMap",l.alphaMap),o("u_isAlphaMap",!0)):o("u_isAlphaMap",!1),o("u_brightness",l.brightness),o("u_min",l.min),o("u_max",l.max),l.dodgeColor?(o("u_dodgeColor",l.dodgeColor),o("u_isDodgeColor",!0)):o("u_isDodgeColor",!1),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var nt="#usf ",tt=`precision highp float; +}`;const Qn=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{u_texture:{value:C},uMap:{value:C},u_alphaMap:{value:C},u_isAlphaMap:{value:!1},uMapIntensity:{value:se.mapIntensity},u_brightness:{value:se.brightness},u_min:{value:se.min},u_max:{value:se.max},u_dodgeColor:{value:new a.Color},u_isDodgeColor:{value:!1}},vertexShader:Xn,fragmentShader:Yn},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},se=Object.freeze({texture:C,map:C,alphaMap:!1,mapIntensity:.3,brightness:new a.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1}),Zn=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Qn({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(se),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("u_texture",o.texture),l("uMap",o.map),l("uMapIntensity",o.mapIntensity),o.alphaMap?(l("u_alphaMap",o.alphaMap),l("u_isAlphaMap",!0)):l("u_isAlphaMap",!1),l("u_brightness",o.brightness),l("u_min",o.min),l("u_max",o.max),o.dodgeColor?(l("u_dodgeColor",o.dodgeColor),l("u_isDodgeColor",!0)):l("u_isDodgeColor",!1),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Jn="#usf ",et=`precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -741,7 +741,7 @@ void main() { gl_FragColor = mix(color0, color1, progress); -}`;const rt=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>{var p,h;return new a.ShaderMaterial({...F({uniforms:{uResolution:{value:new a.Vector2},uTextureResolution:{value:new a.Vector2},uTexture0:{value:_},uTexture1:{value:_},padding:{value:ne.padding},uMap:{value:_},edgeIntensity:{value:ne.edgeIntensity},mapIntensity:{value:ne.mapIntensity},epicenter:{value:ne.epicenter},progress:{value:ne.progress},dirX:{value:(p=ne.dir)==null?void 0:p.x},dirY:{value:(h=ne.dir)==null?void 0:h.y}},vertexShader:nt,fragmentShader:tt},r),...I})},[r]),f=G(n,t);P(m)("uResolution",f.clone());const c=L(e,s,m,a.Mesh);return{material:m,mesh:c}},ne=Object.freeze({texture0:_,texture1:_,padding:0,map:_,mapIntensity:0,edgeIntensity:0,epicenter:new a.Vector2(0,0),progress:0,dir:new a.Vector2(0,0)}),ot=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=rt({scene:c,size:e,dpr:f.shader,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,dpr:f.fbo,size:e,samples:t,isSizeUpdate:s,...r}),[l,d]=$(ne),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{var A,B,R,N,H,oe,ae,ue;const{gl:T}=g;y(b,C),o("uTexture0",l.texture0),o("uTexture1",l.texture1),o("progress",l.progress);const D=[((B=(A=l.texture0)==null?void 0:A.image)==null?void 0:B.width)||0,((N=(R=l.texture0)==null?void 0:R.image)==null?void 0:N.height)||0],z=[((oe=(H=l.texture1)==null?void 0:H.image)==null?void 0:oe.width)||0,((ue=(ae=l.texture1)==null?void 0:ae.image)==null?void 0:ue.height)||0],O=D.map((se,K)=>se+(z[K]-se)*l.progress);return o("uTextureResolution",O),o("padding",l.padding),o("uMap",l.map),o("mapIntensity",l.mapIntensity),o("edgeIntensity",l.edgeIntensity),o("epicenter",l.epicenter),o("dirX",l.dir.x),o("dirY",l.dir.y),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var at="#usf ",ut=`precision highp float; +}`;const nt=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>{var p,x;return new a.ShaderMaterial({...V({uniforms:{uResolution:{value:new a.Vector2},uTextureResolution:{value:new a.Vector2},uTexture0:{value:C},uTexture1:{value:C},padding:{value:ee.padding},uMap:{value:C},edgeIntensity:{value:ee.edgeIntensity},mapIntensity:{value:ee.mapIntensity},epicenter:{value:ee.epicenter},progress:{value:ee.progress},dirX:{value:(p=ee.dir)==null?void 0:p.x},dirY:{value:(x=ee.dir)==null?void 0:x.y}},vertexShader:Jn,fragmentShader:et},r),...F})},[r]),c=N(n,t);P(m)("uResolution",c.clone());const u=B(e,s,m,a.Mesh);return{material:m,mesh:u}},ee=Object.freeze({texture0:C,texture1:C,padding:0,map:C,mapIntensity:0,edgeIntensity:0,epicenter:new a.Vector2(0,0),progress:0,dir:new a.Vector2(0,0)}),tt=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=nt({scene:c,size:e,dpr:m.shader,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,dpr:m.fbo,size:e,isSizeUpdate:r,...t}),[o,h]=L(ee),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{var R,j,w,W,K,re,oe,ae;const{gl:_}=y;f(g,S),l("uTexture0",o.texture0),l("uTexture1",o.texture1),l("progress",o.progress);const D=[((j=(R=o.texture0)==null?void 0:R.image)==null?void 0:j.width)||0,((W=(w=o.texture0)==null?void 0:w.image)==null?void 0:W.height)||0],I=[((re=(K=o.texture1)==null?void 0:K.image)==null?void 0:re.width)||0,((ae=(oe=o.texture1)==null?void 0:oe.image)==null?void 0:ae.height)||0],z=D.map((ie,G)=>ie+(I[G]-ie)*o.progress);return l("uTextureResolution",z),l("padding",o.padding),l("uMap",o.map),l("mapIntensity",o.mapIntensity),l("edgeIntensity",o.edgeIntensity),l("epicenter",o.epicenter),l("dirX",o.dir.x),l("dirY",o.dir.y),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var rt="#usf ",ot=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -755,7 +755,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 it=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{u_texture:{value:_},u_brightness:{value:fe.brightness},u_min:{value:fe.min},u_max:{value:fe.max}},vertexShader:at,fragmentShader:ut},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},fe=Object.freeze({texture:_,brightness:new a.Vector3(.5,.5,.5),min:0,max:1}),st=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=it({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(fe),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("u_texture",l.texture),o("u_brightness",l.brightness),o("u_min",l.min),o("u_max",l.max),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var lt="#usf ",ct=`precision highp float; +}`;const at=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{u_texture:{value:C},u_brightness:{value:pe.brightness},u_min:{value:pe.min},u_max:{value:pe.max}},vertexShader:rt,fragmentShader:ot},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},pe=Object.freeze({texture:C,brightness:new a.Vector3(.5,.5,.5),min:0,max:1}),ut=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=at({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(pe),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("u_texture",o.texture),l("u_brightness",o.brightness),l("u_min",o.min),l("u_max",o.max),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var it="#usf ",st=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -768,7 +768,7 @@ void main() { #usf gl_FragColor = texture2D(u_texture, uv); -}`;const mt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{u_texture:{value:_},uMap:{value:_},uMapIntensity:{value:_e.mapIntensity}},vertexShader:lt,fragmentShader:ct},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},_e=Object.freeze({texture:_,map:_,mapIntensity:.3}),vt=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=mt({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(_e),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("u_texture",l.texture),o("uMap",l.map),o("uMapIntensity",l.mapIntensity),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var pt="#usf ",ft=`precision highp float; +}`;const lt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{u_texture:{value:C},uMap:{value:C},uMapIntensity:{value:Ce.mapIntensity}},vertexShader:it,fragmentShader:st},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},Ce=Object.freeze({texture:C,map:C,mapIntensity:.3}),ct=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=lt({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(Ce),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("u_texture",o.texture),l("uMap",o.map),l("uMapIntensity",o.mapIntensity),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var mt="#usf ",vt=`precision highp float; uniform sampler2D uTexture; uniform sampler2D uMap; @@ -780,7 +780,7 @@ void main() { vec4 tex = texture2D(uTexture, uv); vec4 map = texture2D(uMap, uv); gl_FragColor = mix(tex,map,map.a); -}`;const dt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},uMap:{value:_}},vertexShader:pt,fragmentShader:ft},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},Ve=Object.freeze({texture:_,map:_}),gt=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=dt({scene:c,size:e,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(Ve),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("uTexture",l.texture),o("uMap",l.map),v(T)},[o,v,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var ht="#usf ",xt=`precision highp float; +}`;const pt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},uMap:{value:C}},vertexShader:mt,fragmentShader:vt},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},Ae=Object.freeze({texture:C,map:C}),ft=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=pt({scene:c,size:e,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(Ae),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("uTexture",o.texture),l("uMap",o.map),M(_)},[l,M,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var dt="#usf ",gt=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -798,7 +798,7 @@ void main() { hsv.z *= u_brightness; vec3 final = hsv2rgb(hsv); gl_FragColor = vec4(final, tex.a); -}`;const Mt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{u_texture:{value:_},u_brightness:{value:ye.brightness},u_saturation:{value:ye.saturation}},vertexShader:ht,fragmentShader:xt},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},ye=Object.freeze({texture:_,brightness:1,saturation:1}),yt=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Mt({scene:c,size:e,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(ye),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("u_texture",l.texture),o("u_brightness",l.brightness),o("u_saturation",l.saturation),v(T)},[o,v,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var bt="#usf ",St=`precision highp float; +}`;const ht=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{u_texture:{value:C},u_brightness:{value:Me.brightness},u_saturation:{value:Me.saturation}},vertexShader:dt,fragmentShader:gt},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},Me=Object.freeze({texture:C,brightness:1,saturation:1}),xt=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=ht({scene:c,size:e,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(Me),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("u_texture",o.texture),l("u_brightness",o.brightness),l("u_saturation",o.saturation),M(_)},[l,M,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Mt="#usf ",yt=`precision highp float; varying vec2 vUv; uniform vec2 uResolution; @@ -809,7 +809,7 @@ void main() { #usf gl_FragColor = texture2D(uTexture, uv); -}`;const Ct=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uResolution:{value:new a.Vector2},uTextureResolution:{value:new a.Vector2},uTexture:{value:_}},vertexShader:bt,fragmentShader:St},r),...I}),[r]),f=G(n,t);P(m)("uResolution",f.clone());const c=L(e,s,m,a.Mesh);return{material:m,mesh:c}},Fe=Object.freeze({texture:_}),_t=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Ct({scene:c,size:e,dpr:f.shader,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,dpr:f.fbo,size:e,samples:t,isSizeUpdate:s,...r}),[l,d]=$(Fe),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{var D,z,O,A,B,R;const{gl:T}=g;return y(b,C),o("uTexture",l.texture),o("uTextureResolution",[((O=(z=(D=l.texture)==null?void 0:D.source)==null?void 0:z.data)==null?void 0:O.width)||0,((R=(B=(A=l.texture)==null?void 0:A.source)==null?void 0:B.data)==null?void 0:R.height)||0]),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var Tt="#usf ",wt=`precision highp float; +}`;const bt=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uResolution:{value:new a.Vector2},uTextureResolution:{value:new a.Vector2},uTexture:{value:C}},vertexShader:Mt,fragmentShader:yt},r),...F}),[r]),c=N(n,t);P(m)("uResolution",c.clone());const u=B(e,s,m,a.Mesh);return{material:m,mesh:u}},Ve=Object.freeze({texture:C}),St=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=bt({scene:c,size:e,dpr:m.shader,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,dpr:m.fbo,size:e,isSizeUpdate:r,...t}),[o,h]=L(Ve),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{var D,I,z,R,j,w;const{gl:_}=y;return f(g,S),l("uTexture",o.texture),l("uTextureResolution",[((z=(I=(D=o.texture)==null?void 0:D.source)==null?void 0:I.data)==null?void 0:z.width)||0,((w=(j=(R=o.texture)==null?void 0:R.source)==null?void 0:j.data)==null?void 0:w.height)||0]),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Ct="#usf ",_t=`precision highp float; varying vec2 vUv; uniform sampler2D uTexture; @@ -834,7 +834,7 @@ void main() { ) / 9.0; gl_FragColor = outColor; -}`;const Dt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},uResolution:{value:new a.Vector2(0,0)},uBlurSize:{value:Te.blurSize}},vertexShader:Tt,fragmentShader:wt},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},Te=Object.freeze({texture:_,blurSize:3,blurPower:5}),Rt=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Dt({scene:c,onBeforeInit:m}),h=k(e),M=i.useMemo(()=>({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[c,h,e,f.fbo,t,s,r]),[v,l]=te(M),[d,o]=$(Te),x=P(u),y=V(u),w=i.useCallback((b,C)=>{o(b),y(C)},[o,y]);return[i.useCallback((b,C,T)=>{var O,A,B,R,N,H;const{gl:D}=b;w(C,T),x("uTexture",d.texture),x("uResolution",[((B=(A=(O=d.texture)==null?void 0:O.source)==null?void 0:A.data)==null?void 0:B.width)||0,((H=(N=(R=d.texture)==null?void 0:R.source)==null?void 0:N.data)==null?void 0:H.height)||0]),x("uBlurSize",d.blurSize);let z=l(D);for(let oe=0;oe{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},uResolution:{value:new a.Vector2(0,0)},uBlurSize:{value:_e.blurSize}},vertexShader:Ct,fragmentShader:_t},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},_e=Object.freeze({texture:C,blurSize:3,blurPower:5}),wt=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Tt({scene:c,onBeforeInit:s}),p=E(e),x=i.useMemo(()=>({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[c,p,e,m.fbo,r,t]),[M,o]=ne(x),[h,l]=L(_e),v=P(u),f=A(u),T=i.useCallback((g,S)=>{l(g),f(S)},[l,f]);return[i.useCallback((g,S,_)=>{var z,R,j,w,W,K;const{gl:D}=g;T(S,_),v("uTexture",h.texture),v("uResolution",[((j=(R=(z=h.texture)==null?void 0:z.source)==null?void 0:R.data)==null?void 0:j.width)||0,((K=(W=(w=h.texture)==null?void 0:w.source)==null?void 0:W.data)==null?void 0:K.height)||0]),v("uBlurSize",h.blurSize);let I=o(D);for(let re=0;re{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},uBackbuffer:{value:_},uBegin:{value:de.begin},uEnd:{value:de.end},uStrength:{value:de.strength}},vertexShader:Pt,fragmentShader:At},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},de=Object.freeze({texture:_,begin:new a.Vector2(0,0),end:new a.Vector2(0,0),strength:.9}),Ft=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Vt({scene:c,onBeforeInit:m}),h=k(e),M=i.useMemo(()=>({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[c,h,e,f.fbo,t,s,r]),[v,l]=te(M),[d,o]=$(de),x=P(u),y=V(u),w=i.useCallback((b,C)=>{o(b),y(C)},[o,y]);return[i.useCallback((b,C,T)=>{const{gl:D}=b;return w(C,T),x("uTexture",d.texture),x("uBegin",d.begin),x("uEnd",d.end),x("uStrength",d.strength),l(D,({read:z})=>{x("uBackbuffer",z)})},[l,x,w,d]),w,{scene:c,mesh:p,material:u,camera:h,renderTarget:v,output:v.read.texture}]};var It="#usf ",zt=`precision highp float; +}`;const Pt=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},uBackbuffer:{value:C},uBegin:{value:fe.begin},uEnd:{value:fe.end},uStrength:{value:fe.strength}},vertexShader:Dt,fragmentShader:Rt},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},fe=Object.freeze({texture:C,begin:new a.Vector2(0,0),end:new a.Vector2(0,0),strength:.9}),At=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Pt({scene:c,onBeforeInit:s}),p=E(e),x=i.useMemo(()=>({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[c,p,e,m.fbo,r,t]),[M,o]=ne(x),[h,l]=L(fe),v=P(u),f=A(u),T=i.useCallback((g,S)=>{l(g),f(S)},[l,f]);return[i.useCallback((g,S,_)=>{const{gl:D}=g;return T(S,_),v("uTexture",h.texture),v("uBegin",h.begin),v("uEnd",h.end),v("uStrength",h.strength),o(D,({read:I})=>{v("uBackbuffer",I)})},[o,v,T,h]),T,{scene:c,mesh:d,material:u,camera:p,renderTarget:M,output:M.read.texture}]};var Vt="#usf ",Ft=`precision highp float; varying vec2 vUv; uniform float uProgress; @@ -898,7 +898,7 @@ void main() { color *= progressFactor; gl_FragColor = vec4(color, 1.0); -}`;const Ot=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uEpicenter:{value:ce.epicenter},uProgress:{value:ce.progress},uStrength:{value:ce.strength},uWidth:{value:ce.width},uMode:{value:0}},vertexShader:It,fragmentShader:zt},n),...I}),[n]),s=L(e,t,r,a.Mesh);return{material:r,mesh:s}},ce=Object.freeze({epicenter:new a.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),Ut=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Ot({scene:c,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(ce),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("uEpicenter",l.epicenter),o("uProgress",l.progress),o("uWidth",l.width),o("uStrength",l.strength),o("uMode",l.mode==="center"?0:l.mode==="horizontal"?1:2),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var Et="#usf ",Bt=`precision highp float; +}`;const It=({scene:e,onBeforeInit:n})=>{const t=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),r=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uEpicenter:{value:le.epicenter},uProgress:{value:le.progress},uStrength:{value:le.strength},uWidth:{value:le.width},uMode:{value:0}},vertexShader:Vt,fragmentShader:Ft},n),...F}),[n]),s=B(e,t,r,a.Mesh);return{material:r,mesh:s}},le=Object.freeze({epicenter:new a.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),zt=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=It({scene:c,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(le),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("uEpicenter",o.epicenter),l("uProgress",o.progress),l("uWidth",o.width),l("uStrength",o.strength),l("uMode",o.mode==="center"?0:o.mode==="horizontal"?1:2),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Ot="#usf ",Ut=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -966,7 +966,7 @@ void main() { vec4 finColor = CalcColor(texColor); gl_FragColor = finColor; -}`;const Lt=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{u_texture:{value:_},u_resolution:{value:new a.Vector2},u_keyColor:{value:Y.color},u_similarity:{value:Y.similarity},u_smoothness:{value:Y.smoothness},u_spill:{value:Y.spill},u_color:{value:Y.color},u_contrast:{value:Y.contrast},u_brightness:{value:Y.brightness},u_gamma:{value:Y.gamma}},vertexShader:Et,fragmentShader:Bt},r),...I}),[r]),f=G(n,t);P(m)("u_resolution",f.clone());const c=L(e,s,m,a.Mesh);return{material:m,mesh:c}},Y=Object.freeze({texture:_,keyColor:new a.Color(65280),similarity:.2,smoothness:.1,spill:.2,color:new a.Vector4(1,1,1,1),contrast:1,brightness:0,gamma:1}),kt=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=Lt({scene:c,size:e,dpr:f.shader,onBeforeInit:m}),h=k(e),[M,v]=j({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[l,d]=$(Y),o=P(u),x=V(u),y=i.useCallback((g,b)=>{d(g),x(b)},[d,x]);return[i.useCallback((g,b,C)=>{const{gl:T}=g;return y(b,C),o("u_texture",l.texture),o("u_keyColor",l.keyColor),o("u_similarity",l.similarity),o("u_smoothness",l.smoothness),o("u_spill",l.spill),o("u_color",l.color),o("u_contrast",l.contrast),o("u_brightness",l.brightness),o("u_gamma",l.gamma),v(T)},[v,o,l,y]),y,{scene:c,mesh:p,material:u,camera:h,renderTarget:M,output:M.texture}]};var $t=`precision highp float; +}`;const Bt=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{u_texture:{value:C},u_resolution:{value:new a.Vector2},u_keyColor:{value:X.color},u_similarity:{value:X.similarity},u_smoothness:{value:X.smoothness},u_spill:{value:X.spill},u_color:{value:X.color},u_contrast:{value:X.contrast},u_brightness:{value:X.brightness},u_gamma:{value:X.gamma}},vertexShader:Ot,fragmentShader:Ut},r),...F}),[r]),c=N(n,t);P(m)("u_resolution",c.clone());const u=B(e,s,m,a.Mesh);return{material:m,mesh:u}},X=Object.freeze({texture:C,keyColor:new a.Color(65280),similarity:.2,smoothness:.1,spill:.2,color:new a.Vector4(1,1,1,1),contrast:1,brightness:0,gamma:1}),Et=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=Bt({scene:c,size:e,dpr:m.shader,onBeforeInit:s}),p=E(e),[x,M]=k({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[o,h]=L(X),l=P(u),v=A(u),f=i.useCallback((y,g)=>{h(y),v(g)},[h,v]);return[i.useCallback((y,g,S)=>{const{gl:_}=y;return f(g,S),l("u_texture",o.texture),l("u_keyColor",o.keyColor),l("u_similarity",o.similarity),l("u_smoothness",o.smoothness),l("u_spill",o.spill),l("u_color",o.color),l("u_contrast",o.contrast),l("u_brightness",o.brightness),l("u_gamma",o.gamma),M(_)},[M,l,o,f]),f,{scene:c,mesh:d,material:u,camera:p,renderTarget:x,output:x.texture}]};var Lt=`precision highp float; varying vec2 vUv; #usf @@ -980,7 +980,7 @@ void main() { #usf
gl_Position = usf_Position; -}`,jt=`precision highp float; +}`,kt=`precision highp float; varying vec2 vUv; #usf @@ -999,7 +999,7 @@ void main() { #usf
gl_FragColor = usf_FragColor; -}`;const qt=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...F({uniforms:{uTexture:{value:_},uBackbuffer:{value:_},uTime:{value:0},uPointer:{value:new a.Vector2},uResolution:{value:new a.Vector2}},vertexShader:$t,fragmentShader:jt},r),...I}),[r]),f=G(n,t);P(m)("uResolution",f.clone());const c=L(e,s,m,a.Mesh);return{material:m,mesh:c}},Ie=Object.freeze({texture:_,beat:!1}),Wt=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,onBeforeInit:m})=>{const f=U(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:p}=qt({scene:c,size:e,dpr:f.shader,onBeforeInit:m}),h=k(e),M=i.useMemo(()=>({scene:c,camera:h,size:e,dpr:f.fbo,samples:t,isSizeUpdate:s,...r}),[c,h,e,f.fbo,t,s,r]),[v,l]=te(M),[d,o]=$(Ie),x=P(u),y=V(u),w=i.useCallback((b,C)=>{o(b),y(C)},[o,y]);return[i.useCallback((b,C,T)=>{const{gl:D,clock:z,pointer:O}=b;return w(C,T),x("uPointer",O),x("uTexture",d.texture),x("uTime",d.beat||z.getElapsedTime()),l(D,({read:A})=>{x("uBackbuffer",A)})},[l,x,d,w]),w,{scene:c,mesh:p,material:u,camera:h,renderTarget:v,output:v.read.texture}]},Nt=({scene:e,geometry:n,material:t})=>{const r=L(e,n,t,a.Points),s=L(e,i.useMemo(()=>n.clone(),[n]),i.useMemo(()=>t.clone(),[t]),a.Mesh);return s.visible=!1,{points:r,interactiveMesh:s}};var Gt=`uniform vec2 uResolution; +}`;const $t=({scene:e,size:n,dpr:t,onBeforeInit:r})=>{const s=i.useMemo(()=>new a.PlaneGeometry(2,2),[]),m=i.useMemo(()=>new a.ShaderMaterial({...V({uniforms:{uTexture:{value:C},uBackbuffer:{value:C},uTime:{value:0},uPointer:{value:new a.Vector2},uResolution:{value:new a.Vector2}},vertexShader:Lt,fragmentShader:kt},r),...F}),[r]),c=N(n,t);P(m)("uResolution",c.clone());const u=B(e,s,m,a.Mesh);return{material:m,mesh:u}},Fe=Object.freeze({texture:C,beat:!1}),jt=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,onBeforeInit:s})=>{const m=O(n),c=i.useMemo(()=>new a.Scene,[]),{material:u,mesh:d}=$t({scene:c,size:e,dpr:m.shader,onBeforeInit:s}),p=E(e),x=i.useMemo(()=>({scene:c,camera:p,size:e,dpr:m.fbo,isSizeUpdate:r,...t}),[c,p,e,m.fbo,r,t]),[M,o]=ne(x),[h,l]=L(Fe),v=P(u),f=A(u),T=i.useCallback((g,S)=>{l(g),f(S)},[l,f]);return[i.useCallback((g,S,_)=>{const{gl:D,clock:I,pointer:z}=g;return T(S,_),v("uPointer",z),v("uTexture",h.texture),v("uTime",h.beat||I.getElapsedTime()),o(D,({read:R})=>{v("uBackbuffer",R)})},[o,v,h,T]),T,{scene:c,mesh:d,material:u,camera:p,renderTarget:M,output:M.read.texture}]},qt=({scene:e,geometry:n,material:t})=>{const r=B(e,n,t,a.Points),s=B(e,i.useMemo(()=>n.clone(),[n]),i.useMemo(()=>t.clone(),[t]),a.Mesh);return s.visible=!1,{points:r,interactiveMesh:s}};var Wt=`uniform vec2 uResolution; uniform float uMorphProgress; uniform float uPointSize; @@ -1102,7 +1102,7 @@ void main() { vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; -}`,Kt=`precision highp float; +}`,Nt=`precision highp float; precision highp int; varying vec3 vColor; @@ -1144,19 +1144,19 @@ void main() { float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); -}`;const ze=(e,n,t,r,s)=>{var h;const m=t==="position"?"positionTarget":"uvTarget",f=t==="position"?"#usf ":"#usf ",c=t==="position"?"#usf ":"#usf ",u=t==="position"?"positionsList":"uvsList",p=t==="position"?` +}`;const Ie=(e,n,t,r,s)=>{var x;const m=t==="position"?"positionTarget":"uvTarget",c=t==="position"?"#usf ":"#usf ",u=t==="position"?"#usf ":"#usf ",d=t==="position"?"positionsList":"uvsList",p=t==="position"?` float scaledProgress = uMorphProgress * ${e.length-1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length-1}); float progress = fract(scaledProgress); int nextIndex = baseIndex + 1; newPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress); - `:"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);";if(e.length>0){n.deleteAttribute(t),n.setAttribute(t,new a.BufferAttribute(e[0],s));let M="",v="";e.forEach((l,d)=>{n.setAttribute(`${m}${d}`,new a.BufferAttribute(l,s)),M+=`attribute vec${s} ${m}${d}; -`,d===0?v+=`${m}${d}`:v+=`,${m}${d}`}),r=r.replace(`${f}`,M),r=r.replace(`${c}`,`vec${s} ${u}[${e.length}] = vec${s}[](${v}); + `:"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);";if(e.length>0){n.deleteAttribute(t),n.setAttribute(t,new a.BufferAttribute(e[0],s));let M="",o="";e.forEach((h,l)=>{n.setAttribute(`${m}${l}`,new a.BufferAttribute(h,s)),M+=`attribute vec${s} ${m}${l}; +`,l===0?o+=`${m}${l}`:o+=`,${m}${l}`}),r=r.replace(`${c}`,M),r=r.replace(`${u}`,`vec${s} ${d}[${e.length}] = vec${s}[](${o}); ${p} - `)}else r=r.replace(`${f}`,""),r=r.replace(`${c}`,""),(h=n==null?void 0:n.attributes[t])!=null&&h.array||De&&console.error(`use-shader-fx:geometry.attributes.${t}.array is not found`);return r},Oe=(e,n,t,r)=>{var m;let s=[];if(e&&e.length>0){(m=n==null?void 0:n.attributes[t])!=null&&m.array?s=[n.attributes[t].array,...e]:s=e;const f=Math.max(...s.map(c=>c.length));s.forEach((c,u)=>{if(c.length{let t="";const r={};let s="mapArrayColor = ";return e&&e.length>0?(e.forEach((f,c)=>{const u=`vMapArrayIndex < ${c}.1`,p=`texture2D(uMapArray${c}, uv)`;s+=`( ${u} ) ? ${p} : `,t+=` - uniform sampler2D uMapArray${c}; - `,r[`uMapArray${c}`]={value:f}}),s+="vec4(1.);",t+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(s+="vec4(1.0);",t+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:n.replace("#usf ",s).replace("#usf ",t),mapArrayUniforms:r}},Xt=({size:e,dpr:n,geometry:t,positions:r,uvs:s,mapArray:m,onBeforeInit:f})=>{const c=i.useMemo(()=>Oe(r,t,"position",3),[r,t]),u=i.useMemo(()=>Oe(s,t,"uv",2),[s,t]),p=i.useMemo(()=>{c.length!==u.length&&De&&console.log("use-shader-fx:positions and uvs are not matched");const M=ze(u,t,"uv",ze(c,t,"position",Gt,3),2),{rewritedFragmentShader:v,mapArrayUniforms:l}=Ht(m,Kt);return new a.ShaderMaterial({...F({uniforms:{uResolution:{value:new a.Vector2(0,0)},uMorphProgress:{value:E.morphProgress},uBlurAlpha:{value:E.blurAlpha},uBlurRadius:{value:E.blurRadius},uPointSize:{value:E.pointSize},uPointAlpha:{value:E.pointAlpha},uPicture:{value:_},uIsPicture:{value:!1},uAlphaPicture:{value:_},uIsAlphaPicture:{value:!1},uColor0:{value:E.color0},uColor1:{value:E.color1},uColor2:{value:E.color2},uColor3:{value:E.color3},uMap:{value:_},uIsMap:{value:!1},uAlphaMap:{value:_},uIsAlphaMap:{value:!1},uTime:{value:0},uWobblePositionFrequency:{value:E.wobblePositionFrequency},uWobbleTimeFrequency:{value:E.wobbleTimeFrequency},uWobbleStrength:{value:E.wobbleStrength},uWarpPositionFrequency:{value:E.warpPositionFrequency},uWarpTimeFrequency:{value:E.warpTimeFrequency},uWarpStrength:{value:E.warpStrength},uDisplacement:{value:_},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:E.displacementIntensity},uDisplacementColorIntensity:{value:E.displacementColorIntensity},uSizeRandomIntensity:{value:E.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:E.sizeRandomTimeFrequency},uSizeRandomMin:{value:E.sizeRandomMin},uSizeRandomMax:{value:E.sizeRandomMax},uDivergence:{value:E.divergence},uDivergencePoint:{value:E.divergencePoint},...l},vertexShader:M,fragmentShader:v},f),...I,blending:a.AdditiveBlending,transparent:!0})},[t,c,u,m,f]),h=G(e,n);return P(p)("uResolution",h.clone()),{material:p,modifiedPositions:c,modifiedUvs:u}},Ue=({size:e,dpr:n,scene:t=!1,geometry:r,positions:s,uvs:m,mapArray:f,onBeforeInit:c})=>{const u=U(n),p=i.useMemo(()=>{const w=r||new a.SphereGeometry(1,32,32);return w.setIndex(null),w.deleteAttribute("normal"),w},[r]),{material:h,modifiedPositions:M,modifiedUvs:v}=Xt({size:e,dpr:u.shader,geometry:p,positions:s,uvs:m,mapArray:f,onBeforeInit:c}),{points:l,interactiveMesh:d}=Nt({scene:t,geometry:p,material:h}),o=P(h),x=V(h);return[i.useCallback((w,g,b)=>{w&&o("uTime",(g==null?void 0:g.beat)||w.clock.getElapsedTime()),g!==void 0&&(o("uMorphProgress",g.morphProgress),o("uBlurAlpha",g.blurAlpha),o("uBlurRadius",g.blurRadius),o("uPointSize",g.pointSize),o("uPointAlpha",g.pointAlpha),g.picture?(o("uPicture",g.picture),o("uIsPicture",!0)):g.picture===!1&&o("uIsPicture",!1),g.alphaPicture?(o("uAlphaPicture",g.alphaPicture),o("uIsAlphaPicture",!0)):g.alphaPicture===!1&&o("uIsAlphaPicture",!1),o("uColor0",g.color0),o("uColor1",g.color1),o("uColor2",g.color2),o("uColor3",g.color3),g.map?(o("uMap",g.map),o("uIsMap",!0)):g.map===!1&&o("uIsMap",!1),g.alphaMap?(o("uAlphaMap",g.alphaMap),o("uIsAlphaMap",!0)):g.alphaMap===!1&&o("uIsAlphaMap",!1),o("uWobbleStrength",g.wobbleStrength),o("uWobblePositionFrequency",g.wobblePositionFrequency),o("uWobbleTimeFrequency",g.wobbleTimeFrequency),o("uWarpStrength",g.warpStrength),o("uWarpPositionFrequency",g.warpPositionFrequency),o("uWarpTimeFrequency",g.warpTimeFrequency),g.displacement?(o("uDisplacement",g.displacement),o("uIsDisplacement",!0)):g.displacement===!1&&o("uIsDisplacement",!1),o("uDisplacementIntensity",g.displacementIntensity),o("uDisplacementColorIntensity",g.displacementColorIntensity),o("uSizeRandomIntensity",g.sizeRandomIntensity),o("uSizeRandomTimeFrequency",g.sizeRandomTimeFrequency),o("uSizeRandomMin",g.sizeRandomMin),o("uSizeRandomMax",g.sizeRandomMax),o("uDivergence",g.divergence),o("uDivergencePoint",g.divergencePoint),x(b))},[o,x]),{points:l,interactiveMesh:d,positions:M,uvs:v}]},E=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,pointAlpha:1,picture:!1,alphaPicture:!1,color0:new a.Color(16711680),color1:new a.Color(65280),color2:new a.Color(255),color3:new a.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 a.Vector3(0),beat:!1}),Yt=({size:e,dpr:n,samples:t,isSizeUpdate:r,renderTargetOptions:s,camera:m,geometry:f,positions:c,uvs:u,onBeforeInit:p})=>{const h=U(n),M=i.useMemo(()=>new a.Scene,[]),[v,{points:l,interactiveMesh:d,positions:o,uvs:x}]=Ue({scene:M,size:e,dpr:n,geometry:f,positions:c,uvs:u,onBeforeInit:p}),[y,w]=j({scene:M,camera:m,size:e,dpr:h.fbo,samples:t,isSizeUpdate:r,depthBuffer:!0,...s}),g=i.useCallback((C,T,D)=>(v(C,T,D),w(C.gl)),[w,v]),b=i.useCallback((C,T)=>{v(null,C,T)},[v]);return[g,b,{scene:M,points:l,interactiveMesh:d,renderTarget:y,output:y.texture,positions:o,uvs:x}]},Ee=e=>{e.vertexShader=e.vertexShader.replace("void main() {",` + `)}else r=r.replace(`${c}`,""),r=r.replace(`${u}`,""),(x=n==null?void 0:n.attributes[t])!=null&&x.array||we&&console.error(`use-shader-fx:geometry.attributes.${t}.array is not found`);return r},ze=(e,n,t,r)=>{var m;let s=[];if(e&&e.length>0){(m=n==null?void 0:n.attributes[t])!=null&&m.array?s=[n.attributes[t].array,...e]:s=e;const c=Math.max(...s.map(u=>u.length));s.forEach((u,d)=>{if(u.length{let t="";const r={};let s="mapArrayColor = ";return e&&e.length>0?(e.forEach((c,u)=>{const d=`vMapArrayIndex < ${u}.1`,p=`texture2D(uMapArray${u}, uv)`;s+=`( ${d} ) ? ${p} : `,t+=` + uniform sampler2D uMapArray${u}; + `,r[`uMapArray${u}`]={value:c}}),s+="vec4(1.);",t+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(s+="vec4(1.0);",t+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:n.replace("#usf ",s).replace("#usf ",t),mapArrayUniforms:r}},Kt=({size:e,dpr:n,geometry:t,positions:r,uvs:s,mapArray:m,onBeforeInit:c})=>{const u=i.useMemo(()=>ze(r,t,"position",3),[r,t]),d=i.useMemo(()=>ze(s,t,"uv",2),[s,t]),p=i.useMemo(()=>{u.length!==d.length&&we&&console.log("use-shader-fx:positions and uvs are not matched");const M=Ie(d,t,"uv",Ie(u,t,"position",Wt,3),2),{rewritedFragmentShader:o,mapArrayUniforms:h}=Gt(m,Nt);return new a.ShaderMaterial({...V({uniforms:{uResolution:{value:new a.Vector2(0,0)},uMorphProgress:{value:U.morphProgress},uBlurAlpha:{value:U.blurAlpha},uBlurRadius:{value:U.blurRadius},uPointSize:{value:U.pointSize},uPointAlpha:{value:U.pointAlpha},uPicture:{value:C},uIsPicture:{value:!1},uAlphaPicture:{value:C},uIsAlphaPicture:{value:!1},uColor0:{value:U.color0},uColor1:{value:U.color1},uColor2:{value:U.color2},uColor3:{value:U.color3},uMap:{value:C},uIsMap:{value:!1},uAlphaMap:{value:C},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:C},uIsDisplacement:{value:!1},uDisplacementIntensity:{value:U.displacementIntensity},uDisplacementColorIntensity:{value:U.displacementColorIntensity},uSizeRandomIntensity:{value:U.sizeRandomIntensity},uSizeRandomTimeFrequency:{value:U.sizeRandomTimeFrequency},uSizeRandomMin:{value:U.sizeRandomMin},uSizeRandomMax:{value:U.sizeRandomMax},uDivergence:{value:U.divergence},uDivergencePoint:{value:U.divergencePoint},...h},vertexShader:M,fragmentShader:o},c),...F,blending:a.AdditiveBlending,transparent:!0})},[t,u,d,m,c]),x=N(e,n);return P(p)("uResolution",x.clone()),{material:p,modifiedPositions:u,modifiedUvs:d}},Oe=({size:e,dpr:n,scene:t=!1,geometry:r,positions:s,uvs:m,mapArray:c,onBeforeInit:u})=>{const d=O(n),p=i.useMemo(()=>{const y=r||new a.SphereGeometry(1,32,32);return y.setIndex(null),y.deleteAttribute("normal"),y},[r]),{material:x,modifiedPositions:M,modifiedUvs:o}=Kt({size:e,dpr:d.shader,geometry:p,positions:s,uvs:m,mapArray:c,onBeforeInit:u}),{points:h,interactiveMesh:l}=qt({scene:t,geometry:p,material:x}),v=P(x),f=A(x);return[i.useCallback((y,g,S)=>{y&&v("uTime",(g==null?void 0:g.beat)||y.clock.getElapsedTime()),g!==void 0&&(v("uMorphProgress",g.morphProgress),v("uBlurAlpha",g.blurAlpha),v("uBlurRadius",g.blurRadius),v("uPointSize",g.pointSize),v("uPointAlpha",g.pointAlpha),g.picture?(v("uPicture",g.picture),v("uIsPicture",!0)):g.picture===!1&&v("uIsPicture",!1),g.alphaPicture?(v("uAlphaPicture",g.alphaPicture),v("uIsAlphaPicture",!0)):g.alphaPicture===!1&&v("uIsAlphaPicture",!1),v("uColor0",g.color0),v("uColor1",g.color1),v("uColor2",g.color2),v("uColor3",g.color3),g.map?(v("uMap",g.map),v("uIsMap",!0)):g.map===!1&&v("uIsMap",!1),g.alphaMap?(v("uAlphaMap",g.alphaMap),v("uIsAlphaMap",!0)):g.alphaMap===!1&&v("uIsAlphaMap",!1),v("uWobbleStrength",g.wobbleStrength),v("uWobblePositionFrequency",g.wobblePositionFrequency),v("uWobbleTimeFrequency",g.wobbleTimeFrequency),v("uWarpStrength",g.warpStrength),v("uWarpPositionFrequency",g.warpPositionFrequency),v("uWarpTimeFrequency",g.warpTimeFrequency),g.displacement?(v("uDisplacement",g.displacement),v("uIsDisplacement",!0)):g.displacement===!1&&v("uIsDisplacement",!1),v("uDisplacementIntensity",g.displacementIntensity),v("uDisplacementColorIntensity",g.displacementColorIntensity),v("uSizeRandomIntensity",g.sizeRandomIntensity),v("uSizeRandomTimeFrequency",g.sizeRandomTimeFrequency),v("uSizeRandomMin",g.sizeRandomMin),v("uSizeRandomMax",g.sizeRandomMax),v("uDivergence",g.divergence),v("uDivergencePoint",g.divergencePoint),f(S))},[v,f]),{points:h,interactiveMesh:l,positions:M,uvs:o}]},U=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,pointAlpha:1,picture:!1,alphaPicture:!1,color0:new a.Color(16711680),color1:new a.Color(65280),color2:new a.Color(255),color3:new a.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 a.Vector3(0),beat:!1}),Ht=({size:e,dpr:n,isSizeUpdate:t,renderTargetOptions:r,camera:s,geometry:m,positions:c,uvs:u,onBeforeInit:d})=>{const p=O(n),x=i.useMemo(()=>new a.Scene,[]),[M,{points:o,interactiveMesh:h,positions:l,uvs:v}]=Oe({scene:x,size:e,dpr:n,geometry:m,positions:c,uvs:u,onBeforeInit:d}),[f,T]=k({scene:x,camera:s,size:e,dpr:p.fbo,isSizeUpdate:t,depthBuffer:!0,...r}),y=i.useCallback((S,_,D)=>(M(S,_,D),T(S.gl)),[T,M]),g=i.useCallback((S,_)=>{M(null,S,_)},[M]);return[y,g,{scene:x,points:o,interactiveMesh:h,renderTarget:f,output:f.texture,positions:l,uvs:v}]},Ue=e=>{e.vertexShader=e.vertexShader.replace("void main() {",` uniform float uTime; uniform float uWobblePositionFrequency; uniform float uWobbleTimeFrequency; @@ -1214,7 +1214,7 @@ void main() { vEdgeNormal = normalize(normalMatrix * usf_Normal); vec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0); vEdgeViewPosition = normalize(viewPosition.xyz); - `)},Qt=e=>{e.fragmentShader=e.fragmentShader.replace("#include ",` + `)},Xt=e=>{e.fragmentShader=e.fragmentShader.replace("#include ",` #include if (uEdgeThreshold > 0.0) { @@ -1257,7 +1257,7 @@ void main() { 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); - `)};var Zt=`#ifdef USE_TRANSMISSION + `)};var Yt=`#ifdef USE_TRANSMISSION @@ -1455,7 +1455,7 @@ void main() { return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`,Jt=`#ifdef USE_TRANSMISSION +#endif`,Qt=`#ifdef USE_TRANSMISSION material.transmission = _transmission; material.transmissionAlpha = 1.0; @@ -1526,16 +1526,16 @@ transmission /= uRefractionSamples; totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); -#endif`;const er=({mat:e,isCustomTransmission:n,parameters:t})=>{e.type==="MeshPhysicalMaterial"&&n&&(t.fragmentShader=t.fragmentShader.replace("#include ",`${Zt}`),t.fragmentShader=t.fragmentShader.replace("#include ",`${Jt}`)),e.normalMap||(t.vertexShader=t.vertexShader.replace("void main() {",` +#endif`;const Zt=({mat:e,isCustomTransmission:n,parameters:t})=>{e.type==="MeshPhysicalMaterial"&&n&&(t.fragmentShader=t.fragmentShader.replace("#include ",`${Yt}`),t.fragmentShader=t.fragmentShader.replace("#include ",`${Qt}`)),e.normalMap||(t.vertexShader=t.vertexShader.replace("void main() {",` attribute vec4 tangent; void main() { - `))},nr=({baseMaterial:e,materialParameters:n,isCustomTransmission:t=!1,onBeforeInit:r,depthOnBeforeInit:s})=>{const{material:m,depthMaterial:f}=i.useMemo(()=>{const c=new(e||a.MeshPhysicalMaterial)(n||{});Object.assign(c.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:q.wobblePositionFrequency},uWobbleTimeFrequency:{value:q.wobbleTimeFrequency},uWobbleStrength:{value:q.wobbleStrength},uWarpPositionFrequency:{value:q.warpPositionFrequency},uWarpTimeFrequency:{value:q.warpTimeFrequency},uWarpStrength:{value:q.warpStrength},uColor0:{value:q.color0},uColor1:{value:q.color1},uColor2:{value:q.color2},uColor3:{value:q.color3},uColorMix:{value:q.colorMix},uEdgeThreshold:{value:q.edgeThreshold},uEdgeColor:{value:q.edgeColor},uChromaticAberration:{value:q.chromaticAberration},uAnisotropicBlur:{value:q.anisotropicBlur},uDistortion:{value:q.distortion},uDistortionScale:{value:q.distortionScale},uTemporalDistortion:{value:q.temporalDistortion},uRefractionSamples:{value:q.refractionSamples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),c.onBeforeCompile=p=>{Ee(p),Qt(p),er({parameters:p,mat:c,isCustomTransmission:t});const h=F({fragmentShader:p.fragmentShader,vertexShader:p.vertexShader,uniforms:c.userData.uniforms},r);p.fragmentShader=h.fragmentShader,p.vertexShader=h.vertexShader,Object.assign(p.uniforms,h.uniforms)},c.needsUpdate=!0;const u=new a.MeshDepthMaterial({depthPacking:a.RGBADepthPacking});return u.onBeforeCompile=p=>{Object.assign(p.uniforms,c.userData.uniforms),Ee(p),F(p,s)},u.needsUpdate=!0,{material:c,depthMaterial:u}},[n,e,r,s,t]);return{material:m,depthMaterial:f}},Be=({scene:e=!1,geometry:n,isCustomTransmission:t,baseMaterial:r,materialParameters:s,onBeforeInit:m,depthOnBeforeInit:f})=>{const c=i.useMemo(()=>{let o=n||new a.IcosahedronGeometry(2,20);return o=qe.mergeVertices(o),o.computeTangents(),o},[n]),{material:u,depthMaterial:p}=nr({baseMaterial:r,materialParameters:s,isCustomTransmission:t,onBeforeInit:m,depthOnBeforeInit:f}),h=L(e,c,u,a.Mesh),M=u.userData,v=P(M),l=V(M);return[i.useCallback((o,x,y)=>{o&&v("uTime",(x==null?void 0:x.beat)||o.clock.getElapsedTime()),x!==void 0&&(v("uWobbleStrength",x.wobbleStrength),v("uWobblePositionFrequency",x.wobblePositionFrequency),v("uWobbleTimeFrequency",x.wobbleTimeFrequency),v("uWarpStrength",x.warpStrength),v("uWarpPositionFrequency",x.warpPositionFrequency),v("uWarpTimeFrequency",x.warpTimeFrequency),v("uColor0",x.color0),v("uColor1",x.color1),v("uColor2",x.color2),v("uColor3",x.color3),v("uColorMix",x.colorMix),v("uEdgeThreshold",x.edgeThreshold),v("uEdgeColor",x.edgeColor),v("uChromaticAberration",x.chromaticAberration),v("uAnisotropicBlur",x.anisotropicBlur),v("uDistortion",x.distortion),v("uDistortionScale",x.distortionScale),v("uRefractionSamples",x.refractionSamples),v("uTemporalDistortion",x.temporalDistortion),l(y))},[v,l]),{mesh:h,depthMaterial:p}]},q=Object.freeze({wobbleStrength:.3,wobblePositionFrequency:.3,wobbleTimeFrequency:.3,warpStrength:.3,warpPositionFrequency:.3,warpTimeFrequency:.3,color0:new a.Color(16711680),color1:new a.Color(65280),color2:new a.Color(255),color3:new a.Color(16776960),colorMix:1,edgeThreshold:0,edgeColor:new a.Color(0),chromaticAberration:.1,anisotropicBlur:.1,distortion:0,distortionScale:.1,temporalDistortion:0,refractionSamples:6,beat:!1}),tr=({size:e,dpr:n,samples:t,renderTargetOptions:r,isSizeUpdate:s,camera:m,geometry:f,baseMaterial:c,materialParameters:u,isCustomTransmission:p,onBeforeInit:h,depthOnBeforeInit:M})=>{const v=U(n),l=i.useMemo(()=>new a.Scene,[]),[d,{mesh:o,depthMaterial:x}]=Be({baseMaterial:c,materialParameters:u,scene:l,geometry:f,isCustomTransmission:p,onBeforeInit:h,depthOnBeforeInit:M}),[y,w]=j({scene:l,camera:m,size:e,dpr:v.fbo,samples:t,isSizeUpdate:s,depthBuffer:!0,...r}),g=i.useCallback((C,T,D)=>(d(C,T,D),w(C.gl)),[w,d]),b=i.useCallback((C,T)=>{d(null,C,T)},[d]);return[g,b,{scene:l,mesh:o,depthMaterial:x,renderTarget:y,output:y.texture}]},rr=(e,n,t)=>{const r=i.useMemo(()=>{const s=new a.Mesh(n,t);return e.add(s),s},[n,t,e]);return i.useEffect(()=>()=>{e.remove(r),n.dispose(),t.dispose()},[e,n,t,r]),r},or=(e,n,t,r,s,m)=>{const f=et+s||n>r+s;return m==="smaller"&&f||m==="larger"&&c||m==="both"&&(f||c)},ar=({gl:e,size:n,boundFor:t,threshold:r})=>{const s=i.useRef(n);return i.useMemo(()=>{const{width:f,height:c}=n,{width:u,height:p}=s.current,h=or(f,c,u,p,r,t),M=ke.getMaxDpr(e,n);return h&&(s.current=n),{maxDpr:M,isUpdate:h}},[n,e,t,r])},ge=Object.freeze({easeInSine(e){return 1-Math.cos(e*Math.PI/2)},easeOutSine(e){return Math.sin(e*Math.PI/2)},easeInOutSine(e){return-(Math.cos(Math.PI*e)-1)/2},easeInQuad(e){return e*e},easeOutQuad(e){return 1-(1-e)*(1-e)},easeInOutQuad(e){return e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},easeInCubic(e){return e*e*e},easeOutCubic(e){return 1-Math.pow(1-e,3)},easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2},easeInQuart(e){return e*e*e*e},easeOutQuart(e){return 1-Math.pow(1-e,4)},easeInOutQuart(e){return e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2},easeInQuint(e){return e*e*e*e*e},easeOutQuint(e){return 1-Math.pow(1-e,5)},easeInOutQuint(e){return e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2},easeInExpo(e){return e===0?0:Math.pow(2,10*e-10)},easeOutExpo(e){return e===1?1:1-Math.pow(2,-10*e)},easeInOutExpo(e){return e===0?0:e===1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2},easeInCirc(e){return 1-Math.sqrt(1-Math.pow(e,2))},easeOutCirc(e){return Math.sqrt(1-Math.pow(e-1,2))},easeInOutCirc(e){return e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2},easeInBack(e){return 2.70158*e*e*e-1.70158*e*e},easeOutBack(e){return 1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2)},easeInOutBack(e){const t=2.5949095;return e<.5?Math.pow(2*e,2)*((t+1)*2*e-t)/2:(Math.pow(2*e-2,2)*((t+1)*(e*2-2)+t)+2)/2},easeInElastic(e){const n=2*Math.PI/3;return e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*n)},easeOutElastic(e){const n=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*n)+1},easeInOutElastic(e){const n=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)*n))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*n)/2+1},easeInBounce(e){return 1-ge.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-ge.easeOutBounce(1-2*e))/2:(1+ge.easeOutBounce(2*e-1))/2}});function ur(e){let n=Math.sin(e*12.9898)*43758.5453;return n-Math.floor(n)}const ir=(e,n="easeOutQuart")=>{const t=e/60,r=ge[n];return i.useCallback(m=>{let f=m.getElapsedTime()*t;const c=Math.floor(f),u=r(f-c);f=u+c;const p=ur(c);return{beat:f,floor:c,fract:u,hash:p}},[t,r])},sr=(e=60)=>{const n=i.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),t=i.useRef(null);return i.useCallback(s=>{const m=s.getElapsedTime();return t.current===null||m-t.current>=n?(t.current=m,!0):!1},[n])},lr=e=>{var r,s;const n=(r=e.dom)==null?void 0:r.length,t=(s=e.texture)==null?void 0:s.length;return!n||!t||n!==t};var cr=`varying vec2 vUv; + `))},Jt=({baseMaterial:e,materialParameters:n,isCustomTransmission:t=!1,onBeforeInit:r,depthOnBeforeInit:s})=>{const{material:m,depthMaterial:c}=i.useMemo(()=>{const u=new(e||a.MeshPhysicalMaterial)(n||{});Object.assign(u.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:$.wobblePositionFrequency},uWobbleTimeFrequency:{value:$.wobbleTimeFrequency},uWobbleStrength:{value:$.wobbleStrength},uWarpPositionFrequency:{value:$.warpPositionFrequency},uWarpTimeFrequency:{value:$.warpTimeFrequency},uWarpStrength:{value:$.warpStrength},uColor0:{value:$.color0},uColor1:{value:$.color1},uColor2:{value:$.color2},uColor3:{value:$.color3},uColorMix:{value:$.colorMix},uEdgeThreshold:{value:$.edgeThreshold},uEdgeColor:{value:$.edgeColor},uChromaticAberration:{value:$.chromaticAberration},uAnisotropicBlur:{value:$.anisotropicBlur},uDistortion:{value:$.distortion},uDistortionScale:{value:$.distortionScale},uTemporalDistortion:{value:$.temporalDistortion},uRefractionSamples:{value:$.refractionSamples},transmission:{value:0},_transmission:{value:1},transmissionMap:{value:null}}}),u.onBeforeCompile=p=>{Ue(p),Xt(p),Zt({parameters:p,mat:u,isCustomTransmission:t});const x=V({fragmentShader:p.fragmentShader,vertexShader:p.vertexShader,uniforms:u.userData.uniforms},r);p.fragmentShader=x.fragmentShader,p.vertexShader=x.vertexShader,Object.assign(p.uniforms,x.uniforms)},u.needsUpdate=!0;const d=new a.MeshDepthMaterial({depthPacking:a.RGBADepthPacking});return d.onBeforeCompile=p=>{Object.assign(p.uniforms,u.userData.uniforms),Ue(p),V(p,s)},d.needsUpdate=!0,{material:u,depthMaterial:d}},[n,e,r,s,t]);return{material:m,depthMaterial:c}},Be=({scene:e=!1,geometry:n,isCustomTransmission:t,baseMaterial:r,materialParameters:s,onBeforeInit:m,depthOnBeforeInit:c})=>{const u=i.useMemo(()=>{let v=n||new a.IcosahedronGeometry(2,20);return v=$e.mergeVertices(v),v.computeTangents(),v},[n]),{material:d,depthMaterial:p}=Jt({baseMaterial:r,materialParameters:s,isCustomTransmission:t,onBeforeInit:m,depthOnBeforeInit:c}),x=B(e,u,d,a.Mesh),M=d.userData,o=P(M),h=A(M);return[i.useCallback((v,f,T)=>{v&&o("uTime",(f==null?void 0:f.beat)||v.clock.getElapsedTime()),f!==void 0&&(o("uWobbleStrength",f.wobbleStrength),o("uWobblePositionFrequency",f.wobblePositionFrequency),o("uWobbleTimeFrequency",f.wobbleTimeFrequency),o("uWarpStrength",f.warpStrength),o("uWarpPositionFrequency",f.warpPositionFrequency),o("uWarpTimeFrequency",f.warpTimeFrequency),o("uColor0",f.color0),o("uColor1",f.color1),o("uColor2",f.color2),o("uColor3",f.color3),o("uColorMix",f.colorMix),o("uEdgeThreshold",f.edgeThreshold),o("uEdgeColor",f.edgeColor),o("uChromaticAberration",f.chromaticAberration),o("uAnisotropicBlur",f.anisotropicBlur),o("uDistortion",f.distortion),o("uDistortionScale",f.distortionScale),o("uRefractionSamples",f.refractionSamples),o("uTemporalDistortion",f.temporalDistortion),h(T))},[o,h]),{mesh:x,depthMaterial:p}]},$=Object.freeze({wobbleStrength:.3,wobblePositionFrequency:.3,wobbleTimeFrequency:.3,warpStrength:.3,warpPositionFrequency:.3,warpTimeFrequency:.3,color0:new a.Color(16711680),color1:new a.Color(65280),color2:new a.Color(255),color3:new a.Color(16776960),colorMix:1,edgeThreshold:0,edgeColor:new a.Color(0),chromaticAberration:.1,anisotropicBlur:.1,distortion:0,distortionScale:.1,temporalDistortion:0,refractionSamples:6,beat:!1}),er=({size:e,dpr:n,renderTargetOptions:t,isSizeUpdate:r,camera:s,geometry:m,baseMaterial:c,materialParameters:u,isCustomTransmission:d,onBeforeInit:p,depthOnBeforeInit:x})=>{const M=O(n),o=i.useMemo(()=>new a.Scene,[]),[h,{mesh:l,depthMaterial:v}]=Be({baseMaterial:c,materialParameters:u,scene:o,geometry:m,isCustomTransmission:d,onBeforeInit:p,depthOnBeforeInit:x}),[f,T]=k({scene:o,camera:s,size:e,dpr:M.fbo,isSizeUpdate:r,depthBuffer:!0,...t}),y=i.useCallback((S,_,D)=>(h(S,_,D),T(S.gl)),[T,h]),g=i.useCallback((S,_)=>{h(null,S,_)},[h]);return[y,g,{scene:o,mesh:l,depthMaterial:v,renderTarget:f,output:f.texture}]},nr=(e,n,t)=>{const r=i.useMemo(()=>{const s=new a.Mesh(n,t);return e.add(s),s},[n,t,e]);return i.useEffect(()=>()=>{e.remove(r),n.dispose(),t.dispose()},[e,n,t,r]),r},tr=(e,n,t,r,s,m)=>{const c=et+s||n>r+s;return m==="smaller"&&c||m==="larger"&&u||m==="both"&&(c||u)},rr=({size:e,boundFor:n,threshold:t})=>{const r=i.useRef(e);return i.useMemo(()=>{const{width:m,height:c}=e,{width:u,height:d}=r.current,p=tr(m,c,u,d,t,n);return p&&(r.current=e),p},[e,n,t])},de=Object.freeze({easeInSine(e){return 1-Math.cos(e*Math.PI/2)},easeOutSine(e){return Math.sin(e*Math.PI/2)},easeInOutSine(e){return-(Math.cos(Math.PI*e)-1)/2},easeInQuad(e){return e*e},easeOutQuad(e){return 1-(1-e)*(1-e)},easeInOutQuad(e){return e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},easeInCubic(e){return e*e*e},easeOutCubic(e){return 1-Math.pow(1-e,3)},easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2},easeInQuart(e){return e*e*e*e},easeOutQuart(e){return 1-Math.pow(1-e,4)},easeInOutQuart(e){return e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2},easeInQuint(e){return e*e*e*e*e},easeOutQuint(e){return 1-Math.pow(1-e,5)},easeInOutQuint(e){return e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2},easeInExpo(e){return e===0?0:Math.pow(2,10*e-10)},easeOutExpo(e){return e===1?1:1-Math.pow(2,-10*e)},easeInOutExpo(e){return e===0?0:e===1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2},easeInCirc(e){return 1-Math.sqrt(1-Math.pow(e,2))},easeOutCirc(e){return Math.sqrt(1-Math.pow(e-1,2))},easeInOutCirc(e){return e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2},easeInBack(e){return 2.70158*e*e*e-1.70158*e*e},easeOutBack(e){return 1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2)},easeInOutBack(e){const t=2.5949095;return e<.5?Math.pow(2*e,2)*((t+1)*2*e-t)/2:(Math.pow(2*e-2,2)*((t+1)*(e*2-2)+t)+2)/2},easeInElastic(e){const n=2*Math.PI/3;return e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*n)},easeOutElastic(e){const n=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*n)+1},easeInOutElastic(e){const n=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)*n))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*n)/2+1},easeInBounce(e){return 1-de.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-de.easeOutBounce(1-2*e))/2:(1+de.easeOutBounce(2*e-1))/2}});function or(e){let n=Math.sin(e*12.9898)*43758.5453;return n-Math.floor(n)}const ar=(e,n="easeOutQuart")=>{const t=e/60,r=de[n];return i.useCallback(m=>{let c=m.getElapsedTime()*t;const u=Math.floor(c),d=r(c-u);c=d+u;const p=or(u);return{beat:c,floor:u,fract:d,hash:p}},[t,r])},ur=(e=60)=>{const n=i.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),t=i.useRef(null);return i.useCallback(s=>{const m=s.getElapsedTime();return t.current===null||m-t.current>=n?(t.current=m,!0):!1},[n])},ir=e=>{var r,s;const n=(r=e.dom)==null?void 0:r.length,t=(s=e.texture)==null?void 0:s.length;return!n||!t||n!==t};var sr=`varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`,mr=`precision highp float; +}`,lr=`precision highp float; varying vec2 vUv; uniform sampler2D u_texture; @@ -1578,5 +1578,5 @@ void main() { alpha *= textureAlpha; gl_FragColor = vec4(textureColor, alpha); -}`;const vr=({params:e,scene:n,onBeforeInit:t})=>{n.children.length>0&&(n.children.forEach(r=>{r instanceof a.Mesh&&(r.geometry.dispose(),r.material.dispose())}),n.remove(...n.children)),e.texture.forEach((r,s)=>{const m=new a.ShaderMaterial({...F({uniforms:{u_texture:{value:r},u_textureResolution:{value:new a.Vector2(0,0)},u_resolution:{value:new a.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[s]?e.boderRadius[s]:0}},vertexShader:cr,fragmentShader:mr},t),...I,transparent:!0}),f=new a.Mesh(new a.PlaneGeometry(1,1),m);n.add(f)})},pr=()=>{const e=i.useRef([]),n=i.useRef([]);return i.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:s,params:m})=>{e.current.length>0&&e.current.forEach((c,u)=>{c.unobserve(n.current[u])}),n.current=[],e.current=[];const f=new Array(m.dom.length).fill(!1);r.current=[...f],s.current=[...f],m.dom.forEach((c,u)=>{const p=M=>{M.forEach(v=>{m.onIntersect[u]&&m.onIntersect[u](v),r.current[u]=v.isIntersecting})},h=new IntersectionObserver(p,{rootMargin:"0px",threshold:0});h.observe(c),e.current.push(h),n.current.push(c)})},[])},fr=()=>{const e=i.useRef([]),n=i.useCallback(({params:t,customParams:r,size:s,resolutionRef:m,scene:f,isIntersectingRef:c})=>{f.children.length!==e.current.length&&(e.current=new Array(f.children.length)),f.children.forEach((u,p)=>{var v,l,d,o,x,y;const h=t.dom[p];if(!h)return;const M=h.getBoundingClientRect();if(e.current[p]=M,u.scale.set(M.width,M.height,1),u.position.set(M.left+M.width*.5-s.width*.5,-M.top-M.height*.5+s.height*.5,0),c.current[p]&&(t.rotation[p]&&u.rotation.copy(t.rotation[p]),u instanceof a.Mesh)){const w=u.material,g=P(w),b=V(w);g("u_texture",t.texture[p]),g("u_textureResolution",[((d=(l=(v=t.texture[p])==null?void 0:v.source)==null?void 0:l.data)==null?void 0:d.width)||0,((y=(x=(o=t.texture[p])==null?void 0:o.source)==null?void 0:x.data)==null?void 0:y.height)||0]),g("u_resolution",m.current.set(M.width,M.height)),g("u_borderRadius",t.boderRadius[p]?t.boderRadius[p]:0),b(r)}})},[]);return[e.current,n]},dr=()=>{const e=i.useRef([]),n=i.useRef([]),t=i.useCallback((r,s=!1)=>{e.current.forEach((f,c)=>{f&&(n.current[c]=!0)});const m=s?[...n.current]:[...e.current];return r<0?m:m[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:n,isIntersecting:t}},gr=e=>({onView:t,onHidden:r})=>{const s=i.useRef(!1);i.useEffect(()=>{let m;const f=()=>{e.current.some(c=>c)?s.current||(t&&t(),s.current=!0):s.current&&(r&&r(),s.current=!1),m=requestAnimationFrame(f)};return m=requestAnimationFrame(f),()=>{cancelAnimationFrame(m)}},[t,r])},Le={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},hr=({size:e,dpr:n,samples:t,isSizeUpdate:r,renderTargetOptions:s,onBeforeInit:m},f=[])=>{const c=U(n),u=i.useMemo(()=>new a.Scene,[]),p=k(e),[h,M]=j({scene:u,camera:p,size:e,dpr:c.fbo,samples:t,isSizeUpdate:r,...s}),[v,l]=$({...Le,updateKey:performance.now()}),[d,o]=fr(),x=i.useRef(new a.Vector2(0,0)),[y,w]=i.useState(!0);i.useMemo(()=>w(!0),f);const g=i.useRef(null),b=i.useMemo(()=>_,[]),C=pr(),{isIntersectingOnceRef:T,isIntersectingRef:D,isIntersecting:z}=dr(),O=gr(D),A=i.useMemo(()=>(R,N)=>{l(R),o({params:v,customParams:N,size:e,resolutionRef:x,scene:u,isIntersectingRef:D})},[D,l,o,e,u,v]);return[i.useCallback((R,N,H)=>{const{gl:oe,size:ae}=R;if(A(N,H),lr(v))return b;if(y){if(g.current===v.updateKey)return b;g.current=v.updateKey}return y&&(vr({params:v,size:ae,scene:u,onBeforeInit:m}),C({isIntersectingRef:D,isIntersectingOnceRef:T,params:v}),w(!1)),M(oe)},[M,C,m,A,y,u,v,T,D,b]),A,{scene:u,camera:p,renderTarget:h,output:h.texture,isIntersecting:z,DOMRects:d,intersections:D.current,useDomView:O}]},xr=(e,n)=>{const{scene:t,camera:r,size:s,dpr:m=!1,isSizeUpdate:f=!1,depth:c=!1,...u}=e,p=i.useRef([]),h=G(s,m);p.current=i.useMemo(()=>Array.from({length:n},()=>{const v=new a.WebGLRenderTarget(h.x,h.y,{...pe,...u});return c&&(v.depthTexture=new a.DepthTexture(h.x,h.y,a.FloatType)),v}),[n]),f&&p.current.forEach(v=>v.setSize(h.x,h.y)),i.useEffect(()=>{const v=p.current;return()=>{v.forEach(l=>l.dispose())}},[n]);const M=i.useCallback((v,l,d)=>{const o=p.current[l];return xe({gl:v,scene:t,camera:r,fbo:o,onBeforeRender:()=>d&&d({read:o.texture})}),o.texture},[t,r]);return[p.current,M]},ke=Object.freeze({interpolate(e,n,t,r=1e-6){const s=e+(n-e)*t;return Math.abs(s){n.children.length>0&&(n.children.forEach(r=>{r instanceof a.Mesh&&(r.geometry.dispose(),r.material.dispose())}),n.remove(...n.children)),e.texture.forEach((r,s)=>{const m=new a.ShaderMaterial({...V({uniforms:{u_texture:{value:r},u_textureResolution:{value:new a.Vector2(0,0)},u_resolution:{value:new a.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[s]?e.boderRadius[s]:0}},vertexShader:sr,fragmentShader:lr},t),...F,transparent:!0}),c=new a.Mesh(new a.PlaneGeometry(1,1),m);n.add(c)})},mr=()=>{const e=i.useRef([]),n=i.useRef([]);return i.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:s,params:m})=>{e.current.length>0&&e.current.forEach((u,d)=>{u.unobserve(n.current[d])}),n.current=[],e.current=[];const c=new Array(m.dom.length).fill(!1);r.current=[...c],s.current=[...c],m.dom.forEach((u,d)=>{const p=M=>{M.forEach(o=>{m.onIntersect[d]&&m.onIntersect[d](o),r.current[d]=o.isIntersecting})},x=new IntersectionObserver(p,{rootMargin:"0px",threshold:0});x.observe(u),e.current.push(x),n.current.push(u)})},[])},vr=()=>{const e=i.useRef([]),n=i.useCallback(({params:t,customParams:r,size:s,resolutionRef:m,scene:c,isIntersectingRef:u})=>{c.children.length!==e.current.length&&(e.current=new Array(c.children.length)),c.children.forEach((d,p)=>{var o,h,l,v,f,T;const x=t.dom[p];if(!x)return;const M=x.getBoundingClientRect();if(e.current[p]=M,d.scale.set(M.width,M.height,1),d.position.set(M.left+M.width*.5-s.width*.5,-M.top-M.height*.5+s.height*.5,0),u.current[p]&&(t.rotation[p]&&d.rotation.copy(t.rotation[p]),d instanceof a.Mesh)){const y=d.material,g=P(y),S=A(y);g("u_texture",t.texture[p]),g("u_textureResolution",[((l=(h=(o=t.texture[p])==null?void 0:o.source)==null?void 0:h.data)==null?void 0:l.width)||0,((T=(f=(v=t.texture[p])==null?void 0:v.source)==null?void 0:f.data)==null?void 0:T.height)||0]),g("u_resolution",m.current.set(M.width,M.height)),g("u_borderRadius",t.boderRadius[p]?t.boderRadius[p]:0),S(r)}})},[]);return[e.current,n]},pr=()=>{const e=i.useRef([]),n=i.useRef([]),t=i.useCallback((r,s=!1)=>{e.current.forEach((c,u)=>{c&&(n.current[u]=!0)});const m=s?[...n.current]:[...e.current];return r<0?m:m[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:n,isIntersecting:t}},fr=e=>({onView:t,onHidden:r})=>{const s=i.useRef(!1);i.useEffect(()=>{let m;const c=()=>{e.current.some(u=>u)?s.current||(t&&t(),s.current=!0):s.current&&(r&&r(),s.current=!1),m=requestAnimationFrame(c)};return m=requestAnimationFrame(c),()=>{cancelAnimationFrame(m)}},[t,r])},Ee={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},dr=({size:e,dpr:n,isSizeUpdate:t,renderTargetOptions:r,onBeforeInit:s},m=[])=>{const c=O(n),u=i.useMemo(()=>new a.Scene,[]),d=E(e),[p,x]=k({scene:u,camera:d,size:e,dpr:c.fbo,isSizeUpdate:t,...r}),[M,o]=L({...Ee,updateKey:performance.now()}),[h,l]=vr(),v=i.useRef(new a.Vector2(0,0)),[f,T]=i.useState(!0);i.useMemo(()=>T(!0),m);const y=i.useRef(null),g=i.useMemo(()=>C,[]),S=mr(),{isIntersectingOnceRef:_,isIntersectingRef:D,isIntersecting:I}=pr(),z=fr(D),R=i.useMemo(()=>(w,W)=>{o(w),l({params:M,customParams:W,size:e,resolutionRef:v,scene:u,isIntersectingRef:D})},[D,o,l,e,u,M]);return[i.useCallback((w,W,K)=>{const{gl:re,size:oe}=w;if(R(W,K),ir(M))return g;if(f){if(y.current===M.updateKey)return g;y.current=M.updateKey}return f&&(cr({params:M,size:oe,scene:u,onBeforeInit:s}),S({isIntersectingRef:D,isIntersectingOnceRef:_,params:M}),T(!1)),x(re)},[x,S,s,R,f,u,M,_,D,g]),R,{scene:u,camera:d,renderTarget:p,output:p.texture,isIntersecting:I,DOMRects:h,intersections:D.current,useDomView:z}]},gr=(e,n)=>{const{scene:t,camera:r,size:s,dpr:m=!1,isSizeUpdate:c=!1,depth:u=!1,...d}=e,p=i.useRef([]),x=N(s,m);p.current=i.useMemo(()=>Array.from({length:n},()=>{const o=new a.WebGLRenderTarget(x.x,x.y,{...ve,...d});return u&&(o.depthTexture=new a.DepthTexture(x.x,x.y,a.FloatType)),o}),[n]),c&&p.current.forEach(o=>o.setSize(x.x,x.y)),i.useEffect(()=>{const o=p.current;return()=>{o.forEach(h=>h.dispose())}},[n]);const M=i.useCallback((o,h,l)=>{const v=p.current[h];return he({gl:o,scene:t,camera:r,fbo:v,onBeforeRender:()=>l&&l({read:v.texture})}),v.texture},[t,r]);return[p.current,M]},hr=Object.freeze({interpolate(e,n,t,r=1e-6){const s=e+(n-e)*t;return Math.abs(s)","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\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\ntype UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = value;\n }\n };\n\nexport type CustomParams = { [uniform: string]: UniformValue };\nexport const setCustomUniform =\n (material: { uniforms: UniformObject }) =>\n (customParams: CustomParams | undefined) => {\n if (customParams === undefined) {\n return;\n }\n Object.keys(customParams).forEach((key) => {\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = customParams[key];\n }\n });\n };\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\n};\n","import * as THREE from \"three\";\n\nexport const ISDEV = process.env.NODE_ENV === \"development\";\n\nexport const MATERIAL_BASIC_PARAMS = {\n transparent: false,\n depthTest: false,\n depthWrite: false,\n};\n\nexport const DEFAULT_TEXTURE = new THREE.DataTexture(\n new Uint8Array([0, 0, 0, 0]),\n 1,\n 1,\n THREE.RGBAFormat\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//\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;\n\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}","float screenAspect = uResolution.x / uResolution.y;\nfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\nvec2 aspectRatio = vec2(\n\tmin(screenAspect / textureAspect, 1.0),\n\tmin(textureAspect / screenAspect, 1.0)\n);\nvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;","vec3 mapColor = texture2D(uMap, uv).rgb;\nvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\nuv = uv * 2.0 - 1.0;\nuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\nuv = (uv + 1.0) / 2.0;","precision highp float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","vec3 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}","vec3 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}","import wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVertex from \"./shaderChunk/planeVertex.glsl\";\nimport defaultVertex from \"./shaderChunk/defaultVertex.glsl\";\nimport hsv2rgb from \"./shaderChunk/hsv2rgb.glsl\";\nimport rgb2hsv from \"./shaderChunk/rgb2hsv.glsl\";\n\nexport type ShaderChunkTypes =\n | \"wobble3D\"\n | \"snoise\"\n | \"coverTexture\"\n | \"fxBlending\"\n | \"planeVertex\"\n | \"defaultVertex\"\n | \"hsv2rgb\"\n | \"rgb2hsv\";\n\nexport const ShaderChunk: { [K in ShaderChunkTypes]: string } = Object.freeze({\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVertex,\n defaultVertex,\n hsv2rgb,\n rgb2hsv,\n});\n","import { ShaderChunk, ShaderChunkTypes } from \"./ShaderChunk\";\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: ShaderChunkTypes): string {\n return resolveIncludes(ShaderChunk[include] || \"\");\n}\n\nfunction resolveIncludes(string: string): string {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport { resolveIncludes };\n","import { resolveIncludes } from \"../libs/shaders/resolveShaders\";\nimport { OnBeforeInitParameters } from \"../fxs/types\";\n\nexport const createMaterialParameters = (\n parameters: OnBeforeInitParameters,\n onBeforeInit?: (parameters: OnBeforeInitParameters) => void\n) => {\n onBeforeInit && onBeforeInit(parameters);\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n return parameters;\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BRUSH_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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.Vector2 };\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uBuffer: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: DEFAULT_TEXTURE },\n uIsTexture: { value: false },\n uMap: { value: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uMapIntensity: { value: BRUSH_PARAMS.mapIntensity },\n uRadius: { value: BRUSH_PARAMS.radius },\n uSmudge: { value: BRUSH_PARAMS.smudge },\n uDissipation: { value: BRUSH_PARAMS.dissipation },\n uMotionBlur: { value: BRUSH_PARAMS.motionBlur },\n uMotionSample: { value: BRUSH_PARAMS.motionSample },\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: BRUSH_PARAMS.color },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [onBeforeInit]) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype SetParams = (newParams?: Partial) => void;\ntype UseParamsReturn = [T, SetParams];\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>((newParams) => {\n if (newParams === undefined) {\n return;\n }\n for (const key in newParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n newParams[paramKey] !== undefined &&\n newParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = newParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_DEFAULT_OPTION: THREE.RenderTargetOptions = {\n depthBuffer: 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 /** If set, the scene depth will be rendered into buffer.depthTexture. default : `false` */\n depth?: boolean;\n} & THREE.RenderTargetOptions;\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 * @param depthBuffer Unlike the default in three.js, the default is `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 = (props: UseFboProps): UseSingleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\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_DEFAULT_OPTION,\n ...renderTargetOptions,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { FBO_DEFAULT_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget;\n write: THREE.WebGLRenderTarget;\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 * @description Custom hook for setting up double buffering with WebGL render targets.\n * @param UseFboProps same as `useSingleFBO`\n */\nexport const useDoubleFBO = (props: UseFboProps): UseDoubleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\n const resolution = useResolution(size, dpr);\n\n const renderTarget = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n\n if (depth) {\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 {\n read: read,\n write: write,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (isSizeUpdate) {\n renderTarget.read?.setSize(resolution.x, resolution.y);\n renderTarget.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, [renderTarget]);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget;\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, renderTarget]\n );\n\n return [\n { read: renderTarget.read, write: renderTarget.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default : `0.05` */\n radius?: number;\n /** Strength of smudge effect , default : `0.0`*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. , default : `1.0` */\n dissipation?: number;\n /** Strength of motion blur , default : `0.0` */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default : `5` */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrushParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrushParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture!) {\n updateValue(\"uIsTexture\", true);\n updateValue(\"uTexture\", params.texture!);\n } else {\n updateValue(\"uIsTexture\", false);\n }\n\n if (params.map!) {\n updateValue(\"uIsMap\", true);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n } else {\n updateValue(\"uIsMap\", false);\n }\n\n updateValue(\"uRadius\", params.radius!);\n updateValue(\"uSmudge\", params.smudge!);\n updateValue(\"uDissipation\", params.dissipation!);\n updateValue(\"uMotionBlur\", params.motionBlur!);\n updateValue(\"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateValue(\"uMouse\", pointerValues.currentPointer);\n updateValue(\"uPrevMouse\", pointerValues.prevPointer);\n }\n updateValue(\"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n updateValue(\"uColor\", color);\n\n updateValue(\"uIsCursor\", params.isCursor!);\n\n // pressure\n updateValue(\"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n updateValue(\"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBuffer\", read);\n });\n },\n [updateValue, updatePointer, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\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 = vec4(dissipation * texture2D(uSource, coord).rgb,1.);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: DEFAULT_TEXTURE },\n uSource: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: DELTA_TIME },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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 clampedUV = clamp(uv, 0.0, 1.0);\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tmultiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0;\n\tmultiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0;\n\treturn multiplier * texture2D(uVelocity, clampedUV).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplatMaterial = ({ onBeforeInit }: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTarget: { value: DEFAULT_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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplatMaterial } from \"./materials/useSplatMaterial\";\nimport { CustomParams, setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\n\nexport type CustomizableKeys =\n | \"advection\"\n | \"splat\"\n | \"curl\"\n | \"vorticity\"\n | \"divergence\"\n | \"clear\"\n | \"pressure\"\n | \"gradientSubtract\";\n\nexport type CustomFluidProps = {\n [K in CustomizableKeys]?: MaterialProps;\n};\nexport type CustomFluidParams = {\n [K in CustomizableKeys]?: CustomParams;\n};\n\nconst useCustomMaterial = (\n materialHook: (materialProps: MaterialProps) => T,\n materialProps?: MaterialProps\n) => {\n return materialHook(materialProps ?? {});\n};\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n customFluidProps,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n customFluidProps?: CustomFluidProps;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n\n const {\n curl,\n vorticity,\n advection,\n divergence,\n pressure,\n clear,\n gradientSubtract,\n splat,\n } = customFluidProps ?? {};\n\n const initialMaterial = useCustomMaterial(useInitialMaterial);\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCustomMaterial(useCurlMaterial, curl);\n const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity);\n const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection);\n const divergenceMaterial = useCustomMaterial(\n useDivergenceMaterial,\n divergence\n );\n const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure);\n const clearMaterial = useCustomMaterial(useClearMaterial, clear);\n const gradientSubtractMaterial = useCustomMaterial(\n useGradientSubtractMaterial,\n gradientSubtract\n );\n const splatMaterial = useCustomMaterial(useSplatMaterial, splat);\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useMemo(() => {\n setUniform(materials.splatMaterial)(\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(material)(\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, mesh };\n};\n","import * as THREE from \"three\";\nimport {\n CustomizableKeys,\n FluidMaterials,\n CustomFluidProps,\n CustomFluidParams,\n useMesh,\n} 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport const DELTA_TIME = 0.016;\n\nexport type FluidParams = {\n /** density disspation , default : `0.98` */\n densityDissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocityDissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocityAcceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressureDissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressureIterations?: number;\n /** curl_strength , default : `35` */\n curlStrength?: number;\n /** splat radius , default : `0.002` */\n splatRadius?: 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 fluidColor?:\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 densityDissipation: 0.98,\n velocityDissipation: 0.99,\n velocityAcceleration: 10.0,\n pressureDissipation: 0.9,\n pressureIterations: 20,\n curlStrength: 35,\n splatRadius: 0.002,\n fluidColor: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeInit` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * customFluidProps: {\n vorticity: {\n onBeforeInit: (parameters) => console.log(parameters),\n },\n },\n\t * ```\n\t*/\n customFluidProps?: CustomFluidProps;\n} & HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n customFluidProps,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n type: THREE.HalfFloatType,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n samples,\n _dpr.fbo,\n isSizeUpdate,\n renderTargetOptions,\n ]\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 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 // setUniform\n const updateParamsList = useMemo(\n () => ({\n advection: setUniform(materials.advectionMaterial),\n splat: setUniform(materials.splatMaterial),\n curl: setUniform(materials.curlMaterial),\n vorticity: setUniform(materials.vorticityMaterial),\n divergence: setUniform(materials.divergenceMaterial),\n clear: setUniform(materials.clearMaterial),\n pressure: setUniform(materials.pressureMaterial),\n gradientSubtract: setUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n // customSetUniform\n const updateCustomParamsList = useMemo<{\n [K in CustomizableKeys]: (customParams: CustomParams | undefined) => void;\n }>(\n () => ({\n advection: setCustomUniform(materials.advectionMaterial),\n splat: setCustomUniform(materials.splatMaterial),\n curl: setCustomUniform(materials.curlMaterial),\n vorticity: setCustomUniform(materials.vorticityMaterial),\n divergence: setCustomUniform(materials.divergenceMaterial),\n clear: setCustomUniform(materials.clearMaterial),\n pressure: setCustomUniform(materials.pressureMaterial),\n gradientSubtract: setCustomUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n\n const updateParams = useCallback(\n (newParams?: FluidParams, customParams?: CustomFluidParams) => {\n setParams(newParams);\n if (customParams) {\n Object.keys(customParams).forEach((key) => {\n updateCustomParamsList[key as CustomizableKeys](\n customParams[key as CustomizableKeys]\n );\n });\n }\n },\n [setParams, updateCustomParamsList]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FluidParams,\n customParams?: CustomFluidParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", read);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.velocityDissipation!\n );\n });\n\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", velocityTex);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.densityDissipation!\n );\n });\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n updateParamsList.splat(\"point\", pointerValues.currentPointer);\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocityAcceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splatRadius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluidColor === \"function\"\n ? params.fluidColor(pointerValues.velocity)\n : params.fluidColor!;\n updateParamsList.splat(\"color\", color);\n });\n }\n\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n updateParamsList.curl(\"uVelocity\", velocityTex);\n });\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n updateParamsList.vorticity(\"uVelocity\", read);\n updateParamsList.vorticity(\"uCurl\", curlTex);\n updateParamsList.vorticity(\"curl\", params.curlStrength!);\n });\n\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n updateParamsList.divergence(\"uVelocity\", velocityTex);\n });\n\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n updateParamsList.clear(\"uTexture\", read);\n updateParamsList.clear(\"value\", params.pressureDissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressureIterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n updateParamsList.pressure(\"uPressure\", read);\n });\n }\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n updateParamsList.gradientSubtract(\"uPressure\", pressureTexTemp);\n updateParamsList.gradientSubtract(\"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n updateParamsList,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n params,\n updateParams,\n ]\n );\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nuniform sampler2D uMap;\nuniform float uOpacity;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(uMap, uv).rgb;\n\tgl_FragColor = vec4(color,uOpacity);\n}","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n scene: THREE.Scene;\n texture?: THREE.Texture;\n};\n\nexport const useMesh = ({\n scale,\n max,\n texture,\n scene,\n onBeforeInit,\n}: UseMeshProps & MaterialProps) => {\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, onBeforeInit]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n const mesh = new THREE.Mesh(geometry.clone(), clonedMat);\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n temp.push(mesh);\n }\n return temp;\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.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 };\n }, [scene, meshArr]);\n\n return meshArr;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\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 fadeoutSpeed?: 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 fadeoutSpeed: 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,\n scale = 64,\n max = 100,\n size,\n dpr,\n renderTargetOptions,\n samples,\n isSizeUpdate,\n onBeforeInit,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateParams = useMemo(() => {\n return (newParams?: RippleParams, customParams?: CustomParams) => {\n setParams(newParams);\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.ShaderMaterial;\n mesh.rotation.z += params.rotation!;\n mesh.scale.x =\n params.fadeoutSpeed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\"uOpacity\", opacity * params.fadeoutSpeed!);\n if (opacity < 0.001) mesh.visible = false;\n }\n setCustomUniform(mesh.material)(customParams);\n });\n };\n }, [meshArr, params, setParams]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: RippleParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n const material = mesh.material as THREE.ShaderMaterial;\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 setUniform(material)(\"uOpacity\", params.alpha!);\n currentWave.current = (currentWave.current + 1) % max;\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { NOISE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: NOISE_PARAMS.scale },\n timeStrength: { value: NOISE_PARAMS.timeStrength },\n noiseOctaves: { value: NOISE_PARAMS.noiseOctaves },\n fbmOctaves: { value: NOISE_PARAMS.fbmOctaves },\n warpOctaves: { value: NOISE_PARAMS.warpOctaves },\n warpDirection: { value: NOISE_PARAMS.warpDirection },\n warpStrength: { value: NOISE_PARAMS.warpStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type NoiseParams = {\n /** noise scale , default : `0.004` */\n scale?: number;\n /** time factor default : `0.3` */\n timeStrength?: number;\n /** noiseOctaves, affects performance default : `2` */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default : `2` */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default : `2` */\n warpOctaves?: number;\n /** direction of domain warping , default : `(2.0,2,0)` */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default : `8.0` */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: NoiseParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: NoiseParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"scale\", params.scale!);\n updateValue(\"timeStrength\", params.timeStrength!);\n updateValue(\"noiseOctaves\", params.noiseOctaves!);\n updateValue(\"fbmOctaves\", params.fbmOctaves!);\n updateValue(\"warpOctaves\", params.warpOctaves!);\n updateValue(\"warpDirection\", params.warpDirection!);\n updateValue(\"warpStrength\", params.warpStrength!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COLORSTRATA_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n isTexture: { value: false },\n scale: { value: COLORSTRATA_PARAMS.scale },\n noise: { value: DEFAULT_TEXTURE },\n noiseStrength: { value: COLORSTRATA_PARAMS.noiseStrength },\n isNoise: { value: false },\n laminateLayer: { value: COLORSTRATA_PARAMS.laminateLayer },\n laminateInterval: {\n value: COLORSTRATA_PARAMS.laminateInterval,\n },\n laminateDetail: { value: COLORSTRATA_PARAMS.laminateDetail },\n distortion: { value: COLORSTRATA_PARAMS.distortion },\n colorFactor: { value: COLORSTRATA_PARAMS.colorFactor },\n uTime: { value: 0 },\n timeStrength: { value: COLORSTRATA_PARAMS.timeStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ColorStrataParams = {\n /** default : `null` */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : `1` */\n scale?: number;\n /** default : `1.0` */\n laminateLayer?: number;\n /** default : `(0.1, 0.1)` */\n laminateInterval?: THREE.Vector2;\n /** default : `(1.0, 1.0)` */\n laminateDetail?: THREE.Vector2;\n /** default : `(0.0, 0.0)` */\n distortion?: THREE.Vector2;\n /** default : `(1.0, 1.0, 1.0)` */\n colorFactor?: THREE.Vector3;\n /** default : `(0.0, 0.0)` */\n timeStrength?: THREE.Vector2;\n /** default : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n ColorStrataParams,\n ColorStrataObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ColorStrataParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ColorStrataParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture) {\n updateValue(\"uTexture\", params.texture);\n updateValue(\"isTexture\", true);\n } else {\n updateValue(\"isTexture\", false);\n updateValue(\"scale\", params.scale!);\n }\n\n if (params.noise) {\n updateValue(\"noise\", params.noise);\n updateValue(\"isNoise\", true);\n updateValue(\"noiseStrength\", params.noiseStrength!);\n } else {\n updateValue(\"isNoise\", false);\n }\n\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n updateValue(\"laminateLayer\", params.laminateLayer!);\n updateValue(\"laminateInterval\", params.laminateInterval!);\n updateValue(\"laminateDetail\", params.laminateDetail!);\n updateValue(\"distortion\", params.distortion!);\n updateValue(\"colorFactor\", params.colorFactor!);\n updateValue(\"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: MARBLE_PARAMS.pattern },\n u_complexity: { value: MARBLE_PARAMS.complexity },\n u_complexityAttenuation: {\n value: MARBLE_PARAMS.complexityAttenuation,\n },\n u_iterations: { value: MARBLE_PARAMS.iterations },\n u_timeStrength: { value: MARBLE_PARAMS.timeStrength },\n u_scale: { value: MARBLE_PARAMS.scale },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MarbleParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MarbleParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_pattern\", params.pattern!);\n updateValue(\"u_complexity\", params.complexity!);\n updateValue(\"u_complexityAttenuation\", params.complexityAttenuation!);\n updateValue(\"u_iterations\", params.iterations!);\n updateValue(\"u_timeStrength\", params.timeStrength!);\n updateValue(\"u_scale\", params.scale!);\n updateValue(\"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COSPALETTE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uRgbWeight: { value: COSPALETTE_PARAMS.rgbWeight },\n uColor1: { value: COSPALETTE_PARAMS.color1 },\n uColor2: { value: COSPALETTE_PARAMS.color2 },\n uColor3: { value: COSPALETTE_PARAMS.color3 },\n uColor4: { value: COSPALETTE_PARAMS.color4 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_TEXTURE,\n color1: new THREE.Color().set(0.5, 0.5, 0.5),\n color2: new THREE.Color().set(0.5, 0.5, 0.5),\n color3: new THREE.Color().set(1, 1, 1),\n color4: new THREE.Color().set(0, 0.1, 0.2),\n rgbWeight: new THREE.Vector3(0.299, 0.587, 0.114),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCosPalette = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CosPaletteParams,\n ColorPaletteObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CosPaletteParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CosPaletteParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor1\", params.color1!);\n updateValue(\"uColor2\", params.color2!);\n updateValue(\"uColor3\", params.color3!);\n updateValue(\"uColor4\", params.color4!);\n updateValue(\"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { DUOTONE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n color0: new THREE.Color(0xffffff),\n color1: new THREE.Color(0x000000),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useDuoTone = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: DuoToneParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DuoToneParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor0\", params.color0!);\n updateValue(\"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float uMapIntensity;\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#usf \n\n\t// color 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 alphaColor = vec3(mix(outputColor,mapColor,mixValue));\n\n\tgl_FragColor = vec4(alphaColor,alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n uMapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n u_alphaMap: { value: DEFAULT_TEXTURE },\n u_isAlphaMap: { value: false },\n uMapIntensity: { value: BLENDING_PARAMS.mapIntensity },\n u_brightness: { value: BLENDING_PARAMS.brightness },\n u_min: { value: BLENDING_PARAMS.min },\n u_max: { value: BLENDING_PARAMS.max },\n u_dodgeColor: { value: new THREE.Color() },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_TEXTURE,\n alphaMap: false,\n mapIntensity: 0.3,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n dodgeColor: false,\n});\n\n/**\n * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. \nIf you don't want to reflect the map's color, you can use useFxBlending instead.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlending = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n if (params.alphaMap) {\n updateValue(\"u_alphaMap\", params.alphaMap!);\n updateValue(\"u_isAlphaMap\", true);\n } else {\n updateValue(\"u_isAlphaMap\", false);\n }\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n if (params.dodgeColor) {\n updateValue(\"u_dodgeColor\", params.dodgeColor);\n updateValue(\"u_isDodgeColor\", true);\n } else {\n updateValue(\"u_isDodgeColor\", false);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","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\t#usf \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 { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: DEFAULT_TEXTURE },\n uTexture1: { value: DEFAULT_TEXTURE },\n padding: { value: FXTEXTURE_PARAMS.padding },\n uMap: { value: DEFAULT_TEXTURE },\n edgeIntensity: { value: FXTEXTURE_PARAMS.edgeIntensity },\n mapIntensity: { value: FXTEXTURE_PARAMS.mapIntensity },\n epicenter: { value: FXTEXTURE_PARAMS.epicenter },\n progress: { value: FXTEXTURE_PARAMS.progress },\n dirX: { value: FXTEXTURE_PARAMS.dir?.x },\n dirY: { value: FXTEXTURE_PARAMS.dir?.y },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture0: DEFAULT_TEXTURE,\n texture1: DEFAULT_TEXTURE,\n padding: 0.0,\n map: DEFAULT_TEXTURE,\n mapIntensity: 0.0,\n edgeIntensity: 0.0,\n epicenter: new THREE.Vector2(0, 0),\n progress: 0.0,\n dir: new THREE.Vector2(0, 0),\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxTexture = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture0\", params.texture0!);\n updateValue(\"uTexture1\", params.texture1!);\n updateValue(\"progress\", params.progress!);\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n updateValue(\"uTextureResolution\", interpolatedResolution);\n updateValue(\"padding\", params.padding!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"mapIntensity\", params.mapIntensity!);\n updateValue(\"edgeIntensity\", params.edgeIntensity!);\n updateValue(\"epicenter\", params.epicenter!);\n updateValue(\"dirX\", params.dir!.x);\n updateValue(\"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { BRIGHTNESSPICKER_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n brightness: new THREE.Vector3(0.5, 0.5, 0.5),\n min: 0.0,\n max: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrightnessPicker = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n BrightnessPickerParams,\n BrightnessPickerObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrightnessPickerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrightnessPickerParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform float uMapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t#usf \n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXBLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n uMapIntensity: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_TEXTURE,\n mapIntensity: 0.3,\n});\n\n/**\n * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike \"useBlending\", the map color is not reflected.\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFxBlending = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n FxBlendingParams,\n FxBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_TEXTURE,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useAlphaBlending = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n AlphaBlendingParams,\n AlphaBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: AlphaBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: AlphaBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n brightness: 1,\n saturation: 1,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useHSV = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: HSVParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: HSVParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\t#usf \n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n}\n\n","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useCoverTexture = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CoverTextureParams,\n CoverTextureObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CoverTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CoverTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** blurSize, default : `3` */\n blurSize?: number;\n /** blurPower, affects performance default : `5` */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n blurSize: 3,\n blurPower: 5,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useSimpleBlur = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n SimpleBlurParams,\n SimpleBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n _dpr.fbo,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n ]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: SimpleBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: SimpleBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n updateValue(\"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n for (let i = 0; i < params.blurPower!; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n MotionBlurParams,\n MotionBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n _dpr.fbo,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n ]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MotionBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MotionBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uBegin\", params.begin!);\n updateValue(\"uEnd\", params.end!);\n updateValue(\"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, updateParams, params]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default : `vec2(0.0,0.0)` */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default : `0.0` */\n progress?: number;\n /** default : `0.0` */\n width?: number;\n /** default : `0.0` */\n strength?: number;\n /** default : `center` */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: WaveParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: WaveParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uEpicenter\", params.epicenter!);\n updateValue(\"uProgress\", params.progress!);\n updateValue(\"uWidth\", params.width!);\n updateValue(\"uStrength\", params.strength!);\n updateValue(\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { CHROMAKEY_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: CHROMAKEY_PARAMS.color },\n u_similarity: { value: CHROMAKEY_PARAMS.similarity },\n u_smoothness: { value: CHROMAKEY_PARAMS.smoothness },\n u_spill: { value: CHROMAKEY_PARAMS.spill },\n u_color: { value: CHROMAKEY_PARAMS.color },\n u_contrast: { value: CHROMAKEY_PARAMS.contrast },\n u_brightness: { value: CHROMAKEY_PARAMS.brightness },\n u_gamma: { value: CHROMAKEY_PARAMS.gamma },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_TEXTURE,\n keyColor: new THREE.Color(0x00ff00),\n similarity: 0.2,\n smoothness: 0.1,\n spill: 0.2,\n color: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),\n contrast: 1.0,\n brightness: 0.0,\n gamma: 1.0,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useChromaKey = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ChromaKeyParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ChromaKeyParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_keyColor\", params.keyColor!);\n updateValue(\"u_similarity\", params.similarity!);\n updateValue(\"u_smoothness\", params.smoothness!);\n updateValue(\"u_spill\", params.spill!);\n updateValue(\"u_color\", params.color!);\n updateValue(\"u_contrast\", params.contrast!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 usf_Position = vec4(position,1.);\n\tvUv = uv;\n\n\t#usf
\n\t\n\tgl_Position = usf_Position;\n}","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec2 uResolution;\n\n#usf \n\nvoid main() {\n\tvec4 usf_FragColor = vec4(1.);\n\n\t#usf
\n\t\n\tgl_FragColor = usf_FragColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform, useResolution } from \"../../..\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlankMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uTime: { value: number };\n uPointer: { value: THREE.Vector2 };\n uResolution: { value: THREE.Vector2 };\n };\n}\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type BlankParams = {\n /** texture, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type BlankObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh<\n THREE.BufferGeometry,\n BlankMaterial\n >;\n material: BlankMaterial;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLANK_PARAMS: BlankParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n beat: false,\n});\n\n/**\n * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`.\n * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms.\n *\n * ※ `usf_FragColor` overrides `gl_FragColor`\n *\n * ※ `usf_Position` overrides `gl_Position`\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlank = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [\n scene,\n camera,\n size,\n _dpr.fbo,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n ]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlankParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlankParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uPointer\", pointer);\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\nfloat random3D(vec3 co) {\n\treturn 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\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","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport {\n DEFAULT_TEXTURE,\n ISDEV,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\nimport { MaterialProps } from \"../../../types\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: {\n value: MORPHPARTICLES_PARAMS.morphProgress,\n },\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: DEFAULT_TEXTURE },\n uIsPicture: { value: false },\n uAlphaPicture: { value: DEFAULT_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: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uAlphaMap: { value: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.wobbleStrength,\n },\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: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMin,\n },\n uSizeRandomMax: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMax,\n },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: {\n value: MORPHPARTICLES_PARAMS.divergencePoint,\n },\n ...mapArrayUniforms,\n },\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n blending: THREE.AdditiveBlending,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeInit,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport {\n setUniform,\n CustomParams,\n setCustomUniform,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uMorphProgress\", newParams.morphProgress);\n updateValue(\"uBlurAlpha\", newParams.blurAlpha);\n updateValue(\"uBlurRadius\", newParams.blurRadius);\n updateValue(\"uPointSize\", newParams.pointSize);\n updateValue(\"uPointAlpha\", newParams.pointAlpha);\n if (newParams.picture) {\n updateValue(\"uPicture\", newParams.picture);\n updateValue(\"uIsPicture\", true);\n } else if (newParams.picture === false) {\n updateValue(\"uIsPicture\", false);\n }\n if (newParams.alphaPicture) {\n updateValue(\"uAlphaPicture\", newParams.alphaPicture);\n updateValue(\"uIsAlphaPicture\", true);\n } else if (newParams.alphaPicture === false) {\n updateValue(\"uIsAlphaPicture\", false);\n }\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n if (newParams.map) {\n updateValue(\"uMap\", newParams.map);\n updateValue(\"uIsMap\", true);\n } else if (newParams.map === false) {\n updateValue(\"uIsMap\", false);\n }\n if (newParams.alphaMap) {\n updateValue(\"uAlphaMap\", newParams.alphaMap);\n updateValue(\"uIsAlphaMap\", true);\n } else if (newParams.alphaMap === false) {\n updateValue(\"uIsAlphaMap\", false);\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n if (newParams.displacement) {\n updateValue(\"uDisplacement\", newParams.displacement);\n updateValue(\"uIsDisplacement\", true);\n } else if (newParams.displacement === false) {\n updateValue(\"uIsDisplacement\", false);\n }\n updateValue(\"uDisplacementIntensity\", newParams.displacementIntensity);\n updateValue(\n \"uDisplacementColorIntensity\",\n newParams.displacementColorIntensity\n );\n updateValue(\"uSizeRandomIntensity\", newParams.sizeRandomIntensity);\n updateValue(\n \"uSizeRandomTimeFrequency\",\n newParams.sizeRandomTimeFrequency\n );\n updateValue(\"uSizeRandomMin\", newParams.sizeRandomMin);\n updateValue(\"uSizeRandomMax\", newParams.sizeRandomMax);\n updateValue(\"uDivergence\", newParams.divergence);\n updateValue(\"uDivergencePoint\", newParams.divergencePoint);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n camera,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({\n scene,\n size,\n dpr,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n ) => {\n updateUniform(rootState, newParams, customParams);\n return updateRenderTarget(rootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: MorphParticlesParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\n\nexport const rewriteVertexShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform float uTime;\n\t\t\tuniform float uWobblePositionFrequency;\n\t\t\tuniform float uWobbleTimeFrequency;\n\t\t\tuniform float uWobbleStrength;\n\t\t\tuniform float uWarpPositionFrequency;\n\t\t\tuniform float uWarpTimeFrequency;\n\t\t\tuniform float uWarpStrength;\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\t\n\t\t\t// edge\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\n\t\t\t#usf \n\n\t\t\tvoid main() {\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 objectNormal = usf_Normal;\n\t\t\t#ifdef USE_TANGENT\n\t\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t\t#endif\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 transformed = usf_Position;\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\t\n\t\t\tvec3 usf_Position = position;\n\t\t\tvec3 usf_Normal = normal;\n\t\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\t\n\t\t\t// Neighbours positions\n\t\t\tfloat shift = 0.01;\n\t\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\t\n\t\t\t// wobble\n\t\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\t\n\t\t\tusf_Position += wobble * normal;\n\t\t\tpositionA += wobblePositionA * normal;\n\t\t\tpositionB += wobblePositionB * normal;\n\n\t\t\t// Compute normal\n\t\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\t\tusf_Normal = cross(toA, toB);\n\t\t\t\n\t\t\t// Varying\n\t\t\tvPosition = usf_Position.xy;\n\t\t\tvWobble = wobble/uWobbleStrength;\n\t\t\t\n\t\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t#include \n\n\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t} else {\n\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t}\n\t\t`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform vec3 uColor0;\n\t\t\tuniform vec3 uColor1;\n\t\t\tuniform vec3 uColor2;\n\t\t\tuniform vec3 uColor3;\n\t\t\tuniform float uColorMix;\n\t\t\tuniform float uEdgeThreshold;\n\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\n\t\t\t// transmission\n\t\t\tuniform float uChromaticAberration; \n\t\t\tuniform float uAnisotropicBlur; \n\t\t\tuniform float uTime;\n\t\t\tuniform float uDistortion;\n\t\t\tuniform float uDistortionScale;\n\t\t\tuniform float uTemporalDistortion;\n\t\t\tuniform float uRefractionSamples;\n\t\t\t\n\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\n\t\t\t#usf \n\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\n\t\t\tvoid main(){\n\t\t\t\t\n\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\n\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t`\n );\n};\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 < uRefractionSamples; 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) / uRefractionSamples,\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) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\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) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uRefractionSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport transmission_pars_fragment from \"../shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"../shaders/transmission_fragment.glsl\";\n\nexport const resolveEachMaterial = ({\n mat,\n isCustomTransmission,\n parameters,\n}: {\n mat: THREE.Material;\n isCustomTransmission: boolean;\n parameters: THREE.WebGLProgramParametersWithUniforms;\n}) => {\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n // if normalMap is defined, don't add tangent attribute\n if (!(mat as any).normalMap) {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\t\tattribute vec4 tangent;\n\t\t\t\t\n\t\t\t\tvoid main() {\n\t\t\t`\n );\n }\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps, OnBeforeInitParameters } from \"../../types\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\nimport { rewriteVertexShader } from \"./utils/rewriteVertexShader\";\nimport { rewriteFragmentShader } from \"./utils/rewriteFragmentShader\";\nimport { resolveEachMaterial } from \"./utils/resolveEachMaterial\";\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 uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uEdgeThreshold: { value: number };\n uEdgeColor: { value: THREE.Color };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uRefractionSamples: { value: number };\n };\n}\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\n\ntype WobbleMaterialParams =\n ConstructorParameters[0];\n\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n depthOnBeforeInit?: (parameters: OnBeforeInitParameters) => void;\n /**\n * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false`\n * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial\n * */\n isCustomTransmission?: boolean;\n}\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n isCustomTransmission = false,\n onBeforeInit,\n depthOnBeforeInit,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\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 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 uEdgeThreshold: { value: WOBBLE3D_PARAMS.edgeThreshold },\n uEdgeColor: { value: WOBBLE3D_PARAMS.edgeColor },\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 uRefractionSamples: { value: WOBBLE3D_PARAMS.refractionSamples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (parameters) => {\n rewriteVertexShader(parameters);\n\n rewriteFragmentShader(parameters);\n\n resolveEachMaterial({\n parameters,\n mat,\n isCustomTransmission,\n });\n\n const cutomizedParams = createMaterialParameters(\n {\n fragmentShader: parameters.fragmentShader,\n vertexShader: parameters.vertexShader,\n // Because wobble3D uses userData to update uniforms.\n uniforms: mat.userData.uniforms,\n },\n onBeforeInit\n );\n parameters.fragmentShader = cutomizedParams.fragmentShader;\n parameters.vertexShader = cutomizedParams.vertexShader;\n Object.assign(parameters.uniforms, cutomizedParams.uniforms);\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 = (parameters) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n rewriteVertexShader(parameters);\n createMaterialParameters(parameters, depthOnBeforeInit);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeInit,\n depthOnBeforeInit,\n isCustomTransmission,\n ]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport {\n setUniform,\n setCustomUniform,\n CustomParams,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n) => void;\n\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 isCustomTransmission,\n baseMaterial,\n materialParameters,\n onBeforeInit,\n depthOnBeforeInit,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n\n const updateValue = setUniform(userData);\n const updateCustomValue = setCustomUniform(userData);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n updateValue(\"uColorMix\", newParams.colorMix);\n updateValue(\"uEdgeThreshold\", newParams.edgeThreshold);\n updateValue(\"uEdgeColor\", newParams.edgeColor);\n updateValue(\"uChromaticAberration\", newParams.chromaticAberration);\n updateValue(\"uAnisotropicBlur\", newParams.anisotropicBlur);\n updateValue(\"uDistortion\", newParams.distortion);\n updateValue(\"uDistortionScale\", newParams.distortionScale);\n updateValue(\"uRefractionSamples\", newParams.refractionSamples);\n updateValue(\"uTemporalDistortion\", newParams.temporalDistortion);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type Wobble3DParams = {\n /** default : `0.3` */\n wobbleStrength?: number;\n /** default : `0.3` */\n wobblePositionFrequency?: number;\n /** default : `0.3` */\n wobbleTimeFrequency?: number;\n /** default : `0.3` */\n warpStrength?: number;\n /** default : `0.3` */\n warpPositionFrequency?: number;\n /** default : `0.3` */\n warpTimeFrequency?: 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 /** Threshold of edge. 0 for edge disabled, default : `0` */\n edgeThreshold?: number;\n /** Color of edge. default : `0x000000` */\n edgeColor?: THREE.Color;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n chromaticAberration?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n distortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n distortionScale?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n temporalDistortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `6` */\n refractionSamples?: number;\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 wobbleStrength: 0.3,\n wobblePositionFrequency: 0.3,\n wobbleTimeFrequency: 0.3,\n warpStrength: 0.3,\n warpPositionFrequency: 0.3,\n warpTimeFrequency: 0.3,\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 edgeThreshold: 0.0,\n edgeColor: new THREE.Color(0x000000),\n chromaticAberration: 0.1,\n anisotropicBlur: 0.1,\n distortion: 0.0,\n distortionScale: 0.1,\n temporalDistortion: 0.0,\n refractionSamples: 6,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n samples,\n renderTargetOptions,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n RootState: RootState,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n ) => {\n updateUniform(RootState, newParams, customParams);\n return updateRenderTarget(RootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: Wobble3DParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(() => {\n const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","import * as THREE from \"three\";\nimport { useMemo, useRef } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { Utils } from \"..\";\n\nexport type ResizeBoundary = {\n /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */\n maxDpr: number;\n isUpdate: boolean;\n};\n\nconst checkUpdate = (\n currentW: number,\n currentH: number,\n memoW: number,\n memoH: number,\n threshold: number,\n boundFor: \"smaller\" | \"larger\" | \"both\"\n) => {\n const isSmaller =\n currentW < memoW - threshold || currentH < memoH - threshold;\n const isLarger =\n currentW > memoW + threshold || currentH > memoH + threshold;\n\n return (\n (boundFor === \"smaller\" && isSmaller) ||\n (boundFor === \"larger\" && isLarger) ||\n (boundFor === \"both\" && (isSmaller || isLarger))\n );\n};\n\nexport const useResizeBoundary = ({\n gl,\n size,\n boundFor,\n threshold,\n}: {\n gl: THREE.WebGLRenderer;\n size: Size;\n boundFor: \"smaller\" | \"larger\" | \"both\";\n threshold: number;\n}) => {\n const memorizedSize = useRef(size);\n\n const resizeBoundary = useMemo(() => {\n const { width: currentW, height: currentH } = size;\n const { width: memoW, height: memoH } = memorizedSize.current;\n\n const isUpdate = checkUpdate(\n currentW,\n currentH,\n memoW,\n memoH,\n threshold,\n boundFor\n );\n const dpr = Utils.getMaxDpr(gl, size);\n\n if (isUpdate) {\n memorizedSize.current = size;\n }\n return {\n maxDpr: dpr,\n isUpdate,\n };\n }, [size, gl, boundFor, threshold]);\n\n return resizeBoundary;\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/Easings\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 scene,\n onBeforeInit,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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]\n ? params.boderRadius![i]\n : 0.0,\n },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n customParams?: CustomParams;\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 ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n updateValue(\"u_texture\", params.texture![i]);\n updateValue(\"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n updateValue(\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n updateValue(\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n updateCustomValue(customParams);\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\nimport { getDpr } from \"../../utils/getDpr\";\nimport { CustomParams } from \"../../utils/setUniforms\";\nimport { DEFAULT_TEXTURE } from \"../../libs/constants\";\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 {\n size,\n dpr,\n samples,\n isSizeUpdate,\n renderTargetOptions,\n onBeforeInit,\n }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => DEFAULT_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 updateParams = useMemo(() => {\n return (newParams?: DomSyncerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateDomRects({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n };\n }, [isIntersectingRef, setParams, updateDomRects, size, scene, params]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DomSyncerParams,\n customParams?: CustomParams\n ) => {\n const { gl, size } = rootState;\n\n updateParams(newParams, customParams);\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 onBeforeInit,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n intersectionHandler,\n onBeforeInit,\n updateParams,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport {\n UseFboProps,\n renderFBO,\n FBO_DEFAULT_OPTION,\n} 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 props: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...targetSettings\n } = props;\n\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_DEFAULT_OPTION,\n ...targetSettings,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","import * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\n\ntype Utils = {\n interpolate: (\n startValue: number,\n endValue: number,\n progress: number,\n threshold?: number\n ) => number;\n /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */\n getMaxDpr: (gl: THREE.WebGLRenderer, size: Size) => number;\n};\n\nexport const Utils: Utils = Object.freeze({\n interpolate(startValue, endValue, progress, threshold = 1e-6): number {\n const result = startValue + (endValue - startValue) * progress;\n return Math.abs(result) < threshold ? 0 : result;\n },\n getMaxDpr(gl, size) {\n return Math.floor(\n gl.capabilities.maxTextureSize / Math.max(size.width, size.height)\n );\n },\n});\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVertex_default","defaultVertex_default","hsv2rgb_default","rgb2hsv_default","ShaderChunk","wobble3D","snoise","coverTexture","fxBlending","planeVertex","defaultVertex","hsv2rgb","rgb2hsv","includePattern","includeReplacer","match","include","resolveIncludes","string","createMaterialParameters","parameters","onBeforeInit","useMesh","BRUSH_PARAMS","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","paramsRef","setParams","newParams","paramKey","FBO_DEFAULT_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","props","isSizeUpdate","depth","renderTargetOptions","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","read","write","_b","getDpr","useBrush","samples","_dpr","updatePointer","pressureEnd","updateValue","updateCustomValue","updateParams","rootState","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","DELTA_TIME","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplatMaterial","useCustomMaterial","materialHook","materialProps","customFluidProps","curl","vorticity","advection","divergence","pressure","clear","gradientSubtract","splat","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","scaledDiffVec","spaltVec","updateParamsList","updateCustomParamsList","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","clonedMat","RIPPLE_PARAMS","useRipple","currentWave","opacity","NOISE_PARAMS","useNoise","clock","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","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","BLANK_PARAMS","useBlank","useCreateObject","points","interactiveMesh","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","rewritedFragmentShader","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","transmission_pars_fragment_default","transmission_fragment_default","resolveEachMaterial","mat","isCustomTransmission","transmission_pars_fragment","transmission_fragment","baseMaterial","materialParameters","depthOnBeforeInit","depthMaterial","WOBBLE3D_PARAMS","cutomizedParams","depthMat","useCreateWobble3D","wobbleGeometry","mergeVertices","userData","useWobble3D","RootState","useAddMesh","checkUpdate","currentW","currentH","memoW","memoH","threshold","boundFor","isSmaller","isLarger","useResizeBoundary","memorizedSize","Utils","Easing","x","c2","c4","c5","getHash","input","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","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","targetSettings","renderTargetArr","updateCopyTexture","startValue","endValue","progress","result"],"mappings":"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"} \ 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/libs/constants.ts","../src/libs/shaders/shaderChunk/wobble3D.glsl","../src/libs/shaders/shaderChunk/snoise.glsl","../src/libs/shaders/shaderChunk/coverTexture.glsl","../src/libs/shaders/shaderChunk/fxBlending.glsl","../src/libs/shaders/shaderChunk/planeVertex.glsl","../src/libs/shaders/shaderChunk/defaultVertex.glsl","../src/libs/shaders/shaderChunk/hsv2rgb.glsl","../src/libs/shaders/shaderChunk/rgb2hsv.glsl","../src/libs/shaders/ShaderChunk.ts","../src/libs/shaders/resolveShaders.ts","../src/utils/createMaterialParameters.ts","../src/fxs/interactions/useBrush/useMesh.ts","../src/utils/useCamera.ts","../src/misc/usePointer.ts","../src/utils/useParams.ts","../src/utils/useSingleFBO.ts","../src/utils/useDoubleFBO.ts","../src/utils/getDpr.ts","../src/fxs/interactions/useBrush/index.ts","../src/fxs/simulations/useFluid/shaders/main.vert","../src/fxs/simulations/useFluid/shaders/init.frag","../src/fxs/simulations/useFluid/materials/useInitialMaterial.ts","../src/fxs/simulations/useFluid/shaders/advection.frag","../src/fxs/simulations/useFluid/materials/useAdvectionMaterial.ts","../src/fxs/simulations/useFluid/shaders/divergence.frag","../src/fxs/simulations/useFluid/materials/useDivergenceMaterial.ts","../src/fxs/simulations/useFluid/shaders/pressure.frag","../src/fxs/simulations/useFluid/materials/usePressureMaterial.ts","../src/fxs/simulations/useFluid/shaders/curl.frag","../src/fxs/simulations/useFluid/materials/useCurlMaterial.ts","../src/fxs/simulations/useFluid/shaders/vorticity.frag","../src/fxs/simulations/useFluid/materials/useVorticityMaterial.ts","../src/fxs/simulations/useFluid/shaders/clear.frag","../src/fxs/simulations/useFluid/materials/useClearMaterial.ts","../src/fxs/simulations/useFluid/shaders/gradientSubtract.frag","../src/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.ts","../src/fxs/simulations/useFluid/shaders/splat.frag","../src/fxs/simulations/useFluid/materials/useSplatMaterial.ts","../src/fxs/simulations/useFluid/useMesh.ts","../src/fxs/simulations/useFluid/index.ts","../src/fxs/simulations/useRipple/shader/main.vert","../src/fxs/simulations/useRipple/shader/main.frag","../src/fxs/simulations/useRipple/useMesh.ts","../src/fxs/simulations/useRipple/index.ts","../src/fxs/noises/useNoise/shader/main.vert","../src/fxs/noises/useNoise/shader/main.frag","../src/fxs/noises/useNoise/useMesh.ts","../src/fxs/noises/useNoise/index.ts","../src/fxs/noises/useColorStrata/shader/main.vert","../src/fxs/noises/useColorStrata/shader/main.frag","../src/fxs/noises/useColorStrata/useMesh.ts","../src/fxs/noises/useColorStrata/index.ts","../src/fxs/noises/useMarble/shader/main.vert","../src/fxs/noises/useMarble/shader/main.frag","../src/fxs/noises/useMarble/useMesh.ts","../src/fxs/noises/useMarble/index.ts","../src/fxs/noises/useCosPalette/shader/main.vert","../src/fxs/noises/useCosPalette/shader/main.frag","../src/fxs/noises/useCosPalette/useMesh.ts","../src/fxs/noises/useCosPalette/index.ts","../src/fxs/utils/useDuoTone/shader/main.vert","../src/fxs/utils/useDuoTone/shader/main.frag","../src/fxs/utils/useDuoTone/useMesh.ts","../src/fxs/utils/useDuoTone/index.ts","../src/fxs/utils/useBlending/shader/main.vert","../src/fxs/utils/useBlending/shader/main.frag","../src/fxs/utils/useBlending/useMesh.ts","../src/fxs/utils/useBlending/index.ts","../src/fxs/utils/useFxTexture/shader/main.vert","../src/fxs/utils/useFxTexture/shader/main.frag","../src/fxs/utils/useFxTexture/useMesh.ts","../src/fxs/utils/useFxTexture/index.ts","../src/fxs/utils/useBrightnessPicker/shader/main.vert","../src/fxs/utils/useBrightnessPicker/shader/main.frag","../src/fxs/utils/useBrightnessPicker/useMesh.ts","../src/fxs/utils/useBrightnessPicker/index.ts","../src/fxs/utils/useFxBlending/shader/main.vert","../src/fxs/utils/useFxBlending/shader/main.frag","../src/fxs/utils/useFxBlending/useMesh.ts","../src/fxs/utils/useFxBlending/index.ts","../src/fxs/utils/useAlphaBlending/shader/main.vert","../src/fxs/utils/useAlphaBlending/shader/main.frag","../src/fxs/utils/useAlphaBlending/useMesh.ts","../src/fxs/utils/useAlphaBlending/index.ts","../src/fxs/utils/useHSV/shader/main.vert","../src/fxs/utils/useHSV/shader/main.frag","../src/fxs/utils/useHSV/useMesh.ts","../src/fxs/utils/useHSV/index.ts","../src/fxs/utils/useCoverTexture/shader/main.vert","../src/fxs/utils/useCoverTexture/shader/main.frag","../src/fxs/utils/useCoverTexture/useMesh.ts","../src/fxs/utils/useCoverTexture/index.ts","../src/fxs/effects/useSimpleBlur/shader/main.vert","../src/fxs/effects/useSimpleBlur/shader/main.frag","../src/fxs/effects/useSimpleBlur/useMesh.ts","../src/fxs/effects/useSimpleBlur/index.ts","../src/fxs/effects/useMotionBlur/shader/main.vert","../src/fxs/effects/useMotionBlur/shader/main.frag","../src/fxs/effects/useMotionBlur/useMesh.ts","../src/fxs/effects/useMotionBlur/index.ts","../src/fxs/effects/useWave/shader/main.vert","../src/fxs/effects/useWave/shader/main.frag","../src/fxs/effects/useWave/useMesh.ts","../src/fxs/effects/useWave/index.ts","../src/fxs/misc/useChromaKey/shader/main.vert","../src/fxs/misc/useChromaKey/shader/main.frag","../src/fxs/misc/useChromaKey/useMesh.ts","../src/fxs/misc/useChromaKey/index.ts","../src/fxs/misc/useBlank/shader/main.vert","../src/fxs/misc/useBlank/shader/main.frag","../src/fxs/misc/useBlank/useMesh.ts","../src/fxs/misc/useBlank/index.ts","../src/fxs/3D/useMorphParticles/utils/useCreateObject.ts","../src/fxs/3D/useMorphParticles/shaders/main.vert","../src/fxs/3D/useMorphParticles/shaders/main.frag","../src/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","../src/fxs/3D/useWobble3D/utils/rewriteVertexShader.ts","../src/fxs/3D/useWobble3D/utils/rewriteFragmentShader.ts","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/utils/resolveEachMaterial.ts","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/utils/useResizeBoundary.ts","../src/libs/Easings.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","../src/libs/Utils.ts"],"sourcesContent":["#usf ","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\n const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","import * as THREE from \"three\";\ntype UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = value;\n }\n };\n\nexport type CustomParams = { [uniform: string]: UniformValue };\nexport const setCustomUniform =\n (material: { uniforms: UniformObject }) =>\n (customParams: CustomParams | undefined) => {\n if (customParams === undefined) {\n return;\n }\n Object.keys(customParams).forEach((key) => {\n const uniforms = material.uniforms;\n if (uniforms && uniforms[key]) {\n uniforms[key].value = customParams[key];\n }\n });\n };\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\ntype Object3DConstructor = new (\n geometry: THREE.BufferGeometry,\n material: M\n) => T;\n\n/**\n * Add geometry and material to Object3D and add them to scene.\n */\nexport const useAddObject = <\n T extends THREE.Object3D,\n M extends THREE.Material\n>(\n scene: THREE.Scene | false,\n geometry: THREE.BufferGeometry,\n material: M,\n Proto: Object3DConstructor\n) => {\n const object3D = useMemo(() => {\n const obj = new Proto(geometry, material);\n scene && scene.add(obj);\n return obj;\n }, [geometry, material, Proto, scene]);\n\n useEffect(() => {\n return () => {\n scene && scene.remove(object3D);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, object3D]);\n\n return object3D;\n};\n","import * as THREE from \"three\";\n\nexport const ISDEV = process.env.NODE_ENV === \"development\";\n\nexport const MATERIAL_BASIC_PARAMS = {\n transparent: false,\n depthTest: false,\n depthWrite: false,\n};\n\nexport const DEFAULT_TEXTURE = new THREE.DataTexture(\n new Uint8Array([0, 0, 0, 0]),\n 1,\n 1,\n THREE.RGBAFormat\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//\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;\n\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}","float screenAspect = uResolution.x / uResolution.y;\nfloat textureAspect = uTextureResolution.x / uTextureResolution.y;\nvec2 aspectRatio = vec2(\n\tmin(screenAspect / textureAspect, 1.0),\n\tmin(textureAspect / screenAspect, 1.0)\n);\nvec2 uv = vUv * aspectRatio + (1.0 - aspectRatio) * .5;","vec3 mapColor = texture2D(uMap, uv).rgb;\nvec3 normalizedMap = mapColor * 2.0 - 1.0;\n\nuv = uv * 2.0 - 1.0;\nuv *= mix(vec2(1.0), abs(normalizedMap.rg), uMapIntensity);\nuv = (uv + 1.0) / 2.0;","precision highp float;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4(position, 1.0);\n}","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","vec3 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}","vec3 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}","import wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVertex from \"./shaderChunk/planeVertex.glsl\";\nimport defaultVertex from \"./shaderChunk/defaultVertex.glsl\";\nimport hsv2rgb from \"./shaderChunk/hsv2rgb.glsl\";\nimport rgb2hsv from \"./shaderChunk/rgb2hsv.glsl\";\n\nexport type ShaderChunkTypes =\n | \"wobble3D\"\n | \"snoise\"\n | \"coverTexture\"\n | \"fxBlending\"\n | \"planeVertex\"\n | \"defaultVertex\"\n | \"hsv2rgb\"\n | \"rgb2hsv\";\n\nexport const ShaderChunk: { [K in ShaderChunkTypes]: string } = Object.freeze({\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVertex,\n defaultVertex,\n hsv2rgb,\n rgb2hsv,\n});\n","import { ShaderChunk, ShaderChunkTypes } from \"./ShaderChunk\";\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: ShaderChunkTypes): string {\n return resolveIncludes(ShaderChunk[include] || \"\");\n}\n\nfunction resolveIncludes(string: string): string {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport { resolveIncludes };\n","import { resolveIncludes } from \"../libs/shaders/resolveShaders\";\nimport { OnBeforeInitParameters } from \"../fxs/types\";\n\nexport const createMaterialParameters = (\n parameters: OnBeforeInitParameters,\n onBeforeInit?: (parameters: OnBeforeInitParameters) => void\n) => {\n onBeforeInit && onBeforeInit(parameters);\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n return parameters;\n};\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BRUSH_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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.Vector2 };\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uBuffer: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uTexture: { value: DEFAULT_TEXTURE },\n uIsTexture: { value: false },\n uMap: { value: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uMapIntensity: { value: BRUSH_PARAMS.mapIntensity },\n uRadius: { value: BRUSH_PARAMS.radius },\n uSmudge: { value: BRUSH_PARAMS.smudge },\n uDissipation: { value: BRUSH_PARAMS.dissipation },\n uMotionBlur: { value: BRUSH_PARAMS.motionBlur },\n uMotionSample: { value: BRUSH_PARAMS.motionSample },\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: BRUSH_PARAMS.color },\n uIsCursor: { value: false },\n uPressureStart: { value: 1.0 },\n uPressureEnd: { value: 1.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [onBeforeInit]) as BrushMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useResolution } from \"./useResolution\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst getCameraProps = (width: number, height: number) => {\n const frustumSize = height;\n const aspect = width / height;\n const [w, h] = [(frustumSize * aspect) / 2, frustumSize / 2];\n return { width: w, height: h, near: -1000, far: 1000 };\n};\n\nexport const useCamera = (\n size: Size,\n cameraType: \"OrthographicCamera\" | \"PerspectiveCamera\" = \"OrthographicCamera\"\n) => {\n const resolution = useResolution(size);\n const { width, height, near, far } = getCameraProps(\n resolution.x,\n resolution.y\n );\n const camera = useMemo(() => {\n return cameraType === \"OrthographicCamera\"\n ? new THREE.OrthographicCamera(\n -width,\n width,\n height,\n -height,\n near,\n far\n )\n : new THREE.PerspectiveCamera(50, width / height);\n }, [width, height, near, far, cameraType]);\n return camera;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useRef } from \"react\";\n\nexport type PointerValues = {\n currentPointer: THREE.Vector2;\n prevPointer: THREE.Vector2;\n diffPointer: THREE.Vector2;\n velocity: THREE.Vector2;\n isVelocityUpdate: boolean;\n};\n\ntype UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues;\n\n/**\n * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}.\n * @description When calling custom in a `useFrame` loop, you can avoid duplication of execution by passing `pointerValues` to the update function of a Pointer-activated fxHook, such as `useBrush`.\n * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0`\n */\nexport const usePointer = (lerp: number = 0): UpdatePointer => {\n const prevPointer = useRef(new THREE.Vector2(0, 0));\n const diffPointer = useRef(new THREE.Vector2(0, 0));\n const lerpPointer = useRef(new THREE.Vector2(0, 0));\n const lastUpdateTime = useRef(0);\n const velocity = useRef(new THREE.Vector2(0, 0));\n const isMoved = useRef(false);\n\n const updatePointer = useCallback(\n (currentPointer: THREE.Vector2) => {\n const now = performance.now();\n\n // lerp\n let current: THREE.Vector2;\n if (isMoved.current && lerp) {\n lerpPointer.current = lerpPointer.current.lerp(\n currentPointer,\n 1 - lerp\n );\n current = lerpPointer.current.clone();\n } else {\n current = currentPointer.clone();\n lerpPointer.current = current;\n }\n\n // first frame\n if (lastUpdateTime.current === 0) {\n lastUpdateTime.current = now;\n prevPointer.current = current;\n }\n const deltaTime = Math.max(1, now - lastUpdateTime.current);\n lastUpdateTime.current = now;\n\n // get velocity\n velocity.current\n .copy(current)\n .sub(prevPointer.current)\n .divideScalar(deltaTime);\n const isUpdate = velocity.current.length() > 0;\n\n //set prev temp pos\n const prevTemp = isMoved.current\n ? prevPointer.current.clone()\n : current;\n if (!isMoved.current && isUpdate) {\n isMoved.current = true;\n }\n prevPointer.current = current;\n\n return {\n currentPointer: current,\n prevPointer: prevTemp,\n diffPointer: diffPointer.current.subVectors(current, prevTemp),\n velocity: velocity.current,\n isVelocityUpdate: isUpdate,\n };\n },\n [lerp]\n );\n\n return updatePointer;\n};\n","import { useCallback, useRef } from \"react\";\n\ntype SetParams = (newParams?: Partial) => void;\ntype UseParamsReturn = [T, SetParams];\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>((newParams) => {\n if (newParams === undefined) {\n return;\n }\n for (const key in newParams) {\n const paramKey = key as keyof T;\n if (\n paramKey in paramsRef.current &&\n newParams[paramKey] !== undefined &&\n newParams[paramKey] !== null\n ) {\n paramsRef.current[paramKey] = newParams[paramKey]!;\n } else {\n console.error(\n `\"${String(\n paramKey\n )}\" does not exist in the params. or \"${String(\n paramKey\n )}\" is null | undefined`\n );\n }\n }\n }, []);\n return [paramsRef.current, setParams];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"./useResolution\";\nimport { Size } from \"@react-three/fiber\";\n\nexport const FBO_DEFAULT_OPTION: THREE.RenderTargetOptions = {\n depthBuffer: 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 /** If set, the scene depth will be rendered into buffer.depthTexture. default : `false` */\n depth?: boolean;\n} & THREE.RenderTargetOptions;\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 * @param depthBuffer Unlike the default in three.js, the default is `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 = (props: UseFboProps): UseSingleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\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_DEFAULT_OPTION,\n ...renderTargetOptions,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { FBO_DEFAULT_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget;\n write: THREE.WebGLRenderTarget;\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 * @description Custom hook for setting up double buffering with WebGL render targets.\n * @param UseFboProps same as `useSingleFBO`\n */\nexport const useDoubleFBO = (props: UseFboProps): UseDoubleFBOReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...renderTargetOptions\n } = props;\n\n const resolution = useResolution(size, dpr);\n\n const renderTarget = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_DEFAULT_OPTION,\n ...renderTargetOptions,\n });\n\n if (depth) {\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 {\n read: read,\n write: write,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (isSizeUpdate) {\n renderTarget.read?.setSize(resolution.x, resolution.y);\n renderTarget.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, [renderTarget]);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget;\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, renderTarget]\n );\n\n return [\n { read: renderTarget.read, write: renderTarget.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type BrushParams = {\n /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */\n texture?: THREE.Texture | false;\n /** You can attach an fx map , default : `false` */\n map?: THREE.Texture | false;\n /** map intensity , default : `0.1` */\n mapIntensity?: number;\n /** size of the stamp, percentage of the size ,default : `0.05` */\n radius?: number;\n /** Strength of smudge effect , default : `0.0`*/\n smudge?: number;\n /** dissipation rate. If set to 1, it will remain. , default : `1.0` */\n dissipation?: number;\n /** Strength of motion blur , default : `0.0` */\n motionBlur?: number;\n /** Number of motion blur samples. Affects performance default : `5` */\n motionSample?: number;\n /** brush color , it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** Follows the cursor even if it loses speed , default : `false` */\n isCursor?: boolean;\n /** brush pressure (0 to 1) , default : `1.0` */\n pressure?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type BrushObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BRUSH_PARAMS: BrushParams = Object.freeze({\n texture: false,\n map: false,\n mapIntensity: 0.1,\n radius: 0.05,\n smudge: 0.0,\n dissipation: 1.0,\n motionBlur: 0.0,\n motionSample: 5,\n color: new THREE.Vector3(1.0, 0.0, 0.0),\n isCursor: false,\n pressure: 1.0,\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBrush = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrushParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrushParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture!) {\n updateValue(\"uIsTexture\", true);\n updateValue(\"uTexture\", params.texture!);\n } else {\n updateValue(\"uIsTexture\", false);\n }\n\n if (params.map!) {\n updateValue(\"uIsMap\", true);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n } else {\n updateValue(\"uIsMap\", false);\n }\n\n updateValue(\"uRadius\", params.radius!);\n updateValue(\"uSmudge\", params.smudge!);\n updateValue(\"uDissipation\", params.dissipation!);\n updateValue(\"uMotionBlur\", params.motionBlur!);\n updateValue(\"uMotionSample\", params.motionSample!);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateValue(\"uMouse\", pointerValues.currentPointer);\n updateValue(\"uPrevMouse\", pointerValues.prevPointer);\n }\n updateValue(\"uVelocity\", pointerValues.velocity);\n\n const color: THREE.Vector3 | THREE.Color =\n typeof params.color === \"function\"\n ? params.color(pointerValues.velocity)\n : params.color!;\n updateValue(\"uColor\", color);\n\n updateValue(\"uIsCursor\", params.isCursor!);\n\n // pressure\n updateValue(\"uPressureEnd\", params.pressure!);\n if (pressureEnd.current === null) {\n pressureEnd.current = params.pressure!;\n }\n updateValue(\"uPressureStart\", pressureEnd.current);\n pressureEnd.current = params.pressure!;\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBuffer\", read);\n });\n },\n [updateValue, updatePointer, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","varying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform vec2 texelSize;\n\nvoid main () {\n\tvUv = uv;\n\tvL = vUv - vec2(texelSize.x, 0.0);\n\tvR = vUv + vec2(texelSize.x, 0.0);\n\tvT = vUv + vec2(0.0, texelSize.y);\n\tvB = vUv - vec2(0.0, texelSize.y);\n\tgl_Position = vec4(position, 1.0);\n}","precision highp float;\n\nvoid main(){\n\tgl_FragColor = vec4(0.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/init.frag\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\n\nexport const useInitialMaterial = () => {\n const initialMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\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 = vec4(dissipation * texture2D(uSource, coord).rgb,1.);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/advection.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: DEFAULT_TEXTURE },\n uSource: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n dt: { value: DELTA_TIME },\n dissipation: { value: 0.0 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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 clampedUV = clamp(uv, 0.0, 1.0);\n\tvec2 multiplier = vec2(1.0, 1.0);\n\tmultiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0;\n\tmultiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0;\n\treturn multiplier * texture2D(uVelocity, clampedUV).xy;\n}\n\nvoid main () {\n\tfloat L = sampleVelocity(vL).x;\n\tfloat R = sampleVelocity(vR).x;\n\tfloat T = sampleVelocity(vT).y;\n\tfloat B = sampleVelocity(vB).y;\n\tfloat div = 0.5 * (R - L + T - B);\n\tgl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/divergence.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tfloat C = texture2D(uPressure, vUv).x;\n\tfloat divergence = texture2D(uDivergence, vUv).x;\n\tfloat pressure = (L + R + B + T - divergence) * 0.25;\n\tgl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/pressure.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return pressureMaterial as PressureMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\n\nvoid main () {\n\tfloat L = texture2D(uVelocity, vL).y;\n\tfloat R = texture2D(uVelocity, vR).y;\n\tfloat T = texture2D(uVelocity, vT).x;\n\tfloat B = texture2D(uVelocity, vB).x;\n\tfloat vorticity = R - L - T + B;\n\tgl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/curl.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return curlMaterial as CurlMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vT;\nvarying vec2 vB;\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float curl;\nuniform float dt;\n\nvoid main () {\n\tfloat T = texture2D(uCurl, vT).x;\n\tfloat B = texture2D(uCurl, vB).x;\n\tfloat C = texture2D(uCurl, vUv).x;\n\tvec2 force = vec2(abs(T) - abs(B), 0.0);\n\tforce *= 1.0 / length(force + 0.00001) * curl * C;\n\tvec2 vel = texture2D(uVelocity, vUv).xy;\n\tgl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/vorticity.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../../libs/constants\";\nimport { DELTA_TIME } from \"..\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]);\n\n return vorticityMaterial as VorticityMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float value;\n\nvoid main () {\n\tgl_FragColor = value * texture2D(uTexture, vUv);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/clear.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 = ({ onBeforeInit }: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\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\nvoid main () {\n\tfloat L = texture2D(uPressure, clamp(vL,0.,1.)).x;\n\tfloat R = texture2D(uPressure, clamp(vR,0.,1.)).x;\n\tfloat T = texture2D(uPressure, clamp(vT,0.,1.)).x;\n\tfloat B = texture2D(uPressure, clamp(vB,0.,1.)).x;\n\tvec2 velocity = texture2D(uVelocity, vUv).xy;\n\tvelocity.xy -= vec2(R - L, T - B);\n\tgl_FragColor = vec4(velocity, 0.0, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/gradientSubtract.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return gradientSubtractMaterial as GradientSubtractMaterial;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 color;\nuniform vec2 point;\nuniform float radius;\n\nvoid main () {\n\tvec2 nPoint = (point + vec2(1.0)) * 0.5;\n\tvec2 p = vUv - nPoint.xy;\n\tp.x *= aspectRatio;\n\tvec3 splat = exp(-dot(p, p) / radius) * color;\n\tvec3 base = texture2D(uTarget, vUv).xyz;\n\tgl_FragColor = vec4(base + splat, 1.0);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/splat.frag\";\nimport { MaterialProps } from \"../../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\n\nexport class SplatMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTarget: { value: THREE.Texture };\n aspectRatio: { value: number };\n color: { value: THREE.Vector3 | THREE.Color };\n point: { value: THREE.Vector2 };\n radius: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useSplatMaterial = ({ onBeforeInit }: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTarget: { value: DEFAULT_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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]);\n\n return splatMaterial as SplatMaterial;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useInitialMaterial } from \"./materials/useInitialMaterial\";\nimport {\n AdvectionMaterial,\n useAdvectionMaterial,\n} from \"./materials/useAdvectionMaterial\";\nimport {\n DivergenceMaterial,\n useDivergenceMaterial,\n} from \"./materials/useDivergenceMaterial\";\nimport {\n PressureMaterial,\n usePressureMaterial,\n} from \"./materials/usePressureMaterial\";\nimport { CurlMaterial, useCurlMaterial } from \"./materials/useCurlMaterial\";\nimport {\n VorticityMaterial,\n useVorticityMaterial,\n} from \"./materials/useVorticityMaterial\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { ClearMaterial, useClearMaterial } from \"./materials/useClearMaterial\";\nimport {\n GradientSubtractMaterial,\n useGradientSubtractMaterial,\n} from \"./materials/useGradientSubtractMaterial\";\nimport { SplatMaterial, useSplatMaterial } from \"./materials/useSplatMaterial\";\nimport { CustomParams, setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\n\ntype TMaterials =\n | AdvectionMaterial\n | DivergenceMaterial\n | CurlMaterial\n | PressureMaterial\n | ClearMaterial\n | GradientSubtractMaterial\n | SplatMaterial;\n\nexport type FluidMaterials = {\n vorticityMaterial: VorticityMaterial;\n curlMaterial: CurlMaterial;\n advectionMaterial: AdvectionMaterial;\n divergenceMaterial: DivergenceMaterial;\n pressureMaterial: PressureMaterial;\n clearMaterial: ClearMaterial;\n gradientSubtractMaterial: GradientSubtractMaterial;\n splatMaterial: SplatMaterial;\n};\n\nexport type CustomizableKeys =\n | \"advection\"\n | \"splat\"\n | \"curl\"\n | \"vorticity\"\n | \"divergence\"\n | \"clear\"\n | \"pressure\"\n | \"gradientSubtract\";\n\nexport type CustomFluidProps = {\n [K in CustomizableKeys]?: MaterialProps;\n};\nexport type CustomFluidParams = {\n [K in CustomizableKeys]?: CustomParams;\n};\n\nconst useCustomMaterial = (\n materialHook: (materialProps: MaterialProps) => T,\n materialProps?: MaterialProps\n) => {\n return materialHook(materialProps ?? {});\n};\n\n/**\n * Returns the material update function in the second argument\n */\nexport const useMesh = ({\n scene,\n size,\n dpr,\n customFluidProps,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n customFluidProps?: CustomFluidProps;\n}) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n\n const {\n curl,\n vorticity,\n advection,\n divergence,\n pressure,\n clear,\n gradientSubtract,\n splat,\n } = customFluidProps ?? {};\n\n const initialMaterial = useCustomMaterial(useInitialMaterial);\n const updateMaterial = initialMaterial.clone();\n const curlMaterial = useCustomMaterial(useCurlMaterial, curl);\n const vorticityMaterial = useCustomMaterial(useVorticityMaterial, vorticity);\n const advectionMaterial = useCustomMaterial(useAdvectionMaterial, advection);\n const divergenceMaterial = useCustomMaterial(\n useDivergenceMaterial,\n divergence\n );\n const pressureMaterial = useCustomMaterial(usePressureMaterial, pressure);\n const clearMaterial = useCustomMaterial(useClearMaterial, clear);\n const gradientSubtractMaterial = useCustomMaterial(\n useGradientSubtractMaterial,\n gradientSubtract\n );\n const splatMaterial = useCustomMaterial(useSplatMaterial, splat);\n const materials = useMemo(\n () => ({\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n }),\n [\n vorticityMaterial,\n curlMaterial,\n advectionMaterial,\n divergenceMaterial,\n pressureMaterial,\n clearMaterial,\n gradientSubtractMaterial,\n splatMaterial,\n ]\n );\n\n const resolution = useResolution(size, dpr);\n useMemo(() => {\n setUniform(materials.splatMaterial)(\n \"aspectRatio\",\n resolution.x / resolution.y\n );\n for (const material of Object.values(materials)) {\n setUniform(material)(\n \"texelSize\",\n new THREE.Vector2(1.0 / resolution.x, 1.0 / resolution.y)\n );\n }\n }, [resolution, materials]);\n\n const mesh = useAddObject(scene, geometry, initialMaterial, THREE.Mesh);\n\n useMemo(() => {\n initialMaterial.dispose();\n mesh.material = updateMaterial;\n }, [initialMaterial, mesh, updateMaterial]);\n\n useEffect(() => {\n return () => {\n for (const material of Object.values(materials)) {\n material.dispose();\n }\n };\n }, [materials]);\n\n const setMeshMaterial = useCallback(\n (material: TMaterials) => {\n mesh.material = material;\n mesh.material.needsUpdate = true;\n },\n [mesh]\n );\n\n return { materials, setMeshMaterial, mesh };\n};\n","import * as THREE from \"three\";\nimport {\n CustomizableKeys,\n FluidMaterials,\n CustomFluidProps,\n CustomFluidParams,\n useMesh,\n} 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { UseFboProps } from \"../../../utils/useSingleFBO\";\nimport { DoubleRenderTarget, useDoubleFBO } from \"../../../utils/useDoubleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport const DELTA_TIME = 0.016;\n\nexport type FluidParams = {\n /** density disspation , default : `0.98` */\n densityDissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocityDissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocityAcceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressureDissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressureIterations?: number;\n /** curl_strength , default : `35` */\n curlStrength?: number;\n /** splat radius , default : `0.002` */\n splatRadius?: 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 fluidColor?:\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 densityDissipation: 0.98,\n velocityDissipation: 0.99,\n velocityAcceleration: 10.0,\n pressureDissipation: 0.9,\n pressureIterations: 20,\n curlStrength: 35,\n splatRadius: 0.002,\n fluidColor: 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 renderTargetOptions,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeInit` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * customFluidProps: {\n vorticity: {\n onBeforeInit: (parameters) => console.log(parameters),\n },\n },\n\t * ```\n\t*/\n customFluidProps?: CustomFluidProps;\n} & HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { materials, setMeshMaterial, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n customFluidProps,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n isSizeUpdate,\n type: THREE.HalfFloatType,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\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 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 // setUniform\n const updateParamsList = useMemo(\n () => ({\n advection: setUniform(materials.advectionMaterial),\n splat: setUniform(materials.splatMaterial),\n curl: setUniform(materials.curlMaterial),\n vorticity: setUniform(materials.vorticityMaterial),\n divergence: setUniform(materials.divergenceMaterial),\n clear: setUniform(materials.clearMaterial),\n pressure: setUniform(materials.pressureMaterial),\n gradientSubtract: setUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n // customSetUniform\n const updateCustomParamsList = useMemo<{\n [K in CustomizableKeys]: (customParams: CustomParams | undefined) => void;\n }>(\n () => ({\n advection: setCustomUniform(materials.advectionMaterial),\n splat: setCustomUniform(materials.splatMaterial),\n curl: setCustomUniform(materials.curlMaterial),\n vorticity: setCustomUniform(materials.vorticityMaterial),\n divergence: setCustomUniform(materials.divergenceMaterial),\n clear: setCustomUniform(materials.clearMaterial),\n pressure: setCustomUniform(materials.pressureMaterial),\n gradientSubtract: setCustomUniform(materials.gradientSubtractMaterial),\n }),\n [materials]\n );\n\n const updateParams = useCallback(\n (newParams?: FluidParams, customParams?: CustomFluidParams) => {\n setParams(newParams);\n if (customParams) {\n Object.keys(customParams).forEach((key) => {\n updateCustomParamsList[key as CustomizableKeys](\n customParams[key as CustomizableKeys]\n );\n });\n }\n },\n [setParams, updateCustomParamsList]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FluidParams,\n customParams?: CustomFluidParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const velocityTex = updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", read);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.velocityDissipation!\n );\n });\n\n const densityTex = updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.advectionMaterial);\n updateParamsList.advection(\"uVelocity\", velocityTex);\n updateParamsList.advection(\"uSource\", read);\n updateParamsList.advection(\n \"dissipation\",\n params.densityDissipation!\n );\n });\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (pointerValues.isVelocityUpdate) {\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n updateParamsList.splat(\"point\", pointerValues.currentPointer);\n const scaledDiff = pointerValues.diffPointer.multiply(\n scaledDiffVec.current\n .set(size.width, size.height)\n .multiplyScalar(params.velocityAcceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splatRadius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluidColor === \"function\"\n ? params.fluidColor(pointerValues.velocity)\n : params.fluidColor!;\n updateParamsList.splat(\"color\", color);\n });\n }\n\n const curlTex = updateCurlFBO(gl, () => {\n setMeshMaterial(materials.curlMaterial);\n updateParamsList.curl(\"uVelocity\", velocityTex);\n });\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.vorticityMaterial);\n updateParamsList.vorticity(\"uVelocity\", read);\n updateParamsList.vorticity(\"uCurl\", curlTex);\n updateParamsList.vorticity(\"curl\", params.curlStrength!);\n });\n\n const divergenceTex = updateDivergenceFBO(gl, () => {\n setMeshMaterial(materials.divergenceMaterial);\n updateParamsList.divergence(\"uVelocity\", velocityTex);\n });\n\n updatePressureFBO(gl, ({ read }) => {\n setMeshMaterial(materials.clearMaterial);\n updateParamsList.clear(\"uTexture\", read);\n updateParamsList.clear(\"value\", params.pressureDissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressureIterations!; i++) {\n pressureTexTemp = updatePressureFBO(gl, ({ read }) => {\n updateParamsList.pressure(\"uPressure\", read);\n });\n }\n\n updateVelocityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.gradientSubtractMaterial);\n updateParamsList.gradientSubtract(\"uPressure\", pressureTexTemp);\n updateParamsList.gradientSubtract(\"uVelocity\", read);\n });\n\n return densityTex;\n },\n [\n materials,\n updateParamsList,\n setMeshMaterial,\n updateCurlFBO,\n updateDensityFBO,\n updateDivergenceFBO,\n updatePointer,\n updatePressureFBO,\n updateVelocityFBO,\n params,\n updateParams,\n ]\n );\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nuniform sampler2D uMap;\nuniform float uOpacity;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(uMap, uv).rgb;\n\tgl_FragColor = vec4(color,uOpacity);\n}","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\ntype UseMeshProps = {\n scale: number;\n max: number;\n scene: THREE.Scene;\n texture?: THREE.Texture;\n};\n\nexport const useMesh = ({\n scale,\n max,\n texture,\n scene,\n onBeforeInit,\n}: UseMeshProps & MaterialProps) => {\n const geometry = useMemo(\n () => new THREE.PlaneGeometry(scale, scale),\n [scale]\n );\n\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, onBeforeInit]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n const mesh = new THREE.Mesh(geometry.clone(), clonedMat);\n mesh.rotateZ(2 * Math.PI * Math.random());\n mesh.visible = false;\n scene.add(mesh);\n temp.push(mesh);\n }\n return temp;\n }, [geometry, material, scene, max]);\n\n useEffect(() => {\n return () => {\n meshArr.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 };\n }, [scene, meshArr]);\n\n return meshArr;\n};\n","import { useCallback, useMemo, useRef } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { usePointer, PointerValues } from \"../../../misc/usePointer\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\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 fadeoutSpeed?: 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 fadeoutSpeed: 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,\n scale = 64,\n max = 100,\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const updateParams = useMemo(() => {\n return (newParams?: RippleParams, customParams?: CustomParams) => {\n setParams(newParams);\n meshArr.forEach((mesh) => {\n if (mesh.visible) {\n const material = mesh.material as THREE.ShaderMaterial;\n mesh.rotation.z += params.rotation!;\n mesh.scale.x =\n params.fadeoutSpeed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\"uOpacity\", opacity * params.fadeoutSpeed!);\n if (opacity < 0.001) mesh.visible = false;\n }\n setCustomUniform(mesh.material)(customParams);\n });\n };\n }, [meshArr, params, setParams]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: RippleParams,\n customParams?: CustomParams\n ) => {\n const { gl, pointer, size } = rootState;\n\n updateParams(newParams, customParams);\n\n const pointerValues = params.pointerValues! || updatePointer(pointer);\n\n if (params.frequency! < pointerValues.diffPointer.length()) {\n const mesh = meshArr[currentWave.current];\n const material = mesh.material as THREE.ShaderMaterial;\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 setUniform(material)(\"uOpacity\", params.alpha!);\n currentWave.current = (currentWave.current + 1) % max;\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, meshArr, updatePointer, max, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n camera: camera,\n meshArr: meshArr,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform float uTime;\nuniform float timeStrength;\nuniform int noiseOctaves;\nuniform int fbmOctaves;\nuniform int warpOctaves;\nuniform vec2 warpDirection;\nuniform float warpStrength;\nuniform float scale;\n\nconst float per = 0.5;\nconst float PI = 3.14159265359;\n\nfloat rnd(vec2 n) {\n\tfloat a = 0.129898;\n\tfloat b = 0.78233;\n\tfloat c = 437.585453;\n\tfloat dt= dot(n ,vec2(a, b));\n\tfloat sn= mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\n\nfloat interpolate(float a, float b, float x){\n float f = (1.0 - cos(x * PI)) * 0.5;\n return a * (1.0 - f) + b * f;\n}\n\nfloat irnd(vec2 p){\n\tvec2 i = floor(p);\n\tvec2 f = fract(p);\n\tvec4 v = vec4(rnd(vec2(i.x,i.y)),rnd(vec2(i.x + 1.0,i.y)),rnd(vec2(i.x,i.y + 1.0)),rnd(vec2(i.x + 1.0, i.y + 1.0)));\n\treturn interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y);\n}\n\n// Based on The Book of Shaders\n// https://thebookofshaders.com/13/\nfloat noise(vec2 p, float time){\n\tfloat t = 0.0;\n\tfor(int i = 0; i < noiseOctaves; i++){\n\t\tfloat freq = pow(2.0, float(i));\n\t\tfloat amp = pow(per, float(noiseOctaves - i));\n\t\tt += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp;\n\t}\n\treturn t;\n}\n\nfloat fbm(vec2 x, float time) {\n\tfloat v = 0.0;\n\tfloat a = 0.5;\n\tvec2 shift = vec2(100);\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n\tfloat sign = 1.0;\n\tfor (int i = 0; i < fbmOctaves; ++i) {\n\t\tv += a * noise(x, time * sign);\n\t\tx = rot * x * 2.0 + shift;\n\t\ta *= 0.5;\n\t\tsign *= -1.0;\n\t}\n\treturn v;\n}\n\nfloat warp(vec2 x, float g,float time){\n\tfloat val = 0.0;\n\tfor (int i = 0; i < warpOctaves; i++){\n\t\tval = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time);\n\t}\n\treturn val;\n}\n\nvoid main() {\n\tfloat noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength);\n\tgl_FragColor = vec4(vec3(noise),1.0);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { NOISE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class NoiseMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTime: { value: number };\n scale: { value: number };\n timeStrength: { value: number };\n noiseOctaves: { value: number };\n fbmOctaves: { value: number };\n warpOctaves: { value: number };\n warpDirection: { value: THREE.Vector2 };\n warpStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: NOISE_PARAMS.scale },\n timeStrength: { value: NOISE_PARAMS.timeStrength },\n noiseOctaves: { value: NOISE_PARAMS.noiseOctaves },\n fbmOctaves: { value: NOISE_PARAMS.fbmOctaves },\n warpOctaves: { value: NOISE_PARAMS.warpOctaves },\n warpDirection: { value: NOISE_PARAMS.warpDirection },\n warpStrength: { value: NOISE_PARAMS.warpStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type NoiseParams = {\n /** noise scale , default : `0.004` */\n scale?: number;\n /** time factor default : `0.3` */\n timeStrength?: number;\n /** noiseOctaves, affects performance default : `2` */\n noiseOctaves?: number;\n /** fbmOctaves, affects performance default : `2` */\n fbmOctaves?: number;\n /** domain warping octaves , affects performance default : `2` */\n warpOctaves?: number;\n /** direction of domain warping , default : `(2.0,2,0)` */\n warpDirection?: THREE.Vector2;\n /** strength of domain warping , default : `8.0` */\n warpStrength?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type NoiseObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const NOISE_PARAMS: NoiseParams = Object.freeze({\n scale: 0.004,\n timeStrength: 0.3,\n noiseOctaves: 2,\n fbmOctaves: 2,\n warpOctaves: 2,\n warpDirection: new THREE.Vector2(2.0, 2.0),\n warpStrength: 8.0,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n *\n * It is a basic value noise with `fbm` and `domain warping`\n */\nexport const useNoise = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: NoiseParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: NoiseParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"scale\", params.scale!);\n updateValue(\"timeStrength\", params.timeStrength!);\n updateValue(\"noiseOctaves\", params.noiseOctaves!);\n updateValue(\"fbmOctaves\", params.fbmOctaves!);\n updateValue(\"warpOctaves\", params.warpOctaves!);\n updateValue(\"warpDirection\", params.warpDirection!);\n updateValue(\"warpStrength\", params.warpStrength!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D uTexture;\nuniform bool isTexture;\nuniform sampler2D noise;\nuniform bool isNoise;\nuniform vec2 noiseStrength;\nuniform float laminateLayer;\nuniform vec2 laminateInterval;\nuniform vec2 laminateDetail;\nuniform vec2 distortion;\nuniform vec3 colorFactor;\nuniform float uTime;\nuniform vec2 timeStrength;\nuniform float scale;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\tvec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale;\n\tvec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0);\n\tfloat alpha = isTexture ? texture2D(uTexture, uv).a : 1.0;\n\t\n\t// Avoid floating point bugs caused by GPU drivers.\n\talpha = (alpha < 1e-10) ? 0.0 : alpha;\n\n\tvec3 col;\n\tfor(float j = 0.0; j < 3.0; j++){\n\t\tfor(float i = 1.0; i < laminateLayer; i++){\n\t\t\tfloat timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x;\n\t\t\tfloat timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y;\n\t\t\tpos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j));\n\t\t\tpos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j));\n\t\t}\n\t\tcol[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.));\n\t}\n\n\tcol *= colorFactor * alpha;\n\tcol = clamp(col, 0.0, 1.0);\n\t\n\tgl_FragColor = vec4(col, alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COLORSTRATA_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class ColorStrataMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n isTexture: { value: boolean };\n scale: { value: number };\n noise: { value: THREE.Texture };\n noiseStrength: { value: THREE.Vector2 };\n isNoise: { value: boolean };\n laminateLayer: { value: number };\n laminateInterval: { value: THREE.Vector2 };\n laminateDetail: { value: THREE.Vector2 };\n distortion: { value: THREE.Vector2 };\n colorFactor: { value: THREE.Vector3 };\n uTime: { value: number };\n timeStrength: { value: THREE.Vector2 };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n isTexture: { value: false },\n scale: { value: COLORSTRATA_PARAMS.scale },\n noise: { value: DEFAULT_TEXTURE },\n noiseStrength: { value: COLORSTRATA_PARAMS.noiseStrength },\n isNoise: { value: false },\n laminateLayer: { value: COLORSTRATA_PARAMS.laminateLayer },\n laminateInterval: {\n value: COLORSTRATA_PARAMS.laminateInterval,\n },\n laminateDetail: { value: COLORSTRATA_PARAMS.laminateDetail },\n distortion: { value: COLORSTRATA_PARAMS.distortion },\n colorFactor: { value: COLORSTRATA_PARAMS.colorFactor },\n uTime: { value: 0 },\n timeStrength: { value: COLORSTRATA_PARAMS.timeStrength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type ColorStrataParams = {\n /** default : `null` */\n texture?: THREE.Texture | false;\n /** Valid when texture is false. default : `1` */\n scale?: number;\n /** default : `1.0` */\n laminateLayer?: number;\n /** default : `(0.1, 0.1)` */\n laminateInterval?: THREE.Vector2;\n /** default : `(1.0, 1.0)` */\n laminateDetail?: THREE.Vector2;\n /** default : `(0.0, 0.0)` */\n distortion?: THREE.Vector2;\n /** default : `(1.0, 1.0, 1.0)` */\n colorFactor?: THREE.Vector3;\n /** default : `(0.0, 0.0)` */\n timeStrength?: THREE.Vector2;\n /** default : `false` */\n noise?: THREE.Texture | false;\n /** default : `(0.0,0.0)` */\n noiseStrength?: THREE.Vector2;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type ColorStrataObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({\n texture: false,\n scale: 1.0,\n laminateLayer: 1.0,\n laminateInterval: new THREE.Vector2(0.1, 0.1),\n laminateDetail: new THREE.Vector2(1, 1),\n distortion: new THREE.Vector2(0, 0),\n colorFactor: new THREE.Vector3(1, 1, 1),\n timeStrength: new THREE.Vector2(0, 0),\n noise: false,\n noiseStrength: new THREE.Vector2(0, 0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useColorStrata = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n ColorStrataParams,\n ColorStrataObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ColorStrataParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ColorStrataParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n if (params.texture) {\n updateValue(\"uTexture\", params.texture);\n updateValue(\"isTexture\", true);\n } else {\n updateValue(\"isTexture\", false);\n updateValue(\"scale\", params.scale!);\n }\n\n if (params.noise) {\n updateValue(\"noise\", params.noise);\n updateValue(\"isNoise\", true);\n updateValue(\"noiseStrength\", params.noiseStrength!);\n } else {\n updateValue(\"isNoise\", false);\n }\n\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n updateValue(\"laminateLayer\", params.laminateLayer!);\n updateValue(\"laminateInterval\", params.laminateInterval!);\n updateValue(\"laminateDetail\", params.laminateDetail!);\n updateValue(\"distortion\", params.distortion!);\n updateValue(\"colorFactor\", params.colorFactor!);\n updateValue(\"timeStrength\", params.timeStrength!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float u_time;\nuniform float u_pattern;\nuniform float u_complexity;\nuniform float u_complexityAttenuation;\nuniform float u_iterations;\nuniform float u_timeStrength;\nuniform float u_scale;\n\nvec3 marble(vec3 p){\n\tvec4 n;\n\tfor(float i;i {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_time: { value: 0 },\n u_pattern: { value: MARBLE_PARAMS.pattern },\n u_complexity: { value: MARBLE_PARAMS.complexity },\n u_complexityAttenuation: {\n value: MARBLE_PARAMS.complexityAttenuation,\n },\n u_iterations: { value: MARBLE_PARAMS.iterations },\n u_timeStrength: { value: MARBLE_PARAMS.timeStrength },\n u_scale: { value: MARBLE_PARAMS.scale },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type MarbleParams = {\n /** You can add random patterns to noise by passing random numbers ,default : `0` */\n pattern?: number;\n /** default : `2` */\n complexity?: number;\n /** default : `0.2` */\n complexityAttenuation?: number;\n /** default : `8` */\n iterations?: number;\n /** default : `0.2` */\n timeStrength?: number;\n /** default : `0.002` */\n scale?: number;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MarbleObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MARBLE_PARAMS: MarbleParams = Object.freeze({\n pattern: 0,\n complexity: 2,\n complexityAttenuation: 0.2,\n iterations: 8,\n timeStrength: 0.2,\n scale: 0.002,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMarble = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MarbleParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MarbleParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_pattern\", params.pattern!);\n updateValue(\"u_complexity\", params.complexity!);\n updateValue(\"u_complexityAttenuation\", params.complexityAttenuation!);\n updateValue(\"u_iterations\", params.iterations!);\n updateValue(\"u_timeStrength\", params.timeStrength!);\n updateValue(\"u_scale\", params.scale!);\n updateValue(\"u_time\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nprecision highp int;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uColor4;\nuniform vec3 uRgbWeight;\n\n\n// Based on glsl-cos-palette by Erkaman\n// https://github.com/Erkaman/glsl-cos-palette\nvec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){\n return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) );\n}\n\nvoid main() {\n\n\tvec4 tex = texture2D(uTexture, vUv);\n\tfloat gray = dot(tex.rgb, uRgbWeight);\t\t\n\n\tvec3 outColor = cosPalette(\n\t\tgray,\n\t\tuColor1,\n\t\tuColor2,\n\t\tuColor3,\n\t\tuColor4\n\t);\n\n\tgl_FragColor = vec4(outColor, tex.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { COSPALETTE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class CosPaletteMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uRgbWeight: { value: THREE.Vector3 };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColor4: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uRgbWeight: { value: COSPALETTE_PARAMS.rgbWeight },\n uColor1: { value: COSPALETTE_PARAMS.color1 },\n uColor2: { value: COSPALETTE_PARAMS.color2 },\n uColor3: { value: COSPALETTE_PARAMS.color3 },\n uColor4: { value: COSPALETTE_PARAMS.color4 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CosPaletteParams,\n ColorPaletteObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CosPaletteParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CosPaletteParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor1\", params.color1!);\n updateValue(\"uColor2\", params.color2!);\n updateValue(\"uColor3\", params.color3!);\n updateValue(\"uColor4\", params.color4!);\n updateValue(\"uRgbWeight\", params.rgbWeight!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 texColor = texture2D(uTexture, uv);\n\tfloat grayscale = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));\n\tvec3 duotone = mix(uColor0, uColor1, grayscale);\n\tgl_FragColor = vec4(duotone, texColor.a);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { DUOTONE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class DuoToneMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type DuoToneParams = {\n /** Make this texture duotone , Default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** 1st color , Default : `THREE.Color(0xffffff)` */\n color0?: THREE.Color;\n /** 2nd color , Default : `THREE.Color(0x000000)` */\n color1?: THREE.Color;\n};\n\nexport type DuoToneObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: DuoToneMaterial;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const DUOTONE_PARAMS: DuoToneParams = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: DuoToneParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DuoToneParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uColor0\", params.color0!);\n updateValue(\"uColor1\", params.color1!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform bool u_isAlphaMap;\nuniform sampler2D u_alphaMap;\nuniform float uMapIntensity;\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#usf \n\n\t// color 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 alphaColor = vec3(mix(outputColor,mapColor,mixValue));\n\n\tgl_FragColor = vec4(alphaColor,alpha);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { BLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n u_alphaMap: { value: THREE.Texture };\n u_isAlphaMap: { value: boolean };\n uMapIntensity: { value: number };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n u_dodgeColor: { value: THREE.Color };\n u_isDodgeColor: { value: boolean };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n u_alphaMap: { value: DEFAULT_TEXTURE },\n u_isAlphaMap: { value: false },\n uMapIntensity: { value: BLENDING_PARAMS.mapIntensity },\n u_brightness: { value: BLENDING_PARAMS.brightness },\n u_min: { value: BLENDING_PARAMS.min },\n u_max: { value: BLENDING_PARAMS.max },\n u_dodgeColor: { value: new THREE.Color() },\n u_isDodgeColor: { value: false },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n if (params.alphaMap) {\n updateValue(\"u_alphaMap\", params.alphaMap!);\n updateValue(\"u_isAlphaMap\", true);\n } else {\n updateValue(\"u_isAlphaMap\", false);\n }\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n if (params.dodgeColor) {\n updateValue(\"u_dodgeColor\", params.dodgeColor);\n updateValue(\"u_isDodgeColor\", true);\n } else {\n updateValue(\"u_isDodgeColor\", false);\n }\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","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\t#usf \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 { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: DEFAULT_TEXTURE },\n uTexture1: { value: DEFAULT_TEXTURE },\n padding: { value: FXTEXTURE_PARAMS.padding },\n uMap: { value: DEFAULT_TEXTURE },\n edgeIntensity: { value: FXTEXTURE_PARAMS.edgeIntensity },\n mapIntensity: { value: FXTEXTURE_PARAMS.mapIntensity },\n epicenter: { value: FXTEXTURE_PARAMS.epicenter },\n progress: { value: FXTEXTURE_PARAMS.progress },\n dirX: { value: FXTEXTURE_PARAMS.dir?.x },\n dirY: { value: FXTEXTURE_PARAMS.dir?.y },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture0: DEFAULT_TEXTURE,\n texture1: DEFAULT_TEXTURE,\n padding: 0.0,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture0\", params.texture0!);\n updateValue(\"uTexture1\", params.texture1!);\n updateValue(\"progress\", params.progress!);\n // calculate resolution by linear interpolation.\n const tex0Res = [\n params.texture0!?.image?.width || 0,\n params.texture0!?.image?.height || 0,\n ];\n const tex1Res = [\n params.texture1!?.image?.width || 0,\n params.texture1!?.image?.height || 0,\n ];\n const interpolatedResolution = tex0Res.map((value, index) => {\n return value + (tex1Res[index] - value) * params.progress!;\n });\n updateValue(\"uTextureResolution\", interpolatedResolution);\n updateValue(\"padding\", params.padding!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"mapIntensity\", params.mapIntensity!);\n updateValue(\"edgeIntensity\", params.edgeIntensity!);\n updateValue(\"epicenter\", params.epicenter!);\n updateValue(\"dirX\", params.dir!.x);\n updateValue(\"dirY\", params.dir!.y);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec3 u_brightness;\nuniform float u_min;\nuniform float u_max;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec3 color = texture2D(u_texture, uv).rgb;\n\tfloat brightness = dot(color,u_brightness);\n\tfloat alpha = clamp(smoothstep(u_min, u_max, brightness),0.0,1.0);\n\tgl_FragColor = vec4(color, alpha);\n}","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { BRIGHTNESSPICKER_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BrightnessPickerMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n u_brightness: { value: THREE.Vector3 };\n u_min: { value: number };\n u_max: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n BrightnessPickerParams,\n BrightnessPickerObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BrightnessPickerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BrightnessPickerParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_min\", params.min!);\n updateValue(\"u_max\", params.max!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform sampler2D uMap;\nuniform float uMapIntensity;\n\nvoid main() {\n\tvec2 uv = vUv;\n\n\t#usf \n\n\tgl_FragColor = texture2D(u_texture, uv);\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXBLENDING_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class FxBlendingMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n u_texture: { value: THREE.Texture };\n uMap: { value: THREE.Texture };\n uMapIntensity: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n FxBlendingParams,\n FxBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: FxBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: FxBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n updateValue(\"uMapIntensity\", params.mapIntensity!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvec2 uv = vUv;\n\tvec4 tex = texture2D(uTexture, uv);\n\tvec4 map = texture2D(uMap, uv);\n\tgl_FragColor = mix(tex,map,map.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n DEFAULT_TEXTURE,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_TEXTURE,\n map: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n AlphaBlendingParams,\n AlphaBlendingObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(ALPHABLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: AlphaBlendingParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: AlphaBlendingParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uMap\", params.map!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform float u_brightness;\nuniform float u_saturation;\n\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n onBeforeInit,\n });\n const camera = useCamera(size);\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(HSV_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: HSVParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: HSVParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_saturation\", params.saturation!);\n\n return updateRenderTarget(gl);\n },\n [updateValue, updateRenderTarget, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform vec2 uTextureResolution;\nuniform sampler2D uTexture;\n\nvoid main() {\n\t#usf \n\t\n\tgl_FragColor = texture2D(uTexture, uv);\n}\n\n","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as FxTextureMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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 = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n CoverTextureParams,\n CoverTextureObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: CoverTextureParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: CoverTextureParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTextureResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uResolution;\nuniform float uBlurSize;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec2 perDivSize = uBlurSize / uResolution;\n\n\t// calc average color value from adjacent point\n\tvec4 outColor = vec4(\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) +\n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + \n\t\ttexture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0))\n\t\t) / 9.0;\n\t\n\tgl_FragColor = outColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { SIMPLEBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class SampleMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uResolution: { value: THREE.Vector2 };\n uBlurSize: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as SampleMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type SimpleBlurParams = {\n /** Make this texture blur , default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** blurSize, default : `3` */\n blurSize?: number;\n /** blurPower, affects performance default : `5` */\n blurPower?: number;\n};\n\nexport type SimpleBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({\n texture: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n SimpleBlurParams,\n SimpleBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: SimpleBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: SimpleBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uResolution\", [\n params.texture!?.source?.data?.width || 0,\n params.texture!?.source?.data?.height || 0,\n ]);\n updateValue(\"uBlurSize\", params.blurSize!);\n\n let _tempTexture: THREE.Texture = updateTempTexture(gl);\n\n for (let i = 0; i < params.blurPower!; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform vec2 uBegin;\nuniform vec2 uEnd;\nuniform float uStrength;\n\nvoid main() {\n\tvec2 uv = vUv;\t\n\tvec4 current = texture2D(uTexture, uv + uBegin*.1);\n\tvec4 back = texture2D(uBackbuffer, uv + uEnd*.1);\n\tvec4 mixed = mix(current,back,uStrength);\n\tgl_FragColor = mixed;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MOTIONBLUR_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class MotionBlurMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uBegin: { value: THREE.Vector2 };\n uEnd: { value: THREE.Vector2 };\n uStrength: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uBegin: { value: MOTIONBLUR_PARAMS.begin },\n uEnd: { value: MOTIONBLUR_PARAMS.end },\n uStrength: { value: MOTIONBLUR_PARAMS.strength },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as MotionBlurMaterial;\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type MotionBlurParams = {\n /** Make this texture blur, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** motion begin, default : `THREE.Vector2(0, 0)` */\n begin?: THREE.Vector2;\n /** motion end, default : `THREE.Vector2(0, 0)` */\n end?: THREE.Vector2;\n /** motion strength, default : `0.9` */\n strength?: number;\n};\n\nexport type MotionBlurObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n begin: new THREE.Vector2(0, 0),\n end: new THREE.Vector2(0, 0),\n strength: 0.9,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useMotionBlur = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn<\n MotionBlurParams,\n MotionBlurObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: MotionBlurParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MotionBlurParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uBegin\", params.begin!);\n updateValue(\"uEnd\", params.end!);\n updateValue(\"uStrength\", params.strength!);\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, updateParams, params]\n );\n\n return [\n updateFx,\n updateParams,\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","#usf ","precision highp float;\n\nvarying vec2 vUv;\nuniform float uProgress;\nuniform float uStrength;\nuniform float uWidth;\nuniform vec2 uEpicenter;\nuniform int uMode;\n\nfloat PI = 3.141592653589;\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tfloat progress = min(uProgress, 1.0);\n\tfloat progressFactor = sin(progress * PI);\n\n\tfloat border = progress - progress * progressFactor * uWidth;\n\tfloat blur = uStrength * progressFactor;\n\t\n\t// 0 ~ 1\n\tvec2 normalizeCenter = (uEpicenter + 1.0) / 2.0;\n\n\t// 0:center 1:horizontal 2:vertical\n\tfloat dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y);\n\n\t// Calculate the maximum distance to the four corners of the screen\n\tfloat maxDistance = max(\n\t\tlength(vec2(0.0, 0.0) - normalizeCenter),\n\t\tmax(\n\t\t\t\tlength(vec2(1.0, 0.0) - normalizeCenter),\n\t\t\t\tmax(\n\t\t\t\t\tlength(vec2(0.0, 1.0) - normalizeCenter),\n\t\t\t\t\tlength(vec2(1.0, 1.0) - normalizeCenter)\n\t\t\t\t)\n\t\t)\n\t);\n\n\t// Scale distance so that waves extend to the edge of the screen\n\tdist = maxDistance > 0.0 ? dist / maxDistance : dist;\n\n\tvec3 color = vec3(smoothstep(border - blur, border, dist) -\n smoothstep(progress, progress + blur, dist));\n\t\n\t// Ensure color is 0 when progress is 0,1\n\tcolor *= progressFactor;\n\n\tgl_FragColor = vec4(color, 1.0);\n}\n\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { WAVE_PARAMS } from \".\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class WaveMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uEpicenter: { value: THREE.Vector2 };\n uProgress: { value: number };\n uStrength: { value: number };\n uWidth: { value: number };\n uMode: { value: number };\n };\n}\n\nexport const useMesh = ({\n scene,\n onBeforeInit,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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 onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) 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 {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type WaveParams = {\n /** -1.0 ~ 1.0 , default : `vec2(0.0,0.0)` */\n epicenter?: THREE.Vector2;\n /** 0.0 ~ 1.0 , default : `0.0` */\n progress?: number;\n /** default : `0.0` */\n width?: number;\n /** default : `0.0` */\n strength?: number;\n /** default : `center` */\n mode?: \"center\" | \"horizontal\" | \"vertical\";\n};\n\nexport type WaveObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n material: THREE.Material;\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const WAVE_PARAMS: WaveParams = Object.freeze({\n epicenter: new THREE.Vector2(0.0, 0.0),\n progress: 0.0,\n width: 0.0,\n strength: 0.0,\n mode: \"center\",\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWave = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, onBeforeInit });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: WaveParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: WaveParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uEpicenter\", params.epicenter!);\n updateValue(\"uProgress\", params.progress!);\n updateValue(\"uWidth\", params.width!);\n updateValue(\"uStrength\", params.strength!);\n updateValue(\n \"uMode\",\n params.mode! === \"center\"\n ? 0\n : params.mode! === \"horizontal\"\n ? 1\n : 2\n );\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","#usf ","precision highp float;\nvarying vec2 vUv;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec3 u_keyColor;\nuniform float u_similarity;\nuniform float u_smoothness;\nuniform float u_spill;\n\nuniform vec4 u_color;\nuniform float u_contrast;\nuniform float u_brightness;\nuniform float u_gamma;\n\n// From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\nvec2 RGBtoUV(vec3 rgb) {\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n}\nfloat getChromeDist(vec3 texColor){\n\tfloat chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor));\n\treturn chromaDist;\n}\n\nfloat getBoxFilteredChromaDist(vec3 rgb, vec2 uv)\n{\n\tvec2 pixel_size = vec2(1.) / u_resolution;\n\tvec2 h_pixel_size = pixel_size / 2.0;\n\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);\n\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);\n\tfloat distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb);\n\tdistVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb);\n\tdistVal *= 2.0;\n\tdistVal += getChromeDist(rgb);\n\treturn distVal / 9.0;\n}\n\nvec4 CalcColor(vec4 rgba)\n{\n\treturn vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a);\n}\n\nvoid main() {\n\n\tvec2 uv = vUv;\n\n\tvec4 texColor = texture2D(u_texture, uv);\n\ttexColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.;\n\n\tfloat chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv);\n\t\n\tfloat baseMask = chromaDist - u_similarity;\n\tfloat fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5);\n\t\n\ttexColor.rgba *= u_color;\n\ttexColor.a = fullMask;\n\n\tfloat spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5);\n\tfloat desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.);\n\ttexColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal);\n\n\tvec4 finColor = CalcColor(texColor);\n\n\tgl_FragColor = finColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { CHROMAKEY_PARAMS } from \".\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_resolution: { value: new THREE.Vector2() },\n u_keyColor: { value: CHROMAKEY_PARAMS.color },\n u_similarity: { value: CHROMAKEY_PARAMS.similarity },\n u_smoothness: { value: CHROMAKEY_PARAMS.smoothness },\n u_spill: { value: CHROMAKEY_PARAMS.spill },\n u_color: { value: CHROMAKEY_PARAMS.color },\n u_contrast: { value: CHROMAKEY_PARAMS.contrast },\n u_brightness: { value: CHROMAKEY_PARAMS.brightness },\n u_gamma: { value: CHROMAKEY_PARAMS.gamma },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n\n return mat;\n }, [onBeforeInit]) as ChromaKeyMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"u_resolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { HooksProps, HooksReturn } from \"../../types\";\nimport { useParams } from \"../../../utils/useParams\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\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: DEFAULT_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 renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: ChromaKeyParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: ChromaKeyParams,\n customParams?: CustomParams\n ) => {\n const { gl } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"u_texture\", params.texture!);\n updateValue(\"u_keyColor\", params.keyColor!);\n updateValue(\"u_similarity\", params.similarity!);\n updateValue(\"u_smoothness\", params.smoothness!);\n updateValue(\"u_spill\", params.spill!);\n updateValue(\"u_color\", params.color!);\n updateValue(\"u_contrast\", params.contrast!);\n updateValue(\"u_brightness\", params.brightness!);\n updateValue(\"u_gamma\", params.gamma!);\n\n return updateRenderTarget(gl);\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\n#usf \n\nvoid main() {\n\tvec4 usf_Position = vec4(position,1.);\n\tvUv = uv;\n\n\t#usf
\n\t\n\tgl_Position = usf_Position;\n}","precision highp float;\n\nvarying vec2 vUv;\n#usf \n\nuniform sampler2D uTexture;\nuniform sampler2D uBackbuffer;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec2 uResolution;\n\n#usf \n\nvoid main() {\n\tvec4 usf_FragColor = vec4(1.);\n\n\t#usf
\n\t\n\tgl_FragColor = usf_FragColor;\n}","import { useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport { Size } from \"@react-three/fiber\";\nimport { setUniform, useResolution } from \"../../..\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\n\nexport class BlankMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n uBackbuffer: { value: THREE.Texture };\n uTime: { value: number };\n uPointer: { value: THREE.Vector2 };\n uResolution: { value: THREE.Vector2 };\n };\n}\nexport const useMesh = ({\n scene,\n size,\n dpr,\n onBeforeInit,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n });\n return mat;\n }, [onBeforeInit]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useDoubleFBO, DoubleRenderTarget } from \"../../../utils/useDoubleFBO\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { useParams } from \"../../../utils/useParams\";\nimport type { HooksProps, HooksReturn } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { UseFboProps } from \"../../..\";\nimport { DEFAULT_TEXTURE } from \"../../../libs/constants\";\n\nexport type BlankParams = {\n /** texture, default : `THREE.Texture()` */\n texture?: THREE.Texture;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type BlankObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh<\n THREE.BufferGeometry,\n BlankMaterial\n >;\n material: BlankMaterial;\n camera: THREE.Camera;\n renderTarget: DoubleRenderTarget;\n output: THREE.Texture;\n};\n\nexport const BLANK_PARAMS: BlankParams = Object.freeze({\n texture: DEFAULT_TEXTURE,\n beat: false,\n});\n\n/**\n * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`.\n * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms.\n *\n * ※ `usf_FragColor` overrides `gl_FragColor`\n *\n * ※ `usf_Position` overrides `gl_Position`\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useBlank = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n onBeforeInit,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n onBeforeInit,\n });\n\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n }),\n [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateParams = useCallback(\n (newParams?: BlankParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateCustomValue(customParams);\n },\n [setParams, updateCustomValue]\n );\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: BlankParams,\n customParams?: CustomParams\n ) => {\n const { gl, clock, pointer } = rootState;\n\n updateParams(newParams, customParams);\n\n updateValue(\"uPointer\", pointer);\n updateValue(\"uTexture\", params.texture!);\n updateValue(\"uTime\", params.beat || clock.getElapsedTime());\n\n return updateRenderTarget(gl, ({ read }) => {\n updateValue(\"uBackbuffer\", read);\n });\n },\n [updateRenderTarget, updateValue, params, updateParams]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene: scene,\n mesh: mesh,\n material: material,\n camera: camera,\n renderTarget: renderTarget,\n output: renderTarget.read.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { useAddObject } from \"../../../../utils/useAddObject\";\n\ntype UseCreateObjectProps = {\n scene: THREE.Scene | false;\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n};\n\nexport type MorphParticlePoints = THREE.Points<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\nexport type InteractiveMesh = THREE.Mesh<\n THREE.BufferGeometry,\n THREE.ShaderMaterial\n>;\n\nexport const useCreateObject = ({\n scene,\n geometry,\n material,\n}: UseCreateObjectProps) => {\n const points = useAddObject(\n scene,\n geometry,\n material,\n THREE.Points\n ) as MorphParticlePoints;\n\n // Generate a mesh for pointer\n const interactiveMesh = useAddObject(\n scene,\n useMemo(() => geometry.clone(), [geometry]),\n useMemo(() => material.clone(), [material]),\n THREE.Mesh\n ) as InteractiveMesh;\n interactiveMesh.visible = false;\n\n return {\n points,\n interactiveMesh,\n };\n};\n","uniform vec2 uResolution;\nuniform float uMorphProgress;\nuniform float uPointSize;\n\nuniform sampler2D uPicture;\nuniform bool uIsPicture;\nuniform sampler2D uAlphaPicture;\nuniform bool uIsAlphaPicture;\n\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\n\nuniform float uTime;\n\nuniform float uWobblePositionFrequency;\nuniform float uWobbleTimeFrequency;\nuniform float uWobbleStrength;\nuniform float uWarpPositionFrequency;\nuniform float uWarpTimeFrequency;\nuniform float uWarpStrength;\n\nuniform sampler2D uDisplacement;\nuniform bool uIsDisplacement;\nuniform float uDisplacementIntensity;\n\nuniform float uSizeRandomIntensity;\nuniform float uSizeRandomTimeFrequency;\nuniform float uSizeRandomMin;\nuniform float uSizeRandomMax;\n\nuniform float uMapArrayLength;\n\nuniform float uDivergence;\nuniform vec3 uDivergencePoint;\n\nvarying vec3 vColor;\nvarying float vPictureAlpha;\nvarying vec3 vDisplacementColor;\nvarying float vDisplacementIntensity;\nvarying float vMapArrayIndex;\n\n#usf \n\n#usf \n\n#usf \n\nfloat random3D(vec3 co) {\n\treturn 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\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","import * as THREE from \"three\";\nimport { ISDEV } from \"../../../../libs/constants\";\n\nexport const rewriteVertexShader = (\n modifeidAttributes: Float32Array[],\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n vertexShader: string,\n itemSize: number\n) => {\n const vTargetName =\n targetAttibute === \"position\" ? \"positionTarget\" : \"uvTarget\";\n const vAttributeRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vTransitionRewriteKey =\n targetAttibute === \"position\"\n ? \"#usf \"\n : \"#usf \";\n const vListName =\n targetAttibute === \"position\" ? \"positionsList\" : \"uvsList\";\n const vMorphTransition =\n targetAttibute === \"position\"\n ? `\n\t\t\t\tfloat scaledProgress = uMorphProgress * ${modifeidAttributes.length - 1}.;\n\t\t\t\tint baseIndex = int(floor(scaledProgress));\t\t\n\t\t\t\tbaseIndex = clamp(baseIndex, 0, ${modifeidAttributes.length - 1});\t\t\n\t\t\t\tfloat progress = fract(scaledProgress);\n\t\t\t\tint nextIndex = baseIndex + 1;\n\t\t\t\tnewPosition = mix(positionsList[baseIndex], positionsList[nextIndex], progress);\n\t\t\t`\n : \"newUv = mix(uvsList[baseIndex], uvsList[nextIndex], progress);\";\n\n if (modifeidAttributes.length > 0) {\n // Delete the position at initialization and add the position after normalization\n targetGeometry.deleteAttribute(targetAttibute);\n targetGeometry.setAttribute(\n targetAttibute,\n new THREE.BufferAttribute(modifeidAttributes[0], itemSize)\n );\n\n let stringToAddToMorphAttibutes = \"\";\n let stringToAddToMorphAttibutesList = \"\";\n\n modifeidAttributes.forEach((target, index) => {\n targetGeometry.setAttribute(\n `${vTargetName}${index}`,\n new THREE.BufferAttribute(target, itemSize)\n );\n stringToAddToMorphAttibutes += `attribute vec${itemSize} ${vTargetName}${index};\\n`;\n if (index === 0) {\n stringToAddToMorphAttibutesList += `${vTargetName}${index}`;\n } else {\n stringToAddToMorphAttibutesList += `,${vTargetName}${index}`;\n }\n });\n\n vertexShader = vertexShader.replace(\n `${vAttributeRewriteKey}`,\n stringToAddToMorphAttibutes\n );\n vertexShader = vertexShader.replace(\n `${vTransitionRewriteKey}`,\n `vec${itemSize} ${vListName}[${modifeidAttributes.length}] = vec${itemSize}[](${stringToAddToMorphAttibutesList});\n\t\t\t\t${vMorphTransition}\n\t\t\t`\n );\n } else {\n vertexShader = vertexShader.replace(`${vAttributeRewriteKey}`, \"\");\n vertexShader = vertexShader.replace(`${vTransitionRewriteKey}`, \"\");\n if (!targetGeometry?.attributes[targetAttibute]?.array) {\n ISDEV &&\n console.error(\n `use-shader-fx:geometry.attributes.${targetAttibute}.array is not found`\n );\n }\n }\n\n return vertexShader;\n};\n","import * as THREE from \"three\";\n\n/**\n * Calculate the maximum length of attribute (position and uv) to match the length of all lists. Randomly map missing attributes when matching to maximum length\n * */\nexport const modifyAttributes = (\n attribute: Float32Array[] | undefined,\n targetGeometry: THREE.BufferGeometry,\n targetAttibute: \"position\" | \"uv\",\n itemSize: number\n) => {\n let modifiedAttribute: Float32Array[] = [];\n if (attribute && attribute.length > 0) {\n if (targetGeometry?.attributes[targetAttibute]?.array) {\n modifiedAttribute = [\n targetGeometry.attributes[targetAttibute].array as Float32Array,\n ...attribute,\n ];\n } else {\n modifiedAttribute = attribute;\n }\n\n const maxLength = Math.max(...modifiedAttribute.map((arr) => arr.length));\n\n modifiedAttribute.forEach((arr, i) => {\n if (arr.length < maxLength) {\n const diff = (maxLength - arr.length) / itemSize;\n const addArray = [];\n const oldArray = Array.from(arr);\n for (let i = 0; i < diff; i++) {\n const randomIndex =\n Math.floor((arr.length / itemSize) * Math.random()) *\n itemSize;\n for (let j = 0; j < itemSize; j++) {\n addArray.push(oldArray[randomIndex + j]);\n }\n }\n modifiedAttribute[i] = new Float32Array([...oldArray, ...addArray]);\n }\n });\n }\n return modifiedAttribute;\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n mapArray: THREE.Texture[] | undefined,\n fragmentShader: string\n) => {\n let mapArrayShader = \"\";\n const mapArrayUniforms: any = {};\n let textureSwitcherCode = \"mapArrayColor = \";\n\n if (mapArray && mapArray.length > 0) {\n mapArray.forEach((map, index) => {\n const condition = `vMapArrayIndex < ${index}.1`; // Comparison with a number with .1 added as the handling of floating points may vary between GPU drivers\n const action = `texture2D(uMapArray${index}, uv)`;\n textureSwitcherCode += `( ${condition} ) ? ${action} : `;\n mapArrayShader += `\n uniform sampler2D uMapArray${index};\n `;\n mapArrayUniforms[`uMapArray${index}`] = { value: map };\n });\n textureSwitcherCode += \"vec4(1.);\";\n mapArrayShader += `bool isMapArray = true;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: mapArray.length };\n } else {\n textureSwitcherCode += \"vec4(1.0);\";\n mapArrayShader += `bool isMapArray = false;`;\n mapArrayUniforms[\"uMapArrayLength\"] = { value: 0 };\n }\n const rewritedFragmentShader = fragmentShader\n .replace(`#usf `, textureSwitcherCode)\n .replace(`#usf `, mapArrayShader);\n\n return { rewritedFragmentShader, mapArrayUniforms };\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useResolution } from \"../../../../utils/useResolution\";\nimport { setUniform } from \"../../../../utils/setUniforms\";\nimport vertexShader from \"../shaders/main.vert\";\nimport fragmentShader from \"../shaders/main.frag\";\nimport { MORPHPARTICLES_PARAMS } from \"..\";\nimport {\n DEFAULT_TEXTURE,\n ISDEV,\n MATERIAL_BASIC_PARAMS,\n} from \"../../../../libs/constants\";\nimport { rewriteVertexShader } from \"./rewriteVertexShader\";\nimport { modifyAttributes } from \"./modifyAttributes\";\nimport { rewriteFragmentShader } from \"./rewriteFragmentShader\";\nimport { MaterialProps } from \"../../../types\";\nimport { createMaterialParameters } from \"../../../../utils/createMaterialParameters\";\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 onBeforeInit,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: {\n value: MORPHPARTICLES_PARAMS.morphProgress,\n },\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: DEFAULT_TEXTURE },\n uIsPicture: { value: false },\n uAlphaPicture: { value: DEFAULT_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: DEFAULT_TEXTURE },\n uIsMap: { value: false },\n uAlphaMap: { value: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.wobbleStrength,\n },\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: DEFAULT_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: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMin,\n },\n uSizeRandomMax: {\n value: MORPHPARTICLES_PARAMS.sizeRandomMax,\n },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: {\n value: MORPHPARTICLES_PARAMS.divergencePoint,\n },\n ...mapArrayUniforms,\n },\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n blending: THREE.AdditiveBlending,\n // Must be transparent\n transparent: true,\n });\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeInit,\n ]) as MorphParticlesMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n return { material, modifiedPositions, modifiedUvs };\n};\n","import * as THREE from \"three\";\nimport { Size, RootState } from \"@react-three/fiber\";\nimport {\n InteractiveMesh,\n MorphParticlePoints,\n useCreateObject,\n} from \"./utils/useCreateObject\";\nimport { useMaterial } from \"./utils/useMaterial\";\nimport { MorphParticlesParams } from \".\";\nimport {\n setUniform,\n CustomParams,\n setCustomUniform,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { Create3DHooksProps } from \"../types\";\nimport { Dpr } from \"../../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\n\nexport type UseCreateMorphParticlesProps = {\n size: Size;\n dpr: Dpr;\n /** default : `THREE.SphereGeometry(1, 32, 32)` */\n geometry?: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n /** Array of textures to map to points. Mapped at random. */\n mapArray?: THREE.Texture[];\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n) => void;\n\ntype UseCreateMorphParticlesReturn = [\n UpdateUniform,\n {\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n positions: Float32Array[];\n uvs: Float32Array[];\n }\n];\n\nexport const useCreateMorphParticles = ({\n size,\n dpr,\n scene = false,\n geometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n onBeforeInit,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uMorphProgress\", newParams.morphProgress);\n updateValue(\"uBlurAlpha\", newParams.blurAlpha);\n updateValue(\"uBlurRadius\", newParams.blurRadius);\n updateValue(\"uPointSize\", newParams.pointSize);\n updateValue(\"uPointAlpha\", newParams.pointAlpha);\n if (newParams.picture) {\n updateValue(\"uPicture\", newParams.picture);\n updateValue(\"uIsPicture\", true);\n } else if (newParams.picture === false) {\n updateValue(\"uIsPicture\", false);\n }\n if (newParams.alphaPicture) {\n updateValue(\"uAlphaPicture\", newParams.alphaPicture);\n updateValue(\"uIsAlphaPicture\", true);\n } else if (newParams.alphaPicture === false) {\n updateValue(\"uIsAlphaPicture\", false);\n }\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n if (newParams.map) {\n updateValue(\"uMap\", newParams.map);\n updateValue(\"uIsMap\", true);\n } else if (newParams.map === false) {\n updateValue(\"uIsMap\", false);\n }\n if (newParams.alphaMap) {\n updateValue(\"uAlphaMap\", newParams.alphaMap);\n updateValue(\"uIsAlphaMap\", true);\n } else if (newParams.alphaMap === false) {\n updateValue(\"uIsAlphaMap\", false);\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n if (newParams.displacement) {\n updateValue(\"uDisplacement\", newParams.displacement);\n updateValue(\"uIsDisplacement\", true);\n } else if (newParams.displacement === false) {\n updateValue(\"uIsDisplacement\", false);\n }\n updateValue(\"uDisplacementIntensity\", newParams.displacementIntensity);\n updateValue(\n \"uDisplacementColorIntensity\",\n newParams.displacementColorIntensity\n );\n updateValue(\"uSizeRandomIntensity\", newParams.sizeRandomIntensity);\n updateValue(\n \"uSizeRandomTimeFrequency\",\n newParams.sizeRandomTimeFrequency\n );\n updateValue(\"uSizeRandomMin\", newParams.sizeRandomMin);\n updateValue(\"uSizeRandomMax\", newParams.sizeRandomMax);\n updateValue(\"uDivergence\", newParams.divergence);\n updateValue(\"uDivergencePoint\", newParams.divergencePoint);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: modifiedPositions,\n uvs: modifiedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport {\n useCreateMorphParticles,\n UseCreateMorphParticlesProps,\n} from \"./useCreateMorphParticles\";\nimport { HooksProps3D } from \"../types\";\nimport { InteractiveMesh, MorphParticlePoints } from \"./utils/useCreateObject\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type MorphParticlesParams = {\n /** progress value to morph vertices,0~1 */\n morphProgress?: number;\n blurAlpha?: number;\n blurRadius?: number;\n pointSize?: number;\n /** default : `1` */\n pointAlpha?: number;\n /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */\n picture?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */\n alphaPicture?: THREE.Texture | false;\n color0?: THREE.Color;\n color1?: THREE.Color;\n color2?: THREE.Color;\n color3?: THREE.Color;\n /** This maps to point,texture */\n map?: THREE.Texture | false;\n /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */\n alphaMap?: THREE.Texture | false;\n /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */\n wobbleStrength?: number;\n wobblePositionFrequency?: number;\n wobbleTimeFrequency?: number;\n /** default : `0` */\n warpStrength?: number;\n warpPositionFrequency?: number;\n warpTimeFrequency?: number;\n /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */\n displacement?: THREE.Texture | false;\n /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */\n displacementIntensity?: number;\n /** Strength to reflect color ch of displacement texture */\n displacementColorIntensity?: number;\n /** If set to 0, noise calculation stops, default : `0` */\n sizeRandomIntensity?: number;\n sizeRandomTimeFrequency?: number;\n sizeRandomMin?: number;\n sizeRandomMax?: number;\n /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */\n divergence?: number;\n /** Divergence centre point, default : `THREE.Vector3(0)` */\n divergencePoint?: THREE.Vector3;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n};\n\nexport type MorphParticlesObject = {\n scene: THREE.Scene;\n points: MorphParticlePoints;\n interactiveMesh: InteractiveMesh;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n positions: Float32Array[];\n uvs: Float32Array[];\n};\n\nexport const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({\n morphProgress: 0,\n blurAlpha: 0.9,\n blurRadius: 0.05,\n pointSize: 0.05,\n pointAlpha: 1,\n picture: false,\n alphaPicture: false,\n color0: new THREE.Color(0xff0000),\n color1: new THREE.Color(0x00ff00),\n color2: new THREE.Color(0x0000ff),\n color3: new THREE.Color(0xffff00),\n map: false,\n alphaMap: false,\n wobbleStrength: 0.0,\n wobblePositionFrequency: 0.5,\n wobbleTimeFrequency: 0.5,\n warpStrength: 0.0,\n warpPositionFrequency: 0.5,\n warpTimeFrequency: 0.5,\n displacement: false,\n displacementIntensity: 1,\n displacementColorIntensity: 0,\n sizeRandomIntensity: 0,\n sizeRandomTimeFrequency: 0.2,\n sizeRandomMin: 0.5,\n sizeRandomMax: 1.5,\n divergence: 0,\n divergencePoint: new THREE.Vector3(0),\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useMorphParticles = ({\n size,\n dpr,\n isSizeUpdate,\n renderTargetOptions,\n camera,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n}: HooksProps3D & UseCreateMorphParticlesProps): HooksReturn<\n MorphParticlesParams,\n MorphParticlesObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [\n updateUniform,\n {\n points,\n interactiveMesh,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ] = useCreateMorphParticles({\n scene,\n size,\n dpr,\n geometry,\n positions,\n uvs,\n onBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: MorphParticlesParams,\n customParams?: CustomParams\n ) => {\n updateUniform(rootState, newParams, customParams);\n return updateRenderTarget(rootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: MorphParticlesParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n points,\n interactiveMesh,\n renderTarget,\n output: renderTarget.texture,\n positions: generatedPositions,\n uvs: generatedUvs,\n },\n ];\n};\n","import * as THREE from \"three\";\n\nexport const rewriteVertexShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform float uTime;\n\t\t\tuniform float uWobblePositionFrequency;\n\t\t\tuniform float uWobbleTimeFrequency;\n\t\t\tuniform float uWobbleStrength;\n\t\t\tuniform float uWarpPositionFrequency;\n\t\t\tuniform float uWarpTimeFrequency;\n\t\t\tuniform float uWarpStrength;\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\t\n\t\t\t// edge\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\n\t\t\t#usf \n\n\t\t\tvoid main() {\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 objectNormal = usf_Normal;\n\t\t\t#ifdef USE_TANGENT\n\t\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t\t#endif\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"#include \",\n `\n\t\t\tvec3 transformed = usf_Position;\n\t\t`\n );\n\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\t\n\t\t\tvec3 usf_Position = position;\n\t\t\tvec3 usf_Normal = normal;\n\t\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\t\n\t\t\t// Neighbours positions\n\t\t\tfloat shift = 0.01;\n\t\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\t\n\t\t\t// wobble\n\t\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\t\n\t\t\tusf_Position += wobble * normal;\n\t\t\tpositionA += wobblePositionA * normal;\n\t\t\tpositionB += wobblePositionB * normal;\n\n\t\t\t// Compute normal\n\t\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\t\tusf_Normal = cross(toA, toB);\n\t\t\t\n\t\t\t// Varying\n\t\t\tvPosition = usf_Position.xy;\n\t\t\tvWobble = wobble/uWobbleStrength;\n\t\t\t\n\t\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n};\n","import * as THREE from \"three\";\n\nexport const rewriteFragmentShader = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t#include \n\n\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t} else {\n\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t}\n\t\t`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\tuniform vec3 uColor0;\n\t\t\tuniform vec3 uColor1;\n\t\t\tuniform vec3 uColor2;\n\t\t\tuniform vec3 uColor3;\n\t\t\tuniform float uColorMix;\n\t\t\tuniform float uEdgeThreshold;\n\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\n\t\t\t// transmission\n\t\t\tuniform float uChromaticAberration; \n\t\t\tuniform float uAnisotropicBlur; \n\t\t\tuniform float uTime;\n\t\t\tuniform float uDistortion;\n\t\t\tuniform float uDistortionScale;\n\t\t\tuniform float uTemporalDistortion;\n\t\t\tuniform float uRefractionSamples;\n\t\t\t\n\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\n\t\t\t#usf \n\n\t\t\tvarying float vWobble;\n\t\t\tvarying vec2 vPosition;\n\t\t\tvarying vec3 vEdgeNormal;\n\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\n\t\t\tvoid main(){\n\t\t\t\t\n\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\n\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t`\n );\n};\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 < uRefractionSamples; 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) / uRefractionSamples,\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) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\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) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples,\n\t\tmaterial.attenuationColor, material.attenuationDistance\n\t).b;\n\ttransmission.r += transmissionR;\n\ttransmission.g += transmissionG;\n\ttransmission.b += transmissionB;\n}\n\ntransmission /= uRefractionSamples;\n// to here\n\ntotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n\n#endif","import * as THREE from \"three\";\nimport transmission_pars_fragment from \"../shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"../shaders/transmission_fragment.glsl\";\n\nexport const resolveEachMaterial = ({\n mat,\n isCustomTransmission,\n parameters,\n}: {\n mat: THREE.Material;\n isCustomTransmission: boolean;\n parameters: THREE.WebGLProgramParametersWithUniforms;\n}) => {\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n // if normalMap is defined, don't add tangent attribute\n if (!(mat as any).normalMap) {\n parameters.vertexShader = parameters.vertexShader.replace(\n \"void main() {\",\n `\n\t\t\t\tattribute vec4 tangent;\n\t\t\t\t\n\t\t\t\tvoid main() {\n\t\t\t`\n );\n }\n};\n","import * as THREE from \"three\";\nimport { useMemo } from \"react\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps, OnBeforeInitParameters } from \"../../types\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\nimport { rewriteVertexShader } from \"./utils/rewriteVertexShader\";\nimport { rewriteFragmentShader } from \"./utils/rewriteFragmentShader\";\nimport { resolveEachMaterial } from \"./utils/resolveEachMaterial\";\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 uColor0: { value: THREE.Color };\n uColor1: { value: THREE.Color };\n uColor2: { value: THREE.Color };\n uColor3: { value: THREE.Color };\n uColorMix: { value: number };\n uEdgeThreshold: { value: number };\n uEdgeColor: { value: THREE.Color };\n uChromaticAberration: { value: number };\n uAnisotropicBlur: { value: number };\n uDistortion: { value: number };\n uDistortionScale: { value: number };\n uTemporalDistortion: { value: number };\n uRefractionSamples: { value: number };\n };\n}\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\n\ntype WobbleMaterialParams =\n ConstructorParameters[0];\n\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n depthOnBeforeInit?: (parameters: OnBeforeInitParameters) => void;\n /**\n * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false`\n * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial\n * */\n isCustomTransmission?: boolean;\n}\n\nexport const useMaterial = ({\n baseMaterial,\n materialParameters,\n isCustomTransmission = false,\n onBeforeInit,\n depthOnBeforeInit,\n}: WobbleMaterialProps) => {\n const { material, depthMaterial } = useMemo(() => {\n const mat = new (baseMaterial || THREE.MeshPhysicalMaterial)(\n materialParameters || {}\n );\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 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 uEdgeThreshold: { value: WOBBLE3D_PARAMS.edgeThreshold },\n uEdgeColor: { value: WOBBLE3D_PARAMS.edgeColor },\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 uRefractionSamples: { value: WOBBLE3D_PARAMS.refractionSamples },\n transmission: { value: 0 },\n _transmission: { value: 1 },\n transmissionMap: { value: null },\n },\n });\n\n mat.onBeforeCompile = (parameters) => {\n rewriteVertexShader(parameters);\n\n rewriteFragmentShader(parameters);\n\n resolveEachMaterial({\n parameters,\n mat,\n isCustomTransmission,\n });\n\n const cutomizedParams = createMaterialParameters(\n {\n fragmentShader: parameters.fragmentShader,\n vertexShader: parameters.vertexShader,\n // Because wobble3D uses userData to update uniforms.\n uniforms: mat.userData.uniforms,\n },\n onBeforeInit\n );\n parameters.fragmentShader = cutomizedParams.fragmentShader;\n parameters.vertexShader = cutomizedParams.vertexShader;\n Object.assign(parameters.uniforms, cutomizedParams.uniforms);\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 = (parameters) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n rewriteVertexShader(parameters);\n createMaterialParameters(parameters, depthOnBeforeInit);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeInit,\n depthOnBeforeInit,\n isCustomTransmission,\n ]);\n\n return {\n material: material as Wobble3DMaterial,\n depthMaterial,\n };\n};\n","import * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { mergeVertices } from \"three-stdlib\";\nimport {\n useMaterial,\n Wobble3DMaterial,\n WobbleMaterialProps,\n WobbleMaterialConstructor,\n} from \"./useMaterial\";\nimport { Wobble3DParams } from \".\";\nimport {\n setUniform,\n setCustomUniform,\n CustomParams,\n} from \"../../../utils/setUniforms\";\nimport { useCallback, useMemo } from \"react\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { Create3DHooksProps } from \"../types\";\n\nexport type UseCreateWobble3DProps = {\n /** default : `THREE.IcosahedronGeometry(2,20)` */\n geometry?: THREE.BufferGeometry;\n};\n\ntype UpdateUniform = (\n rootState: RootState | null,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n) => void;\n\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 isCustomTransmission,\n baseMaterial,\n materialParameters,\n onBeforeInit,\n depthOnBeforeInit,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n\n const updateValue = setUniform(userData);\n const updateCustomValue = setCustomUniform(userData);\n\n const updateUniform = useCallback(\n (rootState, newParams, customParams) => {\n if (rootState) {\n updateValue(\n \"uTime\",\n newParams?.beat || rootState.clock.getElapsedTime()\n );\n }\n if (newParams === undefined) {\n return;\n }\n updateValue(\"uWobbleStrength\", newParams.wobbleStrength);\n updateValue(\n \"uWobblePositionFrequency\",\n newParams.wobblePositionFrequency\n );\n updateValue(\"uWobbleTimeFrequency\", newParams.wobbleTimeFrequency);\n updateValue(\"uWarpStrength\", newParams.warpStrength);\n updateValue(\"uWarpPositionFrequency\", newParams.warpPositionFrequency);\n updateValue(\"uWarpTimeFrequency\", newParams.warpTimeFrequency);\n updateValue(\"uColor0\", newParams.color0);\n updateValue(\"uColor1\", newParams.color1);\n updateValue(\"uColor2\", newParams.color2);\n updateValue(\"uColor3\", newParams.color3);\n updateValue(\"uColorMix\", newParams.colorMix);\n updateValue(\"uEdgeThreshold\", newParams.edgeThreshold);\n updateValue(\"uEdgeColor\", newParams.edgeColor);\n updateValue(\"uChromaticAberration\", newParams.chromaticAberration);\n updateValue(\"uAnisotropicBlur\", newParams.anisotropicBlur);\n updateValue(\"uDistortion\", newParams.distortion);\n updateValue(\"uDistortionScale\", newParams.distortionScale);\n updateValue(\"uRefractionSamples\", newParams.refractionSamples);\n updateValue(\"uTemporalDistortion\", newParams.temporalDistortion);\n\n updateCustomValue(customParams);\n },\n [updateValue, updateCustomValue]\n );\n\n return [\n updateUniform,\n {\n mesh,\n depthMaterial,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../../utils/useSingleFBO\";\nimport { HooksReturn } from \"../../types\";\nimport { useCreateWobble3D, UseCreateWobble3DProps } from \"./useCreateWobble3D\";\nimport { WobbleMaterialProps, WobbleMaterialConstructor } from \"./useMaterial\";\nimport { HooksProps3D } from \"../types\";\nimport { getDpr } from \"../../../utils/getDpr\";\nimport { CustomParams } from \"../../../utils/setUniforms\";\n\nexport type Wobble3DParams = {\n /** default : `0.3` */\n wobbleStrength?: number;\n /** default : `0.3` */\n wobblePositionFrequency?: number;\n /** default : `0.3` */\n wobbleTimeFrequency?: number;\n /** default : `0.3` */\n warpStrength?: number;\n /** default : `0.3` */\n warpPositionFrequency?: number;\n /** default : `0.3` */\n warpTimeFrequency?: 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 /** Threshold of edge. 0 for edge disabled, default : `0` */\n edgeThreshold?: number;\n /** Color of edge. default : `0x000000` */\n edgeColor?: THREE.Color;\n /** you can get into the rhythm ♪ , default : `false` */\n beat?: number | false;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n chromaticAberration?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n anisotropicBlur?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n distortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */\n distortionScale?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */\n temporalDistortion?: number;\n /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `6` */\n refractionSamples?: number;\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 wobbleStrength: 0.3,\n wobblePositionFrequency: 0.3,\n wobbleTimeFrequency: 0.3,\n warpStrength: 0.3,\n warpPositionFrequency: 0.3,\n warpTimeFrequency: 0.3,\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 edgeThreshold: 0.0,\n edgeColor: new THREE.Color(0x000000),\n chromaticAberration: 0.1,\n anisotropicBlur: 0.1,\n distortion: 0.0,\n distortionScale: 0.1,\n temporalDistortion: 0.0,\n refractionSamples: 6,\n beat: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx\n */\nexport const useWobble3D = ({\n size,\n dpr,\n renderTargetOptions,\n isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n}: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps): HooksReturn<\n Wobble3DParams,\n Wobble3DObject,\n CustomParams\n> => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n\n const [updateUniform, { mesh, depthMaterial }] = useCreateWobble3D({\n baseMaterial,\n materialParameters,\n scene,\n geometry,\n isCustomTransmission,\n onBeforeInit,\n depthOnBeforeInit,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n depthBuffer: true,\n ...renderTargetOptions,\n });\n\n const updateFx = useCallback(\n (\n RootState: RootState,\n newParams?: Wobble3DParams,\n customParams?: CustomParams\n ) => {\n updateUniform(RootState, newParams, customParams);\n return updateRenderTarget(RootState.gl);\n },\n [updateRenderTarget, updateUniform]\n );\n\n const updateParams = useCallback(\n (newParams?: Wobble3DParams, customParams?: CustomParams) => {\n updateUniform(null, newParams, customParams);\n },\n [updateUniform]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n mesh,\n depthMaterial,\n renderTarget,\n output: renderTarget.texture,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useEffect, useMemo } from \"react\";\n\n/** Generate mesh from geometry and material and add to scene */\nexport const useAddMesh = (\n scene: THREE.Scene,\n geometry: THREE.BufferGeometry,\n material: THREE.Material\n) => {\n const mesh = useMemo(() => {\n const mesh = new THREE.Mesh(geometry, material);\n scene.add(mesh);\n return mesh;\n }, [geometry, material, scene]);\n\n useEffect(() => {\n return () => {\n scene.remove(mesh);\n geometry.dispose();\n material.dispose();\n };\n }, [scene, geometry, material, mesh]);\n\n return mesh;\n};\n","import { useMemo, useRef } from \"react\";\nimport { Size } from \"@react-three/fiber\";\n\nconst checkUpdate = (\n currentW: number,\n currentH: number,\n memoW: number,\n memoH: number,\n threshold: number,\n boundFor: \"smaller\" | \"larger\" | \"both\"\n) => {\n const isSmaller =\n currentW < memoW - threshold || currentH < memoH - threshold;\n const isLarger =\n currentW > memoW + threshold || currentH > memoH + threshold;\n\n return (\n (boundFor === \"smaller\" && isSmaller) ||\n (boundFor === \"larger\" && isLarger) ||\n (boundFor === \"both\" && (isSmaller || isLarger))\n );\n};\n\nexport const useResizeBoundary = ({\n size,\n boundFor,\n threshold,\n}: {\n size: Size;\n boundFor: \"smaller\" | \"larger\" | \"both\";\n threshold: number;\n}) => {\n const memorizedSize = useRef(size);\n\n const isBeyondBoundary = useMemo(() => {\n const { width: currentW, height: currentH } = size;\n const { width: memoW, height: memoH } = memorizedSize.current;\n\n const isUpdate = checkUpdate(\n currentW,\n currentH,\n memoW,\n memoH,\n threshold,\n boundFor\n );\n\n if (isUpdate) {\n memorizedSize.current = size;\n }\n return isUpdate;\n }, [size, boundFor, threshold]);\n\n return isBeyondBoundary;\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/Easings\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { createMaterialParameters } from \"../../../utils/createMaterialParameters\";\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 scene,\n onBeforeInit,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n ...createMaterialParameters(\n {\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]\n ? params.boderRadius![i]\n : 0.0,\n },\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n },\n onBeforeInit\n ),\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\n CustomParams,\n setCustomUniform,\n setUniform,\n} from \"../../../utils/setUniforms\";\nimport { DomSyncerMaterial } from \"./createMesh\";\nimport { useCallback, useRef } from \"react\";\n\ntype UpdateDomRect = ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n}: {\n params: DomSyncerParams;\n customParams?: CustomParams;\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 ({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n }) => {\n // Initialize domRects if the number of children in the scene is different from the number of DOMRect\n if (scene.children.length !== domRects.current!.length) {\n domRects.current = new Array(scene.children.length);\n }\n\n scene.children.forEach((mesh, i) => {\n const domElement = params.dom![i];\n if (!domElement) {\n return;\n }\n\n // DOMRect is updated even outside the intersection\n const rect = domElement.getBoundingClientRect();\n domRects.current[i] = rect;\n\n // Intersection cannot be determined accurately depending on the mobile navigation bar, so it seems better to update it constantly\n mesh.scale.set(rect.width, rect.height, 1.0);\n mesh.position.set(\n rect.left + rect.width * 0.5 - size.width * 0.5,\n -rect.top - rect.height * 0.5 + size.height * 0.5,\n 0.0\n );\n\n if (isIntersectingRef.current[i]) {\n if (params.rotation![i]) {\n mesh.rotation.copy(params.rotation![i]);\n }\n\n if (mesh instanceof THREE.Mesh) {\n const material: DomSyncerMaterial = mesh.material;\n const updateValue = setUniform(material);\n const updateCustomValue = setCustomUniform(material);\n updateValue(\"u_texture\", params.texture![i]);\n updateValue(\"u_textureResolution\", [\n params.texture![i]?.source?.data?.width || 0,\n params.texture![i]?.source?.data?.height || 0,\n ]);\n updateValue(\n \"u_resolution\",\n resolutionRef.current.set(rect.width, rect.height)\n );\n updateValue(\n \"u_borderRadius\",\n params.boderRadius![i] ? params.boderRadius![i] : 0.0\n );\n updateCustomValue(customParams);\n }\n }\n });\n },\n []\n );\n\n return [domRects.current, updateDomRects];\n};\n","import { useCallback, useRef } from \"react\";\n\nexport type IsIntersecting = (\n index: number,\n once?: boolean\n) => boolean[] | boolean;\n\nexport const useIsIntersecting = () => {\n const isIntersectingRef = useRef([]);\n const isIntersectingOnceRef = useRef([]);\n\n const isIntersecting: IsIntersecting = useCallback((index, once = false) => {\n isIntersectingRef.current.forEach((value, i) => {\n if (value) {\n isIntersectingOnceRef.current[i] = true;\n }\n });\n const temp = once\n ? [...isIntersectingOnceRef.current]\n : [...isIntersectingRef.current];\n return index < 0 ? temp : temp[index];\n }, []);\n\n return {\n isIntersectingRef,\n isIntersectingOnceRef,\n isIntersecting,\n };\n};\n","import { useEffect, useRef } from \"react\";\n\nexport type UseDomViewProps = {\n onView?: () => void;\n onHidden?: () => void;\n};\n\nexport type UseDomView = (props: UseDomViewProps) => void;\n\nexport const createUseDomView = (\n isIntersectingRef: React.MutableRefObject\n): UseDomView => {\n const useDomView = ({ onView, onHidden }: UseDomViewProps) => {\n const isView = useRef(false);\n useEffect(() => {\n let id: number;\n const filterIntersection = () => {\n if (isIntersectingRef.current.some((item) => item)) {\n if (!isView.current) {\n onView && onView();\n isView.current = true;\n }\n } else {\n if (isView.current) {\n onHidden && onHidden();\n isView.current = false;\n }\n }\n id = requestAnimationFrame(filterIntersection);\n };\n id = requestAnimationFrame(filterIntersection);\n return () => {\n cancelAnimationFrame(id);\n };\n }, [onView, onHidden]);\n };\n return useDomView;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef, useState, Key } from \"react\";\nimport { useCamera } from \"../../utils/useCamera\";\nimport { RootState } from \"@react-three/fiber\";\nimport { useSingleFBO } from \"../../utils/useSingleFBO\";\nimport { HooksProps, HooksReturn } from \"../../fxs/types\";\nimport { useParams } from \"../../utils/useParams\";\nimport { errorHandler } from \"./utils/errorHandler\";\nimport { createMesh } from \"./utils/createMesh\";\nimport { useIntersectionHandler } from \"./utils/useIntersectionHandler\";\nimport { useUpdateDomRect } from \"./utils/useUpdateDomRect\";\nimport { useIsIntersecting, IsIntersecting } from \"./utils/useIsIntersecting\";\nimport { UseDomView, createUseDomView } from \"./utils/createUseDomView\";\nimport { getDpr } from \"../../utils/getDpr\";\nimport { CustomParams } from \"../../utils/setUniforms\";\nimport { DEFAULT_TEXTURE } from \"../../libs/constants\";\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, isSizeUpdate, renderTargetOptions, onBeforeInit }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n isSizeUpdate,\n ...renderTargetOptions,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => DEFAULT_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 updateParams = useMemo(() => {\n return (newParams?: DomSyncerParams, customParams?: CustomParams) => {\n setParams(newParams);\n updateDomRects({\n params,\n customParams,\n size,\n resolutionRef,\n scene,\n isIntersectingRef,\n });\n };\n }, [isIntersectingRef, setParams, updateDomRects, size, scene, params]);\n\n const updateFx = useCallback(\n (\n rootState: RootState,\n newParams?: DomSyncerParams,\n customParams?: CustomParams\n ) => {\n const { gl, size } = rootState;\n\n updateParams(newParams, customParams);\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 onBeforeInit,\n });\n\n intersectionHandler({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n });\n\n setRefreshTrigger(false);\n }\n\n return updateRenderTarget(gl);\n },\n [\n updateRenderTarget,\n intersectionHandler,\n onBeforeInit,\n updateParams,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n ]\n );\n\n return [\n updateFx,\n updateParams,\n {\n scene,\n camera,\n renderTarget,\n output: renderTarget.texture,\n isIntersecting,\n DOMRects,\n intersections: isIntersectingRef.current,\n useDomView,\n },\n ];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useResolution } from \"../utils/useResolution\";\nimport {\n UseFboProps,\n renderFBO,\n FBO_DEFAULT_OPTION,\n} 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 props: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n depth = false,\n ...targetSettings\n } = props;\n\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_DEFAULT_OPTION,\n ...targetSettings,\n }\n );\n if (depth) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n","type Utils = {\n interpolate: (\n startValue: number,\n endValue: number,\n progress: number,\n threshold?: number\n ) => number;\n};\n\nexport const Utils: Utils = Object.freeze({\n interpolate(startValue, endValue, progress, threshold = 1e-6): number {\n const result = startValue + (endValue - startValue) * progress;\n return Math.abs(result) < threshold ? 0 : result;\n },\n});\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVertex_default","defaultVertex_default","hsv2rgb_default","rgb2hsv_default","ShaderChunk","wobble3D","snoise","coverTexture","fxBlending","planeVertex","defaultVertex","hsv2rgb","rgb2hsv","includePattern","includeReplacer","match","include","resolveIncludes","string","createMaterialParameters","parameters","onBeforeInit","useMesh","BRUSH_PARAMS","vertexShader","fragmentShader","resolution","mesh","getCameraProps","width","height","frustumSize","aspect","w","h","useCamera","cameraType","near","far","usePointer","lerp","prevPointer","useRef","diffPointer","lerpPointer","lastUpdateTime","velocity","isMoved","useCallback","currentPointer","now","current","deltaTime","isUpdate","prevTemp","useParams","params","isContainsFunctions","paramsRef","setParams","newParams","paramKey","FBO_DEFAULT_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","props","isSizeUpdate","depth","renderTargetOptions","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","read","write","_b","getDpr","useBrush","_dpr","updatePointer","pressureEnd","updateValue","updateCustomValue","updateParams","rootState","pointer","pointerValues","color","init_default","useInitialMaterial","advection_default","useAdvectionMaterial","DELTA_TIME","divergence_default","useDivergenceMaterial","pressure_default","usePressureMaterial","curl_default","useCurlMaterial","vorticity_default","useVorticityMaterial","clear_default","useClearMaterial","gradientSubtract_default","useGradientSubtractMaterial","splat_default","useSplatMaterial","useCustomMaterial","materialHook","materialProps","customFluidProps","curl","vorticity","advection","divergence","pressure","clear","gradientSubtract","splat","initialMaterial","updateMaterial","curlMaterial","vorticityMaterial","advectionMaterial","divergenceMaterial","pressureMaterial","clearMaterial","gradientSubtractMaterial","splatMaterial","materials","setMeshMaterial","FLUID_PARAMS","useFluid","fboProps","velocityFBO","updateVelocityFBO","densityFBO","updateDensityFBO","curlFBO","updateCurlFBO","divergenceFBO","updateDivergenceFBO","pressureFBO","updatePressureFBO","scaledDiffVec","spaltVec","updateParamsList","updateCustomParamsList","velocityTex","densityTex","scaledDiff","curlTex","divergenceTex","pressureTexTemp","i","scale","max","texture","meshArr","clonedMat","RIPPLE_PARAMS","useRipple","currentWave","opacity","NOISE_PARAMS","useNoise","clock","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","MOTIONBLUR_PARAMS","useMotionBlur","WAVE_PARAMS","useWave","CHROMAKEY_PARAMS","useChromaKey","BLANK_PARAMS","useBlank","useCreateObject","points","interactiveMesh","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","rewritedFragmentShader","MORPHPARTICLES_PARAMS","useCreateMorphParticles","morphGeometry","geo","useMorphParticles","updateUniform","generatedPositions","generatedUvs","updateFx","transmission_pars_fragment_default","transmission_fragment_default","resolveEachMaterial","mat","isCustomTransmission","transmission_pars_fragment","transmission_fragment","baseMaterial","materialParameters","depthOnBeforeInit","depthMaterial","WOBBLE3D_PARAMS","cutomizedParams","depthMat","useCreateWobble3D","wobbleGeometry","mergeVertices","userData","useWobble3D","RootState","useAddMesh","checkUpdate","currentW","currentH","memoW","memoH","threshold","boundFor","isSmaller","isLarger","useResizeBoundary","memorizedSize","Easing","x","c2","c4","c5","getHash","input","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","hash","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","targetSettings","renderTargetArr","updateCopyTexture","Utils","startValue","endValue","progress","result"],"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QCIO,MAAMC,GAAsB,CAAC,CACjC,IAAAC,EACA,qBAAAC,EACA,WAAA3P,CACH,IAIM,CAEC0P,EAAI,OAAS,wBAA0BC,IAC7B3P,EAAA,eAAiBA,EAAW,eAAe,QACnD,wCACA,GAAG4P,EAA0B,EAAA,EAGrB5P,EAAA,eAAiBA,EAAW,eAAe,QACnD,mCACA,GAAG6P,EAAqB,EAAA,GAKxBH,EAAY,YACJ1P,EAAA,aAAeA,EAAW,aAAa,QAC/C,gBACA;AAAA;AAAA;AAAA;AAAA,IAAA,EAOT,ECiBauO,GAAc,CAAsC,CAC9D,aAAAuB,EACA,mBAAAC,EACA,qBAAAJ,EAAuB,GACvB,aAAA1P,EACA,kBAAA+P,CACH,IAA8B,CAC3B,KAAM,CAAE,SAAAxS,EAAU,cAAAyS,CAAc,EAAI5S,UAAQ,IAAM,CACzC,MAAAqS,EAAM,IAAKI,GAAgBxS,EAAM,sBACpCyS,GAAsB,CAAC,CAAA,EAGnB,OAAA,OAAOL,EAAI,SAAU,CACzB,SAAU,CACP,MAAO,CAAE,MAAO,CAAE,EAClB,yBAA0B,CACvB,MAAOQ,EAAgB,uBAC1B,EACA,qBAAsB,CACnB,MAAOA,EAAgB,mBAC1B,EACA,gBAAiB,CAAE,MAAOA,EAAgB,cAAe,EACzD,uBAAwB,CACrB,MAAOA,EAAgB,qBAC1B,EACA,mBAAoB,CAAE,MAAOA,EAAgB,iBAAkB,EAC/D,cAAe,CAAE,MAAOA,EAAgB,YAAa,EACrD,QAAS,CAAE,MAAOA,EAAgB,MAAO,EACzC,QAAS,CAAE,MAAOA,EAAgB,MAAO,EACzC,QAAS,CAAE,MAAOA,EAAgB,MAAO,EACzC,QAAS,CAAE,MAAOA,EAAgB,MAAO,EACzC,UAAW,CAAE,MAAOA,EAAgB,QAAS,EAC7C,eAAgB,CAAE,MAAOA,EAAgB,aAAc,EACvD,WAAY,CAAE,MAAOA,EAAgB,SAAU,EAC/C,qBAAsB,CACnB,MAAOA,EAAgB,mBAC1B,EACA,iBAAkB,CAAE,MAAOA,EAAgB,eAAgB,EAC3D,YAAa,CAAE,MAAOA,EAAgB,UAAW,EACjD,iBAAkB,CAAE,MAAOA,EAAgB,eAAgB,EAC3D,oBAAqB,CAAE,MAAOA,EAAgB,kBAAmB,EACjE,mBAAoB,CAAE,MAAOA,EAAgB,iBAAkB,EAC/D,aAAc,CAAE,MAAO,CAAE,EACzB,cAAe,CAAE,MAAO,CAAE,EAC1B,gBAAiB,CAAE,MAAO,IAAK,CAClC,CAAA,CACF,EAEGR,EAAA,gBAAmB1P,GAAe,CACnCyM,GAAoBzM,CAAU,EAE9B+N,GAAsB/N,CAAU,EAEZyP,GAAA,CACjB,WAAAzP,EACA,IAAA0P,EACA,qBAAAC,CAAA,CACF,EAED,MAAMQ,EAAkBpQ,EACrB,CACG,eAAgBC,EAAW,eAC3B,aAAcA,EAAW,aAEzB,SAAU0P,EAAI,SAAS,QAC1B,EACAzP,CAAA,EAEHD,EAAW,eAAiBmQ,EAAgB,eAC5CnQ,EAAW,aAAemQ,EAAgB,aAC1C,OAAO,OAAOnQ,EAAW,SAAUmQ,EAAgB,QAAQ,CAAA,EAE9DT,EAAI,YAAc,GAKZ,MAAAU,EAAW,IAAI9S,EAAM,kBAAkB,CAC1C,aAAcA,EAAM,gBAAA,CACtB,EACQ,OAAA8S,EAAA,gBAAmBpQ,GAAe,CACxC,OAAO,OAAOA,EAAW,SAAU0P,EAAI,SAAS,QAAQ,EACxDjD,GAAoBzM,CAAU,EAC9BD,EAAyBC,EAAYgQ,CAAiB,CAAA,EAEzDI,EAAS,YAAc,GAEhB,CAAE,SAAUV,EAAK,cAAeU,CAAS,CAAA,EAChD,CACAL,EACAD,EACA7P,EACA+P,EACAL,CAAA,CACF,EAEM,MAAA,CACJ,SAAAnS,EACA,cAAAyS,CAAA,CAEN,ECpHaI,GAAoB,CAAsC,CACpE,MAAAtS,EAAQ,GACR,SAAAC,EACA,qBAAA2R,EACA,aAAAG,EACA,mBAAAC,EACA,aAAA9P,EACA,kBAAA+P,CACH,IAE0D,CACjD,MAAAM,EAAiBjT,EAAAA,QAAQ,IAAM,CAClC,IAAI4R,EAAMjR,GAAY,IAAIV,EAAM,oBAAoB,EAAG,EAAE,EACzD,OAAA2R,EAAMsB,GAAAA,cAActB,CAAG,EACvBA,EAAI,gBAAgB,EACbA,CAAA,EACP,CAACjR,CAAQ,CAAC,EACP,CAAE,SAAAR,EAAU,cAAAyS,CAAc,EAAI1B,GAAY,CAC7C,aAAAuB,EACA,mBAAAC,EACA,qBAAAJ,EACA,aAAA1P,EACA,kBAAA+P,CAAA,CACF,EAEKzP,EAAOzC,EAAaC,EAAOuS,EAAgB9S,EAAUF,EAAM,IAAI,EAE/DkT,EAAWhT,EAAS,SAEpB4G,EAAc7G,EAAWiT,CAAQ,EACjCnM,EAAoBzG,EAAiB4S,CAAQ,EAyC5C,MAAA,CAvCe5O,EAAA,YACnB,CAAC2C,EAAW/B,EAAW3E,IAAiB,CACjC0G,GACDH,EACG,SACA5B,GAAA,YAAAA,EAAW,OAAQ+B,EAAU,MAAM,eAAe,CAAA,EAGpD/B,IAAc,SAGN4B,EAAA,kBAAmB5B,EAAU,cAAc,EACvD4B,EACG,2BACA5B,EAAU,uBAAA,EAED4B,EAAA,uBAAwB5B,EAAU,mBAAmB,EACrD4B,EAAA,gBAAiB5B,EAAU,YAAY,EACvC4B,EAAA,yBAA0B5B,EAAU,qBAAqB,EACzD4B,EAAA,qBAAsB5B,EAAU,iBAAiB,EACjD4B,EAAA,UAAW5B,EAAU,MAAM,EAC3B4B,EAAA,UAAW5B,EAAU,MAAM,EAC3B4B,EAAA,UAAW5B,EAAU,MAAM,EAC3B4B,EAAA,UAAW5B,EAAU,MAAM,EAC3B4B,EAAA,YAAa5B,EAAU,QAAQ,EAC/B4B,EAAA,iBAAkB5B,EAAU,aAAa,EACzC4B,EAAA,aAAc5B,EAAU,SAAS,EACjC4B,EAAA,uBAAwB5B,EAAU,mBAAmB,EACrD4B,EAAA,mBAAoB5B,EAAU,eAAe,EAC7C4B,EAAA,cAAe5B,EAAU,UAAU,EACnC4B,EAAA,mBAAoB5B,EAAU,eAAe,EAC7C4B,EAAA,qBAAsB5B,EAAU,iBAAiB,EACjD4B,EAAA,sBAAuB5B,EAAU,kBAAkB,EAE/D6B,EAAkBxG,CAAY,EACjC,EACA,CAACuG,EAAaC,CAAiB,CAAA,EAK/B,CACG,KAAA9D,EACA,cAAA0P,CACH,CAAA,CAEN,EC1DaC,EAAkC,OAAO,OAAO,CAC1D,eAAgB,GAChB,wBAAyB,GACzB,oBAAqB,GACrB,aAAc,GACd,sBAAuB,GACvB,kBAAmB,GACnB,OAAQ,IAAI5S,EAAM,MAAM,QAAQ,EAChC,OAAQ,IAAIA,EAAM,MAAM,KAAQ,EAChC,OAAQ,IAAIA,EAAM,MAAM,GAAQ,EAChC,OAAQ,IAAIA,EAAM,MAAM,QAAQ,EAChC,SAAU,EACV,cAAe,EACf,UAAW,IAAIA,EAAM,MAAM,CAAQ,EACnC,oBAAqB,GACrB,gBAAiB,GACjB,WAAY,EACZ,gBAAiB,GACjB,mBAAoB,EACpB,kBAAmB,EACnB,KAAM,EACT,CAAC,EAKYmT,GAAc,CAAsC,CAC9D,KAAAxT,EACA,IAAAC,EACA,oBAAAmG,EACA,aAAAF,EACA,OAAAL,EACA,SAAA9E,EACA,aAAA8R,EACA,mBAAAC,EACA,qBAAAJ,EACA,aAAA1P,EACA,kBAAA+P,CACH,IAIK,CACI,MAAA/L,EAAOF,EAAO7G,CAAG,EAEjBa,EAAQV,EAAAA,QAAQ,IAAM,IAAIC,EAAM,MAAS,CAAA,CAAE,EAE3C,CAAC6R,EAAe,CAAE,KAAA5O,EAAM,cAAA0P,CAAe,CAAA,EAAII,GAAkB,CAChE,aAAAP,EACA,mBAAAC,EACA,MAAAhS,EACA,SAAAC,EACA,qBAAA2R,EACA,aAAA1P,EACA,kBAAA+P,CAAA,CACF,EAEK,CAAC1M,EAAcI,CAAkB,EAAIT,EAAa,CACrD,MAAAlF,EACA,OAAA+E,EACA,KAAA7F,EACA,IAAKgH,EAAK,IACV,aAAAd,EACA,YAAa,GACb,GAAGE,CAAA,CACL,EAEKiM,EAAW1N,EAAA,YACd,CACG8O,EACAlO,EACA3E,KAEc6S,EAAAA,EAAWlO,EAAW3E,CAAY,EACzC6F,EAAmBgN,EAAU,EAAE,GAEzC,CAAChN,EAAoByL,CAAa,CAAA,EAG/B7K,EAAe1C,EAAA,YAClB,CAACY,EAA4B3E,IAAgC,CAC5CsR,EAAA,KAAM3M,EAAW3E,CAAY,CAC9C,EACA,CAACsR,CAAa,CAAA,EAGV,MAAA,CACJG,EACAhL,EACA,CACG,MAAAvG,EACA,KAAAwC,EACA,cAAA0P,EACA,aAAA3M,EACA,OAAQA,EAAa,OACxB,CAAA,CAEN,ECvJaqN,GAAa,CACvB5S,EACAC,EACAR,IACE,CACI,MAAA+C,EAAOlD,EAAAA,QAAQ,IAAM,CACxB,MAAMkD,EAAO,IAAIjD,EAAM,KAAKU,EAAUR,CAAQ,EAC9C,OAAAO,EAAM,IAAIwC,CAAI,EACPA,CACP,EAAA,CAACvC,EAAUR,EAAUO,CAAK,CAAC,EAE9BK,OAAAA,EAAAA,UAAU,IACA,IAAM,CACVL,EAAM,OAAOwC,CAAI,EACjBvC,EAAS,QAAQ,EACjBR,EAAS,QAAQ,CAAA,EAEpB,CAACO,EAAOC,EAAUR,EAAU+C,CAAI,CAAC,EAE7BA,CACV,ECrBMqQ,GAAc,CACjBC,EACAC,EACAC,EACAC,EACAC,EACAC,IACE,CACF,MAAMC,EACHN,EAAWE,EAAQE,GAAaH,EAAWE,EAAQC,EAChDG,EACHP,EAAWE,EAAQE,GAAaH,EAAWE,EAAQC,EAGlD,OAAAC,IAAa,WAAaC,GAC1BD,IAAa,UAAYE,GACzBF,IAAa,SAAWC,GAAaC,EAE5C,EAEaC,GAAoB,CAAC,CAC/B,KAAApU,EACA,SAAAiU,EACA,UAAAD,CACH,IAIM,CACG,MAAAK,EAAgBhQ,SAAarE,CAAI,EAqBhC,OAnBkBI,EAAAA,QAAiB,IAAM,CAC7C,KAAM,CAAE,MAAOwT,EAAU,OAAQC,GAAa7T,EACxC,CAAE,MAAO8T,EAAO,OAAQC,GAAUM,EAAc,QAEhDrP,EAAW2O,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,CAAA,EAGH,OAAIjP,IACDqP,EAAc,QAAUrU,GAEpBgF,CACP,EAAA,CAAChF,EAAMiU,EAAUD,CAAS,CAAC,CAGjC,ECfaM,GAA0B,OAAO,OAAO,CAClD,WAAWC,EAAmB,CAC3B,MAAO,GAAI,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,CACxC,EACA,YAAYA,EAAmB,CAC5B,OAAO,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,CACpC,EACA,cAAcA,EAAmB,CAC9B,MAAO,EAAE,KAAK,IAAI,KAAK,GAAKA,CAAC,EAAI,GAAK,CACzC,EACA,WAAWA,EAAmB,CAC3B,OAAOA,EAAIA,CACd,EACA,YAAYA,EAAmB,CACrB,MAAA,IAAK,EAAIA,IAAM,EAAIA,EAC7B,EACA,cAAcA,EAAmB,CAC9B,OAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAI,EAAI,KAAK,IAAI,GAAKA,EAAI,EAAG,CAAC,EAAI,CAC9D,EACA,YAAYA,EAAmB,CAC5B,OAAOA,EAAIA,EAAIA,CAClB,EACA,aAAaA,EAAmB,CAC7B,MAAO,GAAI,KAAK,IAAI,EAAIA,EAAG,CAAC,CAC/B,EACA,eAAeA,EAAmB,CAC/B,OAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAK,IAAI,GAAKA,EAAI,EAAG,CAAC,EAAI,CAClE,EACA,YAAYA,EAAmB,CACrB,OAAAA,EAAIA,EAAIA,EAAIA,CACtB,EACA,aAAaA,EAAmB,CAC7B,MAAO,GAAI,KAAK,IAAI,EAAIA,EAAG,CAAC,CAC/B,EACA,eAAeA,EAAmB,CAC/B,OAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAK,IAAI,GAAKA,EAAI,EAAG,CAAC,EAAI,CACtE,EACA,YAAYA,EAAmB,CACrB,OAAAA,EAAIA,EAAIA,EAAIA,EAAIA,CAC1B,EACA,aAAaA,EAAmB,CAC7B,MAAO,GAAI,KAAK,IAAI,EAAIA,EAAG,CAAC,CAC/B,EACA,eAAeA,EAAmB,CAC/B,OAAOA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAK,IAAI,GAAKA,EAAI,EAAG,CAAC,EAAI,CAC3E,EACA,WAAWA,EAAmB,CACpB,OAAAA,IAAM,EAAI,EAAI,KAAK,IAAI,EAAG,GAAKA,EAAI,EAAE,CAC/C,EACA,YAAYA,EAAmB,CACrB,OAAAA,IAAM,EAAI,EAAI,EAAI,KAAK,IAAI,EAAG,IAAMA,CAAC,CAC/C,EACA,cAAcA,EAAmB,CACvB,OAAAA,IAAM,EACR,EACAA,IAAM,EACN,EACAA,EAAI,GACJ,KAAK,IAAI,EAAG,GAAKA,EAAI,EAAE,EAAI,GAC1B,EAAI,KAAK,IAAI,EAAG,IAAMA,EAAI,EAAE,GAAK,CAC1C,EACA,WAAWA,EAAmB,CACpB,MAAA,GAAI,KAAK,KAAK,EAAI,KAAK,IAAIA,EAAG,CAAC,CAAC,CAC1C,EACA,YAAYA,EAAmB,CACrB,OAAA,KAAK,KAAK,EAAI,KAAK,IAAIA,EAAI,EAAG,CAAC,CAAC,CAC1C,EACA,cAAcA,EAAmB,CACvB,OAAAA,EAAI,IACL,EAAI,KAAK,KAAK,EAAI,KAAK,IAAI,EAAIA,EAAG,CAAC,CAAC,GAAK,GACzC,KAAK,KAAK,EAAI,KAAK,IAAI,GAAKA,EAAI,EAAG,CAAC,CAAC,EAAI,GAAK,CACvD,EACA,WAAWA,EAAmB,CAI3B,MAAO,SAAKA,EAAIA,EAAIA,EAAI,QAAKA,EAAIA,CACpC,EACA,YAAYA,EAAmB,CAI5B,MAAO,GAAI,QAAK,KAAK,IAAIA,EAAI,EAAG,CAAC,EAAI,QAAK,KAAK,IAAIA,EAAI,EAAG,CAAC,CAC9D,EACA,cAAcA,EAAmB,CAE9B,MAAMC,EAAK,UAEJ,OAAAD,EAAI,GACL,KAAK,IAAI,EAAIA,EAAG,CAAC,IAAMC,EAAK,GAAK,EAAID,EAAIC,GAAO,GAChD,KAAK,IAAI,EAAID,EAAI,EAAG,CAAC,IAAMC,EAAK,IAAMD,EAAI,EAAI,GAAKC,GAAM,GAAK,CACvE,EACA,cAAcD,EAAmB,CACxB,MAAAE,EAAM,EAAI,KAAK,GAAM,EAE3B,OAAOF,IAAM,EACR,EACAA,IAAM,EACN,EACA,CAAC,KAAK,IAAI,EAAG,GAAKA,EAAI,EAAE,EAAI,KAAK,KAAKA,EAAI,GAAK,OAASE,CAAE,CAClE,EACA,eAAeF,EAAmB,CACzB,MAAAE,EAAM,EAAI,KAAK,GAAM,EAE3B,OAAOF,IAAM,EACR,EACAA,IAAM,EACN,EACA,KAAK,IAAI,EAAG,IAAMA,CAAC,EAAI,KAAK,KAAKA,EAAI,GAAK,KAAQE,CAAE,EAAI,CAChE,EACA,iBAAiBF,EAAmB,CAC3B,MAAAG,EAAM,EAAI,KAAK,GAAM,IAE3B,OAAOH,IAAM,EACR,EACAA,IAAM,EACN,EACAA,EAAI,GACJ,EAAE,KAAK,IAAI,EAAG,GAAKA,EAAI,EAAE,EAAI,KAAK,KAAK,GAAKA,EAAI,QAAUG,CAAE,GAAK,EAChE,KAAK,IAAI,EAAG,IAAMH,EAAI,EAAE,EAAI,KAAK,KAAK,GAAKA,EAAI,QAAUG,CAAE,EAAK,EACjE,CACR,EACA,aAAaH,EAAmB,CAC7B,MAAO,GAAID,GAAO,cAAc,EAAIC,CAAC,CACxC,EACA,cAAcA,EAAmB,CAI1B,OAAAA,EAAI,EAAI,KACF,OAAKA,EAAIA,EACRA,EAAI,EAAI,KACT,QAAMA,GAAK,IAAM,MAAMA,EAAI,IAC1BA,EAAI,IAAM,KACX,QAAMA,GAAK,KAAO,MAAMA,EAAI,MAE5B,QAAMA,GAAK,MAAQ,MAAMA,EAAI,OAE1C,EACA,gBAAgBA,EAAmB,CAChC,OAAOA,EAAI,IACL,EAAID,GAAO,cAAc,EAAI,EAAIC,CAAC,GAAK,GACvC,EAAID,GAAO,cAAc,EAAIC,EAAI,CAAC,GAAK,CAChD,CACH,CAAC,EClLD,SAASI,GAAQC,EAAe,CAC7B,IAAI,EAAI,KAAK,IAAIA,EAAQ,OAAO,EAAI,WAC7B,OAAA,EAAI,KAAK,MAAM,CAAC,CAC1B,CAaa,MAAAC,GAAU,CAACC,EAAaC,EAAoB,iBAAmB,CACzE,MAAMC,EAASF,EAAM,GACfG,EAASX,GAAOS,CAAI,EAiBnB,OAhBYpQ,EAAA,YACf6H,GAAuB,CACjB,IAAA0I,EAAO1I,EAAM,eAAA,EAAmBwI,EAC9B,MAAAG,EAAQ,KAAK,MAAMD,CAAI,EACvBE,EAAQH,EAAOC,EAAOC,CAAK,EACjCD,EAAOE,EAAQD,EACT,MAAAE,EAAOV,GAAQQ,CAAK,EACnB,MAAA,CACJ,KAAAD,EACA,MAAAC,EACA,MAAAC,EACA,KAAAC,CAAA,CAEN,EACA,CAACL,EAAQC,CAAM,CAAA,CAGrB,EC1BaK,GAAgB,CAACC,EAAc,KAAO,CAChD,MAAMC,EAAWpV,EAAAA,QAAQ,IAAM,EAAI,KAAK,IAAI,KAAK,IAAImV,EAAK,EAAE,EAAG,CAAC,EAAG,CAACA,CAAG,CAAC,EAClEE,EAAWpR,SAAsB,IAAI,EAmBpC,OAjBSM,EAAA,YACZ6H,GAAuB,CACf,MAAAkJ,EAAOlJ,EAAM,iBAMnB,OALIiJ,EAAS,UAAY,MAIPC,EAAOD,EAAS,SACjBD,GACdC,EAAS,QAAUC,EACZ,IAEH,EACV,EACA,CAACF,CAAQ,CAAA,CAIf,ECnCaG,GAAgBxQ,GAA4B,SAChD,MAAAyQ,GAAYrP,EAAApB,EAAO,MAAP,YAAAoB,EAAY,OACxBsP,GAAgBhP,EAAA1B,EAAO,UAAP,YAAA0B,EAAgB,OAMtC,MAJI,CAAC+O,GAAa,CAACC,GAIfD,IAAcC,CAKrB,ECfA,IAAA/V,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAAA,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,GCkBO,MAAMgW,GAAa,CAAC,CACxB,OAAA3Q,EACA,MAAArE,EACA,aAAAkC,CACH,IAIsB,CACflC,EAAM,SAAS,OAAS,IACnBA,EAAA,SAAS,QAASiV,GAAU,CAC3BA,aAAiB1V,EAAM,OACxB0V,EAAM,SAAS,UACfA,EAAM,SAAS,UAClB,CACF,EACKjV,EAAA,OAAO,GAAGA,EAAM,QAAQ,GAGjCqE,EAAO,QAAS,QAAQ,CAAC4G,EAASH,IAAM,CAC/B,MAAA6G,EAAM,IAAIpS,EAAM,eAAe,CAClC,GAAGyC,EACA,CACG,SAAU,CACP,UAAW,CAAE,MAAOiJ,CAAQ,EAC5B,oBAAqB,CAClB,MAAO,IAAI1L,EAAM,QAAQ,EAAG,CAAC,CAChC,EACA,aAAc,CAAE,MAAO,IAAIA,EAAM,QAAQ,EAAG,CAAC,CAAE,EAC/C,eAAgB,CACb,MAAO8E,EAAO,YAAayG,CAAC,EACvBzG,EAAO,YAAayG,CAAC,EACrB,CACR,CACH,EAAA,aACAzI,GAAA,eACAC,EACH,EACAJ,CACH,EACA,GAAG3B,EAEH,YAAa,EAAA,CACf,EAEKiC,EAAO,IAAIjD,EAAM,KAAK,IAAIA,EAAM,cAAc,EAAG,CAAC,EAAGoS,CAAG,EAC9D3R,EAAM,IAAIwC,CAAI,CAAA,CAChB,CACJ,EC/Da0S,GAAyB,IAAM,CACnC,MAAAC,EAA0B5R,SAA+B,CAAA,CAAE,EAC3D6R,EAAqB7R,SAAyC,CAAA,CAAE,EA6C/D,OA3CqBM,EAAA,YACzB,CAAC,CACE,kBAAAwR,EACA,sBAAAC,EACA,OAAAjR,CAAA,IAKG,CACC8Q,EAAwB,QAAQ,OAAS,GAC1CA,EAAwB,QAAQ,QAAQ,CAACI,EAAUzK,IAAM,CACtDyK,EAAS,UAAUH,EAAmB,QAAQtK,CAAC,CAAE,CAAA,CACnD,EAGJsK,EAAmB,QAAU,GAC7BD,EAAwB,QAAU,GAE5B,MAAAK,EAAS,IAAI,MAAMnR,EAAO,IAAK,MAAM,EAAE,KAAK,EAAK,EACrCgR,EAAA,QAAU,CAAC,GAAGG,CAAM,EAChBF,EAAA,QAAU,CAAC,GAAGE,CAAM,EAE1CnR,EAAO,IAAK,QAAQ,CAACoR,EAAK3K,IAAM,CACvB,MAAA4K,EAAYC,GAAyC,CAChDA,EAAA,QAASC,GAAU,CACxBvR,EAAO,YAAayG,CAAC,GAAKzG,EAAO,YAAayG,CAAC,EAAE8K,CAAK,EAEpCP,EAAA,QAAQvK,CAAC,EAAI8K,EAAM,cAAA,CACvC,CAAA,EAEEL,EAAW,IAAI,qBAAqBG,EAAU,CACjD,WAAY,MACZ,UAAW,CAAA,CACb,EACDH,EAAS,QAAQE,CAAI,EACGN,EAAA,QAAQ,KAAKI,CAAQ,EAC1BH,EAAA,QAAQ,KAAKK,CAAI,CAAA,CACtC,CACJ,EACA,CAAC,CAAA,CAIP,ECtBaI,GAAmB,IAA8B,CACrD,MAAAC,EAAWvS,SAAkB,CAAA,CAAE,EAE/BwS,EAAgClS,EAAA,YACnC,CAAC,CACE,OAAAQ,EACA,aAAAvE,EACA,KAAAZ,EACA,cAAA8W,EACA,MAAAhW,EACA,kBAAAqV,CAAA,IACG,CAECrV,EAAM,SAAS,SAAW8V,EAAS,QAAS,SAC7CA,EAAS,QAAU,IAAI,MAAM9V,EAAM,SAAS,MAAM,GAGrDA,EAAM,SAAS,QAAQ,CAACwC,EAAMsI,IAAM,iBAC3B,MAAAmL,EAAa5R,EAAO,IAAKyG,CAAC,EAChC,GAAI,CAACmL,EACF,OAIG,MAAAC,EAAOD,EAAW,wBAWpB,GAVKH,EAAA,QAAQhL,CAAC,EAAIoL,EAGtB1T,EAAK,MAAM,IAAI0T,EAAK,MAAOA,EAAK,OAAQ,CAAG,EAC3C1T,EAAK,SAAS,IACX0T,EAAK,KAAOA,EAAK,MAAQ,GAAMhX,EAAK,MAAQ,GAC5C,CAACgX,EAAK,IAAMA,EAAK,OAAS,GAAMhX,EAAK,OAAS,GAC9C,CAAA,EAGCmW,EAAkB,QAAQvK,CAAC,IACxBzG,EAAO,SAAUyG,CAAC,GACnBtI,EAAK,SAAS,KAAK6B,EAAO,SAAUyG,CAAC,CAAC,EAGrCtI,aAAgBjD,EAAM,MAAM,CAC7B,MAAME,EAA8B+C,EAAK,SACnC6D,EAAc7G,EAAWC,CAAQ,EACjC6G,EAAoBzG,EAAiBJ,CAAQ,EACnD4G,EAAY,YAAahC,EAAO,QAASyG,CAAC,CAAC,EAC3CzE,EAAY,sBAAuB,GAChCoG,GAAA1G,GAAAN,EAAApB,EAAO,QAASyG,CAAC,IAAjB,YAAArF,EAAoB,SAApB,YAAAM,EAA4B,OAA5B,YAAA0G,EAAkC,QAAS,IAC3CE,GAAAC,GAAAJ,EAAAnI,EAAO,QAASyG,CAAC,IAAjB,YAAA0B,EAAoB,SAApB,YAAAI,EAA4B,OAA5B,YAAAD,EAAkC,SAAU,CAAA,CAC9C,EACDtG,EACG,eACA2P,EAAc,QAAQ,IAAIE,EAAK,MAAOA,EAAK,MAAM,CAAA,EAEpD7P,EACG,iBACAhC,EAAO,YAAayG,CAAC,EAAIzG,EAAO,YAAayG,CAAC,EAAI,CAAA,EAErDxE,EAAkBxG,CAAY,CACjC,CACH,CACF,CACJ,EACA,CAAC,CAAA,EAGG,MAAA,CAACgW,EAAS,QAASC,CAAc,CAC3C,ECxFaI,GAAoB,IAAM,CAC9B,MAAAd,EAAoB9R,SAAkB,CAAA,CAAE,EACxC+R,EAAwB/R,SAAkB,CAAA,CAAE,EAE5C6S,EAAiCvS,EAAA,YAAY,CAACmJ,EAAOqJ,EAAO,KAAU,CACzEhB,EAAkB,QAAQ,QAAQ,CAAC1V,EAAOmL,IAAM,CACzCnL,IACqB2V,EAAA,QAAQxK,CAAC,EAAI,GACtC,CACF,EACK,MAAApF,EAAO2Q,EACR,CAAC,GAAGf,EAAsB,OAAO,EACjC,CAAC,GAAGD,EAAkB,OAAO,EAClC,OAAOrI,EAAQ,EAAItH,EAAOA,EAAKsH,CAAK,CACvC,EAAG,CAAE,CAAA,EAEE,MAAA,CACJ,kBAAAqI,EACA,sBAAAC,EACA,eAAAc,CAAA,CAEN,ECnBaE,GACVjB,GAEmB,CAAC,CAAE,OAAAkB,EAAQ,SAAAC,KAAgC,CACrD,MAAAC,EAASlT,SAAgB,EAAK,EACpClD,EAAAA,UAAU,IAAM,CACT,IAAAqW,EACJ,MAAMC,EAAqB,IAAM,CAC1BtB,EAAkB,QAAQ,KAAMuB,GAASA,CAAI,EACzCH,EAAO,UACTF,GAAUA,EAAO,EACjBE,EAAO,QAAU,IAGhBA,EAAO,UACRD,GAAYA,EAAS,EACrBC,EAAO,QAAU,IAGvBC,EAAK,sBAAsBC,CAAkB,CAAA,EAEhD,OAAAD,EAAK,sBAAsBC,CAAkB,EACtC,IAAM,CACV,qBAAqBD,CAAE,CAAA,CAC1B,EACA,CAACH,EAAQC,CAAQ,CAAC,CAAA,ECkBdK,GAAoC,CAC9C,QAAS,CAAC,EACV,IAAK,CAAC,EACN,YAAa,CAAC,EACd,SAAU,CAAC,EACX,YAAa,CAAC,CACjB,EAMaC,GAAe,CACzB,CAAE,KAAA5X,EAAM,IAAAC,EAAK,aAAAiG,EAAc,oBAAAE,EAAqB,aAAApD,CAAa,EAC7D6U,EAAqC,KAC0B,CACzD,MAAA7Q,EAAOF,EAAO7G,CAAG,EAEjBa,EAAQV,EAAAA,QAAQ,IAAM,IAAIC,EAAM,MAAS,CAAA,CAAE,EAC3CwF,EAAS/B,EAAU9D,CAAI,EACvB,CAACqG,EAAcI,CAAkB,EAAIT,EAAa,CACrD,MAAAlF,EACA,OAAA+E,EACA,KAAA7F,EACA,IAAKgH,EAAK,IACV,aAAAd,EACA,GAAGE,CAAA,CACL,EACK,CAACjB,EAAQG,CAAS,EAAIJ,EAA2B,CACpD,GAAGyS,GACH,UAAW,YAAY,IAAI,CAAA,CAC7B,EAEK,CAACG,EAAUjB,CAAc,EAAIF,GAAiB,EAG9CG,EAAgBzS,EAAAA,OAAsB,IAAIhE,EAAM,QAAQ,EAAG,CAAC,CAAC,EAG7D,CAAC0X,EAAgBC,CAAiB,EAAIC,WAAS,EAAI,EACzD7X,EAAA,QACG,IAAM4X,EAAkB,EAAI,EAE5BH,CAAA,EAIG,MAAAK,EAAY7T,SAAmB,IAAI,EACnC8T,EAAe/X,EAAA,QAAQ,IAAMkB,EAAiB,CAAE,CAAA,EAGhD8W,EAAsBpC,KACtB,CAAE,sBAAAI,EAAuB,kBAAAD,EAAmB,eAAAe,GAC/CD,GAAkB,EAGfoB,EAAajB,GAAiBjB,CAAiB,EAE/C9O,EAAejH,EAAAA,QAAQ,IACnB,CAACmF,EAA6B3E,IAAgC,CAClE0E,EAAUC,CAAS,EACJsR,EAAA,CACZ,OAAA1R,EACA,aAAAvE,EACA,KAAAZ,EACA,cAAA8W,EACA,MAAAhW,EACA,kBAAAqV,CAAA,CACF,CAAA,EAEJ,CAACA,EAAmB7Q,EAAWuR,EAAgB7W,EAAMc,EAAOqE,CAAM,CAAC,EAyD/D,MAAA,CAvDUR,EAAA,YACd,CACG2C,EACA/B,EACA3E,IACE,CACF,KAAM,CAAE,GAAA+E,GAAI,KAAA3F,EAAAA,EAASsH,EAIjB,GAFJD,EAAa9B,EAAW3E,CAAY,EAEhC+U,GAAaxQ,CAAM,EACb,OAAAgT,EAGV,GAAIJ,EAAgB,CACb,GAAAG,EAAU,UAAY/S,EAAO,UACvB,OAAAgT,EAEPD,EAAU,QAAU/S,EAAO,SAEjC,CAEA,OAAI4S,IACUjC,GAAA,CACR,OAAA3Q,EACA,KAAAnF,GACA,MAAAc,EACA,aAAAkC,CAAA,CACF,EAEmBoV,EAAA,CACjB,kBAAAjC,EACA,sBAAAC,EACA,OAAAjR,CAAA,CACF,EAED6S,EAAkB,EAAK,GAGnBvR,EAAmBd,EAAE,CAC/B,EACA,CACGc,EACA2R,EACApV,EACAqE,EACA0Q,EACAjX,EACAqE,EACAiR,EACAD,EACAgC,CACH,CAAA,EAKA9Q,EACA,CACG,MAAAvG,EACA,OAAA+E,EACA,aAAAQ,EACA,OAAQA,EAAa,QACrB,eAAA6Q,EACA,SAAAY,EACA,cAAe3B,EAAkB,QACjC,WAAAkC,CACH,CAAA,CAEN,ECxKaC,GAAiB,CAC3BrS,EACAsS,IACwB,CAClB,KAAA,CACH,MAAAzX,EACA,OAAA+E,EACA,KAAA7F,EACA,IAAAC,EAAM,GACN,aAAAiG,EAAe,GACf,MAAAC,EAAQ,GACR,GAAGqS,CACF,EAAAvS,EAEEwS,EAAkBpU,SAAkC,CAAA,CAAE,EACtDhB,EAAatD,EAAcC,EAAMC,CAAG,EAE1BwY,EAAA,QAAUrY,EAAAA,QAAQ,IACxB,MAAM,KAAK,CAAE,OAAAmY,GAAU,IAAM,CAC3B,MAAAjS,EAAS,IAAIjG,EAAM,kBACtBgD,EAAW,EACXA,EAAW,EACX,CACG,GAAGoC,GACH,GAAG+S,CACN,CAAA,EAEH,OAAIrS,IACMG,EAAA,aAAe,IAAIjG,EAAM,aAC7BgD,EAAW,EACXA,EAAW,EACXhD,EAAM,SAAA,GAGLiG,CAAA,CACT,EAED,CAACiS,CAAM,CAAC,EAEPrS,GACDuS,EAAgB,QAAQ,QAAS7S,GAC9BA,EAAI,QAAQvC,EAAW,EAAGA,EAAW,CAAC,CAAA,EAI5ClC,EAAAA,UAAU,IAAM,CACb,MAAMqF,EAAOiS,EAAgB,QAC7B,MAAO,IAAM,CACVjS,EAAK,QAASZ,GAAQA,EAAI,QAAS,CAAA,CAAA,CACtC,EACA,CAAC2S,CAAM,CAAC,EAEX,MAAMG,EAAwC/T,EAAA,YAC3C,CAACgB,EAAImI,EAAOhI,IAAmB,CACtB,MAAAF,EAAM6S,EAAgB,QAAQ3K,CAAK,EAC/B,OAAApI,GAAA,CACP,GAAAC,EACA,MAAA7E,EACA,OAAA+E,EACA,IAAAD,EACA,eAAgB,IACbE,GAAkBA,EAAe,CAAE,KAAMF,EAAI,QAAS,CAAA,CAC3D,EACMA,EAAI,OACd,EACA,CAAC9E,EAAO+E,CAAM,CAAA,EAGV,MAAA,CAAC4S,EAAgB,QAASC,CAAiB,CACrD,ECrFaC,GAAe,OAAO,OAAO,CACvC,YAAYC,EAAYC,EAAUC,EAAU9E,EAAY,KAAc,CAC7D,MAAA+E,EAASH,GAAcC,EAAWD,GAAcE,EACtD,OAAO,KAAK,IAAIC,CAAM,EAAI/E,EAAY,EAAI+E,CAC7C,CACH,CAAC"} \ 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 3a775ce0..2d13ac3a 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -1,12 +1,12 @@ { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.38", + "version": "1.1.39", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.38", + "version": "1.1.39", "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 161e7c3f..77fc6213 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.38", + "version": "1.1.39", "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 828d48c9..e05cce6d 100644 --- a/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts +++ b/packages/use-shader-fx/src/fxs/3D/useMorphParticles/index.ts @@ -107,7 +107,6 @@ export const MORPHPARTICLES_PARAMS: MorphParticlesParams = Object.freeze({ export const useMorphParticles = ({ size, dpr, - samples, isSizeUpdate, renderTargetOptions, camera, @@ -147,7 +146,6 @@ export const useMorphParticles = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, depthBuffer: true, ...renderTargetOptions, diff --git a/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts b/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts index 045865c1..2016ba4d 100644 --- a/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts +++ b/packages/use-shader-fx/src/fxs/3D/useWobble3D/index.ts @@ -85,7 +85,6 @@ export const WOBBLE3D_PARAMS: Wobble3DParams = Object.freeze({ export const useWobble3D = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, camera, @@ -119,7 +118,6 @@ export const useWobble3D = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, depthBuffer: true, ...renderTargetOptions, diff --git a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts index 89c4445b..283d1b5d 100755 --- a/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts +++ b/packages/use-shader-fx/src/fxs/effects/useMotionBlur/index.ts @@ -48,7 +48,6 @@ export const MOTIONBLUR_PARAMS: MotionBlurParams = Object.freeze({ export const useMotionBlur = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -69,19 +68,10 @@ export const useMotionBlur = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }), - [ - scene, - camera, - size, - _dpr.fbo, - samples, - isSizeUpdate, - renderTargetOptions, - ] + [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions] ) as UseFboProps; const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps); diff --git a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts index c2c88ee2..7d68e513 100755 --- a/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts +++ b/packages/use-shader-fx/src/fxs/effects/useSimpleBlur/index.ts @@ -45,7 +45,6 @@ export const SIMPLEBLUR_PARAMS: SimpleBlurParams = Object.freeze({ export const useSimpleBlur = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -65,19 +64,10 @@ export const useSimpleBlur = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }), - [ - scene, - camera, - size, - _dpr.fbo, - samples, - isSizeUpdate, - renderTargetOptions, - ] + [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions] ) as UseFboProps; const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps); diff --git a/packages/use-shader-fx/src/fxs/effects/useWave/index.ts b/packages/use-shader-fx/src/fxs/effects/useWave/index.ts index 2feeff36..f4c80533 100644 --- a/packages/use-shader-fx/src/fxs/effects/useWave/index.ts +++ b/packages/use-shader-fx/src/fxs/effects/useWave/index.ts @@ -49,7 +49,6 @@ export const WAVE_PARAMS: WaveParams = Object.freeze({ export const useWave = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -63,7 +62,6 @@ export const useWave = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts b/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts index 7cd8ef83..2f2c1693 100644 --- a/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts +++ b/packages/use-shader-fx/src/fxs/interactions/useBrush/index.ts @@ -74,7 +74,6 @@ export const BRUSH_PARAMS: BrushParams = Object.freeze({ export const useBrush = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -95,7 +94,6 @@ export const useBrush = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts b/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts index 80db36b0..1eeb85fa 100755 --- a/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts +++ b/packages/use-shader-fx/src/fxs/misc/useBlank/index.ts @@ -51,7 +51,6 @@ export const BLANK_PARAMS: BlankParams = Object.freeze({ export const useBlank = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -75,19 +74,10 @@ export const useBlank = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }), - [ - scene, - camera, - size, - _dpr.fbo, - samples, - isSizeUpdate, - renderTargetOptions, - ] + [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions] ) as UseFboProps; const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps); diff --git a/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts b/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts index 80426672..26536a35 100644 --- a/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts +++ b/packages/use-shader-fx/src/fxs/misc/useChromaKey/index.ts @@ -62,7 +62,6 @@ export const CHROMAKEY_PARAMS: ChromaKeyParams = Object.freeze({ export const useChromaKey = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -82,7 +81,6 @@ export const useChromaKey = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts b/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts index 369bd017..ac583faa 100644 --- a/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useColorStrata/index.ts @@ -67,7 +67,6 @@ export const COLORSTRATA_PARAMS: ColorStrataParams = Object.freeze({ export const useColorStrata = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -86,7 +85,6 @@ export const useColorStrata = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts b/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts index 5581c894..7b96ae00 100644 --- a/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useCosPalette/index.ts @@ -53,7 +53,6 @@ export const COSPALETTE_PARAMS: CosPaletteParams = Object.freeze({ export const useCosPalette = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -72,7 +71,6 @@ export const useCosPalette = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts b/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts index 26504a4e..670016df 100644 --- a/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useMarble/index.ts @@ -55,7 +55,6 @@ export const MARBLE_PARAMS: MarbleParams = Object.freeze({ export const useMarble = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -69,7 +68,6 @@ export const useMarble = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts b/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts index 25c042c0..8b883b6d 100644 --- a/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts +++ b/packages/use-shader-fx/src/fxs/noises/useNoise/index.ts @@ -60,7 +60,6 @@ export const NOISE_PARAMS: NoiseParams = Object.freeze({ export const useNoise = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -75,7 +74,6 @@ export const useNoise = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/simulations/useFluid/index.ts b/packages/use-shader-fx/src/fxs/simulations/useFluid/index.ts index 3d453eac..f9d1c898 100644 --- a/packages/use-shader-fx/src/fxs/simulations/useFluid/index.ts +++ b/packages/use-shader-fx/src/fxs/simulations/useFluid/index.ts @@ -81,7 +81,6 @@ export const FLUID_PARAMS: FluidParams = Object.freeze({ export const useFluid = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, customFluidProps, @@ -115,20 +114,11 @@ export const useFluid = ({ camera, dpr: _dpr.fbo, size, - samples, isSizeUpdate, type: THREE.HalfFloatType, ...renderTargetOptions, }), - [ - scene, - camera, - size, - samples, - _dpr.fbo, - isSizeUpdate, - renderTargetOptions, - ] + [scene, camera, size, _dpr.fbo, isSizeUpdate, renderTargetOptions] ); const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps); const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps); diff --git a/packages/use-shader-fx/src/fxs/simulations/useRipple/index.ts b/packages/use-shader-fx/src/fxs/simulations/useRipple/index.ts index 4febd08a..c95743f7 100644 --- a/packages/use-shader-fx/src/fxs/simulations/useRipple/index.ts +++ b/packages/use-shader-fx/src/fxs/simulations/useRipple/index.ts @@ -65,7 +65,6 @@ export const useRipple = ({ size, dpr, renderTargetOptions, - samples, isSizeUpdate, onBeforeInit, }: UseRippleProps): HooksReturn => { @@ -85,7 +84,6 @@ export const useRipple = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/types/index.ts b/packages/use-shader-fx/src/fxs/types/index.ts index c3c9f945..9f7dfb06 100644 --- a/packages/use-shader-fx/src/fxs/types/index.ts +++ b/packages/use-shader-fx/src/fxs/types/index.ts @@ -25,9 +25,8 @@ export type MaterialProps = { export interface HooksProps extends MaterialProps { size: Size; + /** Pixel-ratio, use window.devicePixelRatio or viewport.dpr from r3f */ dpr: Dpr; - /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0` */ - samples?: number; /** Whether to `setSize` the FBO when updating size or dpr. default : `false` */ isSizeUpdate?: boolean; /** diff --git a/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts b/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts index a3ae65cf..88293c18 100644 --- a/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useAlphaBlending/index.ts @@ -41,7 +41,6 @@ export const ALPHABLENDING_PARAMS: AlphaBlendingParams = Object.freeze({ export const useAlphaBlending = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -65,7 +64,6 @@ export const useAlphaBlending = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts b/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts index 24e08d62..be428d69 100644 --- a/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useBlending/index.ts @@ -61,7 +61,6 @@ If you don't want to reflect the map's color, you can use useFxBlending instead. export const useBlending = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -76,7 +75,6 @@ export const useBlending = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts b/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts index 50417ba0..b69f10f7 100644 --- a/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useBrightnessPicker/index.ts @@ -47,7 +47,6 @@ export const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams = Object.freeze({ export const useBrightnessPicker = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -65,7 +64,6 @@ export const useBrightnessPicker = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts b/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts index 499a9d2c..37b57e62 100644 --- a/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useCoverTexture/index.ts @@ -38,7 +38,6 @@ export const COVERTEXTURE_PARAMS: CoverTextureParams = Object.freeze({ export const useCoverTexture = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -62,7 +61,6 @@ export const useCoverTexture = ({ camera, dpr: _dpr.fbo, size, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts b/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts index 2f1dafe8..e5acc2eb 100644 --- a/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useDuoTone/index.ts @@ -44,7 +44,6 @@ export const DUOTONE_PARAMS: DuoToneParams = Object.freeze({ export const useDuoTone = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -59,7 +58,6 @@ export const useDuoTone = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts b/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts index cb7e60cd..b93a1745 100644 --- a/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useFxBlending/index.ts @@ -45,7 +45,6 @@ export const FXBLENDING_PARAMS: FxBlendingParams = Object.freeze({ export const useFxBlending = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -64,7 +63,6 @@ export const useFxBlending = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts b/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts index d74f9b2d..f0ed2c28 100644 --- a/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useFxTexture/index.ts @@ -62,7 +62,6 @@ export const FXTEXTURE_PARAMS: FxTextureParams = Object.freeze({ export const useFxTexture = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -82,7 +81,6 @@ export const useFxTexture = ({ camera, dpr: _dpr.fbo, size, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts b/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts index 7e65c4ae..f9cd0bfc 100644 --- a/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts +++ b/packages/use-shader-fx/src/fxs/utils/useHSV/index.ts @@ -44,7 +44,6 @@ export const HSV_PARAMS: HSVParams = Object.freeze({ export const useHSV = ({ size, dpr, - samples, renderTargetOptions, isSizeUpdate, onBeforeInit, @@ -64,7 +63,6 @@ export const useHSV = ({ camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/libs/Utils.ts b/packages/use-shader-fx/src/libs/Utils.ts index cf68794d..4dc483f8 100644 --- a/packages/use-shader-fx/src/libs/Utils.ts +++ b/packages/use-shader-fx/src/libs/Utils.ts @@ -1,6 +1,3 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; - type Utils = { interpolate: ( startValue: number, @@ -8,8 +5,6 @@ type Utils = { progress: number, threshold?: number ) => number; - /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */ - getMaxDpr: (gl: THREE.WebGLRenderer, size: Size) => number; }; export const Utils: Utils = Object.freeze({ @@ -17,9 +12,4 @@ export const Utils: Utils = Object.freeze({ const result = startValue + (endValue - startValue) * progress; return Math.abs(result) < threshold ? 0 : result; }, - getMaxDpr(gl, size) { - return Math.floor( - gl.capabilities.maxTextureSize / Math.max(size.width, size.height) - ); - }, }); diff --git a/packages/use-shader-fx/src/misc/useDomSyncer/index.ts b/packages/use-shader-fx/src/misc/useDomSyncer/index.ts index b769c1bf..18567722 100644 --- a/packages/use-shader-fx/src/misc/useDomSyncer/index.ts +++ b/packages/use-shader-fx/src/misc/useDomSyncer/index.ts @@ -63,14 +63,7 @@ export const DOMSYNCER_PARAMS: DomSyncerParams = { * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array. */ export const useDomSyncer = ( - { - size, - dpr, - samples, - isSizeUpdate, - renderTargetOptions, - onBeforeInit, - }: HooksProps, + { size, dpr, isSizeUpdate, renderTargetOptions, onBeforeInit }: HooksProps, dependencies: React.DependencyList = [] ): HooksReturn => { const _dpr = getDpr(dpr); @@ -82,7 +75,6 @@ export const useDomSyncer = ( camera, size, dpr: _dpr.fbo, - samples, isSizeUpdate, ...renderTargetOptions, }); diff --git a/packages/use-shader-fx/src/utils/useResizeBoundary.ts b/packages/use-shader-fx/src/utils/useResizeBoundary.ts index 4a1b6a0b..386e26f2 100644 --- a/packages/use-shader-fx/src/utils/useResizeBoundary.ts +++ b/packages/use-shader-fx/src/utils/useResizeBoundary.ts @@ -1,13 +1,5 @@ -import * as THREE from "three"; import { useMemo, useRef } from "react"; import { Size } from "@react-three/fiber"; -import { Utils } from ".."; - -export type ResizeBoundary = { - /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */ - maxDpr: number; - isUpdate: boolean; -}; const checkUpdate = ( currentW: number, @@ -30,19 +22,17 @@ const checkUpdate = ( }; export const useResizeBoundary = ({ - gl, size, boundFor, threshold, }: { - gl: THREE.WebGLRenderer; size: Size; boundFor: "smaller" | "larger" | "both"; threshold: number; }) => { const memorizedSize = useRef(size); - const resizeBoundary = useMemo(() => { + const isBeyondBoundary = useMemo(() => { const { width: currentW, height: currentH } = size; const { width: memoW, height: memoH } = memorizedSize.current; @@ -54,16 +44,12 @@ export const useResizeBoundary = ({ threshold, boundFor ); - const dpr = Utils.getMaxDpr(gl, size); if (isUpdate) { memorizedSize.current = size; } - return { - maxDpr: dpr, - isUpdate, - }; - }, [size, gl, boundFor, threshold]); + return isUpdate; + }, [size, boundFor, threshold]); - return resizeBoundary; + return isBeyondBoundary; }; 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 d603e8ab..00a6fb0b 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 @@ -63,4 +63,4 @@ export declare const MORPHPARTICLES_PARAMS: MorphParticlesParams; /** * @link https://github.com/FunTechInc/use-shader-fx */ -export declare const useMorphParticles: ({ size, dpr, samples, isSizeUpdate, renderTargetOptions, camera, geometry, positions, uvs, onBeforeInit, }: HooksProps3D & UseCreateMorphParticlesProps) => HooksReturn; +export declare const useMorphParticles: ({ size, dpr, isSizeUpdate, renderTargetOptions, camera, geometry, positions, uvs, onBeforeInit, }: HooksProps3D & UseCreateMorphParticlesProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts index ace6efa0..787dee2f 100644 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts @@ -53,4 +53,4 @@ export declare const WOBBLE3D_PARAMS: Wobble3DParams; /** * @link https://github.com/FunTechInc/use-shader-fx */ -export declare const useWobble3D: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, camera, geometry, baseMaterial, materialParameters, isCustomTransmission, onBeforeInit, depthOnBeforeInit, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps) => HooksReturn; +export declare const useWobble3D: ({ size, dpr, renderTargetOptions, isSizeUpdate, camera, geometry, baseMaterial, materialParameters, isCustomTransmission, onBeforeInit, depthOnBeforeInit, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts index d37429d1..f23e6f3e 100644 --- a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts @@ -24,4 +24,4 @@ export declare const MOTIONBLUR_PARAMS: MotionBlurParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useMotionBlur: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useMotionBlur: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts index 80b8cf0e..4e495940 100644 --- a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts @@ -22,4 +22,4 @@ export declare const SIMPLEBLUR_PARAMS: SimpleBlurParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useSimpleBlur: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useSimpleBlur: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts index d9ce01aa..c4321d0d 100644 --- a/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts +++ b/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts @@ -25,4 +25,4 @@ export declare const WAVE_PARAMS: WaveParams; /** * @link https://github.com/FunTechInc/use-shader-fx */ -export declare const useWave: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useWave: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts index 05f0ed6c..2f5e7c6f 100644 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts @@ -41,4 +41,4 @@ export declare const BRUSH_PARAMS: BrushParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBrush: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useBrush: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts index 68051a1e..82f30972 100644 --- a/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts +++ b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts @@ -27,4 +27,4 @@ export declare const BLANK_PARAMS: BlankParams; * ※ `usf_Position` overrides `gl_Position` * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBlank: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useBlank: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts index a1e42b30..d495d93b 100644 --- a/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts +++ b/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts @@ -33,4 +33,4 @@ export declare const CHROMAKEY_PARAMS: ChromaKeyParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useChromaKey: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useChromaKey: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts index 8764c458..c3697d6c 100644 --- a/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts @@ -37,4 +37,4 @@ export declare const COLORSTRATA_PARAMS: ColorStrataParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useColorStrata: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useColorStrata: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts index cdf39b80..cccbfeb3 100644 --- a/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts @@ -27,4 +27,4 @@ export declare const COSPALETTE_PARAMS: CosPaletteParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useCosPalette: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useCosPalette: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts index b7281571..5516e108 100644 --- a/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts @@ -29,4 +29,4 @@ export declare const MARBLE_PARAMS: MarbleParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useMarble: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useMarble: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts index 6a86eaf6..d0075a61 100644 --- a/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts +++ b/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts @@ -33,4 +33,4 @@ export declare const NOISE_PARAMS: NoiseParams; * * It is a basic value noise with `fbm` and `domain warping` */ -export declare const useNoise: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useNoise: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts index 90dc8bca..ad0696cb 100644 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts @@ -42,7 +42,7 @@ export declare const FLUID_PARAMS: FluidParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useFluid: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, customFluidProps, }: { +export declare const useFluid: ({ size, dpr, renderTargetOptions, isSizeUpdate, customFluidProps, }: { /** you can add `onBeforeInit` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` * ```ts * customFluidProps: { diff --git a/packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts b/packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts index 76332db5..f622b745 100644 --- a/packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts +++ b/packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts @@ -35,5 +35,5 @@ interface UseRippleProps extends HooksProps { /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useRipple: ({ texture, scale, max, size, dpr, renderTargetOptions, samples, isSizeUpdate, onBeforeInit, }: UseRippleProps) => HooksReturn; +export declare const useRipple: ({ texture, scale, max, size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: UseRippleProps) => HooksReturn; export {}; diff --git a/packages/use-shader-fx/types/fxs/types/index.d.ts b/packages/use-shader-fx/types/fxs/types/index.d.ts index b306e75d..353e5572 100644 --- a/packages/use-shader-fx/types/fxs/types/index.d.ts +++ b/packages/use-shader-fx/types/fxs/types/index.d.ts @@ -22,9 +22,8 @@ export type MaterialProps = { }; export interface HooksProps extends MaterialProps { size: Size; + /** Pixel-ratio, use window.devicePixelRatio or viewport.dpr from r3f */ dpr: Dpr; - /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0` */ - samples?: number; /** Whether to `setSize` the FBO when updating size or dpr. default : `false` */ isSizeUpdate?: boolean; /** diff --git a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts index fbf92065..9de52271 100644 --- a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts @@ -19,4 +19,4 @@ export declare const ALPHABLENDING_PARAMS: AlphaBlendingParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useAlphaBlending: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useAlphaBlending: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts index 572fd051..d1ad89e4 100644 --- a/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts @@ -33,4 +33,4 @@ export declare const BLENDING_PARAMS: BlendingParams; If you don't want to reflect the map's color, you can use useFxBlending instead. * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBlending: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useBlending: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts index 5f569c0c..d8bfd85b 100644 --- a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts @@ -23,4 +23,4 @@ export declare const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useBrightnessPicker: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useBrightnessPicker: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts index d7cff81c..733c456e 100644 --- a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts @@ -17,4 +17,4 @@ export declare const COVERTEXTURE_PARAMS: CoverTextureParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useCoverTexture: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useCoverTexture: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts index f5230a6e..b83a69bb 100644 --- a/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts @@ -22,4 +22,4 @@ export declare const DUOTONE_PARAMS: DuoToneParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useDuoTone: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useDuoTone: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts index c4ca097f..a7124b15 100644 --- a/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts @@ -22,4 +22,4 @@ export declare const FXBLENDING_PARAMS: FxBlendingParams; * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike "useBlending", the map color is not reflected. * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useFxBlending: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useFxBlending: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts index 87e5f3ce..014422ad 100644 --- a/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts @@ -33,4 +33,4 @@ export declare const FXTEXTURE_PARAMS: FxTextureParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useFxTexture: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useFxTexture: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts index 0627764e..6df11829 100644 --- a/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts +++ b/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts @@ -21,4 +21,4 @@ export declare const HSV_PARAMS: HSVParams; /** * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage */ -export declare const useHSV: ({ size, dpr, samples, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; +export declare const useHSV: ({ size, dpr, renderTargetOptions, isSizeUpdate, onBeforeInit, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/libs/Utils.d.ts b/packages/use-shader-fx/types/libs/Utils.d.ts index 226a3f50..1f7b4958 100644 --- a/packages/use-shader-fx/types/libs/Utils.d.ts +++ b/packages/use-shader-fx/types/libs/Utils.d.ts @@ -1,9 +1,5 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; type Utils = { interpolate: (startValue: number, endValue: number, progress: number, threshold?: number) => number; - /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */ - getMaxDpr: (gl: THREE.WebGLRenderer, size: Size) => number; }; export declare const Utils: Utils; export {}; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts index 65fe7131..1443e756 100644 --- a/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts +++ b/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts @@ -42,4 +42,4 @@ export declare const DOMSYNCER_PARAMS: DomSyncerParams; * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usedomsyncer * @param dependencies - When this dependency array is changed, the mesh and intersection judgment will be updated according to the passed DOM array. */ -export declare const useDomSyncer: ({ size, dpr, samples, isSizeUpdate, renderTargetOptions, onBeforeInit, }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; +export declare const useDomSyncer: ({ size, dpr, isSizeUpdate, renderTargetOptions, onBeforeInit }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; diff --git a/packages/use-shader-fx/types/utils/useResizeBoundary.d.ts b/packages/use-shader-fx/types/utils/useResizeBoundary.d.ts index 42f3ebe0..63c185fa 100644 --- a/packages/use-shader-fx/types/utils/useResizeBoundary.d.ts +++ b/packages/use-shader-fx/types/utils/useResizeBoundary.d.ts @@ -1,13 +1,6 @@ -import * as THREE from "three"; import { Size } from "@react-three/fiber"; -export type ResizeBoundary = { - /** Useful if you intentionally want to specify a higher resolution than `window.devicePixelRatio`. The maximum dpr is returned according to `GL_MAX_TEXTURE_SIZE`. */ - maxDpr: number; - isUpdate: boolean; -}; -export declare const useResizeBoundary: ({ gl, size, boundFor, threshold, }: { - gl: THREE.WebGLRenderer; +export declare const useResizeBoundary: ({ size, boundFor, threshold, }: { size: Size; boundFor: "smaller" | "larger" | "both"; threshold: number; -}) => ResizeBoundary; +}) => boolean;